使用字符串作为IdentityHashMap中的键

时间:2015-04-05 14:33:30

标签: java hashmap

我有一个简单的IdentityHashmap:

IdentityHashmap<String, Integer> map;

现在我想使用Strings作为键。主要问题是java字符串池:

String a = "Hello";
String b = "Hello";
map.put(a, 1);
map.put(b, 2);
System.out.println(map.get(a)) //Prints "2" since a == b

我知道我可以通过使用new String("Hello")而不是"Hello"来避免这个问题,但我得到String作为参数,因为我不能强迫用户使用新的构造函数我没有想法如何解决这个问题。

1 个答案:

答案 0 :(得分:3)

  

我在一些序列化系统中使用它。这允许用户在不重写整个文件的情况下保存和删除对象:File.save(Object o)File.delete(Object o)如果某个对象等于其他对象,则仍然需要单独存储

在这种情况下,你既不想要价值也不想要身份。至少不是==给你的堆标识。您想要文件偏移标识。你试图违反设计原则。你永远不应该试图强迫一个属性意味着两件事。你需要另一个房产。强制用户使用将其堆引用与其文件偏移位置耦合的结构来删除对象,或者将所有对象包装在具有文件位置的内容中。

相关问题