String a="aa";
String은 기본 데이터 유형이 아니라 참조 유형입니다. 위의 간단한 문장의 경우 Java 컴파일러는 재컴파일 단계에서 이를 결정한 후 "aa"를 입력할 수 있습니다. 현재 클래스 파일의 상수 풀 영역에 저장됩니다(힙이 아님, 특히 Perm 영역에 유의하세요). 상수 풀은 런타임 시 확장될 수도 있습니다. )은 런타임 시 클래스에 대한 호출입니다. 지속적인 주입으로 인해 java.lang.OutofMemory:PermGen 공간 예외가 발생할 수 있습니다. 프로세스는 먼저 이 문자열을 상수 풀의 각 문자열과 비교하는 것입니다. 일치하는 항목이 있으면 상수 풀에 대한 참조를 반환하고, 상수 값을 삽입하고 현재 주소를 반환하는 것을 볼 수 있습니다. String.intern()은 별로 효율적이지 않습니다.
private static void test1(){ String a = “a” + “b” +1; Stirng b = “ab1”; System.out.println(a==b); }
분명히 반환 결과는 True입니다
"=="에 대하여: 기본 데이터 유형의 경우 ==는 (byte, short, int, float, char, double, long과 같은 기본 데이터 유형의 값을 비교하는 것입니다. , 부울), 참조 유형의 경우 비교되는 것은 두 참조 객체의 논리적 주소입니다
equals 및 hashcode() 정보: Object 클래스의 equals 메서드는 비교되는 두 객체 참조의 논리적 주소를 기본값으로 사용합니다(return (this == obj);) , 동등 설계에서는 하위 클래스가 두 개의 동일한 하위 클래스 비교를 스스로 구현해야 합니다(서로 다른 하위 클래스를 비교하는 것은 의미가 없으므로 많은 동등 구현은 먼저 두 개체가 속하는지 여부를 결정합니다) 클래스) 객체가 동일한지 여부, 여기서는 참조된 주소가 동일한지 여부가 아닙니다. Java의 기본 해시코드 메소드는 객체의 해시 값을 제공합니다(네이티브 메소드 호출 비용은 여전히 매우 높음). 일반적으로 System.identifyHashCode(Object) 메소드의 반환 값과 일치합니다. 해시코드 메소드는 객체를 식별하는 데 사용되며 해시 알고리즘에서 객체를 해시하는 데 사용됩니다. String 클래스는 HashCode 메서드를 재정의합니다. 이는 String 클래스의 해당 해시코드를 생성하기 위해 char[]의 모든 문자를 순회해야 합니다. 실제로 객체의 equals 메서드는 해시코드 자체와 아무 관련이 없습니다. 모든 사람이 재작성이라고 생각하게 만드는 일부 클래스의 사용은 equals() 메서드가 hashcode() 메서드를 재정의해야 합니다. 예를 들어, HashMap(및 HashSet, 그러나 HashSet은 HashMap을 사용하여 구현됨)에서 HashMap에 요소를 배치하는 프로세스는 먼저 키의 해시코드 메소드를 호출하고 이 메소드의 반환 값과 길이를 기반으로 엔터티의 인덱스를 계산하는 것입니다. HashMap의 Entity 배열에 이미 요소가 있으면 비교를 위해 key의 equals 메서드를 호출하고, 존재하지 않으면 해당 요소를 연결 목록에 삽입합니다.
컴파일 시간 최적화 정보: 컴파일러의 경우 컴파일 시간 최적화의 원칙은 결정될 수 있는 것(예: 최종)을 최적화하고 결정될 수 없는 최종 유형 변수와 메서드 호출을 처리하지 않는 것입니다. 최적화되지 않은 경우 String a="a" + "b"는 컴파일 타임에 a="ab"로 최적화되고 String a="a" String b=a+"b"는 Stringbuffer의 스플라이싱에 최적화됩니다. 컴파일 시간에
위 내용은 Java에서 String 클래스 해석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!