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. [HTML5] Avoiding CSS Conflicts via Shadow DOM CSS encapsulation

    Shadow DOM is part of the web components specification. It allows us to ship self contained componen ...

  2. Android的View和ViewGroup分析

    1. 概念 Android中的View与我们曾经理解的"视图"不同.在Android中,View比视图具有更广的含义,它包括了用户交互和显示,更像Windows操作系统中的wind ...

  3. 使用(function() {}).call(this);包裹代码有什么好处,什么时候应该这样做?

    转自:http://segmentfault.com/q/1010000002519489 1.严格模式下函数调用的 this 并不会默认成为全局对象. 使用 func.call(this) 确保函数 ...

  4. mondrian4 kylin saiku 整合踩坑记录

    1 先说了版本: Mondrian 4 .kylin2.2 .saiku 3.15 2 saiku 3.15 使用的xml是基于 mondrian4 的schema的xml.判断是不是mondrian ...

  5. 不兼容:不支持SCSI硬盘

    获取机器硬件失败,可能你使用了SCSI硬盘,请更换一台主机进行安装 聚生网管2.11版本不支持scsi硬盘. 终于体会到了不兼容的麻烦了.

  6. 带"叉叉"的GridView

    由于需要用到“删除图片”的功能,需要写这样一个小demo: 对之前博文的修改 发现imageView监听点击事件 效果实在不敢恭维,因此换个方式:设置Touch的监听函数, 下面的Demo没有改过来哈 ...

  7. linux kernel下输入输出console怎样实现

    近期工作在调试usb虚拟串口,让其作为kernel启动的调试串口,以及user空间的输入输出控制台. 利用这个机会,学习下printk怎样选择往哪个console输出以及user空间下控制台怎样选择. ...

  8. Codeforces Round #228 (Div. 1) C 贪心

    嘎嘎,今天被一些事耽误了,可是还是A了几个题目,这道题还不错 题目链接: 题意:两个人玩游戏,有N堆纸牌,纸牌上有数字,A每次仅仅能取N堆中的 当中一个的顶部的 纸牌,B仅仅能取N堆中的当中一个底部 ...

  9. Oracle EBS SLA(子分类账)

    SLA概述 SLA(Subledger Accounting) 子帐是子分类帐会计的简称,字面上的含义就是子分类帐会计分录 SLA常用表介绍 在SLA中技术方面最常用的就是日记账来源追溯,在追溯的过程 ...

  10. python字符串格式化--dict传参

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #python字符串格式化--dict传参 print "I'm %(name)s. I'm %(a ...