Я написал следующий код с двумя объектами String, но только одна строка добавлена в HashSet
или HashMap
:
String s1 = new String("Text");
String s2 = "Text";
//checking with Reference equality operator
System.out.println("Does both are same object: " + s1 == s2);
//not equal two different object of String is created
HashSet<String> set = new HashSet<>();
set.add(s1);
set.add(s2);
for (Iterator<String> iterator = set.iterator(); iterator.hasNext();) {
String strObj = (String) iterator.next();
System.out.println(strObj);
}
Выход:
Text
Я знаю, что добавление любого объекта в HashMap
или HashSet
зависит от метода equal()
: то есть для строки String
s1.equals(s2) //returns true
поэтому только одна строка добавляется в HashMap
или HashSet
(которая находится в контракте), но что такое обходной путь, который я хотел бы добавить как String, так и другой объект.
String
- это final
класс, поэтому я не могу создать подкласс и переопределить метод equals()
и hashCode()
для проверки с помощью оператора равенства равенства и возврата true или false.
Я думаю, что вы хотите, это IdentityHashMap. Этот класс сравнивает объекты по идентичности (т. ==
Используя ==
) вместо равенства (т. equals
Используя equals
).
Поскольку не существует класса IdentityHashSet
, если вы хотите Set
с теми же характеристиками IdentityHashMap
вы можете просто использовать метод Collections.newSetFromMap
. Этот метод утилиты создает оболочку вокруг данной Map
чтобы она выглядела как Set
. Например:
Set<String> myIdentitySet = Collections.newSetFromMap(new IdentityHashMap<String,Boolean>());
IdentityHashMap
в фоновом режиме. Но зачем внедрять, когда инструмент для этого уже существует?
equals
, поэтому HashMap / HashSet не являются специальными (хотя у них есть тривиальное «решение»).