黑马程序员_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 集合框架(断点查看统计字符串中每个字符出现的次数案例)

 

posted @ 2020-04-15 10:08  reeddeming  阅读(336)  评论(0编辑  收藏  举报
Live2D