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 }