我们要拥有一定成功的信念
—— 24.6.3
一、双列集合的集合框架
HashMap
1.特点:
a.key唯一,value可重复
b.无序
c.无索引
d.线程不安全
e.可以存null键,null值
2.数据结构:哈希表
LinkedHashMap(继承HashMap)
1.特点:
a.key唯一,value可重复
b.有序
c.无索引
d.线程不安全
e.可以存null键,nul值
2.数据结构:哈希表+双向链表
Hashtable
1.特点:
a.key唯一,value可重复
b.无序
c.无索引
d.线程 安全
e.不可以存null键,null值2.数据结构:哈希表
Properties(继承Hashtable)
1.特点
a.key唯一,value可重复
b.无序
c.无索引
d.线程安全
e.不能null键null值f.key和value都是String型的
2.数据结构:哈希表
TreeMap
1.特点:
a.key唯-,value可重复
b.可以对key进行排序
c.无索引
d.线程不安全
e.不能存null键null值2.数据结构:红黑树
二、Map的介绍
1.概述
是双列集合的顶级接口
2.元素特点
元素都是由key(键),value(值)组成 —> 键值对
三、HashMap的介绍和使用
1.概述
HashMap是Map的实现类
2.特点
a、key唯一,value可重复 —> 如果key重复了,会发生value值覆盖
b、无序
c、无索引
d、线程不安全
e、可以存null键null值
3.数据结构
哈希表
4.方法
V put(K key,V value) -> 添加元素,返回的是
V remove(Object key) -> 根据key删除键值对,返回的是被删除的value
V get(Object key) -> 根据key获取value
boolean containsKey(Object key) -> 判断集合中是否包含指定的key
Collection<V> values() -> 获取集合中所有的value,转存到Collection集合中
Set<K> keyset() —> 将Map中的key获取出来,特存到set集合中
Set<Map.Entry<K,V>> entryset() —> 获取Map集合中的键值对,转存到Set集合中
public static void main(String[] args) {HashMap<Integer, String> map = new HashMap<>();// V put(K key,V value) -> 添加元素,返回的是被覆盖的valuemap.put(1, "lk");map.put(2,"lxr");map.put(3,"twq");map.put(4,"lcl");System.out.println(map);// V remove(Object key) -> 根据key删除键值对,返回的是被删除的valueString value = map.remove(3);System.out.println(value);System.out.println("删除后:"+map);// V get(Object key) -> 根据key获取valueSystem.out.println(map.get(4));// V boolean containsKey(Object key) -> 判断集合中是否包含指定的keySystem.out.println(map.containsKey(3));System.out.println(map.containsKey(4));// Collection<V> values() -> 获取集合中所有的value,转存到Collection集合Collection<String> collection = map.values();System.out.println(collection);}
四、LinkedHashMap的介绍
1.概述:
LinkedHashMap extends HashMap
2.特点:
a.key唯一,value可重复 —> 如果key重复了,会发生value覆盖
b.有序
c.无索引
d.线程不安全
e.可以存null键null值3.数据结构:
哈希表 + 双向链表
4.使用:和HashMap一样
public static void main(String[] args) {LinkedHashMap<Integer, String> map = new LinkedHashMap<>();map.put(1,"张三");map.put(2,"李四");map.put(3,"王五");map.put(4,"赵六");map.put(3,"马七");System.out.println(map); // {1=张三, 2=李四, 3=马七, 4=赵六} 值覆盖}
5.HashMap的两种遍历方式
方式1:获取key,根据key再获取value
Set<K> keyset() —> 将Map中的key获取出来,特存到set集合中
方式2:同时获取key和value
Set<Map.Entry<K,V>> entryset() —> 获取Map集合中的键值对,转存到Set集合中
a.获取记录key和value的对象(结婚证),Map接口中的静态内部接口:Map.Entry
b.调用Map.Entry中的两个方法:getKey() 获取keygetValue() 获取value
public static void main(String[] args) {LinkedHashMap<Integer, String> map = new LinkedHashMap<>();map.put(1,"张三");map.put(2,"李四");map.put(3,"王五");map.put(4,"赵六");map.put(3,"马七");System.out.println(map);// Set<K> keyset() —> 将Map中的key获取出来,特存到set集合中Set<Integer> set = map.keySet();for (Integer i : set) {// 根据key获取valueSystem.out.println(i+"…"+map.get(i));}System.out.println("————————————————————————————————————————");// Set<Map.Entry<K,V>> entryset() —> 获取Map集合中的键值对,转存到Set集合中Set<Map.Entry<Integer, String>> set1 = map.entrySet();for (Map.Entry<Integer, String> entry : set1) {// Set集合中只保存“结婚证” -> Map.Entry,我们需要将保存的这个遍历出来Integer key = entry.getKey();String value = entry.getValue();System.out.println(key+"…"+value);}}
6.去重复
package S89HashMap;import java.util.HashMap;public class Demo249HashMapUnique {public static void main(String[] args) {HashMap<Person,String> map = new HashMap<>();map.put(new Person(17,"小明"),"河北省");map.put(new Person(19,"小帅"),"山东省");map.put(new Person(15,"小刚"),"陕西省");map.put(new Person(18,"小美"),"四川省");map.put(new Person(19,"小帅"),"青海省");System.out.println(map);// {Person{name='小明', age=17}=河北省, Person{name='小刚', age=15}=陕西省, Person{name='小帅', age=19}=青海省, Person{name='小美', age=18}=四川省}} }
如果key为自定义类型,去重复的话,重写hashcode和equals方法,去重复过程和set一样
因为set集合的元素到了底层都是保存到了map的key位置上
7.Map的练习
练习1 统计字符出现次数
需求:用Map集合统计字符串中每一个字符出现的次数
1.创建scanner和HashMap
2.遍历字符串,将每一个字符获取出来3.判断,map中是否包含遍历出来的字符 -> containsKey
4.如果不包含,证明此字符第一次出现,直接将此字符和1存储到map中
5.如果包含,根据字符获取对应的value,让value++
6.将此字符和改变后的value重新保存到map集合中
7.输出
package S89HashMap;import java.util.HashMap; import java.util.Scanner;public class Demo250HashMapText01 {// 统计字符个数public static void main(String[] args) { // 1.创建scanner和HashMapScanner sc = new Scanner(System.in);HashMap<String, Integer> map = new HashMap<>();String data = sc.next(); // 2.遍历字符串,将每一个字符获取出来char[] chars = data.toCharArray();for (char aChar : chars) {String key = aChar+"";// 3.判断,map中是否包含遍历出来的字符 -> containsKeyif (!map.containsKey(key)) {// 4.如果不包含,证明此字符第一次出现,直接将此字符和1存储到map中map.put(key, 1);}else{// 5.如果包含,根据字符获取对应的value,让value++Integer value = map.get(key);value++;// 6.将此字符和改变后的value重新保存到map集合中map.put(key, value);}} // 7.输出System.out.println(map);} }
练习2 斗地主Map版
1.创建数组 ——> color ——> 专门存花色
2.创建数组 ——> number ——> 专门存牌号
3.创建map集合,key为序号,value为组合好的牌面
4.创建一个ArrayList,专门存储key
5.组合牌,存储在map中
6.洗牌,打乱list集合中的key
7.创建四个list集合
8.发牌
9.排序
import java.util.ArrayList; import java.util.Collections; import java.util.HashMap;public class Demo251HashMapText02 {public static void main(String[] args) {// 1.创建数组 ——> color ——> 专门存花色String[] color = "♠-♥-♣-♦".split("-");// 2.创建数组 ——> number ——> 专门存牌号String[] number = "2-3-4-5-6-7-8-9-10-J-Q-K-A".split("-");// 3.创建map集合,key为序号,value为组合好的牌面HashMap<Integer, String> poker = new HashMap<>();// 4.创建一个ArrayList,专门存储keyArrayList<Integer> list = new ArrayList<>();list.add(0);list.add(1);// 5.组合牌,存储在map中int key = 2;for (String num : number) {for (String huaSe : color) {String pokerNum = huaSe + num;poker.put(key, pokerNum);list.add(key);key++;}}poker.put(0, "☺");poker.put(1, "😊"); // System.out.println(list); // System.out.println(poker);// 6.洗牌,打乱list集合中的keyCollections.shuffle(list);// 7.创建四个list集合ArrayList<Integer> p1 = new ArrayList<>();ArrayList<Integer> p2 = new ArrayList<>();ArrayList<Integer> p3 = new ArrayList<>();ArrayList<Integer> dipai = new ArrayList<>();// 8.发牌for (int i = 0; i < list.size(); i++) {Integer key1 = list.get(i);if (i >= 51) {dipai.add(key1);} else if (i % 3 == 0) {p1.add(key1);} else if (i % 3 == 1) {p2.add(key1);} else if (i % 3 == 2) {p3.add(key1);}}// 9.排序Collections.sort(p1);Collections.sort(p2);Collections.sort(p3);Collections.sort(dipai);lookPoker("张三", p1, poker);lookPoker("李四", p2, poker);lookPoker("王五", p3, poker);lookPoker("底牌", dipai, poker);}private static void lookPoker(String name, ArrayList<Integer> list, HashMap<Integer, String> map) {System.out.print(name+":");for (Integer key : list) {String value = map.get(key);System.out.print(value+" ");}System.out.println();} }