Java在比较字符串的时候,equals 与== 完全一样呀?
阿神
阿神 2017-04-17 17:36:04
0
9
467

完全一样,比较字符串equals与== 完全没有区别吗?

阿神
阿神

闭关修行中......

모든 응답(9)
Ty80

으아아아

결과:

으아아아

== 객체를 가리키는 변수가 일치하는지 비교합니다. s와 s2가 동일한 이유는 jvm이 최적화하고 두 변수가 하나의 객체를 가리키기 때문입니다.
equal은 객체에 저장된 문자열이 동일한지 비교합니다.

刘奇

어떤 질문에는 실제로 소스 코드에 가장 좋은 답변이 있습니다

으아아아
刘奇

== 연산자는 두 참조가 동일한 객체를 가리키는지 여부를 테스트합니다. 서로 다른 두 객체가 동일한지 테스트하려면 equals() 메서드를 사용해야 합니다.

더 자세히 알고 싶으시면 제가 쓴 글을 읽어보세요. Java 빠른 읽기 쓰기 가이드

迷茫

귀하의 질문은 매우 문제가 있다고 생각합니다. 귀하가 게시한 코드의 텍스트에 설명된 결론을 어떻게 얻었습니까?
당신의 의도를 대략적으로 짐작해 보고 마지못해 대답해 보도록 하겠습니다.
자바에서는 == 메소드와 같음 메소드가 다르기 때문에 간략하게 설명하면 다음과 같습니다.

  1. ==

    ==는 두 참조가 동일한 객체를 가리키는지 확인하는 데 사용됩니다(예:
    Object a = new Object();
    Object b = a;
    a == b // = =&gt ; 사실입니다

  2. 같음

    동등 메소드는 두 객체가 동일한지 여부를 확인하는 데 사용됩니다. 이 메서드는 최상위 클래스 Object에 정의되어 있습니다. Object에서 이 메서드를 구현하면 ==를 사용하여 참조가 같은지 비교합니다. 하위 클래스가 동등 메소드를 사용하려는 경우 Object의 동등 메소드를 대체하고 자체 동등 논리를 제공하는 것이 가장 좋습니다. Person 클래스를 다음과 같이 정의합니다.

으아아아
巴扎黑

ss2은 모두 상수 "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 키워드를 사용하여 문자열 개체를 생성하면 매번 새 개체가 생성되고 참조가 변수에 할당됩니다.

Peter_Zhu

모두 잘 말씀하셨습니다. 문자열 상수 풀을 검색해 보시는 것이 좋습니다. 그러면 깊은 이해가 가능할 것입니다.

巴扎黑

s1과 s2의 내용은 동일합니다.
할당 방법은 다음과 같습니다.
먼저 s1은 "..." 문자열을 JVM 가상 머신의 상수 풀에 넣습니다. 🎜>s2를 두 번째로 할당할 때 먼저 상수 풀에 이 문자열이 포함되어 있는지 확인하고, 그렇다면 이를 가리킵니다.
따라서 ==를 사용해도 동일합니다.
s2에서 새 문자열(123)을 사용하면 참조 주소가 다르며 동일하지 않습니다.
휴대전화 코드는 쉽지 않습니다.

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿