Map集合概述和特点
Map就是将键映射到值的对象,一个映射不能包含重复的键每个键最多只能映射到一个值。
Map接口和Collection接口的不同
Map是双列的,Collection是单列的
Map的键唯一,Collection的子体系Set是唯一的
Map集合的数据结构针对键有效,跟值无关;Collection集合的数据结构是针对元素有效
Map接口的实现类: HashMap, Hashtable, LinkedHashMap, TreeMap, Properties,
基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。(除了非同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同。)此类不保证映射的顺序,特别是它不保证该顺序恒久不变。所有Map集合的数据结构,只跟键有关,跟值没关系。
HashMap
HashMap<String, String> hm = new HashMap<>();
String s = hm.put("文温", "马丹丽"); //当第一次,这个键去映射一个值的时候,返回的是null
System.out.println(s); //null
s = hm.put("文温", "阿达"); //当这个键再次映射一个新值的时候,返回的是上一次映射的旧值
System.out.println(s); //马丹丽
HashMap集合键是String值
键唯一 注意重写hashCode方法 和 equals 方法
Map集合的功能概述
V put(K key,V value)//键相同 值覆盖
a:添加功能
V put(K key,V value):添加元素。这个其实还有另一个功能?替换
如果键是第一次存储,就直接存储元素,返回null
如果键不是第一次存在,就用值把以前的值替换掉,返回以前的值
b:删除功能
void clear():移除所有的键值对元素
V remove(Object key):根据键删除键值对元素,并把删除的值返回
c:判断功能
boolean containsKey(Object key):判断集合是否包含指定的键
boolean containsValue(Object value):判断集合是否包含指定的值
boolean isEmpty():判断集合是否为空
d:获取功能
Set<Map.Entry<K,V>> entrySet(): 返回一个键值对的Set集合
V get(Object key):根据键获取值
Set keySet():获取集合中所有键的集合
Collection values():获取集合中所有值的集合
e:长度功能
int size():返回集合中的键值对的对数
map集合的遍历
int size = hm.size();//获取集合的长度
遍历方式1 使用键找值
Set<Integer> keySet = hm.keySet();//获取键集
//根据键获取值 键找值
String s = hm.get(1);
System.out.println(s);
for (Integer key : keySet) {
System.out.println(hm.get(key));
}
map集合的遍历方式2
//Map.Entry<Integer, String> //键值对,对象 Node<K<V>
//getKey()
//返回与此项对应的键。
//V getValue ()
//返回与此项对应的值。
// hm.entrySet(); 获取集合中,键值对,对象的集合
Set<Map.Entry<Integer, String>> entries = hm.entrySet();
//遍历 键值对,对象的集合 通过键值对 对象中的方法,获取键和值
for (Map.Entry<Integer, String> en : entries) {
Integer key = en.getKey();
String value = en.getValue();
System.out.println(key+"==="+value);
}
下面这也算一种
//获取所有值的集合
Collection<String> values = hm.values();
for (String value : values) {
System.out.println(value);
}
LinkedHashMap
LinkedHashMap的特点:底层的数据结构是链表和哈希表 元素有序 并且唯一。其中元素的有序性由链表数据结构保证,唯一性由哈希表数据结构保证。
Map集合的数据结构只和键有关
TreeMap
键的数据结构是红黑树, 可保证键的排序和唯一性,排序分为自然排序和比较器排序, 线程是不安全的效率比较高。
HashMap<Character, Integer> hashMap = new HashMap<>();
Scanner scanner = new Scanner(System.in);
System.out.println("请输入一串字符串");
String s = scanner.nextLine();
// String str = "aaaaaafdfesfewfeadfaaaaaabaffbeeeecabcdabcde";
//我们可以把这段字符串,中的每个字符获取出来,往map集合里面存,并且还要统计个数
for (int i = 0; i < s.length(); i++) {
//截取每个字符
char ch = s.charAt(i);
if (!(hashMap.containsKey(ch))) {
hashMap.put(ch, 1);
} else {
Integer value = hashMap.get(ch);//取出上一次的值
value++;//自增一下
hashMap.put(ch, value);//键相同,值覆盖
}
}
StringBuilder sb = new StringBuilder();
//遍历集合拼串
Set<Map.Entry<Character, Integer>> entries = hashMap.entrySet();
for (Map.Entry<Character, Integer> en : entries) {
Character key = en.getKey();
Integer value = en.getValue();
sb.append(key).append("(").append(value).append(")");
}
String s1 = sb.toString();
System.out.println(s1);
集合嵌套之HashMap嵌套HashMap
//基础班
// 张三 20
// 李四 22
//就业班
// 王五 21
// 赵六 23
//集合嵌套
HashMap<String, Integer> jcMap = new HashMap<>();
jcMap.put("张三",20);
jcMap.put("李四",24);
HashMap<String, Integer> jyMap = new HashMap<>();
jyMap.put("王五", 25);
jyMap.put("赵六", 26);
HashMap<String, HashMap<String, Integer>> maxMap = new HashMap<>();
maxMap.put("基础班",jcMap);
maxMap.put("就业班",jyMap);
//遍历集合
Set<Map.Entry<String, HashMap<String, Integer>>> entries = maxMap.entrySet();
for (Map.Entry<String, HashMap<String, Integer>> en : entries) {
String key = en.getKey();
System.out.println(key);
HashMap<String, Integer> value = en.getValue();
Set<Map.Entry<String, Integer>> entries1 = value.entrySet();
for (Map.Entry<String, Integer> e : entries1) {
String key1 = e.getKey();
Integer value1 = e.getValue();
System.out.println("\t"+key1+" "+value1);
}
System.out.println();
}
集合嵌套之ArrayList嵌套HashMap
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("杨过");
HashMap<String, ArrayList<String>> maxMap = new HashMap<>();
maxMap.put("三国演义", sgList);
maxMap.put("笑傲江湖", xaList);
maxMap.put("神雕侠侣", sdList);
Set<String> keySet = maxMap.keySet();
for (String s : keySet) {
ArrayList<String> list = maxMap.get(s);
System.out.println(s);
for (String s1 : list) {
System.out.println("\t"+s1);
}
System.out.println();
}
集合嵌套之HashMap嵌套ArrayList
//ArrayList 嵌套HashMap
HashMap<String, String> sgMap = new HashMap<>();
sgMap.put("周瑜", "小乔");
sgMap.put("吕布", " 貂蝉");
HashMap<String, String> sdMap = new HashMap<>();
sdMap.put("郭靖", "黄蓉");
sdMap.put("杨过", " 小龙女");
HashMap<String, String> xaMap = new HashMap<>();
xaMap.put("令狐冲", "任盈盈");
xaMap.put("林平之", "岳灵珊");
ArrayList<HashMap<String, String>> maxList = new ArrayList<>();
maxList.add(sgMap);
maxList.add(sdMap);
maxList.add(xaMap);
for (HashMap<String, String> hm : maxList) {
Set<Map.Entry<String, String>> entries = hm.entrySet();
for (Map.Entry<String, String> en : entries) {
String key = en.getKey();
String value = en.getValue();
System.out.println(key + "------" + value);
}
System.out.println();
}
}
HashMap和Hashtable的区别
HashMap: 线程不安全,效率高.允许null值和null键
Hashtable: 线程安全 , 效率低.不允许null值和null键