>  기사  >  Java  >  Java에서 == 및 같음 분석

Java에서 == 및 같음 분석

王林
王林앞으로
2019-11-27 16:19:141803검색

Java에서 == 및 같음 분석

== 분석

1. 기본 데이터 유형의 경우 비교는 특정 내용이 동일한지 여부이며 메모리 주소와는 관련이 없습니다.

예:

public class Test{
	
	public static void main(String[] args) {
		int i = 10;
		double j = 10.0;
		float m = 10.0f;
		char k = 10;
		boolean b = true;
		
		System.out.println(i == j);
		System.out.println(i == m);
		System.out.println(m == k);
		System.out.println("*******************");
		//System.out.println(i == b);  很明显,布尔型不能和其他基本数据类型比较,编译报错.
		System.out.println(System.identityHashCode(i));
		System.out.println(System.identityHashCode(j));
		System.out.println(System.identityHashCode(m));
		System.out.println(System.identityHashCode(k));
		System.out.println(System.identityHashCode(b));
	}
}

출력:

true
true
true
*******************
366712642
1829164700
2018699554
1311053135
118352462

관련 영상 튜토리얼 추천: java 무료 영상 튜토리얼

분석:

①비교 결과와 메모리 주소에 따르면 내용은 같지만 메모리 주소가 , 그러나 반환된 결과는 모두 true입니다. 즉, 비교할 때 변수에 저장된 내용이 동일한지 여부만 확인하고 메모리 주소와는 아무런 관련이 없음을 의미합니다.

②==비교의 양쪽 데이터를 강제로 동일한 유형으로 변환해야 합니다. 예를 들어 int와 double의 비교는 강제로 두 배가 됩니다.

3Boolean형은 int, float, double, char 등의 기본 데이터형과 비교할 수 없으며, 컴파일 시 오류가 발생합니다.

2. 참조 데이터 유형 비교:

public class Test{
	
	public static void main(String[] args) {
		Test t1 = new Test();
		Test t2 = new Test();
        String name1 = "琼宝";
		String name2 = "琼宝";
		
		System.out.println(name1 == name2);						 // true
		System.out.println(System.identityHashCode(name1));		 //366712642	
		System.out.println(System.identityHashCode(name2));		 //366712642
		
		System.out.println(t1 == t2);                             //false
		System.out.println(System.identityHashCode(t1));          //366712642
		System.out.println(System.identityHashCode(t2));          //1829164700
        System.out.println(System.identityHashCode(new Test()));  //2018699554
		System.out.println(System.identityHashCode(new Test()));  //1311053135
        System.out.println(new Test() == new Test());
	}
}

출력:

true
366712642
366712642
false
366712642
1829164700
2018699554
1311053135
false

분석:

① 참조 데이터 유형의 경우 두 가지 메모리 문제가 관련되며 비교에는 메모리 주소가

Test t1 = new Test() Test t2 = new Test() 명령문을 실행할 때 두 개의 메모리 조각이 열립니다. 하나는 t1 t2를 저장하기 위한 것이고 다른 하나는 두 개의 새로운 Test()를 저장하기 위한 것입니다. t1과 t2의 메모리 주소가 다른 것은 당연하고, 두 new Test()의 주소도 다르기 때문에 이때 ==를 사용하여 비교하면 결과는 false가 되어야 합니다.

(보충 : t1과 t2에 저장되는 것은 실제로 새로운 Test() 객체가 사용하는 메모리의 첫 번째 주소입니다. )

②String 유형의 경우 내용이 동일하면 메모리 주소도 동일하며, 비교할 때 주소도 살펴봅니다.

객체에 저장된 내용이 동일한지 비교하려면(주소 비교가 아님) ==를 구현할 수 없으며 같음이 필요합니다.

equals 분석

1. 먼저 같음 비교의 예를 살펴보겠습니다.

public class TestEquals {
	public static void main(String[] args) {
		
		TestEquals t1 = new TestEquals();
		TestEquals t2 = new TestEquals();
		System.out.println(t1.equals(t2));  //false
		
		String s1 = new String();
		String s2 = new String();		
	
        System.out.println(System.identityHashCode(s1));
		System.out.println(System.identityHashCode(s2));
		System.out.println(System.identityHashCode(new String()));
		System.out.println(System.identityHashCode(new String()));
        System.out.println(s1.equals(s2));  // true
	}
}

输出结果:
false
366712642
1829164700
2018699554
1311053135
true

2. 분석:

①t1과 t2의 비교는 거짓이고 s1과 s2의 비교는 true입니다. 메소드 재작성 문제에 대해서는 먼저 Object 클래스의 equals 소스 코드를 살펴보십시오.

public boolean equals(Object obj) {
        return (this == obj);
    }

② s1.equals(s2)의 경우 이는 s1이고 obj는 s2이며 소스 코드의 비교에서는 다음을 사용합니다. ==, 이는 명백한 참조입니다. 데이터 유형 비교는 s1과 s2의 메모리 주소를 살펴봅니다. 위 분석에서는 이미 두 주소가 서로 다르다는 것을 알고 있으므로 결과는 당연히 거짓입니다.

③s1과 s2의 비교 결과 s2는 true입니다. 이는 String 클래스에서 equals 메소드가 다시 작성되었기 때문입니다. 소스 코드를 참조하세요:

public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

4 이를 object의 equals 소스 코드와 비교하면 String no에서 equals 메소드가 있음을 알 수 있습니다. 이상은 개체의 주소를 비교하지만 두 개체의 내용 또는 두 개체의 속성이 동일한지 확인합니다.

⑤String, Date, File 등과 같은 클래스는 모두 equals 메소드를 다시 작성했습니다.

요약:

1.== 기본 데이터 유형을 비교할 때 비교되는 것은 내용이 동일한지 여부입니다. 참조 데이터 유형을 비교할 때 살펴보는 것은 메모리 주소가 동일한지 여부입니다.

2.equals는 참조 데이터 유형(객체)만 비교할 수 있습니다. 다시 작성하기 전에는 ==를 사용하여 메모리 주소를 비교합니다. 다시 작성한 후에는 객체의 특정 내용과 속성이 일치하는지 여부를 비교합니다.

더 많은 관련 기사와 튜토리얼을 보려면 다음을 방문하세요. Java 프로그래밍 소개

위 내용은 Java에서 == 및 같음 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 csdn.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제