在看Java性能优化的一些文章中,不少都提到说new一个接口的性能一般要低于new一个类,
举例:
ArrayList<String> list = new ArrayList<String>();
        
        List<String> list2 = new ArrayList<String>();
一般都推荐用第一种方式,有点明白有似乎不明白,大拿能指点一二吗?

解决方案 »

  1.   

    ArrayList<String> list = new ArrayList<String>();//这就是普通的定义对象的方式
          
    List<String> list2 = new ArrayList<String>();//体现面向接口编程的思想
      

  2.   

    在JVM中对于一个具体类,查找方法表很容易确定方法的位置而接口是不好实现方法表的,所以要遍历以找到具体方法可参考《深入java虚拟机》第二版 P194~P199
      

  3.   

    理论上
    Java的public member函数,都是virtual,共识吧?
    我们调用list的某个方法,比如size()还是length()什么的,我不知道。JVM都会调用这个指令 invokevirtual,而不是invokespecial。
    那么就都是涉及到查找虚表的问题。你怎么就知道list 是 ArrayList<String>类型。而不是派生自它的list = new MyArrayList<String>()呢?声明成ArrayList<String>,恰巧也确实是这个类型的对象,可不表示这个类型没有派生类啊:)!实际上ArrayList<String> list = new ArrayList<String>();
    List<String> list2 = new ArrayList<String>();
    如果你写到一个函数里面了。
    又分别调用了
    list.length();
    list2.length();实际上编译器可能根据上下文,知道list2的实际对象,把invoke编译成非virtual的调用。都是有可能的。
    为了提速嘛。
    所以,看什么书,多少页都是扯淡的。
      

  4.   

    虚方法的动态分派问题可以参考《深入理解Java虚拟机 JVM高级特性与最佳实践》P214~P217  P220~P221如果说到JIT优化,不得不说到方法内联,对于虚方法该如何内联,参考《深入理解Java虚拟机 JVM高级特性与最佳实践》P307~P309