java - 비교 - string equal




자바 문자열을 어떻게 비교합니까? (16)

지금까지 모든 문자열을 비교하기 위해 프로그램에서 == 연산자를 사용했습니다. 그러나 버그가 발생하여 그 중 하나를 .equals() 로 바 꾸었습니다. 버그가 수정되었습니다.

== 나쁜가요? 언제 사용해야하며 사용하지 않아야합니까? 차이점이 뭐야?


Java에서 "==" 연산자를 사용하여 두 객체를 비교하면 객체가 메모리의 같은 위치를 참조하는지 확인합니다. 즉, 2 개의 객체 이름이 기본적으로 동일한 메모리 위치를 참조하는지 확인합니다.

Java String 클래스는 실제로 Object 클래스의 기본 equals () 구현을 재정의하고 메소드에서 메모리의 위치가 아닌 문자열 값만 검사하도록 메서드를 재정의합니다. 즉, String 객체 2 개를 비교하기 위해 equals () 메서드를 호출하면 실제 문자 시퀀스가 ​​동일하면 두 객체가 모두 같은 것으로 간주됩니다.

== 연산자는 두 문자열이 정확히 같은 객체인지 확인합니다.

.equals() 메소드는 두 문자열이 같은 값을 .equals() 확인합니다.


Java의 문자열은 변경할 수 없습니다. 즉, 문자열을 변경 / 수정할 때마다 새 인스턴스가 만들어집니다. 원래 문자열은 변경할 수 없습니다. 이러한 문자열 인스턴스를 캐시 할 수 있도록이 작업이 수행되었습니다. 일반적인 프로그램에는 많은 문자열 참조가 포함되어 있으며 이러한 인스턴스를 캐싱하면 메모리 사용 공간이 줄어들고 프로그램의 성능이 향상 될 수 있습니다.

문자열 비교를 위해 == 연산자를 사용하면 문자열의 내용을 비교하지 않고 실제로 메모리 주소를 비교합니다. 양쪽 모두가 동일한 경우는 true를 돌려 주어, 그렇지 않은 경우는 false를 돌려줍니다. 반면 문자열에서 equals는 문자열 내용을 비교합니다.

그래서 문제는 모든 문자열이 시스템에 캐시되어 있는지, equ = true가 반환되면 false를 반환하는 것입니다. 음, 가능합니다. String str = new String("Testing") 과 같은 새 문자열을 만들면 캐시에 이미 동일한 내용의 문자열이 포함되어 있더라도 캐시에 새 문자열이 만들어집니다. 간단하게 "MyString" == new String("MyString") 은 항상 false를 반환합니다.

Java는 또한 문자열을 캐시에 포함시켜 "MyString" == new String("MyString").intern() 이 true를 반환하도록 문자열에 사용할 수있는 함수 인 intern ()에 대해서도 설명합니다.

참고 : == 연산자는 두 개의 메모리 주소를 비교하기 때문에 equals보다 훨씬 빠르지 만 코드에서 새 String 인스턴스를 만들지 않아야합니다. 그렇지 않으면 버그가 발생합니다.


그래, 나쁘다 ...

== 는 두 개의 문자열 참조가 정확히 동일한 객체임을 의미합니다. Java가 문자 그대로의 테이블 (일종의 테이블)을 유지하기 때문에 이것이 사실이라고 들었을 수도 있지만 항상 그런 것은 아닙니다. 일부 문자열은 다른 방식으로로드되고 다른 문자열로 구성되므로 동일한 두 문자열이 같은 위치에 저장되어 있다고 가정해서는 안됩니다.

평등은 당신을위한 진정한 비교입니다.


기능:

public float simpleSimilarity(String u, String v) {
    String[] a = u.split(" ");
    String[] b = v.split(" ");

    long correct = 0;
    int minLen = Math.min(a.length, b.length);

    for (int i = 0; i < minLen; i++) {
        String aa = a[i];
        String bb = b[i];
        int minWordLength = Math.min(aa.length(), bb.length());

        for (int j = 0; j < minWordLength; j++) {
            if (aa.charAt(j) == bb.charAt(j)) {
                correct++;
            }
        }
    }

    return (float) (((double) correct) / Math.max(u.length(), v.length()));
}

테스트:

String a = "This is the first string.";

String b = "this is not 1st string!";

// for exact string comparison, use .equals

boolean exact = a.equals(b);

// For similarity check, there are libraries for this
// Here I'll try a simple example I wrote

float similarity = simple_similarity(a,b);

네가 나를 좋아하는 사람이라면 처음으로 자바를 사용하기 시작했을 때 "=="연산자를 사용하여 두 String 인스턴스가 같은지 여부를 테스트하고 싶었지만 더 좋든 나쁘 든 자바에서 올바른 방법은 아니었다.

이 튜토리얼에서는 대부분의 시간에 사용하는 방법부터 시작하여 Java 문자열을 올바르게 비교하는 여러 가지 방법을 보여줍니다. 이 Java String 비교 튜토리얼의 끝에서 Java 문자열을 비교할 때 "=="연산자가 작동하지 않는 이유에 대해서도 설명 할 것입니다.

옵션 1 : equals 메소드와의 Java String 비교 대부분의 경우 (아마도 시간의 95 %) 나는 문자열을 Java String 클래스의 equals 메소드와 비교한다.

if (string1.equals(string2))

이 String equals 메소드는 두 개의 자바 문자열을보고, 정확히 같은 문자열을 포함하고 있다면 동등한 것으로 간주됩니다.

equals 메서드를 사용하여 간단한 문자열 비교 예제를 살펴보면 다음 테스트를 실행 한 경우 두 문자가 동일하지 않은 것으로 간주되지 않습니다 (문자의 대 / 소문자가 다른 경우).

String string1 = "foo";
String string2 = "FOO";

if (string1.equals(string2))
{
    // this line will not print because the
    // java string equals method returns false:
    System.out.println("The two strings are the same.")
}

그러나 두 문자열에 똑같은 문자열이 들어 있으면 equals 메서드는 다음 예제와 같이 true를 반환합니다.

String string1 = "foo";
String string2 = "foo";

// test for equality with the java string equals method
if (string1.equals(string2))
{
    // this line WILL print
    System.out.println("The two strings are the same.")
}

옵션 2 : equalsIgnoreCase 메소드와의 문자열 비교

일부 문자열 비교 테스트에서는 문자열이 대문자인지 소문자인지 여부를 무시하려고합니다. 이 대소 문자를 구별하지 않는 방식으로 문자열의 동등성을 테스트하려면 String 클래스의 equalsIgnoreCase 메서드를 다음과 같이 사용하십시오.

String string1 = "foo";
String string2 = "FOO";

 // java string compare while ignoring case
 if (string1.equalsIgnoreCase(string2))
 {
     // this line WILL print
     System.out.println("Ignoring case, the two strings are the same.")
 }

옵션 3 : compareTo 메소드를 사용한 Java 문자열 비교

Java 문자열을 비교하는 세 번째 방법은 덜 일반적이며 String 클래스 compareTo 메서드를 사용합니다. 2 개의 캐릭터 라인이 완전히 같은 경우, compareTo 메소드는 0의 값을 돌려줍니다. 다음은이 String 비교 방법의 간단한 예제입니다.

String string1 = "foo bar";
String string2 = "foo bar";

// java string compare example
if (string1.compareTo(string2) == 0)
{
    // this line WILL print
    System.out.println("The two strings are the same.")
}

Java에서 이러한 평등 개념에 대해 쓰고 있지만 Java 언어에는 기본 Java Object 클래스에 equals 메소드가 포함되어 있다는 점에 유의해야합니다. 자신의 객체를 생성 할 때마다 객체의 두 인스턴스가 "동일"한지 확인할 수있는 방법을 제공하려는 경우 Java 언어에서 제공하는 것과 동일한 방법으로 클래스에서이 equals 메소드를 재정의하고 구현해야합니다. 이 같음 / 비교 동작은 String equals 메서드와 같습니다).

당신은 this ==, .equals (), compareTo () 및 compare ()를 보길 원할 것입니다.


연산자 == 는 항상 객체 참조 비교를 위한 것이지만, String 클래스 .equals () 메소드는 내용 비교를 위해 오버라이드됩니다.

String s1 = new String("abc");
String s2 = new String("abc");
System.out.println(s1 == s2); // It prints false (reference comparison)
System.out.println(s1.equals(s2)); // It prints true (content comparison)

자바는 자바가 String 객체를위한 메모리 할당을 관리하는 String 풀을 가지고있다. Java의 문자열 풀을 참조하십시오.

== 연산자를 사용하여 두 객체를 검사 (비교) 할 때 주소 평등을 문자열 풀과 비교합니다. 2 개의 String 객체가 같은 주소 참조를 가지는 경우는 true , 그렇지 않은 경우는 false 돌려줍니다. 그러나 두 String 오브젝트의 내용을 비교하려면 equals 메소드를 대체해야합니다.

equals 는 실제로 Object 클래스의 메서드이지만 String 클래스로 재정의되고 object의 내용을 비교하는 새 정의가 제공됩니다.

Example:
    stringObjectOne.equals(stringObjectTwo);

그러나 그것은 String의 경우를 존중합니다. 대소 문자를 구분하지 않으려면 String 클래스의 equalsIgnoreCase 메서드를 사용해야합니다.

보자 :

String one   = "HELLO"; 
String two   = "HELLO"; 
String three = new String("HELLO"); 
String four  = "hello"; 

one == two;   // TRUE
one == three; // FALSE
one == four;  // FALSE

one.equals(two);            // TRUE
one.equals(three);          // TRUE
one.equals(four);           // FALSE
one.equalsIgnoreCase(four); // TRUE

.equals() 는 클래스의 데이터를 비교합니다 (함수가 구현되었다고 가정). == 포인터 위치 (메모리에있는 오브젝트의 위치)를 비교합니다.

== 두 객체 (PRIMITIVES에 대해 말하지 않음)가 SAME 객체 인스턴스를 가리키는 경우 true를 반환합니다. .equals() 는 두 객체가 동일한 데이터를 포함하고 있으면 true를 반환합니다. equals() 대 Java의 경우 ==

그게 너에게 도움이 될거야.


== 객체 참조를 테스트하고 .equals() 는 문자열 값을 테스트합니다.

때로는 == 값을 비교하는 것처럼 보입니다. Java는 동일한 인라인 문자열이 실제로 동일한 객체인지 확인하기 위해 비하인드 작업을 수행하기 때문입니다.

예 :

String fooString1 = new String("foo");
String fooString2 = new String("foo");

// Evaluates to false
fooString1 == fooString2;

// Evaluates to true
fooString1.equals(fooString2);

// Evaluates to true, because Java uses the same object
"bar" == "bar";

그러나 nulls을 조심하십시오!

== null 문자열을 처리하지만 null 문자열에서 .equals() 를 호출하면 예외가 발생합니다.

String nullString1 = null;
String nullString2 = null;

// Evaluates to true
System.out.print(nullString1 == nullString2);

// Throws a NullPointerException
System.out.print(nullString1.equals(nullString2));

그래서 fooString1 이 null 일 수 있다는 것을 fooString1 , 독자에게 쓰는 것으로 말해라.

System.out.print(fooString1 != null && fooString1.equals("bar"));

다음은 더 짧지 만 Java (Java 7)에서 null을 확인하는 것이 덜 분명합니다.

System.out.print(Objects.equals(fooString1, "bar"));

== 는 객체의 참조 값을 비교하지만 java.lang.String 클래스에있는 equals() 메서드는 String 객체의 내용을 다른 객체와 비교합니다.


== 연산자는 두 문자열이 정확히 같은 객체인지 확인합니다.

.equals() 메소드는 두 문자열이 같은 값을 .equals() 확인합니다.


== 연산자는 두 참조가 같은 객체를 가리키는 지 확인합니다. .equals() 는 실제 문자열 내용 (값)을 확인합니다.

.equals() 메소드는 Object 클래스 (모든 클래스의 수퍼 클래스 .equals() 속합니다. 클래스 요구 사항에 따라 재정의해야하지만 String의 경우 이미 구현되어 있으며 두 문자열이 같은 값을 가지는지 여부를 확인합니다.

  • 사례 1

    String s1 = "";
    String s2 = "";
    s1 == s2;      //true
    s1.equals(s2); //true
    

    이유 : null이없는 문자열 리터럴은 permgen 영역의 String 풀에 저장됩니다. 따라서 s1과 s2는 모두 풀의 동일한 객체를 가리 킵니다.

  • 사례 2

    String s1 = new String("");
    String s2 = new String("");
    s1 == s2;      //false
    s1.equals(s2); //true
    

    이유 : new 키워드를 사용하여 String 객체를 만드는 경우 힙에 별도의 공간이 할당됩니다.


String 을 정의 할 때 객체를 정의한다고 생각합니다. 따라서 .equals() 를 사용해야합니다. == 를 사용하지만 String (및 모든 객체)과 함께 원시 데이터 유형을 사용하는 경우 .equals() 를 사용해야합니다.


compareTo() 메서드를 사용하여 두 문자열을 비교할 수도 있습니다. compareTo 결과가 0이면 두 문자열이 같고 그렇지 않으면 비교되는 문자열이 같지 않습니다.

== 는 참조를 비교하고 실제 문자열을 비교하지 않습니다. new String(somestring).intern() 을 사용하여 모든 문자열을 만든 경우 == 연산자를 사용하여 두 문자열을 비교할 수 있습니다. 그렇지 않으면 equals () 또는 compareTo 메서드 만 사용할 수 있습니다.


== Java에서 객체 참조를 비교합니다 . String 객체에는 예외가 아닙니다.

객체 ( String 포함)의 실제 내용을 비교하려면 equals 메소드를 사용해야합니다 .

== 사용하는 2 개의 String 객체의 비교가 true 인 경우는, String 객체가 인턴되고 Java 가상 머신이 복수의 참조가 String 의 동일한 인스턴스를 포인트하고 있기 (위해) 때문에입니다. == 를 사용해, 같은 내용을 포함한 1 개의 String 오브젝트를 다른 String 오브젝트와 비교해, true 평가할 것은 없습니다.


String a = new String("foo");
String b = new String("foo");
System.out.println(a == b); // prints false
System.out.println(a.equals(b)); // prints true

이유를 이해했는지 확인하십시오. 비교가 == 비교 만 참조를 비교하기 때문입니다. equals() 메소드는 내용을 문자 단위로 비교합니다.

ab 에 대해 new를 호출하면, 각각은 문자열 테이블의 "foo" 를 가리키는 새로운 참조를 얻습니다. 참고 문헌은 다르지만 내용은 동일합니다.





equality