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。

  1. 它们提供编译时类型安全。
  2. 它们都是对象,因此你不需要将他们放入集合中。
  3. 它们作为一种类的实现,因此你可以添加一些方法。
  4. 它们为枚举类型提供了合适的命名空间。
  5. 它们打印的值具有情报性(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新特性,语言篇的更多相关文章

  1. 有点干货 | Jdk1.8新特性实战篇(41个案例)

    作者:小傅哥 博客:https://bugstack.cn - 汇总系列原创专题文章 沉淀.分享.成长,让自己和他人都能有所收获!

  2. JDK1.5新特性,基础类库篇,集合框架(Collections)

    集合框架在JDK1.5中增强特性如下: 一. 新语言特性的增强 泛型(Generics)- 增加了集合框架在编译时段的元素类型检查,节省了遍历元素时类型转换代码量. For-Loop循环(Enhanc ...

  3. jdk1.6新特性

    1.Web服务元数据 Java 里的Web服务元数据跟微软的方案基本没有语义上的区别,自从JDK5添加了元数据功能(Annotation)之后,SUN几乎重构了整个J2EE体 系, 由于变化很大,干脆 ...

  4. JDK1.7新特性

    jdk1.7新特性 1 对集合类的语言支持: 2 自动资源管理: 3 改进的通用实例创建类型推断: 4 数字字面量下划线支持: 5 switch中使用string: 6 二进制字面量: 7 简化可变参 ...

  5. JDK1.6新特性,WebService强化

    Web service是一个平台独立的,松耦合的,自包含的.基于可编程的web的应用程序,可使用开放的XML标准来描述.发布.发现.协调和配置这些应用程序,用于开发分布式的互操作的应用程序. Web ...

  6. JDK1.8新特性之(三)--函数式接口

    在上一篇文章中我们介绍了JDK1.8的新特性有以下几项. 1.Lambda表达式 2.方法引用 3.函数式接口 4.默认方法 5.Stream 6.Optional类 7.Nashorm javasc ...

  7. JDK1.8新特性之(一)--Lambda表达式

    近期由于新冠疫情的原因,不能出去游玩,只能在家呆着.于是闲来无事,开始阅读JDK1.8的源代码.在开始之前也查询了以下JDK1.8的新特性,有针对性的开始了这段旅程. 只看不操作,也是不能心领神会的. ...

  8. JDK1.8新特性之(二)--方法引用

    在上一篇文章中我们介绍了JDK1.8的新特性有以下几项. 1.Lambda表达式 2.方法引用 3.函数式接口 4.默认方法 5.Stream 6.Optional类 7.Nashorm javasc ...

  9. C# 9 新特性 —— 补充篇

    C# 9 新特性 -- 补充篇 Intro 前面我们分别介绍了一些 C# 9 中的新特性,还有一些我觉得需要了解一下的新特性,写一篇作为补充. Top-Level Statements 在以往的代码里 ...

  10. jdk1.5新特性之-----自动装箱与自动拆箱

    import java.util.ArrayList; /* jdk1.5新特性之-----自动装箱与自动拆箱. java是面向对象 的语言,任何事物都可以使用类进行描述,sun就使用了 一些类描述j ...

随机推荐

  1. [Backbone] Verying Views

    Below we have our AppointmentsView instance rendering and then taking the rendered HTML and insertin ...

  2. angular5使用httpclient时解决跨域问题

    跨域问题的环境: 在本地开发时,使用命令行ng s开启服务,访问地址为http://localhost:4200 假设调用数据接口的服务地址为http://localhost:8088/api/dat ...

  3. Windows 之 防火墙

          对于只使用浏览.电子邮件等系统自带的网络应用程序,Windows防火墙(firewall)根本不会产生影响.也就是说,用IE.OutlookExpress等系统自带的程序进行网络连接,防火 ...

  4. 谷歌浏览器保存网页为pdf和.mhtml文件

    注:需要安装chrome谷歌浏览器,尽可能安装最新版的浏览器: 一:保存为pdf 打开要加载的网页 空白处右键-----打印 配置要打印的pdf网页 点击  左边----> 保存按钮  即可: ...

  5. NSLog格式化输出

    /* %@      对象 %d, %i  整数 %u      无符整形 %f      浮点/双字 %x, %X  二进制整数 %o      八进制整数 %zu     size_t %p    ...

  6. 【CSS】瀑布流布局的两种方式:传统多列浮动和绝对定位布局

    传统多列浮动 各列固定宽度,并且左浮动: 一列中的数据块为一组,列中的每个数据块依次排列即可: 更多数据加载时,需要分别插入到不同的列上: 优点: (1)布局简单,应该说没啥特别的难点: (2)不用明 ...

  7. Fiddler SessionFlags

    Each Session object in Fiddler contains a collection of string flags, in the Session.oFlags[] collec ...

  8. SSH框架学习

    首先,SSH不是一个框架,而是多个框架(struts+spring+hibernate)的集成,是目前较流行的一种Web应用程序开源集成框架,用于构建灵活.易于扩展的多层Web应用程序. 集成SSH框 ...

  9. $watch

    $watch简单使用 $watch是一个scope函数,用于监听模型变化,当你的模型部分发生变化时它会通知你. $watch(watchExpression, listener, objectEqua ...

  10. CentOS7 查看硬盘情况

    lsblk                                  查看分区和磁盘 df -h                                         查看空间使用情 ...