Java基础关键_020_集合(四)
目 录
一、Set 集合
二、Map 集合
1.概览
2.说明
3.HashMap 说明
4.LinkedHashMap 说明
5.TreeMap 说明
6.Hashtable 说明
7.Properties 说明
三、Map 接口常用方法
1.put(K key, V value) 和 putAll(Map m)
2.get(Object key)
3.clear() 和 size()
4.containsKey(Object key) 和 containsValue(Object value)
5.isEmpty()
6.remove(Object key)
7.values()
8.of(K k1, V v1, K k2, V v2)
9.遍历
(1)keySet()
(2)entrySet()
一、Set 集合
- HashSet:无序集合,底层采用了哈希表的数据结构;
 - LinkedHashSet:有序集合,底层采用双链表和哈希表结合的数据结构;
 - TreeSet:有序集合,集合中元素可排序,底层采用红黑树的数据结构。
 
二、Map 集合
1.概览

2.说明
- Map 接口与 Collection 接口无继承关系;
 - Map 集合以键值对形式存储;
 - 键值对的 key 和 value 都是引用数据类型。 key 为主导,value 为附属;
 - SequencedMap 是 jdk 21 新增的;
 - key 不可重复,否则 value 会被覆盖;
 - HashSet 底层 new 了一个 HashMap,向 HashSet 中存储元素实际上是将元素存储到了 HashMap 的 key 部分;
 - TreeSet 底层 new 了一个 TreeMap,向 TreeSet 中存储元素实际上是将元素存储到了 TreeMap 的 key 部分。排序可通过 java.lang.Comparable 或 java.util.Comparator 实现;
 - LinkedHashSet 底层 new 了一个 LinkedHashMap,LinkedHashMap 只是为了保证插入元素的顺序,效率比 HashSet 低;
 - 向 Set 集合中 add 时,底层会向 Map 中 put,value 只是一个固定不变的常量,作为占位符使用。
 
3.HashMap 说明
底层是哈希表/散列表的数据结构;
key 部分是无序不可重复的(插入顺序和读取顺序不一致,且具有唯一性)。
4.LinkedHashMap 说明
底层是双向链表和哈希表结合的数据结构;
key 部分是有序不可重复的(有下标且具有唯一性)。
5.TreeMap 说明
- 底层是红黑树的数据结构;
 - key 部分是有序不可重复的(可排序且具有唯一性)。
 
6.Hashtable 说明
底层是哈希表的数据结构;
其中所有方法都是线程安全的,但是效率较低,所以较少使用;
key 部分是无序不可重复的(插入顺序和读取顺序不一致,且具有唯一性)。
7.Properties 说明
是属性类;
key 和 value 都是 String 类型;
key 部分是无序不可重复的(插入顺序和读取顺序不一致,且具有唯一性)。
三、Map 接口常用方法
1.put(K key, V value) 和 putAll(Map<? extends K, ? extends V> m)
添加键值对 和 添加多个键值对。
public class MapTest {
    public static void main(String[] args) {
        HashMap<Integer, String> hashMap = new HashMap<>();
        hashMap.put(1, "茅台");
        hashMap.put(2, "五粮液");
        hashMap.put(3, "剑南春");
        hashMap.put(4, "古井贡酒");
        hashMap.put(5, "汾酒");
        System.out.println(hashMap);    // {1=茅台, 2=五粮液, 3=剑南春, 4=古井贡酒, 5=汾酒}
        HashMap<Integer, String> hashMap1 = new HashMap<>();
        hashMap1.putAll(hashMap);
        hashMap1.put(6, "二锅头");
        hashMap1.put(1, "五花红牛");    // key重复,value覆盖
        System.out.println(hashMap1);   // {1=五花红牛, 2=五粮液, 3=剑南春, 4=古井贡酒, 5=汾酒, 6=二锅头}
    }
} 
2.get(Object key)
通过 key 获取对应的 value 。
public class MapTest {
    public static void main(String[] args) {
        HashMap<Integer, String> hashMap = new HashMap<>();
        hashMap.put(1, "茅台");
        hashMap.put(2, "五粮液");
        hashMap.put(3, "剑南春");
        hashMap.put(4, "古井贡酒");
        hashMap.put(5, "汾酒");
        System.out.println(hashMap.get(5)); // 汾酒
        System.out.println(hashMap.get(6)); // null
    }
}
 
3.clear() 和 size()
清空 Map 集合 和 统计键值对的个数。
public class MapTest {
    public static void main(String[] args) {
        HashMap<Integer, String> hashMap = new HashMap<>();
        hashMap.put(1, "茅台");
        hashMap.put(2, "五粮液");
        hashMap.put(3, "剑南春");
        hashMap.put(4, "古井贡酒");
        hashMap.put(5, "汾酒");
        System.out.println(hashMap.size()); // 5
        hashMap.clear();
        System.out.println(hashMap.size()); // 0
    }
} 
4.containsKey(Object key) 和 containsValue(Object value)
是否包含某个 key 或 是否包含某个 value。
public class MapTest {
    public static void main(String[] args) {
        HashMap<Integer, String> hashMap = new HashMap<>();
        hashMap.put(1, "茅台");
        hashMap.put(2, "五粮液");
        hashMap.put(3, "剑南春");
        hashMap.put(4, "古井贡酒");
        hashMap.put(5, "汾酒");
        System.out.println(hashMap.containsKey(1)); // true
        System.out.println(hashMap.containsKey(6)); // false
        System.out.println(hashMap.containsValue("汾酒"));    // true
        System.out.println(hashMap.containsValue("二锅头"));   // false
    }
} 
5.isEmpty()
判断该 Map 集合是否为空。
public class MapTest {
    public static void main(String[] args) {
        HashMap<Integer, String> hashMap = new HashMap<>();
        hashMap.put(1, "茅台");
        hashMap.put(2, "五粮液");
        hashMap.put(3, "剑南春");
        hashMap.put(4, "古井贡酒");
        hashMap.put(5, "汾酒");
        System.out.println(hashMap.isEmpty());  // false
        hashMap.clear();
        System.out.println(hashMap.isEmpty());  // true
    }
} 
6.remove(Object key)
通过 key 删除键值对。
public class MapTest {
    public static void main(String[] args) {
        HashMap<Integer, String> hashMap = new HashMap<>();
        hashMap.put(1, "茅台");
        hashMap.put(2, "五粮液");
        hashMap.put(3, "剑南春");
        hashMap.put(4, "古井贡酒");
        hashMap.put(5, "汾酒");
        hashMap.remove(1);
        System.out.println(hashMap);    // {2=五粮液, 3=剑南春, 4=古井贡酒, 5=汾酒}
    }
} 
7.values()
获取所有的 value 。
public class MapTest {
    public static void main(String[] args) {
        HashMap<Integer, String> hashMap = new HashMap<>();
        hashMap.put(1, "茅台");
        hashMap.put(2, "五粮液");
        hashMap.put(3, "剑南春");
        hashMap.put(4, "古井贡酒");
        hashMap.put(5, "汾酒");
        System.out.println(hashMap.values());   // [茅台, 五粮液, 剑南春, 古井贡酒, 汾酒]
    }
}
 
8.of(K k1, V v1, K k2, V v2)
静态方法,使用现有的 key-value 构造 Map 集合。
public class MapTest {
    public static void main(String[] args) {
        Map<Integer, String> map = Map.of(1, "茅台", 2, "五粮液", 3, "剑南春", 4, "古井贡酒", 5, "汾酒");
        System.out.println(map);    // {1=茅台, 2=五粮液, 3=剑南春, 4=古井贡酒, 5=汾酒}
    }
} 
9.遍历
(1)keySet()
获取所有的 key 。
public class MapTest {
    public static void main(String[] args) {
        HashMap<Integer, String> hashMap = new HashMap<>();
        hashMap.put(1, "中华");
        hashMap.put(2, "九五至尊");
        hashMap.put(3, "芙蓉王");
        hashMap.put(4, "南京");
        hashMap.put(5, "兰州");
        // 遍历集合:获取 Map 集合的所有 key,然后通过遍历 key 获取 value
        Set<Integer> keys = hashMap.keySet();
        Iterator<Integer> iterator = keys.iterator();
        while (iterator.hasNext()) {
            Integer key = iterator.next();
            String value = hashMap.get(key);
            System.out.print(key + ":" + value + "\t");
        }
        // 1:中华	2:九五至尊	3:芙蓉王	4:南京	5:兰州
    }
} 
public class MapTest {
    public static void main(String[] args) {
        HashMap<Integer, String> hashMap = new HashMap<>();
        hashMap.put(1, "中华");
        hashMap.put(2, "九五至尊");
        hashMap.put(3, "芙蓉王");
        hashMap.put(4, "南京");
        hashMap.put(5, "兰州");
        // 遍历集合:获取 Map 集合的所有 key,然后通过遍历 key 获取 value
        Set<Integer> keys = hashMap.keySet();
        for (Integer key : keys) {
            String value = hashMap.get(key);
            System.out.print(key + ":" + value + "\t");
        }
        // 1:中华	2:九五至尊	3:芙蓉王	4:南京	5:兰州
    }
} 
(2)entrySet()
获取所有键值对的 Set 视图。效率较高,建议使用此方式。
public class MapTest {
    public static void main(String[] args) {
        HashMap<Integer, String> hashMap = new HashMap<>();
        hashMap.put(1, "中华");
        hashMap.put(2, "九五至尊");
        hashMap.put(3, "芙蓉王");
        hashMap.put(4, "南京");
        hashMap.put(5, "兰州");
        // 遍历集合:获取 Map 集合的所有 key,然后通过遍历 key 获取 value
        Set<Map.Entry<Integer, String>> entries = hashMap.entrySet();
        Iterator<Map.Entry<Integer, String>> iterator = entries.iterator();
        while (iterator.hasNext()) {
            Map.Entry<Integer, String> next = iterator.next();
            Integer key = next.getKey();
            String value = next.getValue();
            System.out.print(key + ":" + value + "\t");
        }
        // 1:中华	2:九五至尊	3:芙蓉王	4:南京	5:兰州
    }
} 
public class MapTest {
    public static void main(String[] args) {
        HashMap<Integer, String> hashMap = new HashMap<>();
        hashMap.put(1, "中华");
        hashMap.put(2, "九五至尊");
        hashMap.put(3, "芙蓉王");
        hashMap.put(4, "南京");
        hashMap.put(5, "兰州");
        // 遍历集合:获取 Map 集合的所有 key,然后通过遍历 key 获取 value
        Set<Map.Entry<Integer, String>> entries = hashMap.entrySet();
        for (Map.Entry<Integer, String> entry : entries) {
            System.out.print(entry.getKey() + ":" + entry.getValue() + "\t");
        }
        // 1:中华	2:九五至尊	3:芙蓉王	4:南京	5:兰州
    }
}
                