从HashMap中获取第一个键和值

2023/06/07

1. 概述

在本教程中,我们将讨论如何在不知道键的情况下从HashMap中获取第一个键值对。

首先,我们将使用迭代器,然后使用流来获取第一个条目。最后,我们将讨论HashMap在获取第一个条目时出现的一个问题,以及如何解决这个问题。

2. 使用迭代器

假设我们有以下HashMap<Integer, String>:

Map<Integer, String> hashMap = new HashMap<>();
hashMap.put(5, "A");
hashMap.put(1, "B");
hashMap.put(2, "C");

在此示例中,我们将使用迭代器获取第一个键值对。因此,让我们在HashMap的Entry集上创建一个迭代器,并调用next()方法来检索第一个条目:

Iterator<Map.Entry<Integer, String>> iterator = hashMap.entrySet().iterator();

Map.Entry<Integer, String> actualValue = iterator.next();
Map.Entry<Integer, String> expectedValue = new AbstractMap.SimpleEntry<Integer, String>(1, "B");

assertEquals(expectedValue, actualValue);

3. 使用Java Stream

另一种方法是使用Java Stream API。让我们在Entry集上创建一个流并调用findFirst()方法来获取它的第一个条目:

Map.Entry<Integer, String> actualValue = hashMap.entrySet()
    .stream()
    .findFirst()
    .get();

Map.Entry<Integer, String> expectedValue = new AbstractMap.SimpleEntry<Integer, String>(1, "B");

assertEquals(expectedValue, actualValue);

4. 插入顺序问题

为了提出这个问题,让我们记住我们是如何创建hashMap的,将5=A对作为第一个条目插入,然后是1=B,最后是2=C。让我们通过打印HashMap的内容来检查这一点:

System.out.println(hashMap);
{1=B, 2=C, 5=A}

正如我们所看到的,排序是不一样的。HashMap类实现不保证插入顺序

现在让我们再向hashMap添加一个元素:

hashMap.put(0, "D");

Iterator<Map.Entry<Integer, String>> iterator = hashMap.entrySet().iterator();

Map.Entry<Integer, String> actualValue = iterator.next();
Map.Entry<Integer, String> expectedValue = new AbstractMap.SimpleEntry<Integer, String>(0, "D");

assertEquals(expectedValue, actualValue);

如我们所见,第一个条目再次发生变化(在本例中为0=D)。这也证明了HashMap不保证插入顺序。

因此,如果我们想保留顺序,我们应该改用LinkedHashMap

Map<Integer, String> linkedHashMap = new LinkedHashMap<>();
linkedHashMap.put(5, "A");
linkedHashMap.put(1, "B");
linkedHashMap.put(2, "C");
linkedHashMap.put(0, "D");

Iterator<Map.Entry<Integer, String>> iterator = linkedHashMap.entrySet().iterator();
Map.Entry<Integer, String> actualValue = iterator.next();
Map.Entry<Integer, String> expectedValue = new AbstractMap.SimpleEntry<Integer, String>(5, "A");

assertEquals(expectedValue, actualValue);

5. 总结

在这篇简短的文章中,我们讨论了从HashMap获取第一个条目的不同方法。

需要注意的最重要的一点是HashMap实现不保证任何插入顺序。因此,如果我们有兴趣保留插入顺序,应该使用LinkedHashMap。

与往常一样,本教程的完整源代码可在GitHub上获得。

Show Disqus Comments

Post Directory

扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章