Wie viele der vier grundlegenden Java -Fragen können Sie sagen?
1. Verwendung von == Symbol
Schauen Sie sich zunächst einen interessanteren Code an
Ganzzahl A = 1000, B = 1000; Ganzzahl C = 100, d = 100; public void mrun (endgültiger Zeichenfolge Name) {new Runnable () {public void run () {System.out.println (Name); }}; } System.out.println (a == b); System.out.println (c == d); Wenn Sie die richtige Antwort auf diese Frage erhalten und das Prinzip verstehen können. Es bedeutet, dass Ihre Grundlagen in Ordnung sind. Wenn Ihre Antwort wahr und wahr ist, fehlt Ihrem Stiftung.
Veröffentlichen Sie zunächst die Antwort, führen Sie den Code aus und wir werden falsch wahr werden. Wir wissen, dass == die Referenzen der beiden Objekte vergleicht. Das ABCD hier ist beide neu erstellte Objekte. Theoretisch sollte Falsch eingegeben werden. Das ist das Interessante an dieser Frage. Unabhängig davon, ob es sich um die Interviewfrage oder den Forum -Diskussionsbereich handelt, ist die Erscheinungsquote dieser Frage sehr hoch. Das Prinzip ist eigentlich sehr einfach. Schauen wir uns die Integer.java -Klasse an und Sie werden sie verstehen.
public static Integer Valueof (int i) {return i> = 128 || i <-128? New Integer (i): small_values [i + 128]; } / ** * Ein Cache von Instanzen, die von {@link Integer#valueof (int)} und automatisch begleitet werden * / private statische Final Integer [] small_values = new Integer [256]; static {für (int i = -128; i <128; i ++) {small_values [i+128] = new Integer (i); }} Wenn wir eine Ganzzahl deklarieren c = 100;. Zu diesem Zeitpunkt wird der automatische Boxbetrieb durchgeführt. Um es einfach auszudrücken, bedeutet dies, den grundlegenden Datentyp in ein ganzzahliges Objekt zu konvertieren und es in ein ganzzahliges Objekt zu konvertieren, die aufgerufene Werte -OF -Methode. Sie können sehen, dass -128-127 in Ganzzahl zwischengespeichert wird. Die offizielle Erklärung ist, dass kleine Zahlen häufiger verwendet werden. Um die Leistung zu optimieren, werden die Zahlen zwischen ihnen zwischengespeichert. Aus diesem Grund ist die Antwort auf diese Frage falsch und ture. Wenn der Wert des deklarierten Integer -Objekts zwischen -128-127 liegt, wird auf das gleiche Objekt verwiesen, sodass das Ergebnis wahr ist.
2. String
Dann schauen Sie sich den Code an
String S1 = "ABC"; String S2 = "ABC"; String s3 = new String ("ABC"); System.out.println (S1 == S2); System.out.println (S1 == S3); Raten wir mal, was die Antwort auf diese Frage ist?
Nach der Syntax von == sind S1, S2 und S3 zunächst drei verschiedene Objekte. Der gesunde Menschenverstand ist alle falsch. Die laufenden Ergebnisse des Programms sind jedoch in der Tat wahr und falsch. Die zweite Ausgabe False ist verständlich und die erste Ausgabe, die wahr ist, ist wieder rätselhaft. Wir wissen, dass einige grundlegende Variablen und Referenzvariablen des Objekts im Stapelspeicher der Funktion zugewiesen werden, während neue Objekte und Arrays im Heap -Speicher gespeichert werden. Darüber hinaus gibt es jedoch einen anderen Bereich, der als konstanter Pool bezeichnet wird. Wie wir normalerweise möchten, dass String s1 = "ABC";, der Wert des deklarierten Zeichenfolgenobjekts wird in einem konstanten Pool gespeichert. Wenn wir ein Objekt wie Zeichenfolge S1 = "ABC" erstellen, wird "ABC" im konstanten Pool gespeichert (auch als String -Pool bezeichnet). Wenn wir eine Referenzzeichenfolge S2 = "ABC" erstellen, wird die zugrunde liegende Java -Schicht priorisiert, ob "ABC" im konstanten Pool existiert. Wenn es vorhanden ist, lassen Sie S2 auf diesen Wert hinweisen und wird ihn nicht neu erstellen. Wenn es keinen konstanten Pool gibt, wird er erstellt und zum Pool hinzugefügt. Deshalb sind die Antworten wahr und falsch.
3. Schließende Schlüsselwort <br /> schauen wir uns ein Stück Code an
public void mrun (endgültiger Zeichenfolge Name) {new Runnable () {public void run () {try {thread.sleep (1000); } catch (InterruptedException e) {// Todo automatisch generierter Catch-Block e.printstacktrace (); } System.out.println (Name); } }.Start(); } Ich glaube, jeder hat viel von dieser Art von Code geschrieben. Wenn interne Klassen auf lokale Variablen zugreifen, müssen sie vor den lokalen Variablen einen endgültigen Modifikator hinzufügen, andernfalls meldet der Compiler einen Fehler. Normalerweise machen wir das Gleiche. Ok, die zweite Frage ist, warum der endgültige Modifikator hinzufügen? Ich glaube, die meisten meiner Freunde haben noch nie über dieses Problem nachgedacht. Wenn sie es verwenden, fügen Sie es einfach direkt hinzu und haben Sie sich nie in die Prinzipien eingeteilt. Dies ist für einen ausgezeichneten Programmierer nicht wünschenswert. Wir müssen nicht nur die Wahrheit, sondern auch den Grund kennen.
Lassen Sie uns nun analysieren, warum Sie das endgültige Keyword hinzufügen müssen. Erstens befindet sich der Lebenszyklus der internen Klasse auf der Ebene der Mitgliedsebene, während der Lebenszyklus lokaler Variablen in der Methodenkörper liegt. Mit anderen Worten, diese Situation wird auftreten. Wenn die MRUN -Methode ausgeführt wird, wird der neue Thread ausgeführt und der neue Thread für eine Sekunde schläft. Der Haupt -Thread wird weiter ausgeführt, MRUN wird ausgeführt und der Namensattributlebenszyklus endet. Nach 1 Sekunde wird Syetem.out.printh (Name) ausgeführt. Zu diesem Zeitpunkt ist der Name jedoch gestorben und ist nicht mehr in Erinnerung. Java soll diesen Fehler beseitigen und müssen ausschließlich lokale Variablen in internen Klassen mit endgültigen Schlüsselwörtern geändert werden. Nachdem die lokale Variable durch endgültig geändert wurde, wird eine lokale Replik im Speicher beibehalten. Wenn die interne Klasse zugreift, wird tatsächlich zugegriffen. Dies ist so, als würde man den Lebenszyklus einer lokalen Variablen länger machen. Schließlich war es der Java -Ingenieur, der diese Grube im Voraus für uns ausgefüllt hat, sonst frage ich mich, wie viele Freunde sich um interne lokale Variablen sorgen würden.
4. Ganzzahl und int
Schauen Sie sich den folgenden Code an
Ganzzahl a = New Integer (1000); int b = 1000; Ganzzahl C = New Integer (10); Ganzzahl D = New Integer (10); System.out.println (a == b); System.out.println (c == d);
Diese Frage ist eine Folge der ersten Frage. Wenn Sie die Antwort auf diese Frage schnell erhalten können, herzlichen Glückwunsch, auch wenn Sie die Vergleichsfunktion == gründlich gemeistert haben.
Geben Sie die richtige Antwort an: wahr, falsch
Viele Freunde sind verwirrt, nachdem sie diese Antwort gesehen haben. Sprechen wir zuerst über die zweite. Laut der ersten Frage haben Ganzzahl nicht -128-127 zwischenzahlt? Dies sollte wahr sein, aber wenn Sie genau hinschauen, wird die ganze Zahl hier von uns erstellt, nicht mit Cache, sodass das Ergebnis falsch ist. Lassen Sie uns jetzt sehen, warum der erste wieder wahr ist? Zunächst einmal ist der Wert hier 1000, was definitiv nichts mit dem Ganzzahl -Cache zu tun hat, wie wir ihn kennen. Da es nichts mit Cache zu tun hat, ist A das Objekt aus dem neuen neuen, die Eingabe sollte falsch sein. Beachten Sie jedoch, dass B hier der int -Typ ist. Wenn INT und Integer compare ==, werden Java automatisch Unbox Integer freibekommen, dh Ganzzahl in einen int -Typ umwandeln, sodass der Wert des INT -Typs hier verglichen wird, sodass das Ergebnis wahr ist.
Nachdem Sie ein paar Fragen korrekt gemacht haben, beeilen Sie sich und überprüfen Sie die Auslassungen und füllen Sie die Lücken gemäß Ihrem eigenen Testlevel!