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

Java从HashMap检索的值的顺序是插入顺序吗?

胥承
2023-03-14
问题内容

我想弄清楚HashMap中的值被/可以被检索的顺序。这是相同的代码段。

import java.util.HashMap;

public class HashMapExample {

   public static void main(String[] args) {
       HashMap<Integer, String> hashmap = new HashMap<Integer, String>();
       hashmap.put(1, "apple" );
       hashmap.put(2, "lemon" );
       hashmap.put(3, "orange" );
       hashmap.put(4, "banana" );
       hashmap.put(5, "litchi" );
       hashmap.put(6, "mango" );
       hashmap.put(7, "papaya" );

       System.out.println(hashmap.size());

       for (String key : hashmap.values()) {
           System.out.println(key);
       }
   }
}

输出:

7
apple
lemon
orange
banana
litchi
mango
papaya

值按插入顺序打印。这是真的吗?我期望值将以任意顺序打印。这是使用Java 6。


问题答案:

值按插入顺序打印。这是真的吗?我期望值将以随机顺序打印。

HashMapAPI没有定义迭代的顺序。

但是,如果查看HashMap的实现,则可以推断出迭代顺序,键的哈希值,键的插入顺序和哈希表的大小之间存在复杂的过渡关系。如果哈希表自行调整大小,则此关系会变得混乱。

在您的情况下,您正在使用Integer键,这意味着键的哈希值本身就是键值。另外,您按键顺序插入了条目。这(幸运地!)导致匹配插入顺序的迭代顺序。但是,如果您继续插入更多的键,则会发现迭代顺序“环绕”。然后,当表格经过一系列调整大小时,顺序将变得越来越混乱。

简而言之,您看到的只是哈希表实现的伪像,而不是您可以(或应该)明智地利用的东西。尤其重要,因为它可以从一个Java版本更改为另一个Java版本。



 类似资料:
  • 如何在Firebase数据库中添加对象列表? mrefuser.push().setValue(new MessageItem()); mrefuser.push().setValue(new MessageItem()); . 它是如何被添加的? Firebase将每个对象存储为HashMap中的键值对。 如何检索这些值? hashmap键的顺序是随机的。有什么方法可以得到链接的哈希图而不是哈希

  • 问题内容: 要将数据从一个数据库复制到具有相同架构的不同服务器中的另一个数据库,我计划使用C Sharp库中的SqlBulkCopy类。插入记录时,SqlBulkCopy是否将保持与数据表中相同的顺序? 示例:id是标识列。 服务器1,db1 服务器2,db1 步骤1: 步骤2:将SQL批量复制到server2 第3步:由于我们知道插入的记录数,因此我使用的是“前4名”。 第4步: 问题: res

  • 问题内容: 是否可以按照插入顺序从Python字典中检索项目? 问题答案: 如果您使用的是CPython 3.6+(或其他任何Python实现的Python 3.7+),则默认情况下,标准Python会执行此操作。 在旧版Python上,您可以使用。

  • 问题内容: 以下代码以相同的插入顺序为我提供了输出。我阅读了Javadoc,他们甚至没有谈论插入顺序。有人可以帮助我获取正确的信息。 问题答案: 不,不是的。要保留插入顺序,请改用(javadoc)。 而且,现在优先于,因为它具有不必要的并发开销。(请参见HashMap和Hashtable之间的区别?。)

  • 问题内容: 为什么某些集合数据结构不能保持插入顺序?与保持插入顺序相比,有什么特别的事情?如果不维持订单,我们会有所收获吗? 问题答案: 性能。如果您想要原始的插入顺序,则可以使用LinkedXXX类,它们在插入顺序中维护着一个附加的链表。大多数时候,您都不在乎,因此您使用HashXXX,或者想要自然订单,因此您使用TreeXXX。在这两种情况下,您为什么都要支付链接列表的额外费用?

  • 问题内容: 如何以以下方式将值插入表(MySQL): 在表的所有行上,按ID列(PK)的顺序,在“ num”列中插入递增数字? 例如,如果表有3行,其ID为1,5,2,我希望ID 1获得num = 1,ID 2获得num = 2,ID 5获得num = 3。 编辑 我将解释为什么(我认为)需要这样做: 我试图将表中的列拆分为具有1对1关系的单独表。我以为我可以按ID的顺序获取所有值,然后将它们插入