[快乐开发] 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)中的所有变动 操作系统与硬件平台 由于JDK6.0和JDK5.0相比,只是在网络编程方面做了改善,所以稳定性和5.0没什么区别,因为是网络编程方面,所以例子不太好写,大家可以参考以下URL: |
|
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 |