Java 문자열 "==" 및 "equals"에 대한 질문은 Java 학습에 있어서 가장 기본적인 질문이지만, Java를 막 배운 학생들 중 아직 그 원리가 명확하지 않은 학생들이 많습니다. 최근 친구들과 이 문제에 대해 논의했습니다. , 그래서 나는 내 자신의 이해를 여러분과 공유하기 위해 기사를 썼습니다.
먼저 예를 살펴보겠습니다.
다음과 같이 코드 코드를 복사합니다 .
공개 클래스 TestStringEquals {
공개 정적 무효 메인(String[] args) {
문자열 a = "테스트";
문자열 b = "테스트";
String c = new String("테스트");
String d = new String("테스트");
문자열 e = a;
문자열 f = 새로운 문자열(a);
문자열 g = a + "";
System.out.println(a == b ? "표현식 /"a==b/"는 참입니다."
: "표현식 /"a==b/"는 거짓입니다.");
System.out.println(a == c ? "표현식 /"a==c/"는 true입니다."
: "표현식 /"a==c/"는 거짓입니다.");
System.out.println(c == d ? "표현식 /"c==d/"는 참입니다."
: "표현식 /"c==d/"는 거짓입니다.");
System.out.println(a == e ? "표현식 /"a==e/"는 참입니다."
: "표현식 /"a==e/"는 거짓입니다.");
System.out.println(a == f ? "표현식 /"a==f/"는 참입니다."
: "표현식 /"a==f/"는 거짓입니다.");
System.out.println(a == g ? "표현식 /"a==g/"는 참입니다."
: "표현식 /"a==g/"는 거짓입니다.");
if (a.equals(b) && b.equals(c) && c.equals(d) && d.equals(e)
&& e.equals(f) && f.equals(g)) {
시스템아웃
.println("a = b = c = d = e = f = g");
}
}
}
아직 답을 얻지 못했다면 시도해 보세요. 모든 것이 정확하다고 보장할 수 있나요?
답변은 아래와 같이 발표됩니다.
다음과 같이 코드 코드를 복사합니다 .
"a==b"라는 표현은 참입니다
"a==c"라는 표현은 거짓입니다.
"c==d" 표현식은 거짓입니다.
"a==e"라는 표현은 참입니다
"a==f"라는 표현은 거짓입니다.
"a==g"라는 표현은 거짓입니다.
<div style="text-align: left;"></div>a 같음 b 같음 c 같음 d 같음 e 같음 f 같음 g
이런 문제를 잘 이해하기 위해서는 Java에서 String의 "==" 메소드와 "equals" 메소드의 메커니즘과 원리를 깊이 이해하는 것이 가장 좋습니다. "equals"는 문자열의 내용을 비교하는 것임을 다들 아셔야 합니다. 위 프로그램의 모든 문자열 내용은 "test"이므로, equals와 비교하면 모두 같게 됩니다.
하지만 Java의 기본 클래스 Object의 equals 메소드와 "==" 메소드가 실제로 동일하다는 것을 알고 계십니까? String 클래스가 Object 클래스를 상속한 후(Java의 모든 클래스는 Object 클래스를 상속함), equal 메소드를 오버로드하여 문자열 내용을 비교하게 됩니다.
같음에 대해 잘 이해한 후 이제 "==" 메서드의 복잡한 부분을 살펴보겠습니다.
"=="는 Java의 연산자입니다. 비교하는 내용은 실제 객체의 주소인 두 객체의 포인터입니다. 따라서 e==a가 true를 반환한다는 것을 이해하기 쉽습니다.
c와 d의 비교를 다시 살펴보겠습니다. new 키워드를 보면 c와 d 모두 메모리 주소에 다시 적용한 다음 "test" 값을 할당했기 때문에 c==d가 false를 반환한다는 의미입니다. 같은 의미로 이해가 되네요
a, c, d, f 사이의 "==" 연산은 모두 false를 반환합니다.
그러면 g= a + “”를 살펴보겠습니다. new 키워드는 보이지 않지만 String 클래스 “+” 연산자가 오버로드되어 있기 때문에 오버로드된 메서드에는 반드시 새 String이 추가되므로 위와 같이 됩니다. 상황. 그렇다면 가장 이해하기 어려운 것은 a와 b의 비교입니다. 사실 이는 Java 컴파일러의 최적화 결과입니다. String a = "test"이므로 Java 컴파일러에는 문자열 상수 풀이라는 저장 영역이 있습니다. 명령문이 컴파일된 후 "test"는 이 문자열 상수 풀에 저장됩니다. 그런 다음 b가 다시 정의되면 b는 여전히 이 영역을 가리키므로 a와 b는 여전히 동일한 영역을 가리킵니다. 따라서 a==b는 true를 반환합니다.