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
有这样的方法:
方法 | 描述 |
---|---|
|
将 ( key , value ) 对添加到集合中 |
|
返回与键关联的值。 |
|
检查集合中是否存在键 |
|
检查集合中是否存在某个值 |
|
从集合中移除一个元素 |
|
清除集合,删除所有元素 |
|
返回集合中键值对的数量 |
|
返回集合中的键集 |
|
返回包含集合元素的集合 |
|
返回集合中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()
,并且您已经知道如何迭代一组:
代码 | 描述 |
---|---|
|
循环遍历的键 map 获取与键关联的值 |
该keySet()
方法返回一组键。您可以通过两种方式使用此集合:
紧凑的符号 | 长符号 |
---|---|
|
|
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);
}
还不错吧?
ArrayList
5.和的比较HashMap
A 与允许将字符串(或其他类型)用作索引(键)的HashMap
非常相似。ArrayList
如果您使用Integer
a 中的键HashMap
,那么它会变得更加类似于ArrayList
. 让我们比较一下:
使用 ArrayList<String> 的代码 | 使用 HashMap<Integer, String> 的代码 |
---|---|
|
|
GO TO FULL VERSION