• java 关键字


      1.foreach 增强for循环(foreach循环)

    jdk1.5之后增加的新特性

    foreach简化了for循环遍历

    foreach语法最终被编译器转为了对Iterator.next()的调用,所以不会由下标遍历。而for循环则是采用下标访问。

    需要循环数组结构的数据时,建议使用普通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的。
    foreach实现原理

            2.this()和super()区别

    this() 一是引用调用隐式参数(本类中this.的成员变量),二是调用该类中其他构造函数

    super一是调用父类构造函数,二是调用父类的方法。

  • 相关阅读:
    vscode settings
    AutomaticPrefetchPlugin
    echarts 文字超长换行
    webpack篇(三):serve启动 打印台友好提示
    webpack篇(二):webpack 5 (变化)
    webpack篇(一):webpack 5 热更新体验
    面试(保存一些面试相关的网址链接,方便之后复习)
    路由传递参数的常见的两种形式
    组件缓存注意事项 ---keep-alive
    从css属性和布局来说明一下,行类元素和行类块元素和块元素的区别
  • 原文地址:https://www.cnblogs.com/feiguo/p/8290472.html
Copyright © 2020-2023  润新知