java - 如何在 HashMap/HashSet 中存储两个相等的字符串或任何对象(具有不同的引用)?

标签 java collections hashmap equals hashset

我写了下面的代码,有两个String对象,但是在HashSetHashMap中只添加了一个String:

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);
}

输出是:

文本

我知道在 HashMapHashSet 中添加任何对象取决于 equal() 方法:即对于 String

s1.equals(s2) //returns true

这就是为什么在 HashMapHashSet(在契约(Contract)中)中只添加了一个 String 的原因,但是解决方法是什么我想将两个 String 添加为它们是不同的对象。

String 是一个 final 类,因此我无法创建子类并覆盖 equals()hashCode() 使用引用相等运算符检查并返回 true 或 false 的方法。

最佳答案

我想你想要的是 IdentityHashMap 。此类按标识(即使用 ==)而不是按相等(即使用 equals)比较对象。

因为没有 IdentityHashSet 类,如果您想要一个具有与 IdentityHashMap 相同特征的 Set,您可以只使用 Collections.newSetFromMap 实用程序方法。此实用程序方法只是在给定的 Map 周围创建一个包装器,使其看起来像一个 Set。例如:

Set<String> myIdentitySet = Collections.newSetFromMap(new IdentityHashMap<String,Boolean>());

关于java - 如何在 HashMap/HashSet 中存储两个相等的字符串或任何对象(具有不同的引用)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22721385/

相关文章:

java - Java 8 中的这种 lambda 表达式语法是什么样的?

java - 是否可以在布局中混合使用 `SurfaceView` 和另一个 `View` ?

java - 有没有办法使用 Java 从 Azure AD 恢复最近删除的用户?

java - Java 中的非泛型集合——有什么用吗?

java - 让静态方法返回私有(private)类的设计决策背后的原因是什么?比如 Collections.synchronizedList()

java - 以整数作为键和值的 HashMap 需要很长时间才能完成工作

java - 我可以在 Java 中使用相同的指令声明和初始化数组吗?

java - 使用比较器对具有多个字段的对象映射进行排序

java - 收集可能为空的值

java - HashMap 将消耗多少大小?