Java笔记(18):集合框架(04)

1、Map集合概述特点及测试

 1 package cn.itcast_01;
 2
 3 import java.util.HashMap;
 4 import java.util.Map;
 5
 6 /*
 7  * 作为学生来说,是根据学号来区分不同的学生的,那么假设我现在已经知道了学生的学号,我要根据学号去获取学生姓名,请问怎么做呢?
 8  * 如果采用前面讲解过的集合,我们只能把学号和学生姓名作为一个对象的成员,然后存储整个对象,将来遍历的时候,判断,获取对应的名称。
 9  * 但是呢,如果我都能把学生姓名拿出来了,我还需要根据编号去找吗?
10  * 针对我们目前的这种需求:仅仅知道学号,就想知道学生姓名的情况,Java就提供了一种新的集合 Map。
11  * 通过查看API,我们知道Map集合的一个最大的特点,就是它可以存储键值对的元素。这个时候存储我们上面的需求,就可以这样做
12  *         学号1        姓名1
13  *         学号2     姓名2
14  *         学号3        姓名3
15  *         学号2(不行)姓名4
16  *         学号4               姓名4
17  * Map集合的特点:
18  *         将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。
19  *
20  * Map集合和Collection集合的区别?
21  *         Map集合存储元素是成对出现的,Map集合的键是唯一的,值是可重复的。可以把这个理解为:夫妻对
22  *         Collection集合存储元素是单独出现的,Collection的儿子Set是唯一的,List是可重复的。可以把这个理解为:光棍(11.11)
23  *
24  * 注意:
25  *         Map集合的数据结构值针对键有效,跟值无关
26  *             HashMap,TreeMap等会讲。
27  *        Collection集合的数据结构是针对元素有效
28  *
29  * Map集合的功能概述:
30  * 1:添加功能
31  *         V put(K key,V value):添加元素。这个其实还有另一个功能?先不告诉你,等会讲
32  *             如果键是第一次存储,就直接存储元素,返回null
33  *             如果键不是第一次存在,就用值把以前的值替换掉,返回以前的值
34  * 2:删除功能
35  *         void clear():移除所有的键值对元素
36  *         V remove(Object key):根据键删除键值对元素,并把值返回
37  * 3:判断功能
38  *         boolean containsKey(Object key):判断集合是否包含指定的键
39  *         boolean containsValue(Object value):判断集合是否包含指定的值
40  *         boolean isEmpty():判断集合是否为空
41  * 4:获取功能
42  *         Set<Map.Entry<K,V>> entrySet():???
43  *         V get(Object key):根据键获取值
44  *         Set<K> keySet():获取集合中所有键的集合
45  *         Collection<V> values():获取集合中所有值的集合
46  * 5:长度功能
47  *         int size():返回集合中的键值对的对数
48  */
49 public class MapDemo {
50     public static void main(String[] args) {
51         // 创建集合对象
52         Map<String, String> map = new HashMap<String, String>();
53
54         // 添加元素
55         // V put(K key,V value):添加元素。这个其实还有另一个功能?先不告诉你,等会讲
56         // System.out.println("put:" + map.put("文章", "马伊俐"));
57         // System.out.println("put:" + map.put("文章", "姚笛"));
58
59         map.put("邓超", "孙俪");
60         map.put("黄晓明", "杨颖");
61         map.put("周杰伦", "蔡依林");
62         map.put("刘恺威", "杨幂");
63
64         // void clear():移除所有的键值对元素
65         // map.clear();
66
67         // V remove(Object key):根据键删除键值对元素,并把值返回
68         // System.out.println("remove:" + map.remove("黄晓明"));
69         // System.out.println("remove:" + map.remove("黄晓波"));
70
71         // boolean containsKey(Object key):判断集合是否包含指定的键
72         // System.out.println("containsKey:" + map.containsKey("黄晓明"));
73         // System.out.println("containsKey:" + map.containsKey("黄晓波"));
74
75         // boolean isEmpty():判断集合是否为空
76         // System.out.println("isEmpty:"+map.isEmpty());
77
78         //int size():返回集合中的键值对的对数
79         System.out.println("size:"+map.size());
80
81         // 输出集合名称
82         System.out.println("map:" + map);
83     }
84 }

2、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 }

3、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 }

4、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 }

5、HashMap集合键是Stirng值是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 }

6、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 }

7、HashMap集合键是String值是Student的案例

 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() + "---"
35                     + value.getAge());
36         }
37     }
38 }

8、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 }
 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() + "---"
36                     + value);
37         }
38     }
39 }

9、LinkedHashMap的概述和使用

 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 }

10、TreeMap集合键是String值是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 }

11、TreeMap集合键是Student值是String的案例

 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>(
16                 new Comparator<Student>() {
17                     @Override
18                     public int compare(Student s1, Student s2) {
19                         // 主要条件
20                         int num = s1.getAge() - s2.getAge();
21                         // 次要条件
22                         int num2 = num == 0 ? s1.getName().compareTo(
23                                 s2.getName()) : num;
24                         return num2;
25                     }
26                 });
27
28         // 创建学生对象
29         Student s1 = new Student("潘安", 30);
30         Student s2 = new Student("柳下惠", 35);
31         Student s3 = new Student("唐伯虎", 33);
32         Student s4 = new Student("燕青", 32);
33         Student s5 = new Student("唐伯虎", 33);
34
35         // 存储元素
36         tm.put(s1, "宋朝");
37         tm.put(s2, "元朝");
38         tm.put(s3, "明朝");
39         tm.put(s4, "清朝");
40         tm.put(s5, "汉朝");
41
42         // 遍历
43         Set<Student> set = tm.keySet();
44         for (Student key : set) {
45             String value = tm.get(key);
46             System.out.println(key.getName() + "---" + key.getAge() + "---"
47                     + value);
48         }
49     }
50 }

12、统计字符串中每个字符出现的次数案例图解及代码实现

 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 }

13、HashMap集合嵌套HashMap集合的案例

 1 package cn.itcast_05;
 2
 3 import java.util.HashMap;
 4 import java.util.Set;
 5
 6 /*
 7  * HashMap嵌套HashMap
 8  *
 9  * 传智播客
10  *         jc    基础班
11  *                 陈玉楼        20
12  *                 高跃        22
13  *         jy    就业班
14  *                 李杰        21
15  *                 曹石磊        23
16  *
17  * 先存储元素,然后遍历元素
18  */
19 public class HashMapDemo2 {
20     public static void main(String[] args) {
21         // 创建集合对象
22         HashMap<String, HashMap<String, Integer>> czbkMap = new HashMap<String, HashMap<String, Integer>>();
23
24         // 创建基础班集合对象
25         HashMap<String, Integer> jcMap = new HashMap<String, Integer>();
26         // 添加元素
27         jcMap.put("陈玉楼", 20);
28         jcMap.put("高跃", 22);
29         // 把基础班添加到大集合
30         czbkMap.put("jc", jcMap);
31
32         // 创建就业班集合对象
33         HashMap<String, Integer> jyMap = new HashMap<String, Integer>();
34         // 添加元素
35         jyMap.put("李杰", 21);
36         jyMap.put("曹石磊", 23);
37         // 把基础班添加到大集合
38         czbkMap.put("jy", jyMap);
39
40         //遍历集合
41         Set<String> czbkMapSet = czbkMap.keySet();
42         for(String czbkMapKey : czbkMapSet){
43             System.out.println(czbkMapKey);
44             HashMap<String, Integer> czbkMapValue = czbkMap.get(czbkMapKey);
45             Set<String> czbkMapValueSet = czbkMapValue.keySet();
46             for(String czbkMapValueKey : czbkMapValueSet){
47                 Integer czbkMapValueValue = czbkMapValue.get(czbkMapValueKey);
48                 System.out.println("\t"+czbkMapValueKey+"---"+czbkMapValueValue);
49             }
50         }
51     }
52 }

14、HashMap集合嵌套ArrayList集合的案例

 1 package cn.itcast_05;
 2
 3 import java.util.ArrayList;
 4 import java.util.HashMap;
 5 import java.util.Set;
 6
 7 /*
 8  *需求:
 9  *假设HashMap集合的元素是ArrayList。有3个。
10  *每一个ArrayList集合的值是字符串。
11  *元素我已经完成,请遍历。
12  *结果:
13  *         三国演义
14  *             吕布
15  *             周瑜
16  *         笑傲江湖
17  *             令狐冲
18  *             林平之
19  *         神雕侠侣
20  *             郭靖
21  *             杨过
22  */
23 public class HashMapIncludeArrayListDemo {
24     public static void main(String[] args) {
25         // 创建集合对象
26         HashMap<String, ArrayList<String>> hm = new HashMap<String, ArrayList<String>>();
27
28         // 创建元素集合1
29         ArrayList<String> array1 = new ArrayList<String>();
30         array1.add("吕布");
31         array1.add("周瑜");
32         hm.put("三国演义", array1);
33
34         // 创建元素集合2
35         ArrayList<String> array2 = new ArrayList<String>();
36         array2.add("令狐冲");
37         array2.add("林平之");
38         hm.put("笑傲江湖", array2);
39
40         // 创建元素集合3
41         ArrayList<String> array3 = new ArrayList<String>();
42         array3.add("郭靖");
43         array3.add("杨过");
44         hm.put("神雕侠侣", array3);
45
46         //遍历集合
47         Set<String> set = hm.keySet();
48         for(String key : set){
49             System.out.println(key);
50             ArrayList<String> value = hm.get(key);
51             for(String s : value){
52                 System.out.println("\t"+s);
53             }
54         }
55     }
56 }

15、ArrayList集合嵌套HashMap集合的案例

 1 package cn.itcast_05;
 2
 3 import java.util.ArrayList;
 4 import java.util.HashMap;
 5 import java.util.Set;
 6
 7 /*
 8  ArrayList集合嵌套HashMap集合并遍历。
 9  需求:
10  假设ArrayList集合的元素是HashMap。有3个。
11  每一个HashMap集合的键和值都是字符串。
12  元素我已经完成,请遍历。
13  结果:
14  周瑜---小乔
15  吕布---貂蝉
16
17  郭靖---黄蓉
18  杨过---小龙女
19
20  令狐冲---任盈盈
21  林平之---岳灵珊
22  */
23 public class ArrayListIncludeHashMapDemo {
24     public static void main(String[] args) {
25         // 创建集合对象
26         ArrayList<HashMap<String, String>> array = new ArrayList<HashMap<String, String>>();
27
28         // 创建元素1
29         HashMap<String, String> hm1 = new HashMap<String, String>();
30         hm1.put("周瑜", "小乔");
31         hm1.put("吕布", "貂蝉");
32         // 把元素添加到array里面
33         array.add(hm1);
34
35         // 创建元素1
36         HashMap<String, String> hm2 = new HashMap<String, String>();
37         hm2.put("郭靖", "黄蓉");
38         hm2.put("杨过", "小龙女");
39         // 把元素添加到array里面
40         array.add(hm2);
41
42         // 创建元素1
43         HashMap<String, String> hm3 = new HashMap<String, String>();
44         hm3.put("令狐冲", "任盈盈");
45         hm3.put("林平之", "岳灵珊");
46         // 把元素添加到array里面
47         array.add(hm3);
48
49         // 遍历
50         for (HashMap<String, String> hm : array) {
51             Set<String> set = hm.keySet();
52             for (String key : set) {
53                 String value = hm.get(key);
54                 System.out.println(key + "---" + value);
55             }
56         }
57     }
58 }

16、HashMap和Hashtable的区别

 1 package cn.itcast_07;
 2
 3 import java.util.Hashtable;
 4
 5 /*
 6  * 1:Hashtable和HashMap的区别?
 7  * Hashtable:线程安全,效率低。不允许null键和null值
 8  * HashMap:线程不安全,效率高。允许null键和null值
 9  *
10  * 2:List,Set,Map等接口是否都继承子Map接口?
11  * List,Set不是继承自Map接口,它们继承自Collection接口
12  * Map接口本身就是一个顶层接口
13  */
14 public class HashtableDemo {
15     public static void main(String[] args) {
16         // HashMap<String, String> hm = new HashMap<String, String>();
17         Hashtable<String, String> hm = new Hashtable<String, String>();
18
19         hm.put("it001", "hello");
20         // hm.put(null, "world"); //NullPointerException
21         // hm.put("java", null); // NullPointerException
22
23         System.out.println(hm);
24     }
25 }

17、Collections工具类的常见方法

 1 package cn.itcast_01;
 2
 3 import java.util.Collections;
 4 import java.util.List;
 5 import java.util.ArrayList;
 6
 7 /*
 8  * Collections:是针对集合进行操作的工具类,都是静态方法。
 9  *
10  * 面试题:
11  * Collection和Collections的区别?
12  * Collection:是单列集合的顶层接口,有子接口List和Set。
13  * Collections:是针对集合操作的工具类,有对集合进行排序和二分查找的方法
14  *
15  * 要知道的方法
16  * public static <T> void sort(List<T> list):排序 默认情况下是自然顺序。
17  * public static <T> int binarySearch(List<?> list,T key):二分查找
18  * public static <T> T max(Collection<?> coll):最大值
19  * public static void reverse(List<?> list):反转
20  * public static void shuffle(List<?> list):随机置换
21  */
22 public class CollectionsDemo {
23     public static void main(String[] args) {
24         // 创建集合对象
25         List<Integer> list = new ArrayList<Integer>();
26
27         // 添加元素
28         list.add(30);
29         list.add(20);
30         list.add(50);
31         list.add(10);
32         list.add(40);
33
34         System.out.println("list:" + list);
35
36         // public static <T> void sort(List<T> list):排序 默认情况下是自然顺序。
37         // Collections.sort(list);
38         // System.out.println("list:" + list);
39         // [10, 20, 30, 40, 50]
40
41         // public static <T> int binarySearch(List<?> list,T key):二分查找
42         // System.out
43         // .println("binarySearch:" + Collections.binarySearch(list, 30));
44         // System.out.println("binarySearch:"
45         // + Collections.binarySearch(list, 300));
46
47         // public static <T> T max(Collection<?> coll):最大值
48         // System.out.println("max:"+Collections.max(list));
49
50         // public static void reverse(List<?> list):反转
51         // Collections.reverse(list);
52         // System.out.println("list:" + list);
53
54         //public static void shuffle(List<?> list):随机置换
55         Collections.shuffle(list);
56         System.out.println("list:" + list);
57     }
58 }

18、ArrayList存储自定义对象并排序案例

 1 package cn.itcast_02;
 2
 3 import java.util.ArrayList;
 4 import java.util.Collections;
 5 import java.util.Comparator;
 6 import java.util.List;
 7
 8 /*
 9  * Collections可以针对ArrayList存储基本包装类的元素排序,存储自定义对象可不可以排序呢?
10  */
11 public class CollectionsDemo {
12     public static void main(String[] args) {
13         // 创建集合对象
14         List<Student> list = new ArrayList<Student>();
15
16         // 创建学生对象
17         Student s1 = new Student("林青霞", 27);
18         Student s2 = new Student("风清扬", 30);
19         Student s3 = new Student("刘晓曲", 28);
20         Student s4 = new Student("武鑫", 29);
21         Student s5 = new Student("林青霞", 27);
22
23         // 添加元素对象
24         list.add(s1);
25         list.add(s2);
26         list.add(s3);
27         list.add(s4);
28         list.add(s5);
29
30         // 排序
31         // 自然排序
32         // Collections.sort(list);
33         // 比较器排序
34         // 如果同时有自然排序和比较器排序,以比较器排序为主
35         Collections.sort(list, new Comparator<Student>() {
36             @Override
37             public int compare(Student s1, Student s2) {
38                 int num = s2.getAge() - s1.getAge();
39                 int num2 = num == 0 ? s1.getName().compareTo(s2.getName())
40                         : num;
41                 return num2;
42             }
43         });
44
45         // 遍历集合
46         for (Student s : list) {
47             System.out.println(s.getName() + "---" + s.getAge());
48         }
49     }
50 }

19、HashMap、ArrayList、TreeSet的具体应用

 1 package cn.itcast_04;
 2
 3 import java.util.ArrayList;
 4 import java.util.Collections;
 5 import java.util.HashMap;
 6 import java.util.TreeSet;
 7
 8 /*
 9  * 思路:
10  *         A:创建一个HashMap集合
11  *         B:创建一个ArrayList集合
12  *         C:创建花色数组和点数数组
13  *         D:从0开始往HashMap里面存储编号,并存储对应的牌
14  *        同时往ArrayList里面存储编号即可。
15  *      E:洗牌(洗的是编号)
16  *      F:发牌(发的也是编号,为了保证编号是排序的,就创建TreeSet集合接收)
17  *      G:看牌(遍历TreeSet集合,获取编号,到HashMap集合找对应的牌)
18  */
19 public class PokerDemo {
20     public static void main(String[] args) {
21         // 创建一个HashMap集合
22         HashMap<Integer, String> hm = new HashMap<Integer, String>();
23
24         // 创建一个ArrayList集合
25         ArrayList<Integer> array = new ArrayList<Integer>();
26
27         // 创建花色数组和点数数组
28         // 定义一个花色数组
29         String[] colors = { "?", "?", "?", "?" };
30         // 定义一个点数数组
31         String[] numbers = { "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q",
32                 "K", "A", "2", };
33
34         // 从0开始往HashMap里面存储编号,并存储对应的牌,同时往ArrayList里面存储编号即可。
35         int index = 0;
36
37         for (String number : numbers) {
38             for (String color : colors) {
39                 String poker = color.concat(number);
40                 hm.put(index, poker);
41                 array.add(index);
42                 index++;
43             }
44         }
45         hm.put(index, "小王");
46         array.add(index);
47         index++;
48         hm.put(index, "大王");
49         array.add(index);
50
51         // 洗牌(洗的是编号)
52         Collections.shuffle(array);
53
54         // 发牌(发的也是编号,为了保证编号是排序的,就创建TreeSet集合接收)
55         TreeSet<Integer> fengQingYang = new TreeSet<Integer>();
56         TreeSet<Integer> linQingXia = new TreeSet<Integer>();
57         TreeSet<Integer> liuYi = new TreeSet<Integer>();
58         TreeSet<Integer> diPai = new TreeSet<Integer>();
59
60         for (int x = 0; x < array.size(); x++) {
61             if (x >= array.size() - 3) {
62                 diPai.add(array.get(x));
63             } else if (x % 3 == 0) {
64                 fengQingYang.add(array.get(x));
65             } else if (x % 3 == 1) {
66                 linQingXia.add(array.get(x));
67             } else if (x % 3 == 2) {
68                 liuYi.add(array.get(x));
69             }
70         }
71
72         // 看牌(遍历TreeSet集合,获取编号,到HashMap集合找对应的牌)
73         lookPoker("风清扬", fengQingYang, hm);
74         lookPoker("林青霞", linQingXia, hm);
75         lookPoker("刘意", liuYi, hm);
76         lookPoker("底牌", diPai, hm);
77     }
78
79     // 写看牌的功能
80     public static void lookPoker(String name, TreeSet<Integer> ts,
81             HashMap<Integer, String> hm) {
82         System.out.print(name + "的牌是:");
83         for (Integer key : ts) {
84             String value = hm.get(key);
85             System.out.print(value + " ");
86         }
87         System.out.println();
88     }
89 }
时间: 2024-10-14 04:32:16

Java笔记(18):集合框架(04)的相关文章

9.9-全栈Java笔记:遍历集合的N种方式总结&Collections工具类

遍历集合的N种方式总结 [示例1]遍历List方法1,使用普通for循环 for(int i=0;i<list.size();i++){         //list为集合的对象名 String temp = (String)list.get(i); System.out.println(temp); } [示例2]遍历List方法2,使用增强for循环(使用泛型定义类型!) for (String   temp : list) { System.out.println(temp); } [示例

第48节:Java当中的集合框架

Java当中的集合框架 01 在我们班里有50位同学,就有50位对象. // 简书作者:达叔小生 Student[] stus = new Student[20]; 结果来了一位插班生,该同学因为觉得学IT行业好,才要求老师转专业的.可以结果没有多余的空位了,数组里的长度都是安排好的,没有空间了. 为了解决新同学的问题,老师们重新创建一个空间(重复创建一个新的数组),为了能够更好的解决问题,老师提供了可以不断扩大空间(Java提供了集合,当数据多了,个数不稳定时,可以用集合). 在Java中,数

Java中的集合框架-Map

前两篇<Java中的集合框架-Commection(一)>和<Java中的集合框架-Commection(二)>把集合框架中的Collection开发常用知识点作了一下记录,从本篇开始,对集合框架里的另外一部分Map作一下记录. 一,集合框架的Map接口 Map与Collection不同之处在于它是以键值对来存储数据: Map比较常用的实现类有四个:HashTable,HashMap,LinkedHashMap,TreeMap: Map的方法也可以分为四类,增删改查,大致如下: 新

JAVA基础之集合框架

集合框架(collections framework) 首先要明确,集合代表了一组对象(和数组一样,但数组长度不能变,而集合能).Java中的集合框架定义了一套规范,用来表示.操作集合,使具体操作与实现细节解耦. 其实说白了,可以把一个集合看成一个微型数据库,操作不外乎"增删改查"四种操作,我们在学习使用一个具体的集合类时,需要把这四个操作的时空复杂度弄清楚了,基本上就可以说掌握这个类了. 设计理念 主要理念用一句话概括就是:提供一套"小而美"的API.API需要对

java中的集合框架

由于数组具有属性单一,长度不可改变的缺点,于是在程序中我们使用集合来代替它. 集合中不可放入基本数据类型,基本数据类型都是通过自动拆包和自动装箱功能才能放入和取出集合. 分类:Collection接口和Map接口 Collection:存放单一值元素,又可分为list接口类型和set接口类型 list接口类型:存放元素是有序的可重复的,可通过循环来取出其中的元素,实现类ArrayList() set接口类型:hash值排列,存放元素是无序不可重复的,通过指针取出其中元素,实现类HashSet()

学java教程之集合框架

学编程吧学编程学IT教程之java教程集合框架发布了,欢迎通过xuebiancheng8.com来访问 java中的集合框架故名思议就是针对集合的框架.那什么是集合呢,前面已经学习过数组,没错,数组就是一组数据的集合,换句话说数组也是一种特殊的集合框架,可以完成集合的功能.那数组在使用的时候有没有不方便的地方呢,比方说数组有可能有满的时候,满了怎么办,我们是不是得自己写程序来更改数组的大小呢,而且还要把原来的数组赋值到新的数组的原来位置上,这样很明显数组用起来不是特别方便,很多功能得让我们自己去

菜鸟日记之 java中的集合框架

java中的集合框架图 如图所示:java中的集合分为两种Collection和Map两种接口 可分为Collection是单列集合和Map的双列集合 Collection单列集合:继承了Iterator接口所以具有了iterator()方法 ,该方法返回一个Iterator<T>,这个接口具有 HasNext (),next(),remove()3个方法可以在实现类里完成实现. hasNext():判断是否有下一个元素 cusor是当前的操作下标 next():读取下一个元素 remove(

Java中的集合框架(上)

Java中的集合框架概述 集合的概念: Java中的集合类:是一种工具类,就像是容器,存储任意数量的具有共同属性的对象. 集合的作用: 1.在类的内部,对数据进行组织: 2.简单的快速的搜索大数据量的条目: 3.有的集合接口,提供了一系列排列有序的元素,并且 可以在序列中间快速的插入或删除有关的元素. 4.有的集合接口,提供了映射关系,可以通过 关键字(key)去快速查找到对应的唯一对象,而这个关键字可以是任意类型. 与数组的对比一为何选择集合而不是数组 1.数组的长度固定,集合长度可变 2.数

java常见的集合框架有哪些?

java常见的集合框架有哪些?很多学习java的朋友会问到这个问题,那么学习Java集合框架下大致可以分为如下五个部分:List列表.Set集合.Map映射.迭代器(Iterator.Enumeration).工具类(Arrays.Collections).今天西安java培训小编为大家分享. Java集合类的整体框架如下: 从上图中可以看出,集合类主要分为两大类:Collection和Map. Collection是List.Set等集合高度抽象出来的接口,它包含了这些集合的基本操作,它主要又

【Java学习笔记】集合框架Ⅱ

迭代 ●迭代是取出集合中元素的一种方式. ●因为Collection中有iterator方法,所以每一个子类集合对象都具备迭代器. ●用法: 第一种 for (iterator iter=iterator(); iter.hasNext();) //老外比较喜欢用这种,省内存(iter的内存),开发时用这个 { System.out.println(iter.next()); } 第二种 Iterator iter = l.iterator(); while(iter.hasNext()) {