2015-06-25 2 views
3

Почему Java сравнивает (эта == другая строка) внутри метода equalsIgnoreCase для проверки строковой нечувствительности?Почему существует «==» внутри String.equals?

Кроме того, String equals сравнивает (this == another String), чтобы сравнить два объекта?

Java 6: Класс String EqualsIgnoreCase, приведенный ниже.

public boolean equalsIgnoreCase(String anotherString) { 
     return (this == anotherString) ? true : 
       (anotherString != null) && (anotherString.count == count) && 
      regionMatches(true, 0, anotherString, 0, count); 
    } 

Java 6: Класс String приведен ниже.

public boolean equals(Object anObject) { 
    if (this == anObject) { 
     return true; 
    } 
+7

Я бы себе представить, потому что прямое сравнение объекта очень быстро, так что это быстро чтобы проверить, сравнивается ли String с самим собой. –

+1

Обратите внимание, что фактическая реализация 'String.equals' является встроенной и предоставляется Java-реализация - это только код ссылки (для интерпретатора, инструментов анализа кода и т. Д.), –

ответ

10

Почему Java сравнивает (эта == другая строка) внутри метода equalsIgnoreCase для проверки строковой нечувствительности?

Это оптимизация. Если ссылка прошла в точности точно так же, как, то equalsдолжен return true, но нам не нужно искать какие-либо поля и т. Д. Все то же самое, что и сам. Из документации для Object.equals(Object):

равенства метод реализует отношение эквивалентности на непустых ссылок на объекты:

  • Это рефлексивный: для любого ненулевого опорного значения х, x.equals (х) должен возвращать true.
  • ...

Это очень обычное для проверки равенства, чтобы начать с:

  • ли другая ссылка равна this? Если это так, верните true.
  • Является ли другая ссылка нулевой? Если да, верните false.
  • Означает ли другая ссылка на объект неправильного типа? Если да, верните false.

После этого вы переходите к типам проверок.

1
this == another object 

Это базовая проверка в equals методе почти всех объектов не только в классе String. Это эффективный, а также хорошая практика, чтобы проверить это первым в своем классе.
Логика проста если обе имеют одинаковую ссылку, то они всегда относятся к одному объекту, поэтому они равны равным.

Вам не нужно какое-либо другое сравнение, чтобы сказать, что они равны, если верно this == another object.

2

== имеет значение при сравнении с одним и тем же объектом - с учетом повышения эффективности, более вероятного, чем любой другой класс из-за String interning.

Обратите внимание, что этот код:

return (this == anotherString) ? true : <rest of line> 

могли быть написаны (более элегантно ИМХО) как:

return this == anotherString || <rest of line> 
Смежные вопросы