Uruchomiłem poniższy kod i otrzymałem wyniki wyświetlane w komentarzach. Znam różnice między ==
i .equals()
. Nie rozumiem, dlaczego mój kod w drugiej linii ma inne wyniki niż kod w trzeciej linii.Różnice między "abc" + "de" i "abc" + de (de = "de") w Javie?
String de = "de";
// String abcde = "abc" + "de"; // abcde == "abcde" reture true
String abcde = "abc" + de; // abcde == "abcde" reture false;
System.out.println();
System.out.println(abcde=="abcde");
System.out.println(de=="de");
Próbując debugowania to użyłem polecenia -c javap i mam następujący komunikat „kod” dla pierwszego ciągu konkatenacji:
Code:
0: ldc #9; //String de
2: astore_1
3: new #10; //class java/lang/StringBuilder
6: dup
7: invokespecial #11; //Method java/lang/StringBuilder."<init>":()V
10: ldc #4; //String abc
12: invokevirtual #12; //Method java/lang/StringBuilder.append:(Ljava/lang
String;)Ljava/lang/StringBuilder;
15: aload_1
16: invokevirtual #12; //Method java/lang/StringBuilder.append:(Ljava/lang
String;)Ljava/lang/StringBuilder;
19: invokevirtual #13; //Method java/lang/StringBuilder.toString:()Ljava/l
ng/String;
22: astore_2
23: getstatic #14; //Field java/lang/System.out:Ljava/io/PrintStream;
26: invokevirtual #15; //Method java/io/PrintStream.println:()V
29: getstatic #14; //Field java/lang/System.out:Ljava/io/PrintStream;
32: aload_2
33: ldc #16; //String abcde
35: if_acmpne 42
38: iconst_1
39: goto 43
42: iconst_0
43: invokevirtual #17; //Method java/io/PrintStream.println:(Z)V
46: getstatic #14; //Field java/lang/System.out:Ljava/io/PrintStream;
49: aload_1
50: ldc #9; //String de
52: if_acmpne 59
55: iconst_1
56: goto 60
59: iconst_0
60: invokevirtual #17; //Method java/io/PrintStream.println:(Z)V
63: return
a wyjście dla drugiego połączonego łańcucha znaków:
nie jestem tak obeznany z tym „kodu” i nie widzę żadnego powodu, dla którego istnieje te różnice. Czy ktoś mógłby wyjaśnić, dlaczego te różnice się zdarzają?
Powiązane post
Jakie jest aktualne pytanie? (Zakładam, że już wiesz, że '==' porównuje ciąg * referencje *, a nie ciąg * treść *)? – NPE
Zobacz metodę 'String.equals (....)', to NIE jest to samo co '==' operator ... – vikingsteve
Aby zrozumieć "Ten kod" ... można odnieść się do dokumentu [zestawu instrukcji JVM] (http : //docs.oracle.com/javase/specs/jvms/se7/html/jvms-6.html). –