테스트 1 : : : : : 테스트 1 :
먼저 문자열 유형 비교 세트를 살펴 보겠습니다. 더 이상 고민하지 않고 코드를 입력하십시오.
공개 클래스 테스트 {public static void main (String [] args) {String a = "Java Book Garden"; 문자열 b = "Java Book Garden"; 문자열 c = 새 문자열 ( "Java Book Garden"); 문자열 d = new String ( "Java Book Garden"). 인턴 (); if (a == b) {system.out.println ( "a == b"); } else {system.out.println ( "a! = b"); } if (a.equals (b)) {system.out.println ( "a.equals (b)"); } else {system.out.println ( "! a.equals (b)"); } if (a == c) {System.out.println ( "a == c"); } else {system.out.println ( "a! = c"); } if (a.equals (c)) {system.out.println ( "a.equals (c)"); } else {system.out.println ( "! a.equals (c)"); } if (a == d) {system.out.println ( "a == d"); } else {system.out.println ( "a! = d"); } if (a.equals (d)) {system.out.println ( "a.equals (d)"); } else {system.out.println ( "a.equals (d)"); }}}출력 결과 :
a == ba.equals (b) a! = ca.equals (c) a == da.equals (d)
요약 :
결과 a == b : 프로그램이 실행될 때 스트링 버퍼 풀이 생성됩니다. 문자열 a = "Java Book Garden", "Java Book Garden"이 문자열 버퍼 풀에 배치됩니다. 문자열 b = "Java Book Garden"이 문자열을 생성 할 때, 프로그램은 먼저이 문자열 버퍼 풀에서 동일한 값을 가진 객체를 찾습니다. 따라서 B가 생성되면 프로그램은 A가 동일한 값을 가진 A를 찾아 A가 참조하는 객체를 참조합니다. 따라서 A와 B는 동일한 물체를 나타 내기 때문에 a == b.
결과적으로, a! = c : string c = new String ( "Java Book Garden") 새로운 새 개체를 사용하므로 String 버퍼 풀에서 검색되지 않으며 새 개체를 직접 생성합니다. 그래서 a! = c.
결과 A == D : 인턴 메소드가 호출되면 풀에 이미이 문자열 객체와 같은 문자열이 포함 된 경우 (객체는 Equals (개체) 메소드에 의해 결정됩니다. 풀의 문자열이 반환됩니다. 그렇지 않으면이 문자열 객체를 풀에 추가 하고이 문자열 객체에 대한 참조를 반환합니다. 모든 d는 a의 객체를 호출합니다.
Equals는 값을 비교하므로 값이 동일하면 동일합니다.
테스트 2 : : : : : : 테스트 2 :
다음은 INT 유형 및 정수 유형 세트의 테스트입니다.
공개 클래스 테스트 {public static void main (String [] args) {int a = 127; int a1 = 127; int b = 128; 정수 C = 127; 정수 C1 = 127; 정수 d = 128; 정수 D1 = 128; if (a == a1) {system.out.println ( "a == a1"); } else {system.out.println ( "a! = a1"); } if (b == b1) {system.out.println ( "b == b1"); } else {system.out.println ( "b! = b1"); } if (c == c1) {system.out.println ( "c == c1"); } else {System.out.println ( "C! = C1"); } if (d == d1) {system.out.println ( "d == d1"); } else {system.out.println ( "d! = d1"); }}}출력 결과 :
a == a1b == b1c == c1d! = d1
"a == a1"및 "b == b1": int는 기본 유형이며 값은 직접 저장되고 정수는 객체이며 참조 로이 객체를 가리 킵니다. 대부분의 비교는 "a == a1"및 "b == b1"으로 이루어집니다.
"C == C1"및 "D! = D1"결과는 여기에 질문이있을 수 있습니다. 왜 "d! = d1". 정수의 소스 코드를 함께 살펴 보겠습니다.
/** * jls가 요구하는 * -128과 127 (포함) 사이의 값에 대한자가 옥스의 객체 아이덴티티 시맨틱을 지원하는 캐시. * * 캐시는 첫 번째 사용으로 초기화됩니다. 캐시 *의 크기는 -xx : autoboxcachemax = <size> 옵션에 의해 제어 될 수 있습니다. * VM 초기화 중에 java.lang.integer.integercache.high 속성 * * sun.misc.vm 클래스의 개인 시스템 속성에 설정되어 저장 될 수 있습니다. */ private static class integercache {static final int low = -128; 정적 최종 INT High; 정적 최종 정수 캐시 []; static {// 높은 값은 int h = 127 특성으로 구성 될 수 있습니다. 문자열 integercachehighpropvalue = sun.misc.vm.getSavedProperty ( "java.lang.integer.integercache.high"); if (integercachehighpropvalue! = null) {int i = parseint (integercachehighpropvalue); i = math.max (i, 127); // 최대 배열 크기는 정수입니다 .max_value h = math.min (i, integer.max_value- (-low) -1); } High = H; 캐시 = 새 정수 [(High -Low) + 1]; int j = 낮음; for (int k = 0; k <cache.length; k ++) 캐시 [k] = 새 정수 (j ++); } private integercache () {}} /** * 지정된 * {@code int} 값을 나타내는 {@code integer} 인스턴스를 반환합니다. 새 {@code integer} 인스턴스가 * 필수되지 않은 경우,이 메소드는 일반적으로 * @link #integer (int)}를 선호하는 경우 일반적으로 *이 메소드가 자주 요청 된 값을 캐싱하여 상당히 더 나은 공간과 시간 성능을 얻을 수 있으므로 *를 선호해야합니다. * *이 방법은 항상 -128 ~ 127, * 포괄 범위의 값을 캐시 하며이 범위를 벗어난 다른 값을 캐시 할 수 있습니다. * * @param i an {@code int} 값. * @Code I}을 나타내는 {@code integer} 인스턴스. * @since 1.5 */ public static integer valueof (int i) {assert integercache.high> = 127; if (i> = integercache.low && i <= integercache.high) return integercache.cache [i + (-integercache.low)]; 새로운 정수 (I)를 반환합니다. }결론 : 여기서 정수는 [-128,127]의 일정한 풀을 초기화합니다. 값 이이 범위에 있으면 동일한 객체가 참조됩니다. 이 범위에 있지 않으면 소스 코드에서 반환 된 새 개체가 다음과 같은 것을 볼 수 있습니다. return new Integer (i);
따라서 결과 "C == C1"은 동일한 객체를 나타내며 결과는 "d! = d1"은 새로운 객체를 나타 내기 때문에 다릅니다.