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
方法比较键