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 ...
随机推荐
- js 切换隐藏
先试试 显示\隐藏切换 脚本之家欢迎您 切换隐藏 <style type="text/css"> #thediv { width:200px; height:100px ...
- [Bash] Create Aliases in .bash_profile for Common Bash Commands
.bash_profile is a file that bash invokes (or more technically sources) before the start of a new ba ...
- UML建模学习1:UML统一建模语言简单介绍
一什么是UML? Unified Modeling Language(UML又称为统一建模语言或标准建模语言)是国际对象管理组织OMG制定的一个通 用的.可视化建模语言标准.能够用来描写叙述(spec ...
- 打通Fedora19的ssh服务
Fedora19的SSH服务是默认关闭的,安装后我们需要打通它. 首先,编辑/etc/ssh/sshd_config,把下面黑体字部分打开注释,如下: # $OpenBSD: sshd_c ...
- php之快速入门学习-8(if-else)
PHP If...Else 语句 条件语句用于根据不同条件执行不同动作. PHP 条件语句 当您编写代码时,您常常需要为不同的判断执行不同的动作.您可以在代码中使用条件语句来完成此任务. 在 PHP ...
- 页面可视化编辑ckeditor(web基础学习笔记十五)
一.CKedit下载ckedit 下载地址:http://ckeditor.com/ 二.ckedit的引入 2.1.解压并将ckedit复制到项目中 2.2.在页面中引入 在页面头部加入 <s ...
- PyQt5教程——事件和信号(5)
PyQt5中的事件和信号 在这部分PyQt5编程教程中,我们探索应用中事件和信号的发生. 事件 所有的GUI应用都是事件驱动的.事件主要由应用的用户操作产生的.但是事件可能由其他条件触发,比如:一个网 ...
- 【C++系列小结】面向过程的编程风格
前言 编程语言有面向过程和面向对象之分,因此编程风格也有所谓的面向过程的编程和面向对象的编程,并且语言的性质不会限制编程的风格. 这里主要说一以下向过程的编程. "面向过程"(Pr ...
- zookeeper技术浅析
Zookeeper是hadoop的一个子项目,尽管源自hadoop,可是我发现zookeeper脱离hadoop的范畴开发分布式框架的运用越来越多. 今天我想谈谈zookeeper.本文不谈如何使用z ...
- spring jdbc连接数据库
1.在applicationContext.xml中配置jdbc bean <bean id="dataSource" class="org.springframe ...