当前位置: 首页 > 面试题库 >

Java HashMap如何在内部存储条目

孙承弼
2023-03-14
问题内容

假设您有一个键类(KeyClass),该键类具有重写的equals,hashCode和clone方法。假设它有2个基本字段,一个String(名称)和一个int(id)。

现在您定义

KeyClass keyOriginal, keyCopy, keyClone;

keyOriginal = new KeyClass("original", 1);
keyCopy = new KeyClass("original", 1);
keyClone = KeyClass.clone();

现在

keyOriginal.hashCode() == keyCopy.hashCode() == keyClone.hashCode()
keyOriginal.equals(keyCopy) == true
keyCopy.equals(keyClone) == true

因此,就HashMap而言,keyOriginal,keyCopy和keyClone是无法区分的。

现在,如果您使用keyOriginal将条目放入HashMap,则可以使用keyCopy或keyClone将其检索回来,即

map.put(keyOriginal, valueOriginal);
map.get(keyCopy) will return valueOriginal
map.get(keyClone) will return valueOriginal

此外,如果在将密钥放入地图后对其进行了变异,则无法获取原始值。所以例如

keyOriginal.name = "mutated";
keyOriginal.id = 1000;

Now map.get(keyOriginal) will return null

所以我的问题是

当您说map.keySet()时,它将返回地图中的所有键。HashMap类如何知道映射中存储的键,值和条目的完整列表?

编辑 据我所知,我认为通过将Entry键作为最终变量来工作。

static class Entry<K,V> implements Map.Entry<K,V> { 
  final K key;

(docjar.com/html/api/java/util/HashMap.java.html)。因此,即使我在将密钥放入地图后对其进行了变异,原始密钥也会保留下来。我的理解正确吗?但是,即使保留了原始的键引用,也仍然可以更改其内容。因此,如果内容发生突变,并且K,V仍存储在原始位置,则检索如何工作?

*如果将密钥放入哈希表后进行突变,则 *EDIT 检索将失败。因此,不建议您使用可变的哈希映射键。


问题答案:

HashMap维护一个条目表,并根据其哈希码组织对相关键和值的引用。如果您更改键,则哈希码将更改,但输入项HashMap仍会根据原始哈希码放置在哈希表中。这就是为什么map.get(keyOriginal)将返回null
的原因。

map.keySet() 只是遍历哈希表,返回它具有的每个条目的键。



 类似资料:
  • 问题内容: java中的一个int数组作为一个32位值块存储在内存中。如何存储整数对象数组?即 我以为Integer数组中的每个元素都是对Integer对象的引用,并且Integer对象与其他任何对象一样都具有对象存储开销。 但是,我希望JVM能够在底层实现一些神奇的功能,因为Integer是不可变的,并且像整数数组一样存储它。 我的希望真是天真吗?在性能至关重要的应用程序中,整数数组是否比整数数

  • 问题内容: 我想了解ES如何在其索引内部存储日期值。可以转换为UTC吗? 我有一个日期类型的字段“ t”。这是映射: 现在,当我向ES插入/添加文档时,它如何存储在索引中。 “ t”:“ 1427700477165”(从Date.now()函数生成的毫秒数)。ES是否在UTC中识别其时代时间并按原样存储? “ t”:“ 2015-03-29T23:59:59”(我会相应地调整映射日期格式)-ES如

  • 问题内容: 如何复制到外部存储保持,以便以后可以共享首选项。 试图读取并另存为一个文件,创建了类型,但我需要一个。想过遍历应用程序的内部存储和复制文件,然后将其放入外部存储,但这可能太复杂了。 真的很想知道是否存在一种简单而明智的方式来传递`sharedpreferences。 问题答案: 使用此代码, 并取回它, 注意 使用此代码只能处理字符串类型首选项,

  • 我正在尝试为我的应用程序列出内部存储和外部存储中的所有歌曲作为列表视图。我正在使用下面的代码来获取歌曲 以上代码正在成功地获取外部存储器中的所有歌曲,但未获取内部存储器中存储的歌曲。这在像三星Galaxy S8这样没有外置存储的设备中是一个问题。我还尝试了使用以下uri的光标 这为我获取设备铃声和短信音调,这不是我需要的。 我在StackOverflow中也遇到过类似的问题,但那里的答案并没有为我

  • 01-20 08:55:14.787:W/System.err(1383):at libcore.io.iobridge.open(iobridge.java:409)01-20 08:55:14.787:W/System.err(1383):at java.io.fileInputStream.(fileInputstream.java:78)01-20 08:55:14.827:W/Syste

  • 问题内容: 我的应用程序( Android API 15 )制作图片并将其存储在内部存储器的文件夹中。现在,我想将此文件复制到外部存储中的另一个文件夹,例如。我尝试了以下方法: 方法1: 方法2: 方法3: 这些方法都不能解决我的任务。在检查了许多相关主题之后,我发现的唯一建议是验证 在和它确实存在。 该 方法#1 完成执行,但没有文件夹和文件被复制。 在 方法#2 ,应用程序失败,异常的,但对象