[快乐开发] Java5&6新特性

<>++< 2011-01-30

1.增强的for循环(类似C#中的foreach循环)

		// 1.4
		int[] array = {1, 2, 3, 4};
		for (int nIndex = 0; nIndex < array.length; nIndex++) {
			System.out.println(array[nIndex]);
		}
		
		// 5.0
		int[] array = {1, 2, 3, 4};
		for (int nTmp : array) {
			System.out.println(nTmp);
		}

 在5.0中 这种增强for循环底层是用迭代器实现的,所以性能上毋庸置疑会比之前的for循环快,而且不会出现下标越界的exception。(PS:使用下标遍历的方式建议用递减的方式,--遍历比++遍历速度上有不小的差异 有兴趣可以google)

2.泛型数组列表

		// 1.4
		List list = ArrayList();
		list.add("1");
		String str = (String)list.get(0);

		// 5.0
		List<String> list = new ArrayList<String>();
		list.add("1");
		list.get(0);

 使用泛型可以省略显式类型转换。对代码的重构和代码的重用性有很大的提升。(PS:泛型类很复杂 尤其是泛型方法通配符,约束以及与java反射的联合使用,稍后会附上详细例子)

3. 自动打包(自动拆装箱)

		// 1.4
		int n1 = 1;
		Integer n = new Integer(n1);
		int n2 = n.intValue();

		// 5.0
		Integer n = n1;
		n2 = n;

5.0以后 JVM为我们做了这些类型转换的操作

4.变量参数列表

		// 1.4
		sumTwo(1, 2);
		sumThree(1, 2, 3);
		private int sumTwo(int a, int b) {
			return (a + b);
		}

		private int sumThree(int a, int b, int c) {
			return (a + b + c);
		}

		// 5.0 
		sumAnyWay(1, 2);
		sumAnyWay(1, 2, 3);
		private int sumAnyWay(int...array) {
			int sum = 0;
			for (int tmp : array) {
				sum += tmp;
			}
			return sum;
		}

 5.协变

说道协变就不得不谈到方法的覆盖,覆盖的规则是:1.三同,即在具有继承关系的两个类中,具有相同的方法名,相同的参数列表和相同的返回值修饰。2,子类的访问修饰符要>=父类的访问修饰符。(例如:父 private 子plubic)3.子类抛出的异常要<=父类抛出的异常。

针对第一条的三同原则,在JDK5.0中 又增加了一种情况,即子类的返回值修饰可以是父类该方法的返回值修饰的子类

这种情况叫协变

public class Test {
	public static void main(String []args) {
		ChildClass p = new ChildClass();
		// 不会覆盖父类中的getIt()方法
		p.getIt(1);// can't overrided
		// 会覆盖父类中的getIt()方法
		p.getIt();//  overrided->child method
	}
}

class ParentClass {
	public Object getIt(){
		System.out.println("parent method");
		return new Object();
	}
}
class ChildClass extends ParentClass {
	public String getIt(){
		System.out.println("overrided->child method");
		return new String();
	}
	public String getIt(int n){
		System.out.println("can't overrided");
		return new String();
	}
}

 6.静态导入

import static java.lang.Math;
import static java.lang.System;
out.println(sqrt(PI));

 7.控制台输入

增加了Scanner类

Scanner i = new Scanner(System.in);
int n = i.nextInt();
String str = i.nextLine();
 

 8.格式化输出

System类中加了printf(),学过C的人都会知道吧,和c的用法如出一辙

System.out.printf("%8.2f", x);

 不过个人觉得实际用途不是很大。。

 9.变长字符串

在1.4之前,变长字符串都是用的StringBuffer类,在1.5中出现了一个新的变长字符串即StringBilder类

两者的区别在于 Buffer类支持多线程,性能稍差,Builder类线程不安全,性能稍优。

PS:在JDK5.0中,除了以上的这些变动,其实很多类和很多方法都重写了,就是为了提高性能,Sun在JDK1.4就开始提高Java的运算性能,虽然1.4较1.3在性能上有了很大的提升,但从1.5的JDK中不难发现Sun还是不满足于性能现状,从JDK1.5版本的别名Tiger也能看出Sun提高性能的决心,1.6的别名是Mustang(野马) 我估计也是一个想法吧。。

以下是JDK1.5(5.0)中的所有变动

操作系统与硬件平台
支持的系统配置
64 位 AMD Opteron 处理器
虚拟机
Java 堆自我调整
类数据共享
垃圾收集器工效学
致命错误处理
Java 语言特性
Autoboxing/Unboxing
增强的 for 循环
泛型
元数据
静态导入
类型安全枚举
Varargs
核心库
网络
安全
国际化
Formatter 类
Scanner 类
JavaBeansTM 组件体系结构
集合框架
Java API for XML Processing (JAXP)
位操纵操作
Math 包
Instrumentation 包
序列化
并发实用程序
线程优先级
线程转储 API
监控和管理
集成库
远程方法调用(RMI)
Java 数据库连接(JDBC)
Java 命名和目录接口(JNDI)
用户接口
国际化
Java 声音技术
Java 2DTM 技术
图像 I/O
AWT
Swing
部署
一般部署
Java Web Start 部署
工具和工具体系结构
Java虚拟机工具接口(Java Virtual Machine Tool Interface,JVMTI)
Java平台调试器体系结构(Java Platform Debugger Architecture,JPDA)
Java 编译器(javac)
Javadoc 工具

看1.5新特性详细内容 摸我!

由于JDK6.0和JDK5.0相比,只是在网络编程方面做了改善,所以稳定性和5.0没什么区别,因为是网络编程方面,所以例子不太好写,大家可以参考以下URL:

1.6.0新特性:http://www.51cto.com/art/200611/35114.htm

2.改善XML:http://zangweiren.iteye.com/blog/647334

myspace1916 2012-03-09
非常好
qq330749800 2012-08-02
"PS:使用下标遍历的方式建议用递减的方式,--遍历比++遍历速度上有不小的差异",这个能详细解说一下原理么?我测试了一下,10万个长度的字符串数组,循环输出到控制台,--和++都测试了5次,怎么发现++的速度要快一些。
<>++< 2012-09-14
qq330749800 写道
"PS:使用下标遍历的方式建议用递减的方式,--遍历比++遍历速度上有不小的差异",这个能详细解说一下原理么?我测试了一下,10万个长度的字符串数组,循环输出到控制台,--和++都测试了5次,怎么发现++的速度要快一些。


RE:
--的话 每次比较的对象是0 这样就有可能不比较(不执行cmp指令),而是直接靠之前的整数运算设置的标志位来控制跳转。
比较详细的原理 可以参照一下,写的不错。
http://rednaxelafx.iteye.com/blog/545876
Global site tag (gtag.js) - Google Analytics