在 IdentityHashMap 中使用字符串作为键

Use Strings as key in IdentityHashMap

我得到了一个简单的 IdentityHashmap:

IdentityHashmap<String, Integer> map;

现在我想使用字符串作为键。主要问题是 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" 来避免这个问题,但是我得到了字符串作为参数,因为我不能强迫用户使用新的构造函数,所以我没有想法如何解决这个问题。

I use it in some serialization system. Which allows the user to save and delete objects without rewriting the whole file by using: File.save(Object o) File.delete(Object o) If some object is equals to some other they still need to get stored separately

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