Heim > Java > javaLernprogramm > Hauptteil

Was sind Parameter variabler Länge in Java? Was ist das Prinzip der foreach-Schleife?

青灯夜游
Freigeben: 2018-10-19 17:21:01
nach vorne
2207 Leute haben es durchsucht

Der Inhalt dieses Artikels besteht darin, vorzustellen, was Parameter variabler Länge in Java sind. Was ist das Prinzip der foreach-Schleife? Es hat einen gewissen Referenzwert. Freunde in Not können sich darauf beziehen. Ich hoffe, es wird Ihnen hilfreich sein.

1. Syntaktischer Zucker

Syntaktischer Zucker ist eine Annehmlichkeit, die Programmierern mehr oder weniger zur Verfügung stellt Code besteht lediglich aus einigen Tricks, die vom -Compiler implementiert werden. Zur Verarbeitung dieser Syntaxen werden bestimmte Bytecodes oder bestimmte Methoden verwendet, die Entwickler verwenden können sie direkt und bequem. Obwohl diese syntaktischen Zucker keine wesentlichen funktionalen Verbesserungen bewirken, können sie die Leistung verbessern, die Genauigkeit der Syntax verbessern oder die Wahrscheinlichkeit von Codierungsfehlern verringern . Java bietet Benutzern eine Menge Syntaxzucker, wie z. B. Generika, Autoboxing, Autounboxing, Foreach-Schleifen, Parameter variabler Länge, innere Klassen, Aufzählungsklassen, Behauptungen usw.

2. Parameter variabler LängeLassen Sie uns zunächst über Parameter variabler Länge sprechen. Schauen Sie sich einen Codeabschnitt an:

public static void main(String[] args)
{
    print("000", "111", "222", "333");
}
    
public static void print(String... strs)
{
    for (int i = 0; i < strs.length; i++)
    {
        System.out.println(strs[i]);
    }
}
Nach dem Login kopieren

Die Parameter der print-Methode bedeuten, dass die Anzahl der eingehenden Strings variabel ist Schauen Sie sich die laufenden Ergebnisse des Codes an:

000
111
222
333
Nach dem Login kopieren
Ich habe Array-Traversal verwendet. Die Methode hat die Eingabeparameter erfolgreich durchlaufen, was zwei Probleme veranschaulicht:

1 Sie können die Methode zum Durchlaufen des Arrays verwenden, um die Parameter variabler Länge zu durchlaufen

2. Variable Parameter werden mithilfe von Arrays implementiertIn diesem Fall kann ich die Hauptfunktion tatsächlich so schreiben, absolut fein:

String[] strs = {"000", "111", "222", "333"};
print(strs);
Nach dem Login kopieren

Wäre es nicht besser, ein Array direkt zu übergeben? Das Problem ist, dass die Länge des Arrays angegeben werden muss. Was ist, wenn ich dieses Mal 2 Strings und das nächste Mal 3 Strings übergeben möchte?

Beachten Sie abschließend, dass

der Parameter variabler Länge als letzter Parameter in der Methodenparameterliste verwendet werden muss und es nur einen Parameter variabler Länge in der Methodenparameterliste geben kann.

3. Prinzip der foreach-Schleife So wurde die foreach-Schleife früher verwendet, was mich dazu inspirierte, das Prinzip zu studieren Der Grund dafür ist, dass ich vor etwa zwei Monaten selbst eine ArrayList geschrieben habe, um sie zu durchlaufen, um die Auswirkung des Schreibens zu sehen, aber eine Nullzeigerausnahme gemeldet wurde. In diesem Artikel geht es um das Prinzip der foreach-Schleife. Schauen Sie sich zunächst diesen Code an:

public static void main(String[] args)
{
    List<String> list = new ArrayList<String>();
    list.add("111");
    list.add("222");
    
    for (String str : list)
    {
        System.out.println(str);
    }
}
Nach dem Login kopieren

Verwenden Sie die foreach-Schleife, um diese Liste zu durchlaufen. Ich werde das Ergebnis nicht erklären. Schauen Sie sich an, wie Java mit dieser foreach-Schleife umgeht:

F:\代码\MyEclipse\TestArticle\bin\com\xrq\test21>javap -verbose TestMain.class
Nach dem Login kopieren

Der dekompilierte Inhalt enthält Klasseninformationen, Symbolreferenzen und Bytecode-Informationen:

public static void main(java.lang.String[]);
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=2, locals=4, args_size=1
         0: new           #16                 // class java/util/ArrayList
         3: dup
         4: invokespecial #18                 // Method java/util/ArrayList."<in
it>":()V
         7: astore_1
         8: aload_1
         9: ldc           #19                 // String 111
        11: invokeinterface #21,  2           // InterfaceMethod java/util/List.
add:(Ljava/lang/Object;)Z
        16: pop
        17: aload_1
        18: ldc           #27                 // String 222
        20: invokeinterface #21,  2           // InterfaceMethod java/util/List.
add:(Ljava/lang/Object;)Z
        25: pop
        26: aload_1
        27: invokeinterface #29,  1           // InterfaceMethod java/util/List.
iterator:()Ljava/util/Iterator;
Nach dem Login kopieren

Es spielt keine Rolle, ob Sie es nicht verstehen. New, dup und invokespecial sind ursprünglich in der Bytecode-Anweisungstabelle definierte Anweisungen. Die virtuelle Maschine führt den angegebenen C++-Code aus, um die Funktion zu vervollständigen jede Anweisung. Der Schlüssel liegt darin, die Zeilen 21 und 22 zu sehen. Ich habe einen Iterator gesehen und bin zu dem Schluss gekommen:

Während der Kompilierung vergleicht der Compiler automatisch nacheachDie Verwendung dieses Schlüsselworts bedeutet Verwendung des Iterators, Dies ist das Prinzip der foreach-Schleife. Darüber hinaus ziehen wir zwei weitere Schlussfolgerungen: 1. Der Grund, warum ArrayList mit der foreach-Schleife durchlaufen werden kann, liegt darin, dass die gesamte ArrayList-Liste vorhanden ist ist eine Unterschnittstelle von Collection, und Collection ist eine Unterschnittstelle von

Iterable. AbstractList, die übergeordnete Klasse von ArrayList, implementiert die Iteratormethode der Iterable-Schnittstelle korrekt. Zuvor hat die ArrayList, die ich selbst geschrieben habe, mithilfe einer foreach-Schleife direkt eine Nullzeigerausnahme gemeldet, da die ArrayList, die ich selbst geschrieben habe, die Iterable-Schnittstelle nicht implementiert hat

2、任何一个集合,无论是JDK提供的还是自己写的只要想使用foreach循环遍历,就必须正确地实现Iterable接口实际上,这种做法就是23中设计模式中的迭代器模式

数组呢?

上面的讲完了,好理解,但是不知道大家有没有疑问,至少我是有一个疑问的:数组并没有实现Iterable接口啊,为什么数组也可以用foreach循环遍历呢?先给一段代码,再反编译:

public static void main(String[] args)
{
    int[] ints = {1,2,3,4,5};
        
    for (int i : ints)
        System.out.println(i);
}
Nach dem Login kopieren

同样反编译一下,看一下关键的信息:

0: iconst_2
         1: newarray       int
         3: dup
         4: iconst_0
         5: iconst_1
         6: iastore
         7: dup
         8: iconst_1
         9: iconst_2
        10: iastore
        11: astore_1
        12: aload_1
        13: dup
        14: astore        5
        16: arraylength
        17: istore        4
        19: iconst_0
        20: istore_3
        21: goto          39
        24: aload         5
        26: iload_3
        27: iaload
        28: istore_2
        29: getstatic     #16                 // Field java/lang/System.out:Ljav
a/io/PrintStream;
        32: iload_2
        33: invokevirtual #22                 // Method java/io/PrintStream.prin
tln:(I)V
        36: iinc          3, 1
        39: iload_3
        40: iload         4
        42: if_icmplt     24
        45: return
Nach dem Login kopieren

这是完整的这段main函数对应的45个字节码指令,因为这涉及一些压栈、出栈、推送等一些计算机原理性的内容且对于这些字节码指令的知识的理解需要一些C++的知识,所以就不解释了。简单对照字节码指令表之后,我个人对于这45个字节码的理解是Java将对于数组的foreach循环转换为对于这个数组每一个的循环引用

总结:以上就是本篇文的全部内容,希望能对大家的学习有所帮助。更多相关教程请访问Java视频教程java开发图文教程bootstrap视频教程

Das obige ist der detaillierte Inhalt vonWas sind Parameter variabler Länge in Java? Was ist das Prinzip der foreach-Schleife?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:csdn.net
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!