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 ...
随机推荐
- XXX全球 IP 地址库
XXX全球 IP 地址库 Bulgaria 93.123.23.1 93.123.23.2 93.123.23.3 93.123.23.4 93.123.23.5 93.123.23.6 93.123 ...
- Java中看今天是星期几,礼拜几
下面这段代码就能达到目的: Date today = new Date(); Calendar c=Calendar.getInstance(); c.setTime(to ...
- Your Customers Do Not Mean What They Say
Your Customers Do Not Mean What They Say Nate Jackson I'VE NEVER MET A CUSTOMER YET that wasn't all ...
- Power Network (poj 1459 网络流)
Language: Default Power Network Time Limit: 2000MS Memory Limit: 32768K Total Submissions: 23407 ...
- wepy - 与原生有什么不同($pages,$interceptors)
wepy内部封装的一些基类,我们要注意以 “$”开头命名,最好不用 关于wepy基类文档,请查看 关于$apply,其实就是主动刷新DOM,来更新数据. 何时使用它? 答. 你为data里面的数据进行 ...
- matlab histeq函数介绍
Histeq Enhance contrast using histogram equalization 该函数通过直方图均衡化来添加对照度 Syntax J = histeq(I,hgram) De ...
- 解决 windows10 system service exception蓝屏
解决方法: WINDOWS/system32/config/RegBack/SYSTEM/* 复制到 WINDOWS/system32/config/*下
- jquery 清除style样式
$("#show").removeAttr("style"); //ie,ff均支持 $("#show").attr("style ...
- 解决java.sql.SQLException: Incorrect string value: '\xE6\x88\x91\xE7\x9A\x84...' for column 'groupName'
今天使用mysql,用java程序往mysql中写数据,出现如下错误: Caused by: java.sql.SQLException: Incorrect string value: '\xD3\ ...
- 光驱在资源管理器显示黄色感叹号的解决方法BIOS内有 系统下没有
1. 点开“开始”-运行regedit.exe,进入注册表编辑器,到左边的项目栏里找到HKEY_LOCAL_MACHINE\SYSTEM \CurrentControlSet\Control\Clas ...