在看Java性能优化的一些文章中,不少都提到说new一个接口的性能一般要低于new一个类,
举例:
ArrayList<String> list = new ArrayList<String>();
List<String> list2 = new ArrayList<String>();
一般都推荐用第一种方式,有点明白有似乎不明白,大拿能指点一二吗?
举例:
ArrayList<String> list = new ArrayList<String>();
List<String> list2 = new ArrayList<String>();
一般都推荐用第一种方式,有点明白有似乎不明白,大拿能指点一二吗?
List<String> list2 = new ArrayList<String>();//体现面向接口编程的思想
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的调用。都是有可能的。
为了提速嘛。
所以,看什么书,多少页都是扯淡的。