2011-08-04 8 views
-3

가능한 중복 :
Java String.equals versus ==비교 자바 문자열

는 == 연산자를 사용하여 Java 문자열을 비교할 수 있습니까?

자주 보는 이유는 대신 equals() 메서드가 사용되는 이유는 무엇입니까?

==를 사용하여 리터럴 문자열 (예 : "Hello")과 비교할 때 equals()를 호출하지 않는다고해서 그렇습니까?

+5

http://stackoverflow.com/questions/767372/java-string-equals-versus – Johan

+0

인턴 메소드가 두 개의 다른 String 변수를 참조하도록했기 때문에 ==가 두 개의 다른 String 변수에서 성공할 수 있음을주의하십시오. 실제 개체의 동일한 메모리. – Steven

+1

Google "java string comparison"을 사용하는 경우이 사이트에서 몇 가지를 비롯하여 명확한 설명을 찾을 수 있습니다. – NPE

답변

5

사용자 정의 자바에서 연산자 오버로딩이 없습니다. [equals()를 호출하기 위해 오버로드 할 수 없습니다.]

equals()는 2 개의 Object가 동일한 지 확인합니다. 반면 에==는 정확히 동일한 객체인지 확인합니다. [아니, ==를 사용하면 equals()가 호출되지 않습니다.

+0

** 사용자 정의 ** 없음 연산자 오버로딩. 자바 언어는 소수의 연산자를 오버로드했다 ('+'는 숫자 추가 또는 문자열 연결을 의미 할 수 있고,'| '는 비트 OR 또는 논리적 비 단축키 OR을 의미 할 수있다). –

+0

@ Joachim : 동의했다. OP가 커스텀 연산자 오버로딩에 관심이 있다고 생각하기 때문에 명시 적으로 언급하지 않았다. 코멘트 주셔서 감사합니다. 나는 내 대답을 편집했다. – amit

2

==은 두 객체가 동일한 객체 인스턴스를 참조하는지 확인하고 equals()은 동일한 객체가 아니더라도 두 객체가 실제로 동일한 지 확인합니다.

2

아니요, ==를 사용하면 객체 참조를 비교하고 문자열의 내용 (equals를 사용해야하는 내용)을 비교할 수 없으므로 불가능합니다.

1

@ amit의 대답을 확장하면 == 연산자는 값 유형 (int, double 등)에만 사용해야합니다. 문자열은 참조 유형이므로 .equals() 메소드와 비교해야합니다. 참조 유형에 == 연산자를 사용하면 java에서 참조 평등을 검사합니다 (객체 참조가 모두 동일한 메모리 위치를 가리키고 있음을 의미).

1

문자열은 클래스입니다. 문자열을 객체와 비교하려고하면 사용할 수없는 문자열 값을 == 사용할 수없는 객체를 찾고 있습니다. 사용하려는 객체의 내용을 비교하려면 같음

1

연산자 ==는 문자열 객체 참조를 비교하지만 String.equals 메소드 검사 두 객체 참조 + 객체 값 모두. 또한, String.equals 메소드 inturn은 구현 내에서 == 연산자를 사용합니다.

1

'=='연산자는 객체가 동일한 지 여부를 확인하는 데 사용됩니다.
추정 가능한 비교 문자열은 동일한 값 (문자 수 등)을 가질 수 있지만 사실 완전히 다른 두 개의 개체가 될 수 있으므로 비교가 거짓으로 렌더링됩니다.

2

Java에서는 연산자를 과부하 할 수 없습니다. == 연산자는 ID 평등을 수행합니다. 반면에 equals(...) 메서드는 형식 별 비교를 수행하도록 재정의 될 수 있습니다.

는 여기에 코드가 보여입니다 :

String a = "abcdef"; 
String b = a; 
String c = new String(a); 

println(a == b); // true 
println(a.equals(b)); // true 

println(a == c); // false 
println(a.equals(c)); // true 

한 합병증이 너무 널에 대해 신경 쓸 필요가 equals(...) 함께.그래서 올바른 널 안전 관용구이다 : 이것은 루프가

(a == null ? b == null : a.equals(b)) 

당신이 equals() 반면 같은 객체 것에 대해 ==를 통해 미트 이미 말했듯이 C#

0

말에 검사를 뛰어 필요가 없습니다 동일한 내용을 확인합니다 (기본 구현은 ==과 동일하지만 String이 우선 함). 동일 프리미티브의 객체 래퍼, 예를 들어도 마찬가지 게다가

"Hello" == "Hello" //most probably would be true 
"Hello".equals("Hello") //will be true 

String s1, s2; //initialize with something different than a literal, e.g. loading from a file, both should contain the same string 
s1 == s2 //most probably will NOT be true 
s1.equals(s2) //will be true, if both contain the same string, e.g. "Hello" 

: 주

Long l1 = 1L; 
Long l2 = 1L; 
l1 == l2 //will most likely be true for small numbers, since those literals map to cached instances 
l1.equals(l2) //will be true 

new Long(1) == new Long(1) //will NOT be true 
new Long(1).equals(new Long(1)) //will be true 
+0

-1 :'1L'은 프리미티브'long'이고 1L.equals (1L)은 유효하지 않은 Java 구문입니다 (프리미티브 타입의 메소드 호출에 대한 복싱 없음) [괜찮 으면 125 개의 평판에 도달 할 것입니다 : P] – pmnt

+0

@pmnt 맞아요, 대답이 업데이트되었습니다. – Thomas

1

==은 메모리 주소가 양쪽 모두 같으면 기본 유형을 제외하고는 true를 반환합니다.

등호는 프리미티브가 아닌 모든 것에 사용해야합니다. 주요 부분에 대한 수업.

0

== 연산자는 객체의 내용이 아닌 객체의 비트 패턴을 확인하지만, 객체의 내용을 비교하는 함수와 같습니다.

String str1=new String("abc"); 
String str2=new String("abc"); 

System.out.println (str1 == str2); str1과 str2가 "new"로 생성 된 다른 객체이기 때문에 false를 반환합니다. equals()가 object의 내용을 확인하기 때문에 System.out.println (str1.equals (str2))은 true를 반환합니다.