Jemand hat diese Frage erneut gestellt (Duplikat), was mich dazu veranlasst hat, mich mit diesem Thema etwas eingehender zu beschäftigen.
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("a");
list.add("b");
ArrayList<String> aList = new ArrayList<String>();
aList.add("a");
aList.add("b");
}
Wenn wir einen Bytecode-Viewer verwenden (ich habe http://asm.ow2.org/eclipse/index.html ), dann sehen Sie das Folgende (nur Listeninitialisierung und Zuweisung) für unsere Liste Schnipsel:
L0
LINENUMBER 9 L0
NEW ArrayList
DUP
INVOKESPECIAL ArrayList.<init> () : void
ASTORE 1
L1
LINENUMBER 10 L1
ALOAD 1: list
LDC "a"
INVOKEINTERFACE List.add (Object) : boolean
POP
L2
LINENUMBER 11 L2
ALOAD 1: list
LDC "b"
INVOKEINTERFACE List.add (Object) : boolean
POP
und für alist :
L3
LINENUMBER 13 L3
NEW java/util/ArrayList
DUP
INVOKESPECIAL java/util/ArrayList.<init> ()V
ASTORE 2
L4
LINENUMBER 14 L4
ALOAD 2
LDC "a"
INVOKEVIRTUAL java/util/ArrayList.add (Ljava/lang/Object;)Z
POP
L5
LINENUMBER 15 L5
ALOAD 2
LDC "b"
INVOKEVIRTUAL java/util/ArrayList.add (Ljava/lang/Object;)Z
POP
Der Unterschied ist Liste endet mit einem Anruf INVOKEINTERFACE während aList ruft auf. INVOKEVIRTUAL . Gemäß der Referenz des Bycode Outline Plugin,
invokeinterface wird verwendet, um eine Methode aufzurufen, die innerhalb einer Java Schnittstelle
während invokevirtual
ruft alle Methoden mit Ausnahme der Schnittstellenmethoden auf (diese verwenden invokeinterface), statische Methoden (die invokestatic verwenden) und die wenigen Spezialfälle, die von invokespecial behandelt werden.
Zusammenfassend lässt sich sagen, dass invokevirtual pops objectref vom Stapel, während für invokeinterface
holt der Interpreter 'n' Elemente vom Operandenstapel, wobei 'n' ein 8-Bit-Parameter ohne Vorzeichen ist Integer-Parameter aus dem Bytecode ist. Das erste dieser Elemente ist objectref, ein Verweis auf das Objekt, dessen Methode gerade aufgerufen wird.
Wenn ich das richtig verstanden habe, besteht der Unterschied im Wesentlichen darin, wie jede Methode die Daten abruft. objectref .