我们要拥有一定成功的信念
—— 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) -> 添加元素,返回的是被覆盖的value map.put(1, "lk"); map.put(2,"lxr"); map.put(3,"twq"); map.put(4,"lcl"); System.out.println(map); // V remove(Object key) -> 根据key删除键值对,返回的是被删除的value String value = map.remove(3); System.out.println(value); System.out.println("删除后:"+map); // V get(Object key) -> 根据key获取value System.out.println(map.get(4)); // V boolean containsKey(Object key) -> 判断集合中是否包含指定的key System.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获取value System.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和HashMap Scanner 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中是否包含遍历出来的字符 -> containsKey if (!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,专门存储key ArrayList<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集合中的key Collections.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(); } }