Как хранить два одинаковых String или любой объект (с разными ссылками) в HashMap / HashSet?

1

Я написал следующий код с двумя объектами 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.

  • 2
    Примечание. Эта та же самая «проблема» затрагивает все стандартные коллекции и операции - например, List.contains и т. Д. - которые используют equals , поэтому HashMap / HashSet не являются специальными (хотя у них есть тривиальное «решение»).
Теги:
collections
equals
hashset
hashmap

1 ответ

8
Лучший ответ

Я думаю, что вы хотите, это IdentityHashMap. Этот класс сравнивает объекты по идентичности (т. == Используя ==) вместо равенства (т. equals Используя equals).

Поскольку не существует класса IdentityHashSet, если вы хотите Set с теми же характеристиками IdentityHashMap вы можете просто использовать метод Collections.newSetFromMap. Этот метод утилиты создает оболочку вокруг данной Map чтобы она выглядела как Set. Например:

Set<String> myIdentitySet = Collections.newSetFromMap(new IdentityHashMap<String,Boolean>());
  • 0
    Я собирался предложить реализовать набор с использованием IdentityHashMap в фоновом режиме. Но зачем внедрять, когда инструмент для этого уже существует?
  • 0
    Самый превосходный. Я никогда не использовал этот класс.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню