2013-12-15 3 views
3

Effective Java 2e, страница 43.Effective Java: • по сравнению (равно против ==)

ТЕМА: проверить, что поле аргумента совпадает соответствующее поле этого объекта.

Некоторые поля ссылок на объекты могут содержать законные основания. Чтобы избежать возможность в NullPointerException, используйте эту идиому для сравнить такие поля:

(field == null ? o.field == null : field.equals(o.field)) 

Эта альтернатива может быть быстрее, если поле и o.field часто идентичны:

(field == o.field ||  (field != null && field.equals(o.field))) 

Он подразумевает, что field.equals (o.field) производит то же поведение, что и поле == o.field? Может кто-нибудь объяснить, как работает вторая альтернатива?

+2

Если они указывают на то же место, где они находятся и тот же объект, и тот же экземпляр, чтобы они observationality равно .. – nachokk

+2

Выражаясь несколько иначе , для любой реализации, которая соответствует равному контракту, если поле не является нулевым, поле «o.field» подразумевает 'field.equals (o.field)' –

+0

@PatriciaShanahan == проверяет ссылочное равенство while .equa ls проверяет значение равенства, поэтому они могут быть не одинаковыми - http://stackoverflow.com/questions/513832/how-do-compare-strings-in-java – Nik

ответ

3

(поле == o.field || (поле! = NULL & & field.equals (o.field)))

Если они оба нуль, это будет верно.

Если field не имеет значения, оно будет короткозамкнутым до ложного, безопасно.

Если o.field не имеет значения, ответственность за проверку недействительности объекта o.field будет равна field, что хорошо.

Если они идентичны, то есть они являются одним и тем же объектом, а не только равными в соответствии с equals() - это вернет истину и завершится быстро.

Если они оба не равны нулю и не равны, тогда он будет оцениваться как false.

Является ли он подразумевающим, что field.equals (o.field) производит то же поведение, что и поле == o.field?

Нет, конечно, нет, одна из первых вещей, которую изучают Java-программисты, - это не сравнивать строки с ==, потому что они не совпадают.

2
(field == o.field || (field != null && field.equals(o.field))) 

Читать пространно переводится

If both are null or they are interned then they are `equal`. 
If they are not equal and field is not null, 
    Then the strings may have equality even if they are not interned. 
    So do a content check for equality of the strings 

В основном то, что он говорит, есть, что если string1 == string2, то эфир они оба null или оба not null, если оба не утратившие равны, то строки должны быть interned. Однако, если string1 != string2, то один из таких вещей, но будет правдой.

  1. раздел: null or o.поле является пустым
  2. Струны имеют различное содержание
  3. Струны имеют одинаковое содержание, и они не интернировали

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

What is String interning?

Пример кода:

public class InternedDemo { 

    public static void main(String[] args) { 
     String s1 = "hello world"; 
     String s2 = "hello world"; 
     String s3 = new String("hello world"); 

     System.out.println(s1 == s2); // true 
     System.out.println(s1 == s3); // false 
     System.out.println(s2 == s3); // false 

     System.out.println(s1.equals(s3)); // true 
     System.out.println(s2.equals(s3)); // true 
    } 
} 
+0

отличный пример. В этом тексте «поле» не относится только к строкам, но любой объект – Nik

Смежные вопросы