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:兰州
}
}