자바 에서 equals 와 = 의 차이 에 대한 작은 실험

13295 단어
자바 에 서 는 equals 와 = = 이 자주 헷 갈 립 니 다. 쉽게 말 하면 equals 는 값 이 같 는 지 여 부 를 비교 하 는 방법 입 니 다. = = 비교 하 는 두 대상 이 JVM 에 있 는 주 소 는 조작 부호 입 니 다.
몇 가지 작은 실험 을 하여 결 과 를 비교 하 였 다.
실험 1:
String str1="ab";
String str2="ab";
System.out.println(s1==s2);//true
System.out.println(str1.equals(str2));//true

여기 str 1 과 str 2 는 상수 탱크 의 같은 대상 을 가리 키 기 때문에 System. out. println (s1 = s2);true 로 되 돌아 갑 니 다. 물론 str 1 과 str 2 문자열 의 값 도 같 습 니 다.
 
실험 2:
1 String str1="ab";
2 String str2="abc";
3 System.out.println(str1==str2);//false
4 System.out.println(str1.equals(str2));//false

이 str 1 은 문자열 ab 를 가리 키 고 있 습 니 다. 초기 에 상수 탱크 에서 문자열 abc 를 찾 지 못 하면 주소 저장 문자열 abc 를 열 고 str 2 를 abc 문자열 로 가리 키 기 때문에 str 1 과 str 2 는 하나의 대상 이 아니 고 그들의 문자열 값 도 같 지 않 습 니 다.
 
실험 3:
1 String str1="ab";
2 String str2="ab";
3 String str6=str2;
4 System.out.println(str1==str6);//true
5 System.out.println(str2==str6);//true
6 System.out.println(str1.equals(str6));//true
7 System.out.println(str2.equals(str6));//true

str 2 의 값 을 str 6 에 할당 합 니 다. 상수 탱크 에 ab 라 는 문자열 이 존재 하기 때문에 str 1, str 2 와 str 6 는 같은 대상 을 공유 합 니 다. = = equals 와 마찬가지 로 true 로 돌아 갑 니 다.
 
실험 4:
1 String str1= new String("abc");
2 String str2= "abc"3 System.out.println(str1==str2);//false

두 개의 인용 을 만 들 었 습 니 다.두 개의 대상 을 만 들 었 습 니 다.두 인용 은 각각 다른 두 대상 을 가리킨다.위 코드 는 new () 로 대상 을 새로 만 들 면 더미 에서 만 들 고 문자열 은 단독 저장 값 이 며 스 택 의 데이터 와 같 더 라 도 스 택 의 데이터 와 공유 하지 않 는 다 는 것 을 설명 합 니 다.
 
실험 5:
1 String str1="ab";
2 String str3=new String("ab");
3 String str4=new String("ab");
4 System.out.println(str3==str4);//false
5 System.out.println(str1.equals(str3));//true
6 System.out.println(str3.equals(str4));//true

str3 과 str4 의 문자열 의 값 이 같 기 때문에 str3. equals (str4) 는 true 이지 만 str3 과 str4 가 가리 키 는 것 은 같은 대상 이 아니 기 때문에 str3 = = str4 는 false 로 되 돌아 갑 니 다.str1 과 str3 문자열 의 값 이 같 기 때 문 입 니 다. str1 과 str3 이 가리 키 는 것 은 같은 대상 이 아니 지만 str1. equals (str3) 는 똑 같이 true 를 되 돌려 줍 니 다.
 
실험 6:
 
 1 String str1="ab";
 2 String str3=new String("ab");
 3 String str4=new String("ab");
String str5=str3;
4 System.out.println(str1.equals(str3));//true 5 System.out.println(str3.equals(str4));//true 6 System.out.println(str3.equals(str5));//true 7 System.out.println(str4.equals(str5));//true 8 System.out.println(str3==str5);//true 9 System.out.println(str4==str5);//false 10 System.out.println(str1==str5);//false 11 System.out.println(str1.equals(str5));//true

 
str3 를 str5 에 할당 하기 때문에 str3 와 str5 는 같은 대상 을 가리 키 고 str3 = = str5 는 true 값 으로 되 돌아 가 며 str3. equals (str5) 역시 true 값 으로 되 돌아 갑 니 다.str4 와 str5 가 가리 키 는 것 은 같은 대상 이 아니 기 때문에 str4 = = str5 는 false 로 되 돌아 갑 니 다.그러나 문자열 의 값 이 같 기 때문에 str4. euqals (str5) 는 true 값 으로 되 돌아 갑 니 다.
 
다음은 상기 실험의 모든 코드 입 니 다.
 1 public class Test 
 2 {
 3     public static void main(String[] args) 
 4     {
 5         String str1="ab";
 6         String str2="abc";
 7         String str6=str2;
 8         String str3=new String("ab");
 9         String str4=new String("ab");
10                 String str5=str3;
11         System.out.println(str1==str6);//true
12         System.out.println(str2==str6);//true
13         System.out.println(str1.equals(str6));//true
14         System.out.println(str2.equals(str6));//true
15         System.out.println(str1==str2);//true
16         System.out.println(str1.equals(str2));//true
17         System.out.println(str3==str4);//false
18         System.out.println(str1.equals(str3));//true
19         System.out.println(str3.equals(str4));//true
20         System.out.println(str3.equals(str5));//true
21         System.out.println(str4.equals(str5));//true
22         System.out.println(str3==str5);//true
23         System.out.println(str4==str5);//false
24         System.out.println(str1==str5);//false
25             System.out.println(str1.equals(str5));//true
26     }
27 }

 String 류 를 Integer 포장 류 로 바 꾸 고 테스트 코드 와 결 과 는 다음 과 같 습 니 다.
 1 class TestNumber
 2 {
 3     public static void main(String[] args) 
 4     {
 5         Integer str1=23;
 6         Integer str2=23;
 7         Integer str6=str2;
 8         Integer str3=new Integer(23);
 9         Integer str4=new Integer(23);
10         Integer str5=str3;
11         System.out.println(str1==str6);//true
12         System.out.println(str2==str6);//true
13         System.out.println(str1.equals(str6));//true
14         System.out.println(str2.equals(str6));//true
15         System.out.println(str1==str2);//true
16         System.out.println(str1.equals(str2));//true
17         System.out.println(str3==str4);//false
18         System.out.println(str1.equals(str3));//true
19         System.out.println(str3.equals(str4));//true
20         System.out.println(str3.equals(str5));//true
21         System.out.println(str4.equals(str5));//true
22         System.out.println(str3==str5);//true
23         System.out.println(str4==str5);//false
24     }
25 }

 추가 설명:
Integer 클래스 의 equals 소스 코드
1  public boolean equals(Object obj) {  
2     if (obj instanceof Integer) {  
3         return value == ((Integer)obj).intValue();  
4     }  
5     return false;  
6     }  

이 를 통 해 알 수 있 듯 이 Integer 의 equals 는 직접 수 치 를 얻어 비교 한 것 이다.
String 의 equals 소스 코드 는 다음 과 같 습 니 다.
 1 public boolean equals(Object anObject) {
 2         if (this == anObject) {
 3             return true;
 4         }
 5         if (anObject instanceof String) {
 6             String anotherString = (String) anObject;
 7             int n = value.length;
 8             if (n == anotherString.value.length) {
 9                 char v1[] = value;
10                 char v2[] = anotherString.value;
11                 int i = 0;
12                 while (n-- != 0) {
13                     if (v1[i] != v2[i])
14                             return false;
15                     i++;
16                 }
17                 return true;
18             }
19         }
20         return false;
21     }

이 를 통 해 알 수 있 듯 이 String 클래스 의 소스 코드 는 Integer 와 다 릅 니 다. 다른 점 은 먼저 = 방식 으로 비교 한 것 입 니 다. 같은 대상 이 아니면 값 을 비교 한 것 입 니 다. 이 equals 함 수 는 상수 탱크 에 저 장 된 문자열 에 적 용 됩 니 다. 예 를 들 어
1 String str1="ab";
2 String str2="ab";
3 System.out.println(str1.equals(str2));

str 1 과 str 2 의 비교 equals 방법 중의
1 if (this == anObject) {
2            return true;
3       }

비교 한 트 루
다음 의 예 는:
1 String str3=new String("ab");
2 String str4=new String("ab");
3 System.out.println(str3.equals(str4));

str3 와 str4 는 같은 대상 이 아니 기 때문에 if (this = anObject) 가 조건 에 부합 되 지 않 기 때문에 다음 문자열 값 을 비교 한 다음 true 로 돌아 갑 니 다.
아래 의 예 는 같다.
String str5="abc";
String str6=new String("abc");
System.out.println(str5.equals(str6));

 그러나 여기 또 하나의 함정 이 있 습 니 다. 바로 Integer 류 입 니 다. 이런 소스 코드 를 참고 하여 Integer 류 캐 시 - 128 에서 127 을 알 수 있 습 니 다. 공식 적 으로 는 작은 숫자 가 사용 하 는 빈도 가 비교적 높 고 이 범 위 를 초과 할 때 new Integer 를 실행 한 다 는 것 을 알 수 있 습 니 다. 이 를 통 해 다음 과 같은 코드 를 알 수 있 습 니 다.
Integer a=1000;
Integer b=1000;
System.out.println(a==b);//false;

옳다
그러나 두 변수 a 와 b 가 100 으로 할당 되면 결 과 는 true 입 니 다.
다음 코드:
Integer a=new Integer(1000);
int b=1000;
Integer c=new Integer(1000);
Integer d=new Integer(1000);
System.out.println(a==b);//true
System.out.println(c==d);//false 

c 와 d 는 new Integer 에서 얻 은 결과 로 캐 시 를 사용 하지 않 았 기 때문에 c 와 d 는 같은 대상 이 아니 라 출력 결 과 는 false 입 니 다.
그런데 a 와 b 는 왜 true 일 까요?
Integer 와 int 를 = = 비교 할 때 자바 는 Integer 를 자동 으로 뜯 어 int 형식 으로 바 꾸 기 때문에 a 와 b 가 같은 대상 을 가리 키 기 때문에 true 를 출력 합 니 다.

좋은 웹페이지 즐겨찾기