![](/img/trans.png)
[英]Why wouldn't Java Map work? The function .put() not inserting the value and only inserting the key
[英]How does put() function work in Java Map?
我需要弄清楚在更新时map.put()
方法的逻辑背后是什么。
依实例:
我有一张地图,其中包含以下几条记录:
{
[K="key1", V="value1"],
[K="key2", V="value2"],
[K="key3", V="value3"]
}
如果我想更新第二条记录,我会写map.put("key2", "value22")
和Java自动将value2
替换为value22
。
那Java怎么做?
如果键是由几个属性组成的复杂对象...
{
[K=new CustomKey("something1.1", "something2.1"), V="value1"],
[K=new CustomKey("something1.2", "something2.2"), V="value2"],
[K=new CustomKey("something1.3", "something2.3"), V="value3"]
}
...并且我希望通过仅对一个属性赋值的键来更新value2
搜索,怎么可能做这样的事情:
map.put(new CustomKey("something1.2"), "value22");
还是我需要完全提供整个CustomKey
对象?
搜索是使用整个关键字完成的,而不仅仅是其中一部分。
内部有两种在键对象上调用的方法,这些方法用于查找关联的值。 这些方法是equals()
和hashCode()
如果为更复杂的键编写自定义类CustomKey
,则必须重写这些方法( equals()
和hashCode()
),否则将产生意外结果。 请参考class Object
的javadoc文档,您将在其中找到编写这些方法的可靠实现的指南。
如果我想更新第二条记录,我会写map.put(“ key2”,“ value22”)和Java自动将value2替换为value22。
那Java怎么做?
在Map
您需要了解hashCode
的概念,并且首先equals
。 对于每个记录,将计算第一个哈希码,该哈希码将确定该记录的存储桶。 多个记录可能具有相同的哈希码,在这种情况下,它们将存储在链接列表中。
搜索记录如何工作?
首先将计算哈希码以确定存储桶。 然后对于该存储桶对应的列表中的每个记录(条目),将使用equals
方法检查是否相等。这些方法的默认实现只是检查实例是否相等(换句话说,两个Object
仅在它们相等时才会相等)实际上是同一对象)。
我希望更新value2通过一个仅具有一个属性值的键的键来搜索它,怎么可能做这样的事情:
map.put(new CustomKey("something1.2"), "value22");
还是我需要完全提供整个CustomKey对象?
是的,您需要提供完全相同的键,否则将无法在地图中找到记录。 哈希码的计算将使用完整密钥,而不是完整密钥的一部分。 您需要提供(实际上是覆盖)这两种方法的实现。
您描述的代码已经在Java中有效。 如果你写
map.put(obj1, val1);
map.put(obj1, val2);
map.get(obj1); //Returns val2 with no errors
这被认为是有效的语法。
是否需要完全提供整个CustomKey对象?
是的,你有。 密钥通过基础对象的equals
方法进行比较。 因此,即使您为CustomKey
构造了另一个1-arg构造函数,该对象也不会与Map
键对象相等 ,并且put
方法也不会替换值对象。
几天后达到了最终解决方案:在自定义put()
方法内实现一个委托。 在我看来,这是一种相当先进的方法,它会在某些键具有您要查找的内容之前将其Map
。 以为Java在C#中有类似IEqualityComparer
东西,但我错了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.