==
(используется на объектах, а не на примитивных значениях) проверяет, являются ли 2 объекта фактически одним и тем же объектом;он сравнивает, действительно ли указатели указывают на одну и ту же область памяти.
.equals()
определяется самим объектом.
String s1 = new String("Hello");
String s2 = new String("Hello");
boolean b1 = ( s1 == s2 ) ; // false: s1 and s2 point to different objects
boolean b2 = ( s1.equals(s2) ) ; // true: s1 and s2 both represent the same
// piece of text - "Hello"
.hashCode()
- это прием оптимизации (в большинстве случаевего использование, во всяком случае). много кода в стандартных библиотеках предполагает, что если o1.equals(o2)==true
, то o1.hashCode()==o2.hashCode()
, а если o1.hashCode()!=o2.hashCode()
, то o1.equals(o2)==false
, чтобы работать быстрее.
НаиболееОчевидным примером такой оптимизации является класс HashMap .Это делает поиск объектов с использованием ключа действительно быстрым, но плохо работает, если hashCode и equals не работают должным образом для ключевых элементов.Фактически, это одна из причин того, что класс String является неизменяемым: если вы смогли изменить String (и, следовательно, изменить его hashCode), в то время как String был ключом в HashMap, то вы никогда бы не смогли найти его, поскольку вы в конечном итоге искали его не в том месте!
Другие ответы рекомендуют Effective Java от Joshua Bloch.Если вы задаете такие вопросы, то сейчас самое подходящее время в вашей карьере, чтобы купить книгу и прочитать ее от корки до корки.Стоит также перечитать его через год или два, когда вы забудете некоторые из них, и многое из этого будет иметь смысл ...