귀하의 질문은 매우 문제가 있다고 생각합니다. 귀하가 게시한 코드의 텍스트에 설명된 결론을 어떻게 얻었습니까? 당신의 의도를 대략적으로 짐작해 보고 마지못해 대답해 보도록 하겠습니다. 자바에서는 == 메소드와 같음 메소드가 다르기 때문에 간략하게 설명하면 다음과 같습니다.
==
==는 두 참조가 동일한 객체를 가리키는지 확인하는 데 사용됩니다(예: Object a = new Object(); Object b = a; a == b // = => ; 사실입니다
같음
동등 메소드는 두 객체가 동일한지 여부를 확인하는 데 사용됩니다. 이 메서드는 최상위 클래스 Object에 정의되어 있습니다. Object에서 이 메서드를 구현하면 ==를 사용하여 참조가 같은지 비교합니다. 하위 클래스가 동등 메소드를 사용하려는 경우 Object의 동등 메소드를 대체하고 자체 동등 논리를 제공하는 것이 가장 좋습니다. Person 클래스를 다음과 같이 정의합니다.
s 및 s2은 모두 상수 "12"에 대한 직접 참조입니다. 컴파일러는 코드를 최적화하고 두 변수에 의해 참조되는 "12" 문자열 개체만 생성하므로 s == s2입니다. 하지만 다른 "12"가 new String("12") 또는 "1234".substring(0, 2) 등 다른 방식으로 생성된 경우 ==이 작동하지 않고 equals에서 내용을 비교합니다. equals의 원본 코드를 보면 참조된 ==을 비교하기 위해 먼저
우선, equals와 ==의 기능을 고려해야 합니다. ==는 두 객체의 참조를 비교하는 것과 동일하며, equals 메소드는 Object 클래스에 정의되어 있으며 String으로 다시 작성되었습니다. 클래스 소스 코드를 볼 수 있습니다. 위의 분석에서 ==를 먼저 사용하여 참조를 비교한 다음 내용을 비교했습니다. 두 문자열을 비교할 때 주로 내용을 비교하고 싶기 때문에 같음 메서드를 사용합니다. ==를 사용하면 IDE가 실제로 경고를 표시합니다.
그럼 == 및 equals 메소드가 동일한 효과를 갖는 이유는 무엇입니까? "="를 사용하여 문자열 객체를 생성하는 것과 new를 사용하여 문자열을 생성하는 것의 차이점에 따라 달라집니다. 스트링 풀을 이해하신 적이 있는지 모르겠습니다. 제 이해가 깊지 않으니 필요하시면 직접 확인해 보셔도 됩니다. 처음으로 "="를 사용하여 문자열 개체를 생성하면 문자열 풀에 "12"가 있는지 확인합니다. 그렇지 않으면 풀에 하나를 추가하고 s에 대한 참조를 반환합니다. , 풀에 하나가 있는 것으로 확인되면 이 참조는 s2에 직접 할당되므로 s와 s2의 참조가 동일하므로 == 비교가 true가 됩니다. new를 사용하여 문자열을 만들고 효과를 확인할 수 있습니다.
으아악
new 키워드를 사용하여 문자열 개체를 생성하면 매번 새 개체가 생성되고 참조가 변수에 할당됩니다.
s1과 s2의 내용은 동일합니다. 할당 방법은 다음과 같습니다. 먼저 s1은 "..." 문자열을 JVM 가상 머신의 상수 풀에 넣습니다. 🎜>s2를 두 번째로 할당할 때 먼저 상수 풀에 이 문자열이 포함되어 있는지 확인하고, 그렇다면 이를 가리킵니다. 따라서 ==를 사용해도 동일합니다. s2에서 새 문자열(123)을 사용하면 참조 주소가 다르며 동일하지 않습니다. 휴대전화 코드는 쉽지 않습니다.
으아아아
결과:
으아아아== 객체를 가리키는 변수가 일치하는지 비교합니다. s와 s2가 동일한 이유는 jvm이 최적화하고 두 변수가 하나의 객체를 가리키기 때문입니다.
equal은 객체에 저장된 문자열이 동일한지 비교합니다.
어떤 질문에는 실제로 소스 코드에 가장 좋은 답변이 있습니다
으아아아== 연산자는 두 참조가 동일한 객체를 가리키는지 여부를 테스트합니다. 서로 다른 두 객체가 동일한지 테스트하려면 equals() 메서드를 사용해야 합니다.
더 자세히 알고 싶으시면 제가 쓴 글을 읽어보세요. Java 빠른 읽기 쓰기 가이드
귀하의 질문은 매우 문제가 있다고 생각합니다. 귀하가 게시한 코드의 텍스트에 설명된 결론을 어떻게 얻었습니까?
당신의 의도를 대략적으로 짐작해 보고 마지못해 대답해 보도록 하겠습니다.
자바에서는 == 메소드와 같음 메소드가 다르기 때문에 간략하게 설명하면 다음과 같습니다.
==
==는 두 참조가 동일한 객체를 가리키는지 확인하는 데 사용됩니다(예:
Object a = new Object();
Object b = a;
a == b // = => ; 사실입니다
같음
동등 메소드는 두 객체가 동일한지 여부를 확인하는 데 사용됩니다. 이 메서드는 최상위 클래스 Object에 정의되어 있습니다. Object에서 이 메서드를 구현하면 ==를 사용하여 참조가 같은지 비교합니다. 하위 클래스가 동등 메소드를 사용하려는 경우 Object의 동등 메소드를 대체하고 자체 동등 논리를 제공하는 것이 가장 좋습니다. Person 클래스를 다음과 같이 정의합니다.
을 사용한다는 것을 알 수 있습니다. 으아아아s
및s2
은 모두 상수 "12"에 대한 직접 참조입니다. 컴파일러는 코드를 최적화하고 두 변수에 의해 참조되는 "12" 문자열 개체만 생성하므로 s == s2입니다. 하지만 다른 "12"가new String("12")
또는"1234".substring(0, 2)
등 다른 방식으로 생성된 경우==
이 작동하지 않고equals
에서 내용을 비교합니다.equals
의 원본 코드를 보면 참조된==
을 비교하기 위해 먼저신작이 나오면 달라지겠죠
우선, equals와 ==의 기능을 고려해야 합니다.
==는 두 객체의 참조를 비교하는 것과 동일하며, equals 메소드는 Object 클래스에 정의되어 있으며 String으로 다시 작성되었습니다. 클래스 소스 코드를 볼 수 있습니다. 위의 분석에서 ==를 먼저 사용하여 참조를 비교한 다음 내용을 비교했습니다.
두 문자열을 비교할 때 주로 내용을 비교하고 싶기 때문에 같음 메서드를 사용합니다. ==를 사용하면 IDE가 실제로 경고를 표시합니다.
그럼 == 및 equals 메소드가 동일한 효과를 갖는 이유는 무엇입니까? "="를 사용하여 문자열 객체를 생성하는 것과 new를 사용하여 문자열을 생성하는 것의 차이점에 따라 달라집니다.
으아악스트링 풀을 이해하신 적이 있는지 모르겠습니다. 제 이해가 깊지 않으니 필요하시면 직접 확인해 보셔도 됩니다.
처음으로 "="를 사용하여 문자열 개체를 생성하면 문자열 풀에 "12"가 있는지 확인합니다. 그렇지 않으면 풀에 하나를 추가하고 s에 대한 참조를 반환합니다. , 풀에 하나가 있는 것으로 확인되면 이 참조는 s2에 직접 할당되므로 s와 s2의 참조가 동일하므로 == 비교가 true가 됩니다.
new를 사용하여 문자열을 만들고 효과를 확인할 수 있습니다.
new 키워드를 사용하여 문자열 개체를 생성하면 매번 새 개체가 생성되고 참조가 변수에 할당됩니다.
모두 잘 말씀하셨습니다. 문자열 상수 풀을 검색해 보시는 것이 좋습니다. 그러면 깊은 이해가 가능할 것입니다.
s1과 s2의 내용은 동일합니다.
할당 방법은 다음과 같습니다.
먼저 s1은 "..." 문자열을 JVM 가상 머신의 상수 풀에 넣습니다. 🎜>s2를 두 번째로 할당할 때 먼저 상수 풀에 이 문자열이 포함되어 있는지 확인하고, 그렇다면 이를 가리킵니다.
따라서 ==를 사용해도 동일합니다.
s2에서 새 문자열(123)을 사용하면 참조 주소가 다르며 동일하지 않습니다.
휴대전화 코드는 쉽지 않습니다.