put()函数在Java映射中是如何工作的?

put()函数在Java映射中是如何工作的?,java,dictionary,Java,Dictionary,我需要在更新时澄清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(

我需要在更新时澄清
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");
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中已经有效。如果你写信

map.put(obj1, val1);
map.put(obj1, val2);

map.get(obj1); //Returns val2 with no errors

这被认为是有效的语法。

搜索是使用整个键来完成的,而不仅仅是其中的一部分

在内部,有两个方法在key对象上调用,用于查找关联的值。这些方法是
equals()
hashCode()


如果为更复杂的键编写自定义类
CustomKey
,则必须重写这些方法(
equals()
hashCode()
),否则将产生意外的结果。请参阅javadoc文档,您可以在其中找到编写这些方法的可靠实现的指南。

搜索是使用整键来完成的,而不仅仅是其中的一部分

在内部,有两个方法在key对象上调用,用于查找关联的值。这些方法是
equals()
hashCode()

如果为更复杂的键编写自定义类
CustomKey
,则必须重写这些方法(
equals()
hashCode()
),否则将产生意外的结果。请参考javadoc文档,您可以在其中找到编写这些方法的可靠实现的指南

如果我想更新第二条记录,我会写map.put(“key2”, “value22”)和Java会自动将value2替换为value22

Java怎么能做到这一点

Map
中,首先需要理解
hashCode
equals
的概念。对于每个记录,将计算第一个散列码,该散列码将确定该记录的存储桶。多个记录可能具有相同的哈希代码,在这种情况下,它们将存储在链接列表中

如何搜索记录?

首先,将计算哈希代码以确定bucket。然后,对于列表中与该bucket对应的每个记录(条目),将使用
equals
方法检查是否相等。这些方法中的一种方法只是检查实例是否相等(换句话说,两个
Object
s仅当它们实际上是同一个对象时才相等)

我希望通过仅使用一个键搜索来更新value2 属性valorized,如何执行以下操作:

map.put(new CustomKey("something1.2"), "value22");
map.put(new CustomKey("something1.2"), "value22");
或者我需要准确地提供整个CustomKey对象吗

您需要提供完全相同的密钥,否则无法在地图中找到记录。哈希代码的计算将使用完整密钥,而不是其中的一部分。您需要提供(实际上覆盖)这两个方法的实现

如果我想更新第二条记录,我会写map.put(“key2”, “value22”)和Java会自动将value2替换为value22

Java怎么能做到这一点

Map
中,首先需要理解
hashCode
equals
的概念。对于每个记录,将计算第一个散列码,该散列码将确定该记录的存储桶。多个记录可能具有相同的哈希代码,在这种情况下,它们将存储在链接列表中

如何搜索记录?

首先,将计算哈希代码以确定bucket。然后,对于列表中与该bucket对应的每个记录(条目),将使用
equals
方法检查是否相等。这些方法中的一种方法只是检查实例是否相等(换句话说,两个
Object
s仅当它们实际上是同一个对象时才相等)

我希望通过仅使用一个键搜索来更新value2 属性valorized,如何执行以下操作:

map.put(new CustomKey("something1.2"), "value22");
map.put(new CustomKey("something1.2"), "value22");
或者我需要准确地提供整个CustomKey对象吗

您需要提供完全相同的密钥,否则无法在地图中找到记录。哈希代码的计算将使用完整密钥,而不是其中的一部分。您需要提供(实际上覆盖)这两个方法的实现

我是否需要准确地提供整个CustomKey对象

是的,你有。通过底层对象的
equals
方法比较键。因此,即使您有另一个用于
CustomKey
的1-arg构造函数,构造的对象也不会等于
Map
中的key对象,并且
put
方法也不会替换value对象

我是否需要准确地提供整个CustomKey对象

是的,你有。通过
equals
方法比较键