자바에서 명시 적 및 암시 인스턴스화하는 String 클래스의 차이점은 무엇입니까 Do not do this "그리고 새로운 String() 생성자를위한 하나! 그들은 -c와 함께 그러나 동일내가 두 번 인용 구문에 문자열의 두 인스턴스를 생성하기 때문에이</p> <pre><code>String s = new String("Don't do this"); // explicit </code></pre> <p>같은 문자열 인스턴스를 생성하는 "성능 문제가 있다고 들었습니다
C:\jav>javap String1
Compiled from "String1.java"
public class String1 extends java.lang.Object{
public String1();
public static void main(java.lang.String[]);
}
C:\jav>javap String2
Compiled from "String2.java"
public class String2 extends java.lang.Object{
public String2();
public static void main(java.lang.String[]);
}
같다 : 여기
public class String1 {
public static void main(String[] args) {
String s = new String("Hello");
System.out.println(s);
}
}
public class String2 {
public static void main(String[] args) {
String s = "Hello";
System.out.println(s);
}
}
은은 javap의 출력 :
오늘은 내가 두 개의 클래스를 만들어 내 자신에 의해 그것을 테스트하는 시간을 가졌다 플래그는 출력이 다릅니다. 그래서 여기
C:\jav>javap -c String1
Compiled from "String1.java"
public class String1 extends java.lang.Object{
public String1();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: new #2; //class java/lang/String
3: dup
4: ldc #3; //String Hello
6: invokespecial #4; //Method java/lang/String."<init>":(Ljava/lang/String;)V
9: astore_1
10: getstatic #5; //Field java/lang/System.out:Ljava/io/PrintStream;
13: aload_1
14: invokevirtual #6; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
17: return
}
C:\jav>javap -c String2
Compiled from "String2.java"
public class String2 extends java.lang.Object{
public String2();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: ldc #2; //String Hello
2: astore_1
3: getstatic #3; //Field java/lang/System.out:Ljava/io/PrintStream;
6: aload_1
7: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
10: return
}
내 질문입니다 :) 최초의 "LDC는"무엇을, astore_1 등? 그 (것)들을 기술하는 어떤 문서 있는가? 초 javac이 실제로이 두 문장이 동일하지 않은 것을 알 수 없습니까 ??
[Java 가상 시스템 사양] (http://docs.oracle.com/javase/specs/jvms/se7/html/)에서 이러한 의미를 알 수 있습니다. –
'new String()'작업을 다시 한 번 말 했으니까요. 이 작업은 원래 문자열의 문자 배열을 "공유"하므로 모든 Java 생성자 중 가장 빠른 것입니다. (일부 이국적인 경우를 제외하고는 이것을 수행하는 데있어 아무런 의미가 없습니다.) –
'String'을 명시 적으로 생성하면 다른 객체가 생성됩니다.이 객체는 초기화 값의 실제 문자열 내용 (char 배열)을 공유합니다. 따라서 여분의 객체의 오버 헤드가 있습니다. –