繁体   English   中英

put()函数如何在Java Map中工作?

[英]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

这被认为是有效的语法。

映射是一个集合,它没有特定于您的应用程序的逻辑。

有关映射功能的一般信息,请查看java.util.Map javadoc

据说比添加一个已经存在的值代替旧的值

是否需要完全提供整个CustomKey对象?

是的,你有。 密钥通过基础对象的equals方法进行比较。 因此,即使您为CustomKey构造了另一个1-arg构造函数,该对象也不会与Map 对象相等 ,并且put方法也不会替换对象。

几天后达到了最终解决方案:在自定义put()方法内实现一个委托。 在我看来,这是一种相当先进的方法,它会在某些键具有您要查找的内容之前将其Map 以为Java在C#中有类似IEqualityComparer东西,但我错了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM