2011-09-15 3 views
2

가능한 중복 :
Java string comparison?("kg"== "kg")은 false를 반환합니다. 이 비교 결과가 true를 반환하는 Java에 대해 어떻게 말합니까?

나는이 일을하려고했다 : 두 개의 문자열이하더라도,

boolean exit = false; 
while(exit==false && convStoreIndex<convStoreLength) { 
    if(conversionStore[convStoreIndex].getInUnit()==inUnit) { 
    indexCount++; 
    exit=true; 
    } 
    convStoreIndex++; 
} 

을하지만, 만약 조건이 참 가본 적이 같은 (디버거에서 확인). 여기

boolean exit = false; 
while(exit==false && convStoreIndex<convStoreLength) { 
    Log.v("conversionStore["+String.valueOf(convStoreIndex)+"]", conversionStore[convStoreIndex].getInUnit()+"|"+inUnit); 
    String cs = conversionStore[convStoreIndex].getInUnit(); 
    String iu = inUnit; 
    Log.v("cs", cs); 
    Log.v("iu", iu); 
    Log.v("Ergebnis(cs==iu)", String.valueOf(cs==iu)); 
    if(conversionStore[convStoreIndex].getInUnit()==inUnit) { 
    indexCount++; 
    exit=true; 
    } 
    convStoreIndex++; 
} 

과 로그 캣의 추출물은 다음과 같습니다 :

09-15 11:07:14.525: VERBOSE/cs(585): kg 
09-15 11:07:16.148: VERBOSE/iu(585): kg 
09-15 11:07:17.687: VERBOSE/Ergebnis(cs==iu)(585): false 

conversionStore의 클래스 :

class ConversionStore { 
    private String inUnit; 
    [...] 
    public String getInUnit() { 
    return inUnit; 
    } 
} 

미친, 자바 또는 나를 것입니다 은 그래서 몇 줄을 추가?

+3

귀하의 제목 (I가 실제로 true로 평가 것이라고 생각),도 잘못된 것입니다. –

+1

Zukunft'! exit' statt'exit == false' schreiben에서 비트가 끝납니다. – starblue

답변

13

String 객체를 비교하는 ==를 사용 .equals()를 사용하지 마십시오

if(conversionStore[convStoreIndex].getInUnit().equals(inUnit)) { 
+2

저는이 답변에 대해 140 명의 담당자를 얻는 것이 잘못 될 수 있기 때문에 실제로 이미 200 포인트 제한을 이미 초과했기 때문에 실제로 기쁩니다. 특히 명확한 복제물이기 때문에 특히 그렇습니다. –

4

문자열 내용 대신 참조 정체성 비교 String.equals()을 사용하십시오.

6

문자열이 동일한 지 비교하려면 ==를 사용하지 마십시오. == 연산자는 두 개의 객체가 정확히 같은 객체인지 확인하기 위해 을 검사합니다. 두 문자열은 개의 서로 다른 개체가 될 수 있지만 동일한 값을가집니다 (정확히 개의 문자가 있음). .equals() 메서드를 사용하여 문자열이 같은지 비교합니다.

스트레이트 "자바 문자열 비교"를 검색 할 때 구글이 제공하는 첫 번째 링크 ...

3

에서 당신은 ==를 사용하여 Strings을 비교하는 : cs==iu.

그러나 String 두 개가 실제로 동일한 개체 인 경우에만 true이 반환됩니다. 여기에는 해당하지 않습니다. 동일한 값을 포함하는 String이라는 두 개의 고유 한 인스턴스가 있습니다.

String.compareTo(String)을 사용해야합니다.

2

두 가지 : "부울"이 될 것입니다 귀하의 예제에서, 그래서 당신은 작성할 필요가 없습니다 "부울 == false"를 그냥 쓸 수 있습니다 :

while(!exit && convStoreIndex<convStoreLength) { 

두 번째 문제 : 비교하려면 두 문자열은 문자열을 사용합니다.같음 (문자열 x)의 방법, 즉 될 수 있도록 :

if(conversionStore[convStoreIndex].getInUnit().equals(inUnit)) { 
3

사용 ==

Becase의 .equals(); 방법 instread ::

그들은 모두 자신의 중요성에 아주 많이 다릅니다. equals() 메소드는 java.lang.Object 클래스에 존재하며 객체 상태와 동등한지를 검사해야합니다! 즉, 객체의 내용을 의미합니다. 반면 '=='연산자는 실제 객체 인스턴스가 동일한 지 여부를 확인해야합니다.

예를 들어, 두 개의 String 객체가 있고 두 개의 다른 참조 변수 s1과 s2가 가리키고 있다고 가정 해 봅시다. 당신이 "() 등호"를 사용하는 경우

s1 = new String("abc"); 
s2 = new String("abc"); 

이제 방법은

if(s1.equals(s2)) 
    System.out.println("s1.equals(s2) is TRUE"); 
else 
    System.out.println("s1.equals(s2) is FALSE"); 

그들의 등가를 확인하기 위해 당신은 ') (등호'을위한 방법 체크를 한 TRUE 출력을 얻을 것이다 내용 동일성.

다른

if(s1==s2) 
System.out.printlln("s1==s2 is TRUE"); 

있습니다 .. '=='연산자를 검사에서 System.out.println ("S1 S2 == FALSE 인")을하자;

이제 s1과 s2가 모두 동일한 문자열 컨텐츠를 공유하더라도 두 개의 다른 오브젝트를 가리 키기 때문에 FALSE가 출력됩니다. 새로운 객체가 생성 될 때마다 'new String()'때문입니다.

은 '새로운 문자열'없이 당신이 모두 시험 TRUE 얻을 것이다

String s1 = "abc"; 
String s2 = "abc"; 

와 함께 프로그램을 실행 해보십시오.

RESON :: 당신이 "kg"== "kg"을 가지고 있지 않기 때문에

After the execution of String str1 = “Hello World!”; the JVM adds the string “Hello World!” to the string pool and on next line of the code, it encounters String str2 =”Hello World!”; in this case the JVM already knows that this string is already there in pool, so it does not create a new string. So both str1 and str2 points to the same string means they have same references. However, str3 is created at runtime so it refers to different string.

관련 문제