다음 코드를 실행하고 주석에 표시된 결과를 얻습니다. ==
과 .equals()
의 차이점을 알고 있습니다. 두 번째 줄의 코드가 세 번째 줄의 코드와 다른 결과를 얻는 이유는 무엇인지 이해할 수 없습니다.Java에서 "abc"+ "de"와 "abc"+ de (de = "de")의 차이점은 무엇입니까?
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
그리고 두 번째 문자열 연결을위한 출력 :
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");
난은 javap -c 명령 사용이 디버깅하는 노력에서
과 첫 번째 문자열 연결에 대한 다음과 같은 출력 '코드'를 가지고
나는이 '코드'너무 익숙하지 않은이고 이러한 차이가 존재하는 어떤 이유를 볼 수 없습니다. 왜 그런 차이가 발생하는지 설명 할 수 있습니까?
관련 post
실제 질문은 무엇입니까? (나는'=='이 string * references *이 아닌 string * references *을 비교한다는 것을 이미 알고 있다고 가정합니다)? – NPE
'String.equals (....) '메쏘드를 보라.'=='연산자와 같지 않다 ... – vikingsteve
"그 코드"를 이해하려면 ... [http] : //docs.oracle.com/javase/specs/jvms/se7/html/jvms-6.html). –