LinkedHashMap类概述
Map 接口的哈希表和链接列表实现,具有可预知的迭代顺序。
import java.util.LinkedHashMap; import java.util.Set; /* * LinkedHashMap:是Map接口的哈希表和链接列表实现,具有可预知的迭代顺序。 * 由哈希表保证键的唯一性 * 由链表保证键盘的有序(存储和取出的顺序一致) */ public class LinkedHashMapDemo { public static void main(String[] args) { // 创建集合对象 LinkedHashMap<String, String> hm = new LinkedHashMap<String, String>(); // 创建并添加元素 hm.put("2345", "hello"); hm.put("1234", "world"); hm.put("3456", "java"); hm.put("1234", "javaee"); hm.put("3456", "android"); // 遍历 Set<String> set = hm.keySet(); for (String key : set) { String value = hm.get(key); System.out.println(key + "---" + value); } } }
TreeMap类概述
TreeMap类概述
键是红黑树结构,可以保证键的排序和唯一性
TreeMap案例
TreeMap<String,String>
TreeMap<Student,String>
import java.util.Set; import java.util.TreeMap; /* * TreeMap:是基于红黑树的Map接口的实现。 * * HashMap<String,String> * 键:String * 值:String */ public class TreeMapDemo { public static void main(String[] args) { // 创建集合对象 TreeMap<String, String> tm = new TreeMap<String, String>(); // 创建元素并添加元素 tm.put("hello", "你好"); tm.put("world", "世界"); tm.put("java", "爪哇"); tm.put("world", "世界2"); tm.put("javaee", "爪哇EE"); // 遍历集合 Set<String> set = tm.keySet(); for (String key : set) { String value = tm.get(key); System.out.println(key + "---" + value); } } }
自己创建类对象
public class Student { private String name; private int age; public Student() { super(); } public Student(String name, int age) { super(); this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
import java.util.Comparator; import java.util.Set; import java.util.TreeMap; /* * TreeMap<Student,String> * 键:Student * 值:String */ public class TreeMapDemo2 { public static void main(String[] args) { // 创建集合对象 TreeMap<Student, String> tm = new TreeMap<Student, String>( new Comparator<Student>() { @Override public int compare(Student s1, Student s2) { // 主要条件 int num = s1.getAge() - s2.getAge(); // 次要条件 int num2 = num == 0 ? s1.getName().compareTo( s2.getName()) : num; return num2; } }); // 创建学生对象 Student s1 = new Student("潘安", 30); Student s2 = new Student("柳下惠", 35); Student s3 = new Student("唐伯虎", 33); Student s4 = new Student("燕青", 32); Student s5 = new Student("唐伯虎", 33); // 存储元素 tm.put(s1, "宋朝"); tm.put(s2, "元朝"); tm.put(s3, "明朝"); tm.put(s4, "清朝"); tm.put(s5, "汉朝"); // 遍历 Set<Student> set = tm.keySet(); for (Student key : set) { String value = tm.get(key); System.out.println(key.getName() + "---" + key.getAge() + "---" + value); } } }
Map集合案例
"aababcabcdabcde",获取字符串中每一个字母出现的次数要求结果:a(5)b(4)c(3)d(2)e(1)
import java.util.Scanner; import java.util.Set; import java.util.TreeMap; /* * 需求 :"aababcabcdabcde",获取字符串中每一个字母出现的次数要求结果:a(5)b(4)c(3)d(2)e(1) * * 分析: * A:定义一个字符串(可以改进为键盘录入) * B:定义一个TreeMap集合 * 键:Character * 值:Integer * C:把字符串转换为字符数组 * D:遍历字符数组,得到每一个字符 * E:拿刚才得到的字符作为键到集合中去找值,看返回值 * 是null:说明该键不存在,就把该字符作为键,1作为值存储 * 不是null:说明该键存在,就把值加1,然后重写存储该键和值 * F:定义字符串缓冲区变量 * G:遍历集合,得到键和值,进行按照要求拼接 * H:把字符串缓冲区转换为字符串输出 * * 录入:linqingxia * 结果:result:a(1)g(1)i(3)l(1)n(2)q(1)x(1) */ public class TreeMapDemo { public static void main(String[] args) { // 定义一个字符串(可以改进为键盘录入) Scanner sc = new Scanner(System.in); System.out.println("请输入一个字符串:"); String line = sc.nextLine(); // 定义一个TreeMap集合 TreeMap<Character, Integer> tm = new TreeMap<Character, Integer>(); //把字符串转换为字符数组 char[] chs = line.toCharArray(); //遍历字符数组,得到每一个字符 for(char ch : chs){ //拿刚才得到的字符作为键到集合中去找值,看返回值 Integer i = tm.get(ch); //是null:说明该键不存在,就把该字符作为键,1作为值存储 if(i == null){ tm.put(ch, 1); }else { //不是null:说明该键存在,就把值加1,然后重写存储该键和值 i++; tm.put(ch,i); } } //定义字符串缓冲区变量 StringBuilder sb= new StringBuilder(); //遍历集合,得到键和值,进行按照要求拼接 Set<Character> set = tm.keySet(); for(Character key : set){ Integer value = tm.get(key); sb.append(key).append("(").append(value).append(")"); } //把字符串缓冲区转换为字符串输出 String result = sb.toString(); System.out.println("result:"+result); } }
HashMap嵌套HashMap
import java.util.HashMap; import java.util.Set; /* * HashMap嵌套HashMap * * jc基础班 * 张三20 * 李四22 * jy就业班 * 王五21 * 李六23 * * 先存储元素,然后遍历元素 */ public class HashMapDemo2 { public static void main(String[] args) { // 创建集合对象 HashMap<String, HashMap<String, Integer>> shibazhangMap = new HashMap<String, HashMap<String, Integer>>(); // 创建基础班集合对象 HashMap<String, Integer> jcMap = new HashMap<String, Integer>(); // 添加元素 jcMap.put("张三", 20); jcMap.put("李四", 22); // 把基础班添加到大集合 shibazhangMap.put("jc", jcMap); // 创建就业班集合对象 HashMap<String, Integer> jyMap = new HashMap<String, Integer>(); // 添加元素 jyMap.put("王五", 21); jyMap.put("李六", 23); // 把基础班添加到大集合 shibazhangMap.put("jy", jyMap); //遍历集合 Set<String> shibazhangMapSet = shibazhangMap.keySet(); for(String shibazhangMapKey : shibazhangMapSet){ System.out.println(shibazhangMapKey); HashMap<String, Integer> shibazhangMapValue = shibazhangMap.get(shibazhangMapKey); Set<String> shibazhangMapValueSet = shibazhangMapValue.keySet(); for(String shibazhangMapValueKey : shibazhangMapValueSet){ Integer shibazhangMapValueValue = shibazhangMapValue.get(shibazhangMapValueKey); System.out.println("\t"+shibazhangMapValueKey+"---"+shibazhangMapValueValue); } } } }
HashMap嵌套ArrayList
/*
*需求:
*假设HashMap集合的元素是ArrayList。有3个。
*每一个ArrayList集合的值是字符串。
*元素我已经完成,请遍历。
*结果:
* 三国演义
* 吕布
* 周瑜
* 笑傲江湖
* 令狐冲
* 林平之
* 神雕侠侣
* 郭靖
* 杨过
*/
public class HashMapIncludeArrayListDemo { public static void main(String[] args) { // 创建集合对象 HashMap<String, ArrayList<String>> hm = new HashMap<String, ArrayList<String>>(); // 创建元素集合1 ArrayList<String> array1 = new ArrayList<String>(); array1.add("吕布"); array1.add("周瑜"); hm.put("三国演义", array1); // 创建元素集合2 ArrayList<String> array2 = new ArrayList<String>(); array2.add("令狐冲"); array2.add("林平之"); hm.put("笑傲江湖", array2); // 创建元素集合3 ArrayList<String> array3 = new ArrayList<String>(); array3.add("郭靖"); array3.add("杨过"); hm.put("神雕侠侣", array3); //遍历集合 Set<String> set = hm.keySet(); for(String key : set){ System.out.println(key); ArrayList<String> value = hm.get(key); for(String s : value){ System.out.println("\t"+s); } } } }
ArrayList嵌套HashMap
/*
ArrayList集合嵌套HashMap集合并遍历。
需求:
假设ArrayList集合的元素是HashMap。有3个。
每一个HashMap集合的键和值都是字符串。
元素我已经完成,请遍历。
结果:
周瑜---小乔
吕布---貂蝉
郭靖---黄蓉
杨过---小龙女
令狐冲---任盈盈
林平之---岳灵珊
*/
public class ArrayListIncludeHashMapDemo { public static void main(String[] args) { // 创建集合对象 ArrayList<HashMap<String, String>> array = new ArrayList<HashMap<String, String>>(); // 创建元素1 HashMap<String, String> hm1 = new HashMap<String, String>(); hm1.put("周瑜", "小乔"); hm1.put("吕布", "貂蝉"); // 把元素添加到array里面 array.add(hm1); // 创建元素1 HashMap<String, String> hm2 = new HashMap<String, String>(); hm2.put("郭靖", "黄蓉"); hm2.put("杨过", "小龙女"); // 把元素添加到array里面 array.add(hm2); // 创建元素1 HashMap<String, String> hm3 = new HashMap<String, String>(); hm3.put("令狐冲", "任盈盈"); hm3.put("林平之", "岳灵珊"); // 把元素添加到array里面 array.add(hm3); // 遍历 for (HashMap<String, String> hm : array) { Set<String> set = hm.keySet(); for (String key : set) { String value = hm.get(key); System.out.println(key + "---" + value); } } } }
面试题
HashMap和Hashtable的区别
List,Set,Map等接口是否都继承自Map接口
import java.util.Hashtable; /* * 1:Hashtable和HashMap的区别? * Hashtable:线程安全,效率低。不允许null键和null值 * HashMap:线程不安全,效率高。允许null键和null值 * * 2:List,Set,Map等接口是否都继承子Map接口? * List,Set不是继承自Map接口,它们继承自Collection接口 * Map接口本身就是一个顶层接口 */ public class HashtableDemo { public static void main(String[] args) { // HashMap<String, String> hm = new HashMap<String, String>(); Hashtable<String, String> hm = new Hashtable<String, String>(); hm.put("it001", "hello"); // hm.put(null, "world"); //NullPointerException // hm.put("java", null); // NullPointerException System.out.println(hm); } }
Collections类概述和成员方法
Collections类概述
针对集合操作 的工具类
Collections成员方法
public static <T> void sort(List<T> list)
public static <T> int binarySearch(List<?> list,T key)
public static <T> T max(Collection<?> coll)
public static void reverse(List<?> list)
public static void shuffle(List<?> list)
/*
* Collections:是针对集合进行操作的工具类,都是静态方法。
*
* 面试题:
* Collection和Collections的区别?
* Collection:是单列集合的顶层接口,有子接口List和Set。
* Collections:是针对集合操作的工具类,有对集合进行排序和二分查找的方法
*
* 要知道的方法
* public static <T> void sort(List<T> list):排序 默认情况下是自然顺序。
* public static <T> int binarySearch(List<?> list,T key):二分查找
* public static <T> T max(Collection<?> coll):最大值
* public static void reverse(List<?> list):反转
* public static void shuffle(List<?> list):随机置换
*/
public class CollectionsDemo { public static void main(String[] args) { // 创建集合对象 List<Integer> list = new ArrayList<Integer>(); // 添加元素 list.add(30); list.add(20); list.add(50); list.add(10); list.add(40); System.out.println("list:" + list); // public static <T> void sort(List<T> list):排序 默认情况下是自然顺序。 // Collections.sort(list); // System.out.println("list:" + list); // [10, 20, 30, 40, 50] // public static <T> int binarySearch(List<?> list,T key):二分查找 // System.out // .println("binarySearch:" + Collections.binarySearch(list, 30)); // System.out.println("binarySearch:" // + Collections.binarySearch(list, 300)); // public static <T> T max(Collection<?> coll):最大值 // System.out.println("max:"+Collections.max(list)); // public static void reverse(List<?> list):反转 // Collections.reverse(list); // System.out.println("list:" + list); //public static void shuffle(List<?> list):随机置换 Collections.shuffle(list); System.out.println("list:" + list); } }
ArrayList存储基本包装类的元素排序
/*
* Collections可以针对ArrayList存储基本包装类的元素排序,存储自定义对象可不可以排序呢?
*/
public class CollectionsDemo { public static void main(String[] args) { // 创建集合对象 List<Student> list = new ArrayList<Student>(); // 创建学生对象 Student s1 = new Student("林青霞", 27); Student s2 = new Student("风清扬", 30); Student s3 = new Student("刘晓曲", 28); Student s4 = new Student("武鑫", 29); Student s5 = new Student("林青霞", 27); // 添加元素对象 list.add(s1); list.add(s2); list.add(s3); list.add(s4); list.add(s5); // 排序 // 自然排序 // Collections.sort(list); // 比较器排序 // 如果同时有自然排序和比较器排序,以比较器排序为主 Collections.sort(list, new Comparator<Student>() { @Override public int compare(Student s1, Student s2) { int num = s2.getAge() - s1.getAge(); int num2 = num == 0 ? s1.getName().compareTo(s2.getName()) : num; return num2; } }); // 遍历集合 for (Student s : list) { System.out.println(s.getName() + "---" + s.getAge()); } } } /** * @author Administrator * */ public class Student implements Comparable<Student> { private String name; private int age; public Student() { super(); } public Student(String name, int age) { super(); this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public int compareTo(Student s) { int num = this.age - s.age; int num2 = num == 0 ? this.name.compareTo(s.name) : num; return num2; } }
模拟斗地主洗牌和发牌
/*
* 模拟斗地主洗牌和发牌
*
* 分析:
* A:创建一个牌盒
* B:装牌
* C:洗牌
* D:发牌
* E:看牌
*/
public class PokerDemo { public static void main(String[] args) { // 创建一个牌盒 ArrayList<String> array = new ArrayList<String>(); // 装牌 // 黑桃A,黑桃2,黑桃3,...黑桃K // 红桃A,... // 梅花A,... // 方块A,... // 定义一个花色数组 String[] colors = { "", "", "", "" }; // 定义一个点数数组 String[] numbers = { "A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K" }; // 装牌 for (String color : colors) { for (String number : numbers) { array.add(color.concat(number)); } } array.add("小王"); array.add("大王"); // 洗牌 Collections.shuffle(array); // System.out.println("array:" + array); // 发牌 ArrayList<String> fengQingYang = new ArrayList<String>(); ArrayList<String> linQingXia = new ArrayList<String>(); ArrayList<String> liuYi = new ArrayList<String>(); ArrayList<String> diPai = new ArrayList<String>(); for (int x = 0; x < array.size(); x++) { if (x >= array.size() - 3) { diPai.add(array.get(x)); } else if (x % 3 == 0) { fengQingYang.add(array.get(x)); } else if (x % 3 == 1) { linQingXia.add(array.get(x)); } else if (x % 3 == 2) { liuYi.add(array.get(x)); } } // 看牌 lookPoker("风清扬", fengQingYang); lookPoker("林青霞", linQingXia); lookPoker("张三", liuYi); lookPoker("底牌", diPai); } public static void lookPoker(String name, ArrayList<String> array) { System.out.print(name + "的牌是:"); for (String s : array) { System.out.print(s + " "); } System.out.println(); } }
斗地主增强版本
import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.TreeSet; /* * 思路: * A:创建一个HashMap集合 * B:创建一个ArrayList集合 * C:创建花色数组和点数数组 * D:从0开始往HashMap里面存储编号,并存储对应的牌 * 同时往ArrayList里面存储编号即可。 * E:洗牌(洗的是编号) * F:发牌(发的也是编号,为了保证编号是排序的,就创建TreeSet集合接收) * G:看牌(遍历TreeSet集合,获取编号,到HashMap集合找对应的牌) */ public class PokerDemo { public static void main(String[] args) { // 创建一个HashMap集合 HashMap<Integer, String> hm = new HashMap<Integer, String>(); // 创建一个ArrayList集合 ArrayList<Integer> array = new ArrayList<Integer>(); // 创建花色数组和点数数组 // 定义一个花色数组 String[] colors = { "", "", "", "" }; // 定义一个点数数组 String[] numbers = { "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2", }; // 从0开始往HashMap里面存储编号,并存储对应的牌,同时往ArrayList里面存储编号即可。 int index = 0; for (String number : numbers) { for (String color : colors) { String poker = color.concat(number); hm.put(index, poker); array.add(index); index++; } } hm.put(index, "小王"); array.add(index); index++; hm.put(index, "大王"); array.add(index); // 洗牌(洗的是编号) Collections.shuffle(array); // 发牌(发的也是编号,为了保证编号是排序的,就创建TreeSet集合接收) TreeSet<Integer> fengQingYang = new TreeSet<Integer>(); TreeSet<Integer> linQingXia = new TreeSet<Integer>(); TreeSet<Integer> liuYi = new TreeSet<Integer>(); TreeSet<Integer> diPai = new TreeSet<Integer>(); for (int x = 0; x < array.size(); x++) { if (x >= array.size() - 3) { diPai.add(array.get(x)); } else if (x % 3 == 0) { fengQingYang.add(array.get(x)); } else if (x % 3 == 1) { linQingXia.add(array.get(x)); } else if (x % 3 == 2) { liuYi.add(array.get(x)); } } // 看牌(遍历TreeSet集合,获取编号,到HashMap集合找对应的牌) lookPoker("风清扬", fengQingYang, hm); lookPoker("林青霞", linQingXia, hm); lookPoker("刘意", liuYi, hm); lookPoker("底牌", diPai, hm); } // 写看牌的功能 public static void lookPoker(String name, TreeSet<Integer> ts, HashMap<Integer, String> hm) { System.out.print(name + "的牌是:"); for (Integer key : ts) { String value = hm.get(key); System.out.print(value + " "); } System.out.println(); } }
总结:
1:Map(掌握)
(1)将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。
(2)Map和Collection的区别?
A:Map 存储的是键值对形式的元素,键唯一,值可以重复。夫妻对
B:Collection 存储的是单独出现的元素,子接口Set元素唯一,子接口List元素可重复。光棍
(3)Map接口功能概述(自己补齐)
A:添加功能
B:删除功能
C:判断功能
D:获取功能
E:长度功能
(4)Map集合的遍历
A:键找值
a:获取所有键的集合
b:遍历键的集合,得到每一个键
c:根据键到集合中去找值
B:键值对对象找键和值
a:获取所有的键值对对象的集合
b:遍历键值对对象的集合,获取每一个键值对对象
c:根据键值对对象去获取键和值
代码体现:
Map<String,String> hm = new HashMap<String,String>();
hm.put("it002","hello");
hm.put("it003","world");
hm.put("it001","java");
//方式1 键找值
Set<String> set = hm.keySet();
for(String key : set) {
String value = hm.get(key);
System.out.println(key+"---"+value);
}
//方式2 键值对对象找键和值
Set<Map.Entry<String,String>> set2 = hm.entrySet();
for(Map.Entry<String,String> me : set2) {
String key = me.getKey();
String value = me.getValue();
System.out.println(key+"---"+value);
}
(5)HashMap集合的练习
A:HashMap<String,String>
B:HashMap<Integer,String>
C:HashMap<String,Student>
D:HashMap<Student,String>
(6)TreeMap集合的练习
A:TreeMap<String,String>
B:TreeMap<Student,String>
(7)案例
A:统计一个字符串中每个字符出现的次数
B:集合的嵌套遍历
a:HashMap嵌套HashMap
b:HashMap嵌套ArrayList
c:ArrayList嵌套HashMap
d:多层嵌套
2:Collections(理解)
(1)是针对集合进行操作的工具类
(2)面试题:Collection和Collections的区别
A:Collection 是单列集合的顶层接口,有两个子接口List和Set
B:Collections 是针对集合进行操作的工具类,可以对集合进行排序和查找等
(3)常见的几个小方法:
A:public static <T> void sort(List<T> list)
B:public static <T> int binarySearch(List<?> list,T key)
C:public static <T> T max(Collection<?> coll)
D:public static void reverse(List<?> list)
E:public static void shuffle(List<?> list)
(4)案例
A:ArrayList集合存储自定义对象的排序
B:模拟斗地主洗牌和发牌
C:模拟斗地主洗牌和发牌并对牌进行排序