자바 에서 두 문자열 이 같 음 을 어떻게 판단 합 니까?

1862 단어
어떻게 두 문자열 이 같다 고 판단 합 니까?
자바 에 서 는 두 가지 방법 으로 이 일 을 할 수 있 습 니 다.그런데 이 두 가 지 는 또 어떤 차이 가 있 습 니까?
먼저 예제 코드 를 보 겠 습 니 다.
String a1 = "abc";
String b1 = "abc";

//    ==      ,        ,          。
System.out.println(a1 == b1); // true

String a2 = new String("abc");
String b2 = new String("abc");

System.out.println(a2 == b2); // false    a   b       。

// equals                   ,     。
System.out.println(a2.equals(b2)); // true

String a3 = a1 + "d";
String b3 = a1.concat("d");
System.out.println(a3 == b3);

자바 의 모든 대상 은 Object 클래스 에서 계승 되 며, Object 클래스 에서 이 루어 지 는 equals () 방법 은 다음 과 같 습 니 다.
public boolean equals(Object obj) {  
    return (this == obj);  
}
  • String 류 는 이 방법 을 다시 썼 습 니 다. 다시 쓴 방법 은 메모리 주소 가 일치 하 는 지 먼저 판단 합 니 다. 일치 하면 true 로 돌아 갑 니 다. 그렇지 않 으 면 문자열 의 내용 이 일치 하 는 지, 내용 이 일치 하면 true 로 돌아 갑 니 다.따라서 String 클래스 를 사용 하 는 equals 방법 은 내용 이 일치 하 는 지, '= =' 을 사용 하 는 것 은 같은 인 스 턴 스 인지 비교 하 는 것 입 니 다.
  • StringBuilder 클래스 는 equals 방법 을 다시 쓰 지 않 았 기 때문에 equals 를 사용 할 때 같은 인 스 턴 스 가 필요 할 때 true 로 돌아 갑 니 다. 그렇지 않 으 면 false 로 돌아 갑 니 다.

  • 자바 문자열 생 성 과정
    "=" 할당 을 사용 할 때 메모리 에 이 문자열 이 있 으 면 이 변수 에 주 소 를 직접 주 고 새로운 문자열 이 생기 지 않 습 니 다.
    위의 코드 중의 "a1" 과 "b1" 과 같이 양 자 는 같은 실례 를 가리킨다.
    "+" 또는 "concat" 방법 으로 문자열 을 연결 할 때 새로운 문자열 을 만 들 고 새로운 메모리 공간 을 차지 하기 때문에 "= =" 판단 을 사용 할 때 false 로 돌아 갑 니 다.
    자바 에서 String 의 인용 방식
    String a1 = "abc";
    String b1 = "abc";
    System.out.println(a1 == b1); // true
    

    먼저 메모리 에 문자열 'abc' 를 만 든 다음 에 주소 의 인용 을 변수 a1 에 주 었 고 그 다음 에 이 주소 의 인용 을 b1 에 주 었 습 니 다.따라서 a1 과 b1 은 같은 메모리 입 니 다.String 클래스 는 변경 할 수 없 는 클래스 이기 때 문 입 니 다.문자열 은 변경 할 수 없 기 때문에 이런 방식 은 문제 가 되 지 않 습 니 다.

    좋은 웹페이지 즐겨찾기