자바 에서 equals 와 = 의 차이 에 대한 작은 실험
몇 가지 작은 실험 을 하여 결 과 를 비교 하 였 다.
실험 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 를 출력 합 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.