Java Map集合(HashMap、LinkedHashMap、TreeMap、Hashtable)及Collections集合工具类
一、Map集合
-
Map<K,V>
- K - 此映射所维护的键的类型
- V - 映射值的类型
-
概述
将键映射到值的对象,一个映射不能包含重复的键,每个键最多只能映射到一个值
-
Map接口和Collection接口的不同
- Map是双列的,Collection是单列的
- Map的键唯一,Collection的子体系Set值是唯一的
- Map集合的数据结构针对键有效,跟值无关;Collection集合的数据结构是针对元素有效
二、Map集合的常用功能
-
添加功能
-
V put(K key,V value):添加元素。这个其实还有另一个功能——替换,如果键是第一次存储,就直接存储元素,返回null,如果键不是第一次存在,就用值把以前的值替换掉,返回以前的值
import java.util.HashMap; import java.util.Set; public class Test21 { public static void main(String[] args) { HashMap map = new HashMap<Integer,String>(); map.put(1,"张三"); map.put(2,"李四"); Set<Integer> set = map.keySet(); for (Integer integer : set) { System.out.println(map.get(integer)); } System.out.println("-------------"); map.put(2,"覆盖后的李四"); for (Integer integer : set) { System.out.println(map.get(integer)); } } } //输出 张三 李四 ------------- 张三 覆盖后的李四
-
-
删除功能
-
void clear():移除所有的键值对元素
import java.util.HashMap; import java.util.Set; public class Test21 { public static void main(String[] args) { HashMap map = new HashMap<Integer,String>(); map.put(1,"张三"); map.put(2,"李四"); map.clear(); Set<Integer> set = map.keySet(); for (Integer integer : set) { System.out.println(map.get(integer)); } } } //输出:无输出结构,Map集合已被清空
-
V remove(Object key):根据键删除键值对元素,并把值返回
import java.util.HashMap; import java.util.Set; public class Test21 { public static void main(String[] args) { HashMap map = new HashMap<Integer,String>(); map.put(1,"张三"); map.put(2,"李四"); map.remove(1); Set<Integer> set = map.keySet(); for (Integer integer : set) { System.out.println(map.get(integer)); } } } //输出: 李四
-
-
判断功能
-
boolean containsKey(Object key):判断集合是否包含指定的键
-
boolean containsValue(Object value):判断集合是否包含指定的值
-
boolean isEmpty():判断集合是否为空
import java.util.HashMap; public class Test21 { public static void main(String[] args) { HashMap map = new HashMap<Integer,String>(); map.put(1,"张三"); map.put(2,"李四"); boolean b = map.containsKey(1);//b=1; boolean b1 = map.containsValue("李四");//b1=true boolean b2 = map.isEmpty();//b2=false } }
-
-
获取功能
-
Set<Map.Entry<K,V>> entrySet(): 返回一个键值对的Set集合
-
V get(Object key):根据键获取值
-
Set keySet():获取集合中所有键的集合
-
Collection values():获取集合中所有值的集合
-
int size():返回集合中的键值对的对数
import java.util.Collection; import java.util.HashMap; import java.util.Map; import java.util.Set; public class Test21 { public static void main(String[] args) { HashMap map = new HashMap<Integer,String>(); map.put(1,"张三"); map.put(2,"李四"); Set<Integer> set = map.keySet(); for (Integer integer : set) { System.out.println(integer); } Set<Map.Entry<Integer,String>> set1 = map.entrySet(); for (Map.Entry<Integer, String> entry : set1) { System.out.println(entry); } Collection values = map.values(); System.out.println(values); int size = map.size(); System.out.println(size); } } //输出 1 2 1=张三 2=李四 [张三, 李四] 2
-
三、Map集合遍历的两种方式
-
keySet()方法通过键找值
-
思路:
- 获取所有键的集合
- 遍历键的集合,获取到每一个键
- 根据键找值
-
案例
import java.util.HashMap; import java.util.Set; public class Test19 { public static void main(String[] args) { HashMap<String,Integer> map = new HashMap<>(); map.put("张三",18); map.put("李四",19); map.put("王五",20); map.put("赵六",21); map.put("张三",22); Set<String> keySet = map.keySet(); for (String s : keySet) { Integer integer = map.get(s); System.out.println(s+" "+integer); } } } //输出 李四 19 张三 22 王五 20 赵六 21
-
-
entryMap方法键值对对象找键和值
-
思路
- 获取所有键值对对象的集合
- 遍历键值对对象的集合,获取到每一个键值对对象
- 根据键值对对象找键和值
-
案例
import java.util.HashMap; import java.util.Map; import java.util.Set; public class Test20 { public static void main(String[] args) { HashMap<String, Integer> map = new HashMap<>(); map.put("张三",18); map.put("李四",19); map.put("王五",20); map.put("赵六",21); map.put("张三",22); Set<Map.Entry<String, Integer>> entrySet = map.entrySet(); for (Map.Entry<String, Integer> entry : entrySet) { System.out.println(entry); } } } //输出 李四=19 张三=22 王五=20 赵六=21
-
四、HashMap、TreeMap、LinkedHashMap特点
- HashMap 允许插入null键 null值,元素唯一,无序
- TreeMap 键不允许插入null,能对元素进行排序,键的数据结构是红黑树,可保证键的排序和唯一性 ,排序分为自然排序和比较器排序(类似TreeSet集合),线程是不安全的效率比较高
- LinkedHashMap 底层的数据结构是链表和哈希表 元素有序 并且唯一
五、HashMap和Hashtable的区别
- HashMap: 线程不安全,效率高.允许null值和null键
- Hashtable: 线程安全 , 效率低.不允许null值和null键
六、HashMap嵌套ArrayList
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.Set;
public class Test22 {
public static void main(String[] args) {
// HashMap 嵌套 ArrayList
ArrayList<String> sgList = new ArrayList<>();
sgList.add("吕布");
sgList.add("周瑜");
ArrayList<String> xaList = new ArrayList<>();
xaList.add("令狐冲");
xaList.add("林平之");
ArrayList<String> sdList = new ArrayList<>();
sdList.add("郭靖");
sdList.add("杨过");
sdList.add("尹志平");
LinkedHashMap<String, ArrayList<String>> maxMap = new LinkedHashMap<>();
maxMap.put("三国演义", sgList);
maxMap.put("笑傲江湖", xaList);
maxMap.put("神雕侠侣", sdList);
Set<String> keySet = maxMap.keySet();
for (String key : keySet) {
System.out.println(key);
ArrayList<String> list = maxMap.get(key);
for (String s : list) {
System.out.println("\t"+s);
}
System.out.println();
}
}
}
//输出
三国演义
吕布
周瑜
笑傲江湖
令狐冲
林平之
神雕侠侣
郭靖
杨过
尹志平
七、Collections工具类
- 概述:针对集合操作的工具类
- 常用方法
- public static void sort(List list): 排序,默认按照自然顺序
- public static int binarySearch(List<?> list,T key): 二分查找
- public static T max(Collection<?> coll): 获取最大值
- public static void reverse(List<?> list): 反转
- public static void shuffle(List<?> list): 随机置换