혼란

2013-08-11 3 views
4

개체 , 새로운 연산자가 사용될 때 새로운 문자열 ("testing")에 메모리가 할당되므로 test1의 경우 어떻게 메모리가 할당됩니까? 또한 문자열이 인턴 될 때 두 문자열이 문자열 인턴 풀에 한 번만 참조되는 문자열과 동일한 값을 갖는 경우?혼란

답변

0

당신이

String test1="testing1" 

를 사용하고 그것은 당신이

하지만

String test=new String("testing"); 

당신에게 새로운 문자열 객체를 제공 각각의 고유 한 문자열 값의 복사본을 저장하는 것을 의미한다.

0

는 두 번째 과제였다 고려해

여기
String1 test1 = System.getenv("PATH"); 

은 TEST1 새로운 사용하지 않고, 또한 대부분의 아마 String 객체에 대한 참조입니다(). 기존 개체에 대한 참조를 새 변수에 지정할 수 있습니다. 그래서 문제가 어디 있습니까?

문제는 "test1이 String 객체"와 같이 엉성한 문구를 사용하지 않아야한다는 것입니다. 그렇지 않습니다. String 객체 또는 null에 대한 참조입니다. 그게 다에요.

1

자바는 new으로 생성자를 호출하지 않고 만든 문자열을위한 별도의 메모리를 가지고 있습니다. 이러한 String이 생성 될 때마다 Java는 해당 String이 이미이 메모리에 있는지 검사합니다. 일치하는 경우, Java는 그 중 하나가 변경 될 때까지 새 String에 동일한 참조를 설정합니다.

new을 사용하여 생성자를 사용하여 String을 생성하면 Java에서 일반 객체로 동작합니다.

이 예를 살펴 :

String s1 = "Test"; 
String s2 = "Test"; 

당신이 == 연산자이 문자열을 비교하는 경우는 true를 돌려줍니다. s1.equals(s2) 또한 true를 반환합니다.

당신이 문자열이 같은 생성자를 사용하여 객체를 만들 경우 다른 모습이 문자열의 참조는 이제 다르기 때문에 (당신이 지금 == 연산자를 사용하여이 문자열을 비교할 때

String s1 = new String("Test"); 
String s2 = new String("Test"); 

는 false를 돌려줍니다 2 개의 고유 한 String 객체를 만들었습니다.) 그러나 s1.equals(s2)을 사용하면 예상대로 true가 반환됩니다.

+0

새로운 연산자를 사용하지 않고도 String 객체를 선언 할 수있는 특수한 경우는 String입니까? – Nirali

+0

대단한 답변입니다. 감사! – user2236096

2

것은 우리가 처음은 힙에 문자열 객체를 생성이 String test=new String("testing");

  • 를 생각해 보자.풀에서이 문자열이 존재하는지 확인하기 위해 문자열 풀에서 검사가 수행되지 않습니다.

및 지금이 String test1="testing1"

  • 그것은이 문자열이 예는 참조가 반환되는 pool.If 거기에 이미 있는지 여부를 수행 Heap.Before 생성 검사에서 문자열을 문자열 풀의 String 개체를하지 생성 그렇지 않으면 새로운 문자열이 풀에 만들어지고 참조가 반환됩니다. 기본적으로 이것은 문자열 리터럴이며, 메모리 최적화 및 재사용을 위해 상수 풀에 저장됩니다.

인턴() : 그것은 당신이 사용하여 객체를 생성 할 때 사용되는 새로운() 그 문자열이 이미 여부 존재하는 경우 먼저 체크가 Stirng 풀에서 수행되는 개체에서 인턴()를 호출한다 , 그렇다면 직접 사용됩니다

+0

그러나 새로운 문자열 ("testing")의 문자열 "testing"은 금지됩니다. –

+0

@SotiriosDelimanolis 정보가 정확히 10x입니다. 이를 위해 우리는이 새로운 String ("testing")과 같은 것을 할 필요가있다. . – Algorithmist

+0

새로운 연산자를 사용하지 않고도 String 객체를 선언 할 수있는 특수한 경우에만 String을 사용할 수 있습니까? – Nirali

0

문자열 리터럴을 만들 때마다 JVM은 먼저 문자열 상수 풀을 확인합니다. 문자열이 이미 풀에 있으면 풀링 된 인스턴스에 대한 참조가 반환됩니다. 문자열이 풀에 없으면 새 문자열 인스턴스가 만들어져 풀에 배치됩니다. 예 :

문자열 s1 = "환영";
문자열 s2 = "환영"; // 새 인스턴스를 만들지 않습니다.

위의 예제에서는 하나의 개체 만 만들어집니다. 먼저 JVM은 문자열 상수 풀에서 값 "Welcome"가있는 문자열 객체를 찾지 않으므로 새 객체를 만듭니다. 그런 다음 풀에 값 "Welcome"가있는 문자열을 찾으면 새 객체를 만들지 않지만 동일한 인스턴스에 대한 참조를 반환합니다.

http://www.javatpoint.com/java-string?

+0

다른 답변의 정보 만 반복하면됩니다. 질문을 게시하기 전에 질문에 대한 다른 답변을 읽어보십시오. – FakeRainBrigand