[Java] String형의 정확한 비교
String형 비교 깊이 파고들기
구성된 문자열 값 비교.
등 비교 방법
1. ==
·기본형에서 값을 비교한다.
· 객체 유형에서 객체의 참조 값을 비교하여 객체가 동일한지 여부를 판단합니다.
2. equals()
객체 유형에서만 사용할 수 있으며 객체의 컨텐트를 비교하여 객체가 동일한지 여부를 판단합니다.
※ 오브젝트 클래스에 equals가 정의되어 있습니다.
String 클래스에서 override.
즉, String형은 참조형의 객체이므로 equals를 사용하면 됩니다.
검증(==이면 정말 비교가 안 되나요)
StringSample.java String str1 = "A";
String str2 = "A";
String str3 = new String("A");
System.out.println(str1.hashCode());
System.out.println(str2.hashCode());
if(str1 == str2) {
System.out.println("TRUE");
}else {
System.out.println("FALSE");
}
if(str1 == str3) {
System.out.println("TRUE");
}else {
System.out.println("FALSE");
}
결과
100
100
TRUE
TRUE가 되었습니다.String 타입은 ==로도 비교할 수 있습니까?
조사
String형은 초기화할 때 더미 영역에서 값을 생성하지만 같은 값을 사용할 때 반복적으로 사용할 수 있을 것 같습니다.
※ new 시 새 영역이 생성됩니다.
도해를 해봤어요.
메모리를 절약하기 위해 new를 사용하지 않고 "A"값이 일치하는 구역(주소=100)을 반복합니다.
※ 참조 값: 대상 스토리지 주소 참조
문자열 값을 변경할 때의 동작
변수의 값을 바꾸지 않으면 참조 원본의 값(주소=100)이 변경되고, new'B'의 새로운 구역이 참조 목적지를 변경합니다.(참조 주소를 100 → 200으로 변경)
※ String은 모방이므로 참조 객체의 값을 변경할 수 없습니다.
String 객체의 equals는 무엇을 합니까?
String.class private final char value[];
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value; //自オブジェクトのvalue
char v2[] = anotherString.value; //比較先オブジェクトのvalue
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i]) //Stirngをcharに分解して値比較
return false;
i++;
}
return true;
}
}
return false;
}
String 객체를 char[]로 분해하여 값을 하나씩 비교합니다.
결론
String 대상은 메모리를 절약하기 위해 같은 값의 경우 서로 다른 부분 변수라도 참조 값(주소 참조)이 같을 수 있지만 보장할 수 없기 때문에 equals에서 비교해야 한다.
Reference
이 문제에 관하여([Java] String형의 정확한 비교), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/j-work/items/d5c387d682ba5c0c6401
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
String str1 = "A";
String str2 = "A";
String str3 = new String("A");
System.out.println(str1.hashCode());
System.out.println(str2.hashCode());
if(str1 == str2) {
System.out.println("TRUE");
}else {
System.out.println("FALSE");
}
if(str1 == str3) {
System.out.println("TRUE");
}else {
System.out.println("FALSE");
}
100
100
TRUE
String형은 초기화할 때 더미 영역에서 값을 생성하지만 같은 값을 사용할 때 반복적으로 사용할 수 있을 것 같습니다.
※ new 시 새 영역이 생성됩니다.
도해를 해봤어요.
메모리를 절약하기 위해 new를 사용하지 않고 "A"값이 일치하는 구역(주소=100)을 반복합니다.
※ 참조 값: 대상 스토리지 주소 참조
문자열 값을 변경할 때의 동작
변수의 값을 바꾸지 않으면 참조 원본의 값(주소=100)이 변경되고, new'B'의 새로운 구역이 참조 목적지를 변경합니다.(참조 주소를 100 → 200으로 변경)
※ String은 모방이므로 참조 객체의 값을 변경할 수 없습니다.
String 객체의 equals는 무엇을 합니까?
String.class private final char value[];
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value; //自オブジェクトのvalue
char v2[] = anotherString.value; //比較先オブジェクトのvalue
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i]) //Stirngをcharに分解して値比較
return false;
i++;
}
return true;
}
}
return false;
}
String 객체를 char[]로 분해하여 값을 하나씩 비교합니다.
결론
String 대상은 메모리를 절약하기 위해 같은 값의 경우 서로 다른 부분 변수라도 참조 값(주소 참조)이 같을 수 있지만 보장할 수 없기 때문에 equals에서 비교해야 한다.
Reference
이 문제에 관하여([Java] String형의 정확한 비교), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/j-work/items/d5c387d682ba5c0c6401
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
String.class
private final char value[];
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value; //自オブジェクトのvalue
char v2[] = anotherString.value; //比較先オブジェクトのvalue
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i]) //Stirngをcharに分解して値比較
return false;
i++;
}
return true;
}
}
return false;
}
String 객체를 char[]로 분해하여 값을 하나씩 비교합니다.결론
String 대상은 메모리를 절약하기 위해 같은 값의 경우 서로 다른 부분 변수라도 참조 값(주소 참조)이 같을 수 있지만 보장할 수 없기 때문에 equals에서 비교해야 한다.
Reference
이 문제에 관하여([Java] String형의 정확한 비교), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/j-work/items/d5c387d682ba5c0c6401
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여([Java] String형의 정확한 비교), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/j-work/items/d5c387d682ba5c0c6401텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)