2013-10-24 2 views
3

문자열 풀이 작동하는 방식을 이해하려고합니다. 많은 사이트를 통과했으며 마침내 더 혼란스러워졌습니다. 여기에 나의 의심을 두지 말라. 누군가 나를 이해하는 데 도움이됩니다.Java 문자열 풀 관련 의심

1) 문자열 풀은 어디에 있습니까? 힙 또는 메소드 영역에 있습니까?

2) String s = "Hello world"; -이 작성 충분할 것 string.Since 문자열 불변, 문자열을 변경할 수 어차피 한 번 생성 한 후 String s = new String(“Hello World”)를 사용하여 문자열을 만들 필요가 무엇입니까?
비록 JVM이 String pool.Hut 대신에 새로운 String 객체를 생성하기 위해 JVM을 강요 할 필요가 있습니까?

3) 문자열은 언제 어떻게 수집됩니까?

미리 감사드립니다.

답변

4

문자열이 관리 방법의 실제 구현은 보장 것을 제외하고, 자바 결과적 있어야되지 않습니다

  1. 문자열 X = "안녕하세요"; 문자열 y = "안녕"; // 보장 그 x == y
  2. 문자열 x = "안녕"; String y = new String ("hi"); // 가능성은 있지만 == 보장 할 필요는 없습니다! =
  3. String x = new String ("hi"); String y = new String ("hi"); // 보장! = 그러나 x.equals (y)
  4. 문자열 x = "안녕"; String y = new String ("hi"). intern(); // 보증 X == y를

사람들은 문자열에 대한 규칙 ....

과거

(이것은 Java8로 변경됩니다), String.intern()와 문자열 상수 (String x = "hi")가에 할당 된입니다 PermGen 메모리 모델의 공간.

결과적으로 GC 메커니즘이 다르기 때문에 무료 힙 공간이 많이 있더라도 String.intern()을 사용하면 메모리가 부족할 수 있습니다 (PermGen은 일반적으로 128MB 미만).

new String(....)으로 할당 된 문자열은 일반 힙에 있으며 표준 GC 메커니즘이 있습니다.

우리가 new String ("...")을 사용하여 Strings의 새로운 인스턴스를 만드는 이유에 관해서는, 내가 그런 식으로 만하는 것이 바람직한 한 곳을 생각할 수 있습니다. 누군가가 결과 객체를 동기화로 사용하려는 경우입니다. 자물쇠. 디버깅 할 때 의미가있을 수 있지만 .....별로 의미가 없습니다. 실수로 다른 String 객체를 동기화 용으로 사용하지 않도록 'new'를 사용해야합니다.

일반적으로 Java 코딩 연습에서는 일반적으로 new String ("....")을 사용하는 사람을 보지 못했습니다. 실제로 사람들은 대부분 문자열 연결 연산자 등을 사용합니다. 그러나 잘못된 것은 아닙니다. new String(...)

String에 대한 소스 코드를 살펴보면 이 코드는 String을 변경 불가능하게 만드는 것에 크게 의존합니다. 예를 들어, 새로운 String (new String ("hi")); char의 배열 하나만 만들고 String 인스턴스에서 공유됩니다. (그리고 어쨌든 내부 인스턴스가 GC 될 것입니다).

0

1.문자열 풀은 스택이 아니며 또한 힙입니다! 방법 영역입니다! 문자열 풀이 상수 풀에 속합니다. 우리 모두가 알고 있기 때문에, 상수는 변경 될 수없는 값이고, 일정한 풀을 제공하는 목적은 프로그램의 속도를 가속시키는 것입니다. 클래스 파일에서 int a = 10, String b = "123450"과 같은 문자열이 처리됩니다 (메서드에서 변경할 수 있음). 클래스가로드되면 JVM은 유지 보수를 위해 배열에 배치합니다. 이 배열을 String Pool이라는 메소드 영역에 놓습니다.

2. 문자열 개체를 만들 때 다음을 수행 할 수 있습니다. String str1 = new String("abc")Stirng str2 = "abc";. 그들은 똑같아 보이지만 JVM은 그것들을 다르게 처리합니다. 첫 번째 경우 JVM은 HEAP에 String 객체를 생성합니다. 그리고 객체를 사용자에게 반환합니다. 하지만 두 번째 경우 JVM은 String 풀이 String 객체인지 여부를 확인하기 위해 String의 equals() 메서드를 사용하여 String Pool을 확인합니다. 그렇다면 String 객체를 사용자에게 반환하면 String 객체를 다시 만들지 않습니다. String 풀에 String 객체가 없으면 JVM은 HEAP에 새 객체를 만들고 사용자에게 다시 반환합니다. 동시에 JVM이 String 풀에 넣습니다.

String str1 = new String("abc"); //jvm creates a String object in Heap. 

//jvm can not find "abc" in String pool 
//Create a String object in heap,and put it in strings pool 
//Now heap has two string object. 
Stirng str2 = "abc"; 

if(str1 == str2){ 
     System.out.println("str1 == str2"); 
}else{ 
     System.out.println("str1 != str2"); 
} 
    //Print result is str1 != str2, because they are different objects in heap 

    String str3 = "abc"; 

//Now,jvm realizes String Pool already had “abc” object,because “abc”equals “abc” 

    if(str2 == str3){ 
     System.out.println("str2 == str3"); 
    }else{ 
     System.out.println("str2 != str3"); 
    } 
//Print result is str2 == str3 



String str1 = new String("abc"); 

str1 = str1.intern(); 


Stirng str2 = "abc"; 

if(str1 == str2){ 
     System.out.println("str1 == str2"); 
}else{ 
     System.out.println("str1 != str2"); 
} //Print: str1 == str2 
0

문자열 풀은 String 상수가있는 버킷과 같습니다. 예를 들어 : -

Object a = new Object(); 
Object b = new Object(); 

그것은 힙에서 두 개의 새로운 개체를 만드는 것입니다. 그들은 상수이기 때문에

그러나,

String s1 = "abc"; 
String s2 = "abc"; 

String 풀에서 하나 개의 객체를 생성합니다.