JDK1.5新特性,语言篇
Java 1.5版本,就是Java 2 Standard Edition 5,Version 1.5,简称Java 5。版本代号Tiger。
一. 泛型(Generics)
C++通过模板技术可以指定集合的元素类型,而Java在1.5之前一直没有相对应的功能。一个集合可以放任何类型的对象,相应地从集合里面拿对象的时候我们也不得不对他们进行强制得类型转换。
泛型提供一种途径,让你告诉编译器容器中存放的是什么,这样它就可以做一些检查工作。不符合规则的情况下,编译是通不过的。通过引入泛型,我们将获得编译时类型的安全和运行时更小地抛出ClassCastExceptions的可能。
@Test
public void testGenerics() {
List<String> c = new ArrayList<String>();
c.add("Hello");
c.add("World");
c.add("Hihi");
// c.add(new Date()); // 编译出错:The method add(String) in the type List<String> is not applicable for the arguments (Date)
// Removes 4-letter words from c. Elements must be strings
for (Iterator i = c.iterator(); i.hasNext(); ) // 旧方式处理
if (((String) i.next()).length() == 4)
i.remove(); // Removes the 4-letter words from c
for (Iterator<String> i = c.iterator(); i.hasNext(); ) // 新方式处理
if (i.next().length() == 4)
i.remove(); System.out.println(c);
二. For-Each循环(The For-Each Loop)
在这类For循环中,你应该将":"看成"in",所以,在该例中可以看成"for Object o in c"。你可以发现这种For循环更具可读性,For-Each循环的加入简化了集合的遍历。
@Test
public void testForEach() {
List<String> list = new ArrayList<String>();
for(int i=0; i<10; i++)
list.add("str" + i); // 老款遍历的方法
for (int i = 0; i < list.size(); i++) {
String str = list.get(i);
} // 迭代遍历的for方式;相对while循环而言,能够避免变量名错误
for (Iterator<String> iter = list.iterator(); iter.hasNext();) {
String str = (String)iter.next();
}
// For-Each循环
for (String str : list) {
// 直接用了
System.out.println(str);
}
}
三. 自动装箱/拆箱(Autoboxing/Unboxing)
自动装箱/拆箱,提供基本数据类型与包装类的自动互相转换功能。自动装包/拆包大大方便了基本类型数据和它们包装类地使用。
@Test
public void testBoxing() {
List<Integer> list = new ArrayList<Integer>();
list.add(1); // 自动转换成Integer
list.add(2);
list.add(3); int i = 2;
Integer integer = new Integer(i);
list.add(integer + 2); // 变量integer自动转换为int进行加法运算,再转换为Integer
System.out.println(list); // [1, 2, 3, 4] System.out.println(list.get(i) + "\t" + list.get(integer)); // 3 3
// 注意下面两行语句的差别,实践时要特别注意!
list.remove(i);
list.remove(integer);
System.out.println(list); // [1, 4]
}
四. 类型安全枚举(Typesafe Enums)
JDK1.5加入了一个全新类型的“类”-枚举类型。为此JDK1.5引入了一个新关键字enum。
- 它们提供编译时类型安全。
- 它们都是对象,因此你不需要将他们放入集合中。
- 它们作为一种类的实现,因此你可以添加一些方法。
- 它们为枚举类型提供了合适的命名空间。
- 它们打印的值具有情报性(informative)― 如果你打印一个整数枚举(intenum),你只是看见一个数字,它可能并不具有情报性。
// Typesafe Enums:定义一个红绿灯
enum TrafficLight {
Green,
Yellow,
Red,
} @Test
public void testEnum() throws Exception {
// 类型安全的枚举(Enums):定义一个红绿灯
TrafficLight currentLight = TrafficLight.Yellow;
for (TrafficLight light : TrafficLight.values())
System.out.println(light);
}
五. 可变参数(Varargs)
可变参数(Varargs):可变参数可以是零个、一个、两个...多个;但不能是null值。注意,可变参数必须是函数声明中的最后一个参数。在JDK1.5之前,我们可以用重载来实现上述功能,但是这样就需要写很多的重载函数。如果使用可变参数的话我们只需要一个函数就行了。
@Test
public void testVarargs() throws Exception {
// 可变参数(Varargs):参考可以零个、一个、两个...多个;但不能是null值。
printStr();
printStr("你好");
printStr("我好", "你也好");
}
// 可变参数(Varargs):参考可以零个、一个、两个...多个;但不能是null值。
// 如果要求用户至少输入一个参数的话,那么参数应该是:printStr(String str1, String... strs),然后做相关处理
private void printStr(String... strs) {
for(String str: strs)
System.out.println(str);
}
六. 静态导入(Static Import)
import static 语句可以导入一个类中的某个静态方法或是所有静态方法。
import static java.lang.Math.*;
@Test
public void testStaticImport() throws Exception {
// 静态导入(Static Import):可以直接使用Math的方法、属性
double d = round(PI * 2);
System.out.println("round(2*PI)=" + d);
}
七. 注解(Annotations)
元数据特征志于使开发者们借助厂商提供的工具可以进行更简易的开发。
@Override
// Annotations,如果更改此方法的返回类型,则会出错,因为已经指定Override,必须跟父类一样返回String。
public String toString() {
return "Just Test";
}
完整代码:
package com.clzhang.sample.thinking; import static java.lang.Math.*;
import java.util.*; import org.junit.Test; public class JDK15LangFeature {
@Test
public void testGenerics() {
List<String> c = new ArrayList<String>();
c.add("Hello");
c.add("World");
c.add("Hihi");
// c.add(new Date()); // 编译出错:The method add(String) in the type List<String> is not applicable for the arguments (Date) // Removes 4-letter words from c. Elements must be strings
for (Iterator i = c.iterator(); i.hasNext(); ) // 旧方式处理
if (((String) i.next()).length() == 4)
i.remove(); // Removes the 4-letter words from c
for (Iterator<String> i = c.iterator(); i.hasNext(); ) // 新方式处理
if (i.next().length() == 4)
i.remove(); System.out.println(c);
} @Test
public void testForEach() {
List<String> list = new ArrayList<String>();
for(int i=0; i<10; i++)
list.add("str" + i); // 老款遍历的方法
for (int i = 0; i < list.size(); i++) {
String str = list.get(i);
} // 迭代遍历的for方式;相对while循环而言,能够避免变量名错误
for (Iterator<String> iter = list.iterator(); iter.hasNext();) {
String str = (String)iter.next();
} // For-Each循环
for (String str : list) {
// 直接用了
System.out.println(str);
}
} @Test
public void testBoxing() {
List<Integer> list = new ArrayList<Integer>();
list.add(1); // 自动转换成Integer
list.add(2);
list.add(3); int i = 2;
Integer integer = new Integer(i);
list.add(integer + 2); // 变量integer自动转换为int进行加法运算,再转换为Integer
System.out.println(list); // [1, 2, 3, 4] System.out.println(list.get(i) + "\t" + list.get(integer)); // 3 3 // 注意下面两行语句的差别,实践时要特别注意!
list.remove(i);
list.remove(integer);
System.out.println(list); // [1, 4]
} // Typesafe Enums:定义一个红绿灯
enum TrafficLight {
Green,
Yellow,
Red,
} @Test
public void testEnum() throws Exception {
// 类型安全的枚举(Enums):定义一个红绿灯
TrafficLight currentLight = TrafficLight.Yellow;
for (TrafficLight light : TrafficLight.values())
System.out.println(light);
} @Test
public void testVarargs() throws Exception {
// 可变参数(Varargs):参考可以零个、一个、两个...多个;但不能是null值。
printStr();
printStr("你好");
printStr("我好", "你也好");
} // 可变参数(Varargs):参考可以零个、一个、两个...多个;但不能是null值。
// 如果要求用户至少输入一个参数的话,那么参数应该是:printStr(String str1, String... strs),然后做相关处理
private void printStr(String... strs) {
for(String str: strs)
System.out.println(str);
} @Test
public void testStaticImport() throws Exception {
// 静态导入(Static Import):可以直接使用Math的方法、属性
double d = round(PI * 2);
System.out.println("round(2*PI)=" + d);
} @Override
// Annotations,如果更改此方法的返回类型,则会出错,因为已经指定Override,必须跟父类一样返回String。
public String toString() {
return "Just Test";
}
}
JDK1.5新特性,语言篇的更多相关文章
- 有点干货 | Jdk1.8新特性实战篇(41个案例)
作者:小傅哥 博客:https://bugstack.cn - 汇总系列原创专题文章 沉淀.分享.成长,让自己和他人都能有所收获!
- JDK1.5新特性,基础类库篇,集合框架(Collections)
集合框架在JDK1.5中增强特性如下: 一. 新语言特性的增强 泛型(Generics)- 增加了集合框架在编译时段的元素类型检查,节省了遍历元素时类型转换代码量. For-Loop循环(Enhanc ...
- jdk1.6新特性
1.Web服务元数据 Java 里的Web服务元数据跟微软的方案基本没有语义上的区别,自从JDK5添加了元数据功能(Annotation)之后,SUN几乎重构了整个J2EE体 系, 由于变化很大,干脆 ...
- JDK1.7新特性
jdk1.7新特性 1 对集合类的语言支持: 2 自动资源管理: 3 改进的通用实例创建类型推断: 4 数字字面量下划线支持: 5 switch中使用string: 6 二进制字面量: 7 简化可变参 ...
- JDK1.6新特性,WebService强化
Web service是一个平台独立的,松耦合的,自包含的.基于可编程的web的应用程序,可使用开放的XML标准来描述.发布.发现.协调和配置这些应用程序,用于开发分布式的互操作的应用程序. Web ...
- JDK1.8新特性之(三)--函数式接口
在上一篇文章中我们介绍了JDK1.8的新特性有以下几项. 1.Lambda表达式 2.方法引用 3.函数式接口 4.默认方法 5.Stream 6.Optional类 7.Nashorm javasc ...
- JDK1.8新特性之(一)--Lambda表达式
近期由于新冠疫情的原因,不能出去游玩,只能在家呆着.于是闲来无事,开始阅读JDK1.8的源代码.在开始之前也查询了以下JDK1.8的新特性,有针对性的开始了这段旅程. 只看不操作,也是不能心领神会的. ...
- JDK1.8新特性之(二)--方法引用
在上一篇文章中我们介绍了JDK1.8的新特性有以下几项. 1.Lambda表达式 2.方法引用 3.函数式接口 4.默认方法 5.Stream 6.Optional类 7.Nashorm javasc ...
- C# 9 新特性 —— 补充篇
C# 9 新特性 -- 补充篇 Intro 前面我们分别介绍了一些 C# 9 中的新特性,还有一些我觉得需要了解一下的新特性,写一篇作为补充. Top-Level Statements 在以往的代码里 ...
- jdk1.5新特性之-----自动装箱与自动拆箱
import java.util.ArrayList; /* jdk1.5新特性之-----自动装箱与自动拆箱. java是面向对象 的语言,任何事物都可以使用类进行描述,sun就使用了 一些类描述j ...
随机推荐
- 在不重装系统的情况下撤底删除oracle数据库及oralce的相关软件
先从控制面板删除oracle的相关应用及数据库, 删除系统变量 ORACLE_OEM_CLASSPATH=%JAVA_HOME%\lib\ext\access-bridge-64.jar;%JAVA_ ...
- [React GraphQL] Pass Parameters to urql's useQuery React Hook
Showing how to use 'uqrl' library to do GraphQL in React. import React, {useState} from 'react' impo ...
- 开源 免费 java CMS - FreeCMS1.9 移动APP管理 网站配置
项目地址:http://www.freeteam.cn/ 网站配置 管理员能够在这里设置当前管理网站是否同意移动app訪问,是否默认移动APP网站.首页的布局,首页数据最多载入页数. 从左側管理菜单点 ...
- 克隆server2008R2造成SID冲突
在云上搞的虚拟机,安装5台winserver2008r2,搭域环境,域环境搭好之后,改域用户为管理员,死活更改不成功,之前在测试环境搞域环境时碰到克隆镜像系统全部还原后搭建域环境不成功的情况,后来全部 ...
- 编译时:virtual memory exhausted: Cannot allocate memory(转)
一.问题 当安装虚拟机时系统时没有设置swap大小或设置内存太小,编译程序会出现virtual memory exhausted: Cannot allocate memory的问题,可以用swap扩 ...
- 升级 asp.net core 1.1 到 2.0 preview
Upgrading to .NET Core 2.0 Preview 1 更新 依赖的类库 改为 标准库 2 web app 更改 csproj 文件---升级版本 <PropertyGrou ...
- 腾讯云-Linux 基础入门
Linux 基础入门 目录操作 任务时间:5min ~ 10min 创建目录 使用 mkdir 命令创建目录 mkdir $HOME/testFolder # $HOME 当前用户的家目录 root ...
- cocos2dx跟eclipse交叉编译“make: * No rule to make target `all' Stop”的解决方案
cocos2dx和eclipse交叉编译“make: *** No rule to make target `all'. Stop”的解决方案 搞cocos2dx在eclipse上的交叉编译. 项目. ...
- awk打印倒数第2列
cat 1-iplist.txt | awk '{ print $(NF-2) }'|wc 实际示例: 打印nginx日志中 变量request_time超过3秒的日志信息 [root@datalin ...
- JAVA常见异常解析
1. java.lang.nullpointerexception 这个异常大家肯定都经常遇到,异常的解释是"程序遇上了空指针",简单地说就是调用了未经初始化的对象或者是不存在的对 ...