Поскольку структура set
(обратите внимание, что ваша хэш-карта поддерживается набором) не позволяет хранить два одинаковых объекта. Вот так ведут себя наборы.
Теперь вы можете быть одурачены тем, что оба a1
и a2
равны, но если они не переопределяют equals
или hashCode
, то для Java они не равны , Однако с вашими строками s1
и s2
они действительно равны, потому что реализация String уже переопределяет методы equals
и hashCode
. Попробуйте сделать s1.equals(s2)
, и вы получите true
в результате. Если вы сделаете a1.equals(a2)
, вы получите false
.
В конце ваш хэш-сет содержит a1, a2 и s1.
Вы расширили свой вопрос, чтобы ответить на него ...
s1
и s2
- это , а не , относящиеся к одному и тому же объекту, это два разных объекта String, но оба представляют один и тот же набор символов. Поскольку они не являются одним и тем же объектом, System.out.println(s1 == s2)
печатает false
. Это equal()
, но не один и тот же объект.