문제

나는 그것을 알고있다 == 두 가지를 비교할 때 몇 가지 문제가 있습니다 Strings. 그것은 것 같습니다 String.equals() 더 나은 접근 방식입니다. 글쎄, 나는 주니트 테스트를하고 있고 내 성향은 사용하는 것입니다 assertEquals(str1, str2). 두 줄에 같은 내용이 포함되어 있다고 주장하는 신뢰할 수있는 방법입니까? 나는 사용할 것이다 assertTrue(str1.equals(str2)), 그러나 예상 및 실제 값이 실패한 것을 보는 이점을 얻지 못합니다.

관련 메모에서 누구나 문제를 분명히 설명하는 페이지 나 스레드에 대한 링크가 있습니까? str1 == str2?

도움이 되었습니까?

해결책

당신은해야합니다 언제나 사용 .equals() 비교할 때 Strings 자바에서.

주니트는 .equals() 방법에서 평등을 결정하는 방법 assertEquals(Object o1, Object o2).

따라서, 당신은 확실히 안전합니다 assertEquals(string1, string2). (왜냐하면 Strings는 Object에스)

다음은 훌륭한 stackoverflow 질문에 대한 링크입니다 간의 차이점에 대해 == 그리고 .equals().

다른 팁

assertEquals 사용 equals 비교 방법. 다른 주장이 있습니다. assertSame, == 운영자.

이유를 이해합니다 == 무엇을 이해하는 데 필요한 줄과 함께 사용해서는 안됩니다. == 그렇게 : 신원 확인을합니다. 그건, a == b 확인하는지 확인합니다 a 그리고 b 참조 같은 객체. 언어에 내장되어 있으며 다른 클래스로는 행동을 바꿀 수 없습니다. 그만큼 equals 반면에 방법은 클래스에 의해 상환 될 수 있습니다. 기본 동작 ( Object 클래스)는 == 운영자, 많은 수업을 포함합니다 String, 대신 "동등성"점검을 수행하도록 재정의하십시오. 의 경우 String, 확인하는 대신 a 그리고 b 동일한 개체를 참조하고 a.equals(b) 그들이 참조하는 객체가 정확히 같은 문자를 포함하는 문자열인지 확인합니다.

비유 시간 : 각각을 상상해보십시오 String 객체는 그 위에 쓰여진 용지입니다. "foo"가 작성된 두 장의 종이가 있고 다른 하나는 "바"가 쓰여졌다 고 가정 해 봅시다. 처음 두 종이를 가져 와서 사용한다면 == 그것들을 비교하기 위해 돌아올 것입니다 false 그것은 본질적으로 "이것들이 같은 종이입니까?"라고 묻기 때문입니다. 종이에 쓰여진 내용을 볼 필요조차 없습니다. 내가 두 개의 종이를 두 번주고 있다는 사실은 그것이 두 번 같은 종이가 아니라 반환한다는 것을 의미합니다. false. 내가 사용하는 경우 equals, 그러나, 그 equals 방법은 두 장의 종이를 읽고 같은 말을하는 것을 볼 수 있습니다 ( "foo"). true.

문자열과 혼동하는 비트는 Java가 "Interning"문자열이라는 개념을 가지고 있으며, 이는 코드의 모든 문자열 리터럴에서 자동으로 수행된다는 것입니다. 이것은 코드에 동등한 문자 그럴이 두 개가 있다면 (다른 클래스에 있더라도) 실제로 동일하게 참조합니다. String 물체. 이것은로 만듭니다 == 운영자 반환 true 한 사람보다 더 자주 기대할 수 있습니다.

간단히 말해서 - 동일한 문자를 포함하지만 다른 객체 (다른 메모리 위치) 인 두 개의 문자열 객체를 가질 수 있습니다. == 운영자는 두 참조가 동일한 객체 (메모리 위치)를 가리키는 것을 확인하지만, equals () 메소드는 문자가 동일한지 확인합니다.

일반적으로 두 문자열에 동일한 메모리 위치를 가리키는지 여부가 아닌 동일한 문자가 포함되어 있는지 확인하는 데 관심이 있습니다.

예, 테스트에 항상 사용됩니다. 테스트 프레임 워크가 이와 같은 비교에 .quals ()를 사용했을 가능성이 높습니다.

아래는 "문자열 평등 실수"를 설명하는 링크입니다. 기본적으로 Java의 문자열은 물체이며, 객체 평등을 비교할 때 일반적으로 내용이 아닌 메모리 주소를 기준으로 비교됩니다. 이로 인해 콘텐츠가 동일하더라도 두 개의 문자열이 동일한 주소를 차지하지 않으므로 인쇄 할 때 동일하게 보이지만 올바르게 일치하지 않습니다.

http://blog.enrii.com/2006/03/15/java-string-equality-common-mistake/

public class StringEqualityTest extends TestCase {
    public void testEquality() throws Exception {
        String a = "abcde";
        String b = new String(a);
        assertTrue(a.equals(b));
        assertFalse(a == b);
        assertEquals(a, b);
    }
}

주니 assertEquals(obj1, obj2) 실제로 전화를합니다 obj1.equals(obj2).

또한 있습니다 assertSame(obj1, obj2) 그렇습니다 obj1 == obj2 (즉, 그것을 확인합니다 obj1 그리고 obj2 참조하고 있습니다 같은 인스턴스), 당신이 피하려는 것입니다.

그래서 당신은 괜찮습니다.

"그만큼 == 운영자는 두 개를 확인합니다 Objects 정확히 동일합니다 Object."

http://leftoint.net/notes-java/data/strings/12stringcomparison.html

String 이다 Object Java에서는 해당 범주의 비교 규칙에 속합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top