source

문자열 개체와 문자열 리터럴의 차이

lovecheck 2023. 1. 2. 22:41
반응형

문자열 개체와 문자열 리터럴의 차이

와의 차이는 무엇입니까?

String str = new String("abc");

그리고.

String str = "abc";

문자열 리터럴을 사용하는 경우 문자열을 삽입할 수 있지만new String("...")새로운 문자열 오브젝트가 생성됩니다.

이 예에서는 두 문자열 리터럴이 같은 개체를 참조하고 있습니다.

String a = "abc"; 
String b = "abc";
System.out.println(a == b);  // true

여기에서는 2개의 다른 오브젝트가 생성되어 서로 다른 참조가 있습니다.

String c = new String("abc");
String d = new String("abc");
System.out.println(c == d);  // false

일반적으로 가능한 경우 문자열 리터럴 표기법을 사용해야 합니다.읽기 쉽고 컴파일러가 코드를 최적화할 수 있습니다.

String 리터럴은 Java 언어 개념입니다.이것은 String 리터럴입니다.

"a String literal"

String 객체는 의 개별 인스턴스입니다.java.lang.String학급.

String s1 = "abcde";
String s2 = new String("abcde");
String s3 = "abcde";

모두 유효하지만 약간의 차이가 있습니다. s1내장된 String 객체를 참조합니다.즉, 문자 시퀀스가"abcde"중앙 위치에 저장될 것이며, 같은 리터럴이 저장될 수 있습니다."abcde"를 다시 사용하면 JVM은 새 String 개체를 생성하지 않고 캐시된 String 참조를 사용합니다.

s2새로운 String 객체가 될 것이 확실하기 때문에 이 경우 다음과 같이 됩니다.

s1 == s2 // is false
s1 == s3 // is true
s1.equals(s2) // is true

여기서 긴 답이 나오니까 짧은 걸로 할게요.

이 경우:

String str = "abc";

전화하고 있습니다.intern()string의 메서드는 String 입니다.메서드는 내부 풀을 참조합니다.String물건들.호출한 문자열이intern()는 이미 풀에 있습니다.그러면 해당 풀에 대한 참조가 됩니다.String에 할당되어 있다.str그렇지 않은 경우, 새로워진행된String이 풀에 배치되고 다음으로 이 풀에 대한 참조가 할당됩니다.str.

다음 코드가 지정됩니다.

String str = "abc";
String str2 = "abc";
boolean identity = str == str2;

다음을 수행하여 개체 ID를 확인하는 경우==(이러한 2개의 레퍼런스가 같은 오브젝트를 가리키고 있는지 말 그대로 묻고 있습니다).true.

하지만, 당신은 그것을 할 필요가 없다.intern() Strings. 새로 작성하도록 강제할 수 있습니다.Object히프상에서 다음과 같이 동작합니다.

String str = new String("abc");
String str2 = new String("abc");
boolean identity = str == str2;

이 경우,str그리고.str2에 대한 참조가 다릅니다.Objects둘 다 인턴이 되어 있지 않기 때문에 테스트 할 때Object사용 아이덴티티==, 을 얻을 수 있습니다.false.

좋은 코딩 관행의 관점에서: 사용하지 마십시오.==문자열의 동일성을 확인하려면.equals()대신.

문자열은 불변하기 때문에 다음과 같이 합니다.

String a = "xyz"

중 값 ""가 풀 합니다."xyz"'a'는 단순히 해당 문자열의 참조일 뿐 새로운 String 객체는 생성되지 않습니다.

하지만 당신이 말한다면:

String a = new String("xyz")

JVM을 합니다.String 「」의 라도)"xyz"수영장에 있습니다.

상세한 것에 대하여는, 여기를 참조해 주세요.

"abc"을 사용하다

으로 풀링되고 of Java가 풀링됩니다."abc"코드 내에서 문자열 리터럴이 선언된 경우 사용됩니다. ★★★★★★★★★★★★★★★★★."abc" == "abc"가가가가가가 가가 가가 가가 가가 가가 가가 가가 가가 가가.

원하는 문자열을 내부 풀링된 문자열에 추가할 수 있는 방법을 사용하면 Java가 종료될 때까지 메모리에 유지됩니다.

「」, 「」를 사용합니다.new String("abc")는 새로운 이는 논리적으로 '메모리'와 .이것은 논리적으로 같은 것입니다."abc"문자 그대로의 "abc" == new String("abc")논리적으로는 동일하지만 다른 인스턴스를 참조하기 때문에 항상 false가 됩니다.

String 컨스트럭터를 문자열 리터럴로 감싸는 것은 의미가 없습니다.필요한 것보다 많은 메모리를 불필요하게 사용할 뿐입니다.

문자열은 다른 프로그래밍 언어와는 다른 Java 클래스입니다.따라서 모든 클래스에 대해 객체 선언 및 초기화는 다음과 같습니다.

String st1 = new String();

또는

String st2 = new String("Hello"); 
String st3 = new String("Hello");

서서,,st1,st2 ★★★★★★★★★★★★★★★★★」st3는 다른 오브젝트입니다.

즉, 다음과 같습니다.

st1 == st2 // false
st1 == st3 // false
st2 == st3 // false

★★★★★★★★★★★★★★★★★★st1,st2,st3 오브젝트와 3개의 오브젝트를 하고 있습니다.==는, 에, 그 결과 「메모리 로케이션의 동일성」, 「메모리 로케이션의 동일성」, 「메모리 로, 「메모리 로케이션의 동일성」이 확인됩니다.

단,

st1.equals(st2) // false
st2.equals(st3) // true

서 ★★★★.equals()는 내용을하고 메서드의 을 확인합니다.st1 = "",st2 = "hello" ★★★★★★★★★★★★★★★★★」st3 = "hello"결과는 이렇습니다.

그리고 String 선언의 경우

String st = "hello";

서서,,intern()의 of의 String되어 " " " "가 "인지 합니다."hello"pool에 pool에 되지 않은 pool에 "hello할 경우 intern을 합니다.렇intern않않 intern interninterninterninternintern인턴.intern "hello " hello 。st."hello"

따라서 다음과 같은 경우:

String st3 = "hello";
String st4 = "hello"; 

여기:

st3 == st4 // true

★★★★★★★★★★★★★★★★★★st3 ★★★★★★★★★★★★★★★★★」st4이치노

기타:

st3.equals(st4);  // true as usual

첫 번째 경우 두 개의 개체가 생성됩니다.

두 번째 경우엔, 딱 하나야.

str라고 하는 은요, 라고 하는 것을 ."abc".

어떤 분해는 항상 흥미롭다...

$ cat Test.java 
public class Test {
    public static void main(String... args) {
        String abc = "abc";
        String def = new String("def");
    }
}

$ javap -c -v Test
Compiled from "Test.java"
public class Test extends java.lang.Object
  SourceFile: "Test.java"
  minor version: 0
  major version: 50
  Constant pool:
const #1 = Method  #7.#16;  //  java/lang/Object."<init>":()V
const #2 = String  #17;     //  abc
const #3 = class   #18;     //  java/lang/String
const #4 = String  #19;     //  def
const #5 = Method  #3.#20;  //  java/lang/String."<init>":(Ljava/lang/String;)V
const #6 = class   #21;     //  Test
const #7 = class   #22;     //  java/lang/Object
const #8 = Asciz   <init>;
...

{
public Test(); ...    

public static void main(java.lang.String[]);
  Code:
   Stack=3, Locals=3, Args_size=1
    0:    ldc #2;           // Load string constant "abc"
    2:    astore_1          // Store top of stack onto local variable 1
    3:    new #3;           // class java/lang/String
    6:    dup               // duplicate top of stack
    7:    ldc #4;           // Load string constant "def"
    9:    invokespecial #5; // Invoke constructor
   12:    astore_2          // Store top of stack onto local variable 2
   13:    return
}

이미 게시된 답변 외에 javaranch에 대한 이 훌륭한 기사도 참조하십시오.

String 클래스의 설명서에 따르면 이들은 동등합니다.

『 』의 매뉴얼:String(String original)또, 다음과 같이 말하고 있습니다.원본의 명시적 복사가 필요하지 않는 한 문자열은 불변이므로 이 생성자를 사용할 필요가 없습니다.

Java 문서가 오해를 불러일으킬 수 있으므로 다른 응답을 확인하십시오.

다음은 몇 가지 비교입니다.

String s1 = "Hello";
String s2 = "Hello";
String s3 = new String("Hello");

System.out.println(s1 == s2); //true
System.out.println(s1.equals(s2)); //true

System.out.println(s1 == s3);   //false
System.out.println(s1.equals(s3)); //true

s3 = s3.intern();
System.out.println(s1 == s3); //true
System.out.println(s1.equals(s3)); //true

intern()를 참조라고 합니다.

String 객체와 String 리터럴 사이에는 미묘한 차이가 있습니다.

String s = "abc"; // creates one String object and one reference variable

이 간단한 예에서는 "abc"가 풀에 들어가고 가 이를 참조합니다.

String s = new String("abc"); // creates two objects,and one reference variable

「 」를에, 「 」를 하고 있습니다.new키워드를 지정하면 Java는 일반(풀 이외) 메모리에 새로운 String 객체를 생성하고,는 그것을 참조합니다.또, 리터럴 「abc」가 풀에 배치됩니다.

String s = new String("FFFF")의 오브젝트, 즉 2개의 오브젝트를 ."FFFF" 및 " " "String 「」를 합니다)"FFFF"문자열은 포인터에 대한 포인터와 같습니다(참조하기 위해, 저는 용어를 잘 모릅니다).

.new String("FFFF")

언급URL : https://stackoverflow.com/questions/3297867/difference-between-string-object-and-string-literal

반응형