1. 一组键值对。

一组键值对

在 Java 中,另一个有趣的集合(从广义上讲)是Map. 有时这种数据结构也称为字典。

它类似于集合Set,但它存储一组“对”元素而不是一组元素,a 中的每一对Map由两个元素组成:一个“键”和一个“值”。

假设您希望您的程序存储员工姓名和他们的薪水,或者您同事的姓名和他们的年龄。那么你需要一个这样的表:

姓名 年龄
埃隆 21
杰夫 22
账单 48
沃伦

每行包含几个值。我们将把名字称为对的,将年龄称为对的

这些对的整个集合就是我们的映射( Map)。

一对的密钥可以是除null. 键必须是唯一的:一个映射不能包含两个相同的键。


2.HashMap

HashMap是最受欢迎的一种Map集合。一方面,它与 HashSet 非常相似并且拥有它的所有方法。另一方面,它就像一个列表 ( ArrayList),可以使用单词(或其他任何东西)作为其索引。

您可以HashMap使用这样的语句创建一个:

HashMap<KeyType, ValueType> name = new HashMap<KeyType, ValueType>();

其中KeyType是存储对中键的类型,ValueType是存储在集合中的对中值的类型HashMap

该类HashMap有这样的方法:

方法 描述
void put(KeyType key, ValueType value)
将 ( key, value) 对添加到集合中
ValueType get(KeyType key)
返回与键关联的值。
boolean containsKey(KeyType key)
检查集合中是否存在键
boolean containsValue(ValueType value)
检查集合中是否存在某个值
ValueType remove(KeyType key)
从集合中移除一个元素
void clear()
清除集合,删除所有元素
int size()
返回集合中键值对的数量
Set<KeyType> keySet()
返回集合中的键集
Collection<ValueType> values()
返回包含集合元素的集合
Set<Map.Entry<KeyType, ValueType>> entrySet()
返回集合中Set所有对 ( ) 的集合 ( )。Map.Entry

将元素添加到HashMap

使用该方法将元素成对添加到地图中put()。键作为第一个参数传递,值作为第二个参数传递。

HashMap<String, Integer> map = new HashMap<String, Integer>();
map.put("Elon", 21);
map.put("Jeff", 22);
map.put("Bill", 48);
map.put("Warren", null);

添加键值对时,如果键已经存在于集合中,则旧值被新值替换。

这种行为使 aHashMap类似于数组或列表,其索引是单词 ( String) 而不是数字。

重要的:

几乎任何类型都可以是 KeyType 或 ValueType。KeyType 有一些小的附加要求,当您在 Java Collections 任务中更详细地研究集合时,您将了解这些要求。



3. Subsets of a HashMap: 键集

假设我们只想HashMap在屏幕上显示 a 中的所有条目。我们如何做到这一点?为此,我们需要知道如何遍历HashMap. 这可以通过多种方式完成。

最简单的方法是遍历键

HashMap条目没有按顺序编号,因此带计数器的循环在这里不起作用。但是我们可以使用该方法获得一组键keySet(),并且您已经知道如何迭代一组:

代码 描述
HashMap<String, Integer> map = new HashMap<String, Integer>();
map.put("Elon", 21);
map.put("Jeff", 22);
map.put("Bill", 48);
map.put("Warren", null);

for (String key: map.keySet())
{
   Integer value = map.get(key);
   System.out.println(key + " --> " + value);
}






循环遍历的键map

获取与键关联的值

keySet()方法返回一组键。您可以通过两种方式使用此集合:

紧凑的符号 长符号
for (String key: map.keySet())
{
   Integer value = map.get(key);
   System.out.println(key + " --> " + value);
}
Set<String> keys = map.keySet();

for (String key: keys)
{
   Integer value = map.get(key);
   System.out.println(key + " --> " + value);
}


4.循环键值对

还有一种更复杂的方法:可以将 a 转换Map为一组键值对,然后循环遍历集合中的元素,我们已经学过。

HashMap集合有一个存储键值对的辅助类。它看起来大约是这样的:

class Entry<KeyType, ValueType>
{
   private KeyType key;
   private ValueType value;

   public KeyType getKey()
   {
      return this.key;
   }

   public ValueType getValue()
   {
      return this.value;
   }
}

entrySet()在对象上调用该方法的结果将是:HashMap<KeyType, ValueType>Set<Entry<KeyType, ValueType>>

Set<Entry<KeyType, ValueType>> name = map.entrySet();

这里我们有一个带有类型参数的泛型Set类,它又是一个Entry带有两个类型参数的泛型类型 ( )。

初学者很容易对此感到困惑。但是一旦你弄明白了,你就可以编写如下代码:

HashMap<String, Integer> map = new HashMap<String, Integer>();
map.put("Elon", 21);
map.put("Jeff", 22);
map.put("Bill", 48);
map.put("Warren", null);

Set<Map.Entry<String, Integer>> entries = map.entrySet();
for(Map.Entry<String, Integer> pair: entries)
{
   String key = pair.getKey();
   Integer value = pair.getValue();
   System.out.println(key + " --> " + value);
}

也就是说,这段代码可以稍微简化一下:

首先,您可以跳过为 for 创建单独的变量entries,而是entrySet()直接在for循环内调用该方法:

for(Map.Entry<String, Integer> pair: map.entrySet())
{
   String key = pair.getKey();
   Integer value = pair.getValue();
   System.out.println(key + " --> " + value);
}

其次,您可以使用最近推出的运算符来自动推断键值对var的类型:

for(var pair: map.entrySet())
{
   String key = pair.getKey();
   Integer value = pair.getValue();
   System.out.println(key + " --> " + value);
}

还不错吧?



ArrayList5.和的比较HashMap

A 与允许将字符串(或其他类型)用作索引(键)的HashMap非常相似。ArrayList

如果您使用Integera 中的键HashMap,那么它会变得更加类似于ArrayList. 让我们比较一下:

使用 ArrayList<String> 的代码 使用 HashMap<Integer, String> 的代码
ArrayList<String> list = new ArrayList<String>();

list.add("Greetings");
list.add("Hello");

String s = list.get(0);
list.set(0, s + "!");

for (String item: list)
{
   System.out.println(item);
}
HashMap<Integer, String> map = new HashMap<Integer, String>();

map.put(0, "Greetings");
map.put(1, "Hello");

String s = map.get(0);
map.put(0, s + "!");

for (String item: map.values())
{
   System.out.println(item);
}