请问两种方式是否等价?
HashMap map = new HashMap<>();
map.put("abc", 1); //1
map.put("abc".intern(), 1);//2
高洛峰2017-04-17 16:12:00
.class 파일의 상수 풀은 런타임 중에 JVM에 의해 로드되며 확장될 수 있습니다. String의 intern() 메소드는 상수 풀을 확장하는 메소드로, String 인스턴스 str이 intern() 메소드를 호출하면 Java는 상수 풀에 동일한 유니코드를 갖는 문자열 상수가 있는지 확인하여 반환합니다. 그렇지 않은 경우 상수 풀에 str과 동일한 유니코드 문자열을 추가하고 해당 참조를 반환합니다.
따라서 이 두 문자열은 동일해야 합니다
PHP中文网2017-04-17 16:12:00
는 동일합니다. 우선 두 번째 명령문의 intern()은 완전히 불필요합니다. "abc" 자체는 상수 풀로 컴파일되므로 intern()은 아무 작업도 수행하지 않습니다.
PHPz2017-04-17 16:12:00
HashMap의 put 메소드는 키의 해시 값을 계산하므로 문자열이 상수 풀에서 반환되거나 새 문자열이 반환되든 동일합니다.
intern() 메소드의 주석에서 볼 수 있듯이 문자열 상수 풀에서 문자열을 찾습니다. 문자열을 찾으면 상수 풀에서 문자열을 반환합니다. 문자열을 상수 풀에 추가한 다음 반환합니다.
인턴 메소드가 호출될 때 풀에 이미
String
{@link #equals(Object)} 메서드인 경우 풀의 문자열은
반환됩니다. 그렇지 않으면 이 String
개체가
풀과 이 String
객체에 대한 참조가 반환됩니다.