1.foreach 加强for循环(foreach循环)java
jdk1.5以后增长的新特性数组
foreach简化了for循环遍历安全
foreach语法最终被编译器转为了对Iterator.next()的调用,因此不会由下标遍历。而for循环则是采用下标访问。ide
须要循环数组结构的数据时,建议使用普通for循环,由于for循环采用下标访问,对于数组结构的数据来讲,采用下标访问比较好。函数
须要循环链表结构的数据时,必定不要使用普通for循环,这种作法很糟糕,数据量大的时候有可能会致使系统崩溃。优化
到底是如何实现foreach的呢,想一想多是编译器作了优化,就看了下最终编译成的字节码 public class Iterable_eros { List<String> strings; public void display(){ for(String s : strings){ System.out.println(s); } } 相应的字节码为 public void display (){ line0 : aload_0 getfield java.util.List my.lang.Iterable_eros.strings invokeinterface java.util.Iterator java.util.List.iterator() 1 astore_2 goto line30 line13 : aload_2 invokeinterface java.lang.Object java.util.Iterator.next() 1 checkcast java.lang.String astore_1 line23 : getstatic java.io.PrintStream java.lang.System.out aload_1 line27 : invokevirtual void java.io.PrintStream.println(java.lang.String) line30 : aload_2 invokeinterface boolean java.util.Iterator.hasNext() 1 ifne line13 line39 : return 果真没猜错哈!能够看到,foreach语法最终被编译器转为了对Iterator.next()的调用。而做为使用者的咱们, jdk并没用向咱们暴露这些细节,咱们甚至不须要知道Iterator的存在,认识到jdk的强大之处了吧。 为了证明本身的想法,用Iterator写了个遍历List的方法查看了字节码,果真跟foreach的形式基本同样,固然这是后话~ public void display(){ for(String s : strings){ System.out.println(s); } Iterator<String> iterator = strings.iterator(); while(iterator.hasNext()){ String s = iterator.next(); System.out.println(s); } } public void display (){ line0 : aload_0 getfield java.util.List my.lang.Iterable_eros.strings invokeinterface java.util.Iterator java.util.List.iterator() 1 astore_2 goto line30 line13 : aload_2 invokeinterface java.lang.Object java.util.Iterator.next() 1 checkcast java.lang.String astore_1 line23 : getstatic java.io.PrintStream java.lang.System.out aload_1 line27 : invokevirtual void java.io.PrintStream.println(java.lang.String) line30 : aload_2 invokeinterface boolean java.util.Iterator.hasNext() 1 ifne line13 aload_0 getfield java.util.List my.lang.Iterable_eros.strings invokeinterface java.util.Iterator java.util.List.iterator() 1 astore_1 line49 : goto line69 line52 : aload_1 invokeinterface java.lang.Object java.util.Iterator.next() 1 checkcast java.lang.String astore_2 line62 : getstatic java.io.PrintStream java.lang.System.out aload_2 line66 : invokevirtual void java.io.PrintStream.println(java.lang.String) line69 : aload_1 invokeinterface boolean java.util.Iterator.hasNext() 1 ifne line52 line78 : return 这边还发现一个比较有趣的现象:在取Iterator.next()以后并在把该值load进内容栈以前,编译器调用了checkcast java.lang.String方法来进行类型安全检查,jdk应该是采用这个来检测并抛出ClassCastException的。
2.this()和super()区别this
this() 一是引用调用隐式参数(本类中this.的成员变量),二是调用该类中其余构造函数spa
super一是调用父类构造函数,二是调用父类的方法。code