java - String s=new String()与String s = ""的区别
阿神
阿神 2017-04-18 10:50:36
0
4
695

是不是定义字符串如果不使用new来初始化的话相同的字符串会被定义成一个引用

阿神
阿神

闭关修行中......

모든 응답(4)
左手右手慢动作

JVM의 String 저장소는 String常量池 조각이 있다는 점에서 조금 특별합니다.
이 상수 풀은 String 객체에 대한 참조를 저장합니다.

예를 들어 String s = "abc"은 먼저 String常量池에 기존 참조가 있는지 확인합니다. 그렇지 않은 경우 선언된 abc는 String 객체를 직접 생성하고 이 String을 가리키는 참조를 String常量池 객체에 저장합니다.

바로 뒤에 선언된 문자열도 위의 단계를 따르므로 두 번째 String s2 = "abc"에서는 첫 번째 선언된 문자열 개체를 가리키는 String常量池에서 참조를 찾습니다.

그리고 new String("abc")String常量池을 입력하지 않고 힙에 직접 새 객체를 생성합니다. 이러한 객체 참조를 상수 풀에 넣으려면 String 객체의 상수 풀 참조를 반환하는 String 클래스 intern()의 또 다른 메서드가 필요합니다. 이 객체가 상수 풀에 없으면 String 객체가 상수 풀에 들어가고 해당 객체 참조가 반환됩니다.

이 질문에 사용된 첫 번째 스크린샷 방법 str2.intern() == str3.intern()true을 반환하며, intern()을 호출하여 반환된 String常量池 참조도 동일합니다.

阿神
  1. Java의 모든 내장되지 않은 데이터 유형은 참조입니다.

  2. String s = new String("xx"); 이 메소드는 메모리 공간을 생성하고 참조 s가 이를 가리키도록 합니다.

  3. String s = "xx"; 이 방법은 참조 s가 공유 공간을 가리키도록 만듭니다.

  4. new를 사용하여 생성된 경우 str2와 str3은 서로 다른 메모리 공간을 가리키므로 str2와 str3은 동일하지 않습니다.

  5. 문자열 할당을 직접 사용하는 경우 str2와 str3은 동일한 메모리 공간을 가리키므로 str2와 str3은 동일합니다.

  6. str2.equals(str3)를 사용하여 문자열 내용을 비교할 수 있습니다.

洪涛

하나는 상수 풀에 저장하는 것이고, 다른 하나는 힙에 새로운 객체를 생성하는 것입니다

迷茫

과정을 이해하도록 도와주세요. Java에서 기억할 수 있는 몇 가지 사항이 있습니다.
1. 모든 문자열은 불변인 CONSTANT_String_info에 해당하는 상수 풀에서 생성됩니다.
2. 일반 개체는 거의 항상 힙에서 생성됩니다. (물론 메서드 영역에서 생성될 수 있는 클래스 개체와 같은 일부 특수 개체도 있습니다. 이는 다양한 가상 머신 구현 및 가상 머신 사양에 따라 다릅니다. 필수는 아님)
3.== 이 결정을 내릴 때 참조 유형의 경우 최종 분석은 메모리 주소를 비교하는 것입니다.

자, 이제 위의 개념을 갖추었습니다. 첫 번째 질문에서
String s1 = new String("aaa"); 새 객체를 만들 때 jvm은 힙에서 객체 공간을 여는 데 도움을 주고 s1은 로컬 변수 테이블에 저장됩니다. 이 객체 공간을 가리킵니다(s1이 객체 공간의 주소를 저장한다는 것을 일시적으로 이해할 수 있습니다). 그래서 두 개의 서로 다른 개체 공간인 두 개의 새로운 개체를 만들었습니다. ==s1과 s2가 다른 공간을 가리키기 때문에 판단은 물론 다릅니다.

두 번째 질문, 위의 첫 번째 점, 각 문자열은 상수 풀의 하나의 복사본에만 존재하므로 str2는 이 상수 풀 문자열의 주소를 가리키고 str3도 이 상수 풀 문자열의 주소를 가리킵니다. ==판단은 당연히 똑같다.

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!