2015-04-05 40 views
1

鍵我有一個簡單的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"避免這個問題,但我得到的字符串作爲參數,因爲我不能強迫用戶使用新的構造我不知道如何解決這個問題。

+7

你爲什麼使用IdentityHashMap?在什麼情況下,你想要相同的字符串有不同的價值觀,爲什麼? – user2357112 2015-04-05 14:35:12

+0

我在某些序列化系統中使用它。它允許用戶保存和刪除對象而不用重寫整個文件: 'File.save(Object o)' 'File.delete(Object o)' 如果某個對象等於某些其他對象,它們仍然需要分開存儲。 – Crigges 2015-04-05 14:44:40

+0

爲什麼你遇到問題的行爲呢?爲什麼這些字符串需要單獨的對象?你的序列化系統在處理共享結構上不好嗎? – user2357112 2015-04-05 15:04:42

回答

3

我在某些序列化系統中使用它。 File.save(Object o)File.delete(Object o)如果某個對象等於其他對象,則它們仍然需要分別存儲。

在這種情況下,您既不想要價值,也不想要身份。至少不會堆積什麼==給你的身份。你想要文件偏移標識。你試圖違反設計原則。你不應該試圖強迫一個財產意味着兩件事。你需要另一個物業。強制用戶使用將堆引用與文件偏移位置耦合的結構來刪除對象,或者將所有對象包含在具有文件位置的東西中。