Java 如何仅修改hashmap的现有密钥而不修改其对? HashMap data=newhashmap(); 数据。出售(“AAA”、“CCC”);

Java 如何仅修改hashmap的现有密钥而不修改其对? HashMap data=newhashmap(); 数据。出售(“AAA”、“CCC”);,java,Java,我想在运行时将AAA替换为BBB,而无需在映射中添加新键。 这可能吗?只需删除旧的一对即可。使用新密钥创建一个新的密钥对并进行插入。无法重命名/更改密钥对的旧密钥-buzzwordimmutable。您需要删除该对象并使用新键将其插回。 下面是它的详细工作原理: HashMap<String,String> data = new HashMap<>(); data.put("AAA", "CCC"); HashMap data=newhashmap(); 数据。出售(

我想在运行时将
AAA
替换为
BBB
,而无需在
映射中添加新键。

这可能吗?

只需删除旧的一对即可。使用新密钥创建一个新的密钥对并进行插入。

无法重命名/更改密钥对的旧密钥-buzzword
immutable
。您需要删除该对象并使用新键将其插回。 下面是它的详细工作原理:

HashMap<String,String> data = new HashMap<>();

data.put("AAA", "CCC");
HashMap data=newhashmap();
数据。出售(“AAA”、“CCC”);
字符串值=映射。删除(“AAA”);//value=“CCC”
map.put(“BBB”,值);
当然,您可以将其缩短为一行,就像在设置时删除值一样。因为remove wwhile返回值。
map.put(“BBB”),map.remove(“AAA”)

你不能* 没有*方法可以编辑现有密钥,唯一的方法是删除旧密钥并添加新密钥。 最优雅的方式(IMHO)是:


*:正如@Michael Zilluck在他的评论和回答中所说的,从技术上讲,你可以通过反射来实现,但由于反射破坏了哈希表的完整性,你只能自己承担风险,因为HashMap基于对键进行哈希运算,并假设键永远不会改变。因此,更改它们将破坏哈希表的完整性,并将失去所有效率


也就是说,从技术上讲,有一种方法可以改变密钥。您需要查看
HashMap
类的源代码,然后使用反射直接编辑密钥本身。

否,因为它没有意义。HashMap密钥是不可变的,您将无法替换密钥。您可以删除“AAA”并添加“BBB”也许可以解释一下为什么要这样做,我们将提出一种更适合的数据结构。如果“CCC”是固定的,并且“AAA”可以更改为“BBB”,则可能应该反转映射,以使“CCC”成为键,“AAA”成为其关联值。如果将键从“AAA”更改为“BBB”,则它将具有不同的哈希代码,并且需要存储在哈希映射中的不同位置。在不删除/添加的情况下更改密钥不仅是不可能的,而且如果可能的话,还会破坏hashmap。密钥的哈希代码主要与equals()方法结合使用,用于将密钥放入映射中,然后从映射中搜索回来。所以,如果在映射中放入一个键值对后,键对象的哈希代码发生了变化,那么从映射中提取值对象几乎是不可能的。这是一个内存泄漏的案例。参考:不使用数据是不可能的。删除(“AAA”)?使用
Map
-API是可能的。假设
map
HashMap
,您可以得到
it=map.keySet().iterator()
。但是在迭代时,您仍然必须识别密钥。一旦识别,您就可以使用
it.remove()
。这将像映射一样删除条目。删除(o)
就可以了。这可以通过反射来实现。通过反射几乎可以改变任何事情。@MichaelZiluck从技术上讲,这是可能的,但你不应该这样做。这不是某种黑客行为吗?我的意思是,有了反射,你就不能绕过私有/受保护的变量吗?它破坏了哈希表的完整性,但有时人们想要使用映射实现,
HashMap
就是最容易使用的。如果你是1。需要一个
Map
implementation 2。不关心哈希表,和3。我不想自己编写一个实现,使用反射来破解
HashMap
的键是可以的。“我如何编辑一个不可变的对象-通过改变规则使它不再是不可变的”对我来说似乎不是一个好的实践,最好自己实现。我同意你可以这样做,但我不认为你应该在Java中没有什么是真正不变的。甚至字符串也可以通过反射进行更改。如果你想说“是的,这在技术上是正确的,但是……”他确实问过你是否“可以”,如果你“应该”的话是否“不能”。@MichaelZiluck你是对的,但你真的知道我的意思^^^^是的,只是想澄清一下,万一他真的对思考感兴趣:)
HashMap<String,String> data = new HashMap<>();
data.put("AAA", "CCC");
String value = map.remove("AAA");  // value = "CCC"
map.put("BBB", value);
map.put( "newKey", map.remove( "oldKey" ) );