JAVA之集合—-Map

Map是一个双列集合,其中保存的是键值对(Key-Value),键要求保持唯一性,值可以重复。

image-20211130204437880


Map方法

创建与删除

1
Map<String, Integer> Ages = new HashMap<String, Integer>(); 

Value put(K key, V value):将键和值建立映射关系,如果键是第一次存储,就直接存储元素,返回null; 如果键不是第一次存在,就用值把以前的值替换掉,返回以前的值

void remove(K key):删除指定键的映射


查询

Value get(K key):返回键映射的值,如果该键没有映射值,则返回null

Set<Map.Entry<K,V>> entrySet():返回一个键值对的Set集合

Set keySet():获取集合中所有键的集合

Collection values():获取集合中所有值的集合

int size():返回集合中的键值对的对数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public static void main(String[] args) {
// 创建一个成绩单的 Map
Map<String, Integer> scoreMap = new HashMap<>();
scoreMap.put("Alice", 90);
scoreMap.put("Bob", 85);
scoreMap.put("Charlie", 95);

// 使用 get(K key) 方法获取指定键的值
Integer bobScore = scoreMap.get("Bob"); // 返回 85
Integer daveScore = scoreMap.get("Dave"); // 返回 null,因为 Dave 不在成绩单中

// 使用 entrySet() 方法返回键值对的 Set 集合
Set<Map.Entry<String, Integer>> entrySet = scoreMap.entrySet();

// 使用 keySet() 方法获取所有键的集合
Set<String> keySet = scoreMap.keySet();

// 使用 values() 方法获取所有值的集合
Collection<Integer> values = scoreMap.values();

// 使用 size() 方法获取键值对的对数
int size = scoreMap.size(); // 返回 3,因为有三个键值对
}

判断

boolean containsKey(Object key):是否存在特定的key

boolean containsValue(Object value):是否存在特定的value

boolean isEmpty():判断集合是否为空

default V getOrDefault(Object key, V defaultValue):如果哈希表中有这个Key则获取这个值,如果没有则初始化Key的值为defaultValue

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

public static void main(String[] args) {
// 创建一个成绩单的 Map
Map<String, Integer> scoreMap = new HashMap<>();
scoreMap.put("Alice", 90);
scoreMap.put("Bob", 85);

// 使用 getOrDefault(Object key, V defaultValue) 方法获取指定键的值
int aliceScore = scoreMap.getOrDefault("Alice", 0);
// 返回 90,因为 "Alice" 的成绩是 90
int charlieScore = scoreMap.getOrDefault("Charlie", 0);
// 返回 0,因为 "Charlie" 不在成绩单中,默认值是 0

// 输出结果
System.out.println("Alice 的成绩: " + aliceScore);
System.out.println("Charlie 的成绩: " + charlieScore);

// 如果我们尝试获取一个不存在的键并且不提供默认值,会返回 null
Integer daveScore = scoreMap.getOrDefault("Dave", null);
// 返回 null,因为 "Dave" 不在成绩单中,默认值是 null
System.out.println("Dave 的成绩: " + daveScore);
}



遍历

  • 使用 values() 方法遍历value

    1
    2
    3
    4
    5
    6
    7
    8
    9
    Map<Integer, String> map = new HashMap<>();
    map.put(1, "Apple");
    map.put(2, "Banana");
    map.put(3, "Cherry");

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

  • 使用 keySet() 方法遍历key

    1
    2
    3
    4
    5
    6
    7
    8
    9
    Map<Integer, String> map = new HashMap<>();
    map.put(1, "Apple");
    map.put(2, "Banana");
    map.put(3, "Cherry");

    for (Integer key : map.keySet()) {
    System.out.println(key);
    }

  • 使用ForEach方法遍历key-value

    1
    2
    3
    4
    5
    6
    7
    8
    9
    Map<String, Integer> map = new HashMap<>();
    map.put("key1", 1);
    map.put("key2", 2);

    // 使用forEach方法遍历Map中的键值对
    map.forEach((key, value) -> {
    System.out.println("Key: " + key + ", Value: " + value);
    });


HashMap

特点:

  • 无序
  • 访问速度快
  • key不允许重复(只允许存在一个null Key)

LinkedHashMap

  • 有序
  • 先进先出
  • 继承于HashMap

LinkedHashMap它的特点主要在于linked,带有这个字眼的就表示底层用的是链表来进行的存储。

相对于其他的无序的map实现类,还有像TreeMap这样的排序类,linkedHashMap最大的特点在于有序,但是它的有序主要体现在先进先出FIFO上。没错,LinkedHashMap主要依靠双向链表和hash表来实现的。


TreeMap

  • Key排序

    TreeMap也是一个很常用的map实现类,因为它实现了SortMap,所以会对Key进行排序,使用了TreeMap存储键值对,再使用iterator进行输出时,会发现其默认采用key由小到大的顺序输出键值对,如果想要按照其他的方式来排序,需要重写也就是override 它的compartor接口。

因为只有TreeMap实现了SortedMap类,所以它具有一些独特方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Map.Entry<K, V> firstEntry();
//返回该TreeMap的第一个(最小的)映射
K firstKey();
//返回该TreeMap的第一个(最小的)映射的key
Map.Entry<K, V> lastEntry();
//返回该TreeMap的最后一个(最大的)映射
K lastKey();
//返回该TreeMap的最后一个(最大的)映射的key
v get(K key);
//返回指定key对应的value
SortedMap<K, V> headMap(K toKey);
//返回该TreeMap中严格小于指定key的映射集合
SortedMap<K, V> subMap(K fromKey, K toKey);
//返回该TreeMap中指定范围的映射集合(大于等于fromKey,小于toKey)