Как строки сравниваются друг с другом? - PullRequest
0 голосов
/ 14 сентября 2018

При сравнении 2 строк, что на самом деле происходит? Как определить, что content внутри строки A равно строке B? Мы смотрим в таблице символов Юникода для сравнения элементов обеих строк? если да, то как equals () узнает об элементе в строке, такой как «ABC», как equals () отделяет A от BC, чтобы сравнить его с первым элементом другой строки?

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

Строки - это, по сути, неизменяемые обертки вокруг char[], с множеством полезных служебных методов.

Итак, чтобы проверить, равны ли две строки, вы просто проверяете, имеют ли они char массивы одинакового размера и с одинаковым содержимым.

Используя класс Arrays, который имеет полезные методы для работы с массивами, упрощенная реализация String может выглядеть так:

public final class String {
    private char[] value;

    public String(char[] value) {
        this.value = value.clone();
    }

    @Override
    public boolean equals(Object obj) {
        if (! (obj instanceof String))
            return false;
        String other = (String) obj;
        return Arrays.equals(this.value, other.value);
    }

    @Override
    public int hashCode() {
        return Arrays.hashCode(this.value);
    }

    public char[] toCharArray() {
        return this.value.clone();
    }

    public String substring(int beginIndex, int endIndex) {
        return new String(Arrays.copyOfRange(this.value, beginIndex, endIndex));
    }

    // more utility methods

}

Реальный класс String более сложен, в зависимости от версии Java, по-разному.

например. в более ранних версиях char[] мог совместно использоваться несколькими String объектами, например, substring() не нужно будет копировать массив.

В более поздних версиях оптимизации были изменены, чтобы хранить символы в byte ( LATIN1 ) массивах, если это возможно, вместо char ( UTF- 16 ) массивов, чтобы сэкономить место.

Эти различные оптимизации, конечно, усложнят внутренний код служебных методов String, что может вас смущать, когда вы смотрите на исходный код JDK.

0 голосов
/ 14 сентября 2018

В случае сомнения всегда проверяйте JavaDocs :

Сравнивает эту строку с указанным объектом.Результат имеет значение true тогда и только тогда, когда аргумент не равен NULL и является объектом String, представляющим ту же последовательность символов, что и этот объект.

Когда вы используете равно со строками, это на самом деле происходит

public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        String anotherString = (String)anObject;
        int n = value.length;
        if (n == anotherString.value.length) {
            char v1[] = value;
            char v2[] = anotherString.value;
            int i = 0;
            while (n-- != 0) {
                if (v1[i] != v2[i])
                    return false;
                i++;
            }
            return true;
        }
    }
    return false;
}

Таким образом, он вернется, только если вы сравниваете другую строку, если у вас та же последовательность, потому что она сравнивает символы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...