logo

자바 문자열 인턴()

그만큼 자바 문자열 클래스 인턴() 메소드는 인턴된 문자열을 반환합니다. 문자열의 표준 표현을 반환합니다.

새 키워드로 문자열이 생성된 경우 메모리에서 문자열을 반환하는 데 사용할 수 있습니다. 문자열 상수 풀에 힙 문자열 개체의 정확한 복사본을 만듭니다.

서명

intern() 메서드의 서명은 다음과 같습니다.

 public String intern() 

보고

인턴된 문자열

String.intern() 메소드의 필요성과 작동

Java에서 문자열이 생성되면 힙에서 메모리를 차지합니다. 또한 우리는 String 클래스가 불변이라는 것을 알고 있습니다. 따라서 new 키워드를 사용하여 문자열을 생성할 때마다 배열의 내용에 관계없이 해당 문자열에 대한 힙에 새 메모리가 할당됩니다. 다음 코드 조각을 고려해보세요.

 String str = new String('Welcome to JavaTpoint.'); String str1 = new String('Welcome to JavaTpoint'); System.out.println(str1 == str); // prints false 

각 문자열 리터럴에 별도의 메모리가 할당되므로 println 문은 false를 인쇄합니다. 따라서 두 개의 새로운 문자열 개체, 즉 str과 str1이 메모리에 생성됩니다. 다른 참조를 보유하고 있습니다.

우리는 Java에서 객체를 생성하는 것이 비용이 많이 드는 작업이라는 것을 알고 있습니다. 따라서 시간을 절약하기 위해 Java 개발자는 문자열 상수 풀(SCP)이라는 개념을 생각해 냈습니다. SCP는 힙 메모리 내부 영역입니다. 여기에는 고유한 문자열이 포함되어 있습니다. 문자열을 문자열 풀에 넣으려면 다음을 호출해야 합니다. 인턴() 방법. 문자열 풀에 객체를 생성하기 전에 JVM은 해당 문자열이 풀에 이미 존재하는지 여부를 확인합니다. 문자열이 있으면 해당 참조가 반환됩니다.

 String str = new String('Welcome to JavaTpoint').intern(); // statement - 1 String str1 = new String('Welcome to JavaTpoint').intern(); // statement - 2 System.out.println(str1 == str); // prints true 

위의 코드 조각에서 intern() 메서드는 String 객체에 대해 호출됩니다. 따라서 SCP에 메모리가 할당됩니다. 두 번째 문의 경우 str과 str1의 내용이 동일하므로 새 문자열 개체가 생성되지 않습니다. 따라서 첫 번째 문에서 생성된 개체의 참조가 str1에 대해 반환됩니다. 따라서 str과 str1은 모두 동일한 메모리를 가리킵니다. 따라서 print 문은 true를 인쇄합니다.

Java 문자열 intern() 메서드 예

파일 이름: InternExample.java

 public class InternExample{ public static void main(String args[]){ String s1=new String('hello'); String s2='hello'; String s3=s1.intern();//returns string from pool, now it will be same as s2 System.out.println(s1==s2);//false because reference variables are pointing to different instance System.out.println(s2==s3);//true because reference variables are pointing to same instance }} 
지금 테스트해보세요

산출:

 false true 

Java 문자열 intern() 메소드 예 2

스트링 인턴 개념을 이해하기 위해 한 가지 예를 더 살펴보겠습니다.

파일 이름: InternExample2.java

 public class InternExample2 { public static void main(String[] args) { String s1 = 'Javatpoint'; String s2 = s1.intern(); String s3 = new String('Javatpoint'); String s4 = s3.intern(); System.out.println(s1==s2); // True System.out.println(s1==s3); // False System.out.println(s1==s4); // True System.out.println(s2==s3); // False System.out.println(s2==s4); // True System.out.println(s3==s4); // False } } 
지금 테스트해보세요

산출:

 true false true false true false 

기억해야 할 점

다음은 intern() 메서드와 관련하여 기억해야 할 몇 가지 중요한 사항입니다.

1) 문자열 리터럴은 문자열 리터럴과 함께 intern() 메서드를 언급하는지 여부에 관계없이 항상 intern() 메서드를 호출합니다. 예를 들어,

 String s = 'd'.intern(); String p = 'd'; // compiler treats it as String p = 'd'.intern(); System.out.println(s == p); // prints true 

2) 우리가 String 객체를 생성할 때마다 새로운 키워드를 사용하면 두 개의 개체가 생성됩니다. 예를 들어,

 String str = new ('Hello World'); 

여기서 new 키워드 사용으로 인해 SCP 외부의 힙 메모리에 하나의 객체가 생성됩니다. 우리는 문자열 리터럴('Hello World')도 얻었습니다. 따라서 리터럴 'Hello World'가 SCP에 이미 존재하지 않는 경우 SCP 내부에 하나의 객체가 생성됩니다.