인터뷰 질문 시리즈 파트 1 : ==와 같음의 차이점에 대해 알려주세요. 대답이 틀렸을 수 있습니다

최근에는 인터뷰 질문을 정리하고, 인터뷰 질문에 좀 더 고전적이고 핵심적인 내용을 작성하여 공개 계정에 게시하고, 기본 지식을 통합하여 모든 사람과 공유 할 예정입니다. [프로그램 뉴 비전]에 계속 관심을 기울일 모든 사람을 환영합니다. 다음은이 시리즈의 첫 번째입니다.

대부분의 인터뷰에서 첫 번째 질문은 객체 지향적 인 이야기가 아니라 캐릭터에 관한 것입니다. 이 기사에서는 모든 측면에서 "==와 같음의 차이점"에 대해 설명합니다.

개념적 차이

문자열 비교 (문자열 만 해당)의 경우 ==와 같음의 차이에는 다음 두 가지가 있습니다.

(1) "=="는 두 변수 또는 인스턴스가 동일한 메모리 공간을 가리키는 지 판단하는 것입니다.

(2) "같음"은 두 개의 변수 또는 인스턴스가 가리키는 메모리 공간의 값이 동일한 지 여부를 판단하는 것입니다.

위의 설명은 추상 개념의 관점에서 다소 모호합니다. 위의 개념을 명확하게 설명하기 위해 먼저 JVM 메모리 할당에 대한 지식을 간략하게 이해하겠습니다.

개체의 메모리 할당 만들기

JVM에서 메모리는 힙 메모리와 스택 메모리로 나뉩니다. 일반적으로 new 키워드를 통해 객체를 생성 할 때 객체의 생성자를 호출하여 공간을 열고 객체 데이터를 힙 메모리에 저장하며 동시에 스택 메모리에 해당 참조를 생성합니다.

String str = new String("程序新视界");

위의 코드에서 실제 String 객체는 힙 메모리에 저장되며 str 변수는 객체를 가리키는 참조 주소 만 보유합니다. 후속 코드에서 호출 할 때 스택 메모리의 모든 참조 (str이 가리키는 주소)가 사용됩니다.

String이 equals 메소드를 구현하는 방법

위의 개념을 이해 한 후 equals 메소드가 String에서 어떻게 구현되는지 살펴 보겠습니다.

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;
}

위의 코드는 두 부분으로 구성됩니다. 첫 번째 부분은 "=="와 직접 비교하는 것입니다. 비교 대상의 참조 주소가 동일한 지 이미 알고 있습니다. 즉, 두 개체의 참조 주소가 동일하면 동일합니다.

코드의 두 번째 부분은 들어오는 객체가 String 객체인지 여부를 결정합니다. 이것이 String 객체이고 두 String 객체 값의 char [] 배열에있는 각 요소가 같으면 동일한 것입니다.

위의 코드를 읽은 후, 차이점을 말할 때 "note only strings"메모를 추가해야하는 이유를 이해할 수 있습니다. 문자열의 equals 메소드는 equals 메소드를 재정의하기 때문에 값을 비교합니다.

요약하면 다음 그림에서 String의 비교를 볼 수 있습니다.

인터뷰 문자열

Java의 모든 클래스는 Object 객체에서 상속되며 equals 메소드도 Object 객체에 정의되어 있습니다.

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

우리는 무엇을 보았습니까? Object의 equals 메소드는 참조 주소로 밝혀졌습니다! 따라서 단순히 "=="는 참조로 비교하고 같음은 해당 값에 대한 참조로 비교하므로 잘못된 것입니다! 이것은 String 클래스의 범위로 제한됩니다.

클래스를 정의 할 때 equals 메소드가 재정의되지 않으면 Object의 기본 equals 메소드가 사용됩니다. 이 메소드를 재 작성할 경우 재 작성된 메소드에 따라 비교해보십시오. 문자열의 equals 메소드는 재 작성된 예제 중 하나입니다.

특수 문자열 정의

new 형식으로 정의되는 것 외에도 String을 등호 할당 형식으로 정의 할 수도 있습니다.

String str = "程序新视界";

이것은 매우 특별한 형태로, 객체는 new없이 생성 될 수 있으며 이는 본질적으로 new와 다릅니다. 이러한 할당 형식은 Java에서 직접이라고하며, 새처럼 힙에 저장되지 않고 상수 풀에 존재합니다.

이러한 문자열을 선언 할 때 JVM은 먼저 상수 풀에서 해당 값을 가진 객체를 찾습니다. 그렇다면 현재 참조, 즉 원래 참조와 현재 참조 포인트를 동일한 객체에 할당합니다. 그렇지 않은 경우 상수 풀에 새 개체가 생성됩니다. 이 형식으로 선언 된 문자열의 경우 값이 같으면 여러 참조가 동일한 객체를 가리 킵니다.

새 폼과 달리 String 객체를 생성하는 것은 다른 객체를 생성하는 것과 동일하며 호출 할 때마다 새 객체가 생성됩니다.

예제 검증

다음의 구체적인 예는 위의 결론을 확인하는 데 사용됩니다. 동시에 이러한 검증 예는 인터뷰 질문의 내용 일 수도 있습니다.

String x = "程序新视界";
String y = "程序新视界";
String z = new String("程序新视界");

System.out.println(x == y); // true
System.out.println(x == z); // false
System.out.println(x.equals(y)); // true
System.out.println(x.equals(z)); // true

첫 번째 줄은 할당에 의해 객체가 생성되기 때문에 x에 해당하는 객체가 이미 메모리에 존재하는 경우 y 객체를 할당 할 때 참조가 원래 객체를 직접 가리 킵니다. 따라서 동등합니다.

두 번째 줄에서는 z가 new 형태로 생성 되었기 때문에 새로운 객체가 생성되며 여기서 두 객체의 참조 주소를 비교하므로 같지 않습니다.

세 번째와 네 번째 줄은 문자열의 실제 값을 비교하므로 동일합니다.

equals 메소드를 재정의하지 않고 객체 비교를 살펴 보겠습니다. 해당 엔티티 클래스 정의 및 단위 테스트 방법은 다음과 같습니다.

@Test
public void testObject(){
	Person p1 = new Person("Tom");
	Person p2 = new Person("Tom");

	System.out.println(p1.equals(p2));
}

class Person{

	public Person(String name){
		this.name = name;
	}
	
	private String name;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
}

위의 방법을 실행하면 인쇄 결과가 거짓입니다.

위의 두 가지 예를 통해 위에서 이야기 한 이론을 검증했습니다.

요약

위의 분석을 통해 근본적인 논리를 이해하고 비슷한 면접 질문을 접할 때 모두가 정확하게 답할 수있을 것이라고 생각합니다.

간단히 말해 같음으로 비교되는 것은 참조이고 같음으로 비교되는 것은 값입니다. 엄밀히 말하면 잘못된 것입니다. JVM 개체의 저장 형식과 같은 기본 구현 원칙을 해결하고 equals 메서드를 다시 작성해야만 암기보다는 강점을 반영 할 수 있습니다.

다음 기사에서는 새로운 문자열의 형태로 여러 객체와 기본 로직을 생성하는 방법에 대해 이야기 해 보겠습니다.

원본 링크 : " 인터뷰 질문 시리즈 1 부 : ==와 같음의 차이점에 대해 알려주세요. 귀하의 답변이 잘못되었을 수 있습니다. "


절차의 새로운 비전

소프트 파워와 하드 기술을 동시에 향상시켜 대량의 데이터를 제공 할 수있는 플랫폼 " New Vision of Program " 공개 계정

WeChat 공식 계정 : 프로그램의 새로운 비전

추천

출처blog.csdn.net/wo541075754/article/details/108198289