黑马程序员_Ja-va基础视频-深入浅出精华版_day18学习笔记
day18
18.01 集合框架(Map集合概述和特点)
1.Map接口概述
(1) 将键映射到值的对象
(2) 一个映射不能包含重复的键
(3) 每个键最多只能映射到一个值
2.Map接口和Collection接口的不同
(1) Map是双列的,Collection是单列的
(2) Map的键唯一,Collection的子体系Set是唯一的
(3) Map集合的数据结构值针对键有效,跟值无关
Collection集合的数据结构是针对元素有效
作为学生来说,是根据学号来区分不同的学生的,那么假设我现在已经知道了学生的学号,我要根据学号去获取学生姓名,请问怎么做呢?
如果采用前面讲解过的集合,我们只能把学号和学生姓名作为一个对象的成员,然后存储整个对象,将来遍历的时候,判断,获取对应的名称。
但是呢,如果我都能把学生姓名拿出来了,我还需要根据编号去找吗?
针对我们目前的这种需求:仅仅知道学号,就想知道学生姓名的情况,Java就提供了一种新的集合 Map。
通过查看API,我们知道Map集合的一个最大的特点,就是它可以存储键值对的元素。这个时候存储我们上面的需求,就可以这样做
学号1 姓名1
学号2 姓名2
学号3 姓名3
学号2(不行)姓名4
学号4 姓名4
Map集合的特点:
将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。
Map集合和Collection集合的区别?
Map集合存储元素是成对出现的,Map集合的键是唯一的,值是可重复的。可以把这个理解为:夫妻对
Collection集合存储元素是单独出现的,Collection的儿子Set是唯一的,List是可重复的。可以把这个理解为:光棍(11.11)
作为学生来说,是根据学号来区分不同的学生的,那么假设我现在已经知道了学生的学号,我要根据学号去获取学生姓名,请问怎么做呢?
如果采用前面讲解过的集合,我们只能把学号和学生姓名作为一个对象的成员,然后存储整个对象,将来遍历的时候,判断,获取对应的名称。
但是呢,如果我都能把学生姓名拿出来了,我还需要根据编号去找吗?
针对我们目前的这种需求:仅仅知道学号,就想知道学生姓名的情况,Java就提供了一种新的集合 Map。
通过查看API,我们知道Map集合的一个最大的特点,就是它可以存储键值对的元素。这个时候存储我们上面的需求,就可以这样做
学号1 姓名1
学号2 姓名2
学号3 姓名3
学号2(不行)姓名4
学号4 姓名4
Map集合的特点:
将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。
Map集合和Collection集合的区别?
Map集合存储元素是成对出现的,Map集合的键是唯一的,值是可重复的。可以把这个理解为:夫妻对
Collection集合存储元素是单独出现的,Collection的儿子Set是唯一的,List是可重复的。可以把这个理解为:光棍(11.11)
18.02 集合框架(Map集合的功能概述)
1:添加功能
V put(K key,V value):添加元素。这个其实还有另一个功能?先不告诉你,等会讲
如果键是第一次存储,就直接存储元素,返回null
如果键不是第一次存在,就用值把以前的值替换掉,返回以前的值
2:删除功能
void clear():移除所有的键值对元素
V remove(Object key):根据键删除键值对元素,并把值返回
3:判断功能
boolean containsKey(Object key):判断集合是否包含指定的键
boolean containsValue(Object value):判断集合是否包含指定的值
boolean isEmpty():判断集合是否为空
4:获取功能
Set<Map.Entry<K,V>> entrySet():???
V get(Object key):根据键获取值
Set<K> keySet():获取集合中所有键的集合
Collection<V> values():获取集合中所有值的集合
5:长度功能
int size():返回集合中的键值对的对数
18.03 集合框架(Map集合的基本功能测试)
1 public class MapDemo { 2 public static void main(String[] args) { 3 // 创建集合对象 4 Map<String, String> map = new HashMap<String, String>(); 5 6 // 添加元素 7 // V put(K key,V value):添加元素。这个其实还有另一个功能?先不告诉你,等会讲 8 // System.out.println("put:" + map.put("文章", "马伊俐")); 9 // System.out.println("put:" + map.put("文章", "姚笛")); 10 11 map.put("邓超", "孙俪"); 12 map.put("黄晓明", "杨颖"); 13 map.put("周杰伦", "蔡依林"); 14 map.put("刘恺威", "杨幂"); 15 16 // void clear():移除所有的键值对元素 17 // map.clear(); 18 19 // V remove(Object key):根据键删除键值对元素,并把值返回 20 // System.out.println("remove:" + map.remove("黄晓明")); 21 // System.out.println("remove:" + map.remove("黄晓波")); 22 23 // boolean containsKey(Object key):判断集合是否包含指定的键 24 // System.out.println("containsKey:" + map.containsKey("黄晓明")); 25 // System.out.println("containsKey:" + map.containsKey("黄晓波")); 26 27 // boolean isEmpty():判断集合是否为空 28 // System.out.println("isEmpty:"+map.isEmpty()); 29 30 // int size():返回集合中的键值对的对数 31 System.out.println("size:" + map.size()); 32 33 // 输出集合名称 34 System.out.println("map:" + map); 35 } 36 }
18.04 集合框架(Map集合的获取功能测试)
1 package cn.itcast_01; 2 3 import java.util.Collection; 4 import java.util.HashMap; 5 import java.util.Map; 6 import java.util.Set; 7 8 /* 9 * 获取功能: 10 * V get(Object key):根据键获取值 11 * Set<K> keySet():获取集合中所有键的集合 12 * Collection<V> values():获取集合中所有值的集合 13 */ 14 public class MapDemo2 { 15 public static void main(String[] args) { 16 // 创建集合对象 17 Map<String, String> map = new HashMap<String, String>(); 18 19 // 创建元素并添加元素 20 map.put("邓超", "孙俪"); 21 map.put("黄晓明", "杨颖"); 22 map.put("周杰伦", "蔡依林"); 23 map.put("刘恺威", "杨幂"); 24 25 // V get(Object key):根据键获取值 26 System.out.println("get:" + map.get("周杰伦")); 27 System.out.println("get:" + map.get("周杰")); // 返回null 28 System.out.println("----------------------"); 29 30 // Set<K> keySet():获取集合中所有键的集合 31 Set<String> set = map.keySet(); 32 for (String key : set) { 33 System.out.println(key); 34 } 35 System.out.println("----------------------"); 36 37 // Collection<V> values():获取集合中所有值的集合 38 Collection<String> con = map.values(); 39 for (String value : con) { 40 System.out.println(value); 41 } 42 } 43 }
18.05 集合框架(Map集合的遍历之键找值)
1 package cn.itcast_01; 2 3 import java.util.HashMap; 4 import java.util.Map; 5 import java.util.Set; 6 7 /* 8 * Map集合的遍历。 9 * Map -- 夫妻对 10 * 思路: 11 * A:把所有的丈夫给集中起来。 12 * B:遍历丈夫的集合,获取得到每一个丈夫。 13 * C:让丈夫去找自己的妻子。 14 * 15 * 转换: 16 * A:获取所有的键 17 * B:遍历键的集合,获取得到每一个键 18 * C:根据键去找值 19 */ 20 public class MapDemo3 { 21 public static void main(String[] args) { 22 // 创建集合对象 23 Map<String, String> map = new HashMap<String, String>(); 24 25 // 创建元素并添加到集合 26 map.put("杨过", "小龙女"); 27 map.put("郭靖", "黄蓉"); 28 map.put("杨康", "穆念慈"); 29 map.put("陈玄风", "梅超风"); 30 31 // 遍历 32 // 获取所有的键 33 Set<String> set = map.keySet(); 34 // 遍历键的集合,获取得到每一个键 35 for (String key : set) { 36 // 根据键去找值 37 String value = map.get(key); 38 System.out.println(key + "---" + value); 39 } 40 } 41 }
18.06 集合框架(Map集合的遍历之键值对对象找键和值)
1 package cn.itcast_01; 2 3 import java.util.HashMap; 4 import java.util.Map; 5 import java.util.Set; 6 7 /* 8 * Map集合的遍历。 9 * Map -- 夫妻对 10 * 11 * 思路: 12 * A:获取所有结婚证的集合 13 * B:遍历结婚证的集合,得到每一个结婚证 14 * C:根据结婚证获取丈夫和妻子 15 * 16 * 转换: 17 * A:获取所有键值对对象的集合 18 * B:遍历键值对对象的集合,得到每一个键值对对象 19 * C:根据键值对对象获取键和值 20 * 21 * 这里面最麻烦的就是键值对对象如何表示呢? 22 * 看看我们开始的一个方法: 23 * Set<Map.Entry<K,V>> entrySet():返回的是键值对对象的集合 24 */ 25 public class MapDemo4 { 26 public static void main(String[] args) { 27 // 创建集合对象 28 Map<String, String> map = new HashMap<String, String>(); 29 30 // 创建元素并添加到集合 31 map.put("杨过", "小龙女"); 32 map.put("郭靖", "黄蓉"); 33 map.put("杨康", "穆念慈"); 34 map.put("陈玄风", "梅超风"); 35 36 // 获取所有键值对对象的集合 37 Set<Map.Entry<String, String>> set = map.entrySet(); 38 // 遍历键值对对象的集合,得到每一个键值对对象 39 for (Map.Entry<String, String> me : set) { 40 // 根据键值对对象获取键和值 41 String key = me.getKey(); 42 String value = me.getValue(); 43 System.out.println(key + "---" + value); 44 } 45 } 46 }
18.07 集合框架(Map集合遍历的两种方式比较图解)
Map集合遍历
方式1:根据键找值
(1) 获取所有键的集合
(2) 遍历键的集合,获取到每一个键
(3) 根据键找值
方式2:根据键值对对象找键和值
(1) 获取所有键值对对象的集合
(2) 遍历键值对对象的集合,获取到每一个键值对对象
(3) 根据键值对对象找键和值
18.08 集合框架(HashMap集合键是String值是String的案例)
1.HashMap类概述
键是哈希表结构,可以保证键的唯一性
2.HashMap案例
(1) HashMap<String,String>
(2) HashMap<Integer,String>
(3) HashMap<String,Student>
(4) HashMap<Student,String>
1 package cn.itcast_02; 2 3 import java.util.HashMap; 4 import java.util.Set; 5 6 /* 7 * HashMap:是基于哈希表的Map接口实现。 8 * 哈希表的作用是用来保证键的唯一性的。 9 * 10 * HashMap<String,String> 11 * 键:String 12 * 值:String 13 */ 14 public class HashMapDemo { 15 public static void main(String[] args) { 16 // 创建集合对象 17 HashMap<String, String> hm = new HashMap<String, String>(); 18 19 // 创建元素并添加元素 20 // String key1 = "it001"; 21 // String value1 = "马云"; 22 // hm.put(key1, value1); 23 24 hm.put("it001", "马云"); 25 hm.put("it003", "马化腾"); 26 hm.put("it004", "乔布斯"); 27 hm.put("it005", "张朝阳"); 28 hm.put("it002", "裘伯君"); // wps 29 hm.put("it001", "比尔盖茨"); 30 31 // 遍历 32 Set<String> set = hm.keySet(); 33 for (String key : set) { 34 String value = hm.get(key); 35 System.out.println(key + "---" + value); 36 } 37 } 38 }
18.09 集合框架(HashMap集合键是Integer值是String的案例)
1 package cn.itcast_02; 2 3 import java.util.HashMap; 4 import java.util.Set; 5 6 /* 7 * HashMap<Integer,String> 8 * 键:Integer 9 * 值:String 10 */ 11 public class HashMapDemo2 { 12 public static void main(String[] args) { 13 // 创建集合对象 14 HashMap<Integer, String> hm = new HashMap<Integer, String>(); 15 16 // 创建元素并添加元素 17 // Integer i = new Integer(27); 18 // Integer i = 27; 19 // String s = "林青霞"; 20 // hm.put(i, s); 21 22 hm.put(27, "林青霞"); 23 hm.put(30, "风清扬"); 24 hm.put(28, "刘意"); 25 hm.put(29, "林青霞"); 26 27 // 下面的写法是八进制,但是不能出现8以上的单个数据 28 // hm.put(003, "hello"); 29 // hm.put(006, "hello"); 30 // hm.put(007, "hello"); 31 // hm.put(008, "hello"); 32 33 // 遍历 34 Set<Integer> set = hm.keySet(); 35 for (Integer key : set) { 36 String value = hm.get(key); 37 System.out.println(key + "---" + value); 38 } 39 40 // 下面这种方式仅仅是集合的元素的字符串表示 41 // System.out.println("hm:" + hm); 42 } 43 }
18.10 集合框架(HashMap集合键是String值是Student的案例)
1 package cn.itcast_02; 2 3 public class Student { 4 private String name; 5 private int age; 6 7 public Student() { 8 super(); 9 } 10 11 public Student(String name, int age) { 12 super(); 13 this.name = name; 14 this.age = age; 15 } 16 17 public String getName() { 18 return name; 19 } 20 21 public void setName(String name) { 22 this.name = name; 23 } 24 25 public int getAge() { 26 return age; 27 } 28 29 public void setAge(int age) { 30 this.age = age; 31 } 32 }
View Code
1 package cn.itcast_02; 2 3 import java.util.HashMap; 4 import java.util.Set; 5 6 /* 7 * HashMap<String,Student> 8 * 键:String 学号 9 * 值:Student 学生对象 10 */ 11 public class HashMapDemo3 { 12 public static void main(String[] args) { 13 // 创建集合对象 14 HashMap<String, Student> hm = new HashMap<String, Student>(); 15 16 // 创建学生对象 17 Student s1 = new Student("周星驰", 58); 18 Student s2 = new Student("刘德华", 55); 19 Student s3 = new Student("梁朝伟", 54); 20 Student s4 = new Student("刘嘉玲", 50); 21 22 // 添加元素 23 hm.put("9527", s1); 24 hm.put("9522", s2); 25 hm.put("9524", s3); 26 hm.put("9529", s4); 27 28 // 遍历 29 Set<String> set = hm.keySet(); 30 for (String key : set) { 31 // 注意了:这次值不是字符串了 32 // String value = hm.get(key); 33 Student value = hm.get(key); 34 System.out.println(key + "---" + value.getName() + "---" + value.getAge()); 35 } 36 } 37 }
18.11 集合框架(HashMap集合键是Student值是String的案例)
1 package cn.itcast_02; 2 3 public class Student { 4 private String name; 5 private int age; 6 7 public Student() { 8 super(); 9 } 10 11 public Student(String name, int age) { 12 super(); 13 this.name = name; 14 this.age = age; 15 } 16 17 public String getName() { 18 return name; 19 } 20 21 public void setName(String name) { 22 this.name = name; 23 } 24 25 public int getAge() { 26 return age; 27 } 28 29 public void setAge(int age) { 30 this.age = age; 31 } 32 33 @Override 34 public int hashCode() { 35 final int prime = 31; 36 int result = 1; 37 result = prime * result + age; 38 result = prime * result + ((name == null) ? 0 : name.hashCode()); 39 return result; 40 } 41 42 @Override 43 public boolean equals(Object obj) { 44 if (this == obj) 45 return true; 46 if (obj == null) 47 return false; 48 if (getClass() != obj.getClass()) 49 return false; 50 Student other = (Student) obj; 51 if (age != other.age) 52 return false; 53 if (name == null) { 54 if (other.name != null) 55 return false; 56 } else if (!name.equals(other.name)) 57 return false; 58 return true; 59 } 60 61 }
View Code
1 package cn.itcast_02; 2 3 import java.util.HashMap; 4 import java.util.Set; 5 6 /* 7 * HashMap<Student,String> 8 * 键:Student 9 * 要求:如果两个对象的成员变量值都相同,则为同一个对象。 10 * 值:String 11 */ 12 public class HashMapDemo4 { 13 public static void main(String[] args) { 14 // 创建集合对象 15 HashMap<Student, String> hm = new HashMap<Student, String>(); 16 17 // 创建学生对象 18 Student s1 = new Student("貂蝉", 27); 19 Student s2 = new Student("王昭君", 30); 20 Student s3 = new Student("西施", 33); 21 Student s4 = new Student("杨玉环", 35); 22 Student s5 = new Student("貂蝉", 27); 23 24 // 添加元素 25 hm.put(s1, "8888"); 26 hm.put(s2, "6666"); 27 hm.put(s3, "5555"); 28 hm.put(s4, "7777"); 29 hm.put(s5, "9999"); 30 31 // 遍历 32 Set<Student> set = hm.keySet(); 33 for (Student key : set) { 34 String value = hm.get(key); 35 System.out.println(key.getName() + "---" + key.getAge() + "---" + value); 36 } 37 } 38 }
18.12 集合框架(LinkedHashMap的概述和使用)
Map 接口的哈希表和链接列表实现,具有可预知的迭代顺序。
1 package cn.itcast_03; 2 3 import java.util.LinkedHashMap; 4 import java.util.Set; 5 6 /* 7 * LinkedHashMap:是Map接口的哈希表和链接列表实现,具有可预知的迭代顺序。 8 * 由哈希表保证键的唯一性 9 * 由链表保证键盘的有序(存储和取出的顺序一致) 10 */ 11 public class LinkedHashMapDemo { 12 public static void main(String[] args) { 13 // 创建集合对象 14 LinkedHashMap<String, String> hm = new LinkedHashMap<String, String>(); 15 16 // 创建并添加元素 17 hm.put("2345", "hello"); 18 hm.put("1234", "world"); 19 hm.put("3456", "java"); 20 hm.put("1234", "javaee"); 21 hm.put("3456", "android"); 22 23 // 遍历 24 Set<String> set = hm.keySet(); 25 for (String key : set) { 26 String value = hm.get(key); 27 System.out.println(key + "---" + value); 28 } 29 } 30 }
18.13 集合框架(TreeMap集合键是String值是String的案例)
1.TreeMap类概述
键是红黑树结构,可以保证键的排序和唯一性
2.TreeMap案例
(1) TreeMap<String,String>
(2) TreeMap<Student,String>
1 package cn.itcast_04; 2 3 import java.util.Set; 4 import java.util.TreeMap; 5 6 /* 7 * TreeMap:是基于红黑树的Map接口的实现。 8 * 9 * HashMap<String,String> 10 * 键:String 11 * 值:String 12 */ 13 public class TreeMapDemo { 14 public static void main(String[] args) { 15 // 创建集合对象 16 TreeMap<String, String> tm = new TreeMap<String, String>(); 17 18 // 创建元素并添加元素 19 tm.put("hello", "你好"); 20 tm.put("world", "世界"); 21 tm.put("java", "爪哇"); 22 tm.put("world", "世界2"); 23 tm.put("javaee", "爪哇EE"); 24 25 // 遍历集合 26 Set<String> set = tm.keySet(); 27 for (String key : set) { 28 String value = tm.get(key); 29 System.out.println(key + "---" + value); 30 } 31 } 32 }
18.14 集合框架(TreeMap集合键是Student值是String的案例)
1 package cn.itcast_04; 2 3 public class Student { 4 private String name; 5 private int age; 6 7 public Student() { 8 super(); 9 } 10 11 public Student(String name, int age) { 12 super(); 13 this.name = name; 14 this.age = age; 15 } 16 17 public String getName() { 18 return name; 19 } 20 21 public void setName(String name) { 22 this.name = name; 23 } 24 25 public int getAge() { 26 return age; 27 } 28 29 public void setAge(int age) { 30 this.age = age; 31 } 32 }
View Code
1 package cn.itcast_04; 2 3 import java.util.Comparator; 4 import java.util.Set; 5 import java.util.TreeMap; 6 7 /* 8 * TreeMap<Student,String> 9 * 键:Student 10 * 值:String 11 */ 12 public class TreeMapDemo2 { 13 public static void main(String[] args) { 14 // 创建集合对象 15 TreeMap<Student, String> tm = new TreeMap<Student, String>(new Comparator<Student>() { 16 @Override 17 public int compare(Student s1, Student s2) { 18 // 主要条件 19 int num = s1.getAge() - s2.getAge(); 20 // 次要条件 21 int num2 = num == 0 ? s1.getName().compareTo(s2.getName()) : num; 22 return num2; 23 } 24 }); 25 26 // 创建学生对象 27 Student s1 = new Student("潘安", 30); 28 Student s2 = new Student("柳下惠", 35); 29 Student s3 = new Student("唐伯虎", 33); 30 Student s4 = new Student("燕青", 32); 31 Student s5 = new Student("唐伯虎", 33); 32 33 // 存储元素 34 tm.put(s1, "宋朝"); 35 tm.put(s2, "元朝"); 36 tm.put(s3, "明朝"); 37 tm.put(s4, "清朝"); 38 tm.put(s5, "汉朝"); 39 40 // 遍历 41 Set<Student> set = tm.keySet(); 42 for (Student key : set) { 43 String value = tm.get(key); 44 System.out.println(key.getName() + "---" + key.getAge() + "---" + value); 45 } 46 } 47 }
18.15 集合框架(统计字符串中每个字符出现的次数案例图解)
18.16 集合框架(统计字符串中每个字符出现的次数案例代码实现)
1 package cn.itcast_05; 2 3 import java.util.Scanner; 4 import java.util.Set; 5 import java.util.TreeMap; 6 7 /* 8 * 需求 :"aababcabcdabcde",获取字符串中每一个字母出现的次数要求结果:a(5)b(4)c(3)d(2)e(1) 9 * 10 * 分析: 11 * A:定义一个字符串(可以改进为键盘录入) 12 * B:定义一个TreeMap集合 13 * 键:Character 14 * 值:Integer 15 * C:把字符串转换为字符数组 16 * D:遍历字符数组,得到每一个字符 17 * E:拿刚才得到的字符作为键到集合中去找值,看返回值 18 * 是null:说明该键不存在,就把该字符作为键,1作为值存储 19 * 不是null:说明该键存在,就把值加1,然后重写存储该键和值 20 * F:定义字符串缓冲区变量 21 * G:遍历集合,得到键和值,进行按照要求拼接 22 * H:把字符串缓冲区转换为字符串输出 23 * 24 * 录入:linqingxia 25 * 结果:result:a(1)g(1)i(3)l(1)n(2)q(1)x(1) 26 */ 27 public class TreeMapDemo { 28 public static void main(String[] args) { 29 // 定义一个字符串(可以改进为键盘录入) 30 Scanner sc = new Scanner(System.in); 31 System.out.println("请输入一个字符串:"); 32 String line = sc.nextLine(); 33 34 // 定义一个TreeMap集合 35 TreeMap<Character, Integer> tm = new TreeMap<Character, Integer>(); 36 37 // 把字符串转换为字符数组 38 char[] chs = line.toCharArray(); 39 40 // 遍历字符数组,得到每一个字符 41 for (char ch : chs) { 42 // 拿刚才得到的字符作为键到集合中去找值,看返回值 43 Integer i = tm.get(ch); 44 45 // 是null:说明该键不存在,就把该字符作为键,1作为值存储 46 if (i == null) { 47 tm.put(ch, 1); 48 } else { 49 // 不是null:说明该键存在,就把值加1,然后重写存储该键和值 50 i++; 51 tm.put(ch, i); 52 } 53 } 54 55 // 定义字符串缓冲区变量 56 StringBuilder sb = new StringBuilder(); 57 58 // 遍历集合,得到键和值,进行按照要求拼接 59 Set<Character> set = tm.keySet(); 60 for (Character key : set) { 61 Integer value = tm.get(key); 62 sb.append(key).append("(").append(value).append(")"); 63 } 64 65 // 把字符串缓冲区转换为字符串输出 66 String result = sb.toString(); 67 System.out.println("result:" + result); 68 } 69 }
18.17 集合框架(断点查看统计字符串中每个字符出现的次数案例)