2009-12-01 4 views
2

이것은 Java 및 C# 질문입니다. Object Identity (==)는 두 객체가 같은 위치를 참조하는지 여부를 테스트하고, 두 개의 다른 객체 (동일하지 않은 객체)가 동일한 값을 갖고 있는지 테스트합니다. 그러나 문자열 객체의 경우 Object Identity 와 Object Equality는 동일합니다. 예컨대 두 부울 식 아래의 경우 이 문은 왜 그렇게이다개체 ID 및 개체 평등 및 문자열 클래스 예외에 대한 질문

string a="123"; 
string b="123"; 
if(a==b) 
if(a.Equals(b)) 

true를 돌려주는 경우에? 이 디자인 결정의 근거는 무엇입니까?

+0

을 당신이 Object.equals()와 String.equals (의 코드를 읽어 제안) 그리고 이것이 정확하지 않다는 것을 알 수 있습니다. –

+0

C#에서 "=="은 IDENTITY 테스트로 간주되지 않습니다. 일반적으로 클래스의 EQUALS 메소드가하는 일을 수행하기 위해 구현됩니다. "ReferenceEquals (a, b)"는 .Net의 IDENTITY 테스트입니다. – ToolmakerSteve

답변

4

Java와 C# 둘 다 string interning이라는 메모리 절약 기술을 사용합니다. 문자열은 이러한 언어로 불변이므로 자주 사용하는 문자열 (예제에 포함 된 하드 코딩 된 문자열 리터럴 포함)을 풀링하고 메모리에서 해당 문자열 하나에 대한 여러 참조를 사용하여 공간을 절약 할 수 있습니다.

2

사실 자바에서는 적어도 문자열에 캐싱 메커니즘이 있습니다. 함정은 동등한 두 문자열이 때때로 ID 연산자를 적용 할 때 항상 true를 반환하는 것은 아니라는 점입니다. 거짓 다음 코드를 인쇄 :

String a="123"; 
String b="12"; 
b=b+"3"; 
System.out.println(a==b); 
0

당신이 정말로 a.equals(b) == true하지만 (a==b) == false 두 개의 문자열 a와 b에 대해 false로 평가하는, 있는지 확인하려면, 당신은 완전히 저평가 (^^) 문자열 생성자를 사용할 수 있습니다

String a = new String("abc"); 
String b = new String("abc"); 
if (a.equals(b)) { 
    doTheyAreEqual(); 
    if (a != b) { 
    doButNotTheSame(); 
    } 
} 
+0

C#에서는 'true'로 평가됩니다. ReferenceEquals (a, b)는 'false'로 평가됩니다. – ToolmakerSteve

2

는 지금까지 내가 아는 한, .NET에서 문자열에 대한 == 운영자는 개체의 정체성 대신 Equals()를 사용하는 오버로드됩니다. 자세한 내용은이 설명을 참조하십시오 http://www.dotnetperls.com/string-equals

당신이 정말로 같은 객체인지 알 필요가 있다면,이 사용하십시오 :

Object.ReferenceEquals(string1, string2)