Map集合

Map接口和Collection接口的不同Map是双列的,Collection是单列的Map的键唯一,Collection的子体系Set是唯一的Map集合的数据结构针对键有效,跟值无关;Collection集合的数据结构是针对元素有效A:HashMap集合底层是哈希表/散列表的数据结构
B:哈希表是一个数组和单链表的结合体(数组查询效率高,增删效率低,链表增删效率高,查询效率低)哈希表充分发挥他们各自的优点

Map集合的方法

V put(K key,V value):添加元素如果键是第一次存储,就直接存储元素,返回null如果键不是第一次存在,就用值把以前的值替换掉,返回以前的值void clear():移除所有的键值对元素
V remove(Object key):根据键删除键值对元素,并把值返回boolean containsKey(Object key):判断集合是否包含指定的键
boolean containsValue(Object value):判断集合是否包含指定的值
boolean isEmpty():判断集合是否为空Set<Map.Entry<K,V>> entrySet(): 返回一个键值对的Set集合
V get(Object key):根据键获取值
Set<K> keySet():获取集合中所有键的集合
Collection<V> values():获取集合中所有值的集合int size():返回集合中的键值对的对数
import java.util.*;public class MapTest1 {public static void main(String[] args) {//创建Map集合Map<Integer,String> map = new HashMap<>();//添加元素map.put(1,"aaa");map.put(2,"bbb");map.put(3,"ccc");map.put(4,"ddd");map.put(5,"eee");map.put(6,"eee");//删除元素map.remove(6);//删去key为6的元素,并返回值//判断集合是否包含指定的键boolean b = map.containsKey(4);System.out.println(b);//true//判断集合是否包含指定的值boolean bbb = map.containsValue("bbb");System.out.println(bbb);//true//判断集合是否为空boolean empty = map.isEmpty();System.out.println(empty);//false//返回集合中的键值对的对数System.out.println(map.size());//5//遍历方式1(通过key获取value)//获取集合中所有键的集合Set<Integer> keySet = map.keySet();//迭代器Iterator<Integer> it = keySet.iterator();while (it.hasNext()){Integer key = it.next();String value = map.get(key);System.out.println(key + "==" + value);}System.out.println("==========");//增强forfor (Integer keys : keySet){String value = map.get(keys);System.out.println(keys + "==" + value);}System.out.println("==========");//遍历方式2(转换成set集合)//返回一个键值对的Set集合Set<Map.Entry<Integer, String>> mapSet = map.entrySet();//调用set迭代器Iterator<Map.Entry<Integer, String>> it1 = mapSet.iterator();while (it1.hasNext()) {Map.Entry<Integer, String> node = it1.next();Integer key = node.getKey();String value = node.getValue();System.out.println(key + "===" + value);}//增强forfor (Map.Entry<Integer,String> node1 : mapSet){System.out.println(node1);//Integer key = node1.getKey();//String value = node1.getValue();}}
}
public class MyTest5 {public static void main(String[] args) {//创建hashmap集合HashMap<Student, String> hm = new HashMap<>();hm.put(new Student("张三", 23), "s001");hm.put(new Student("张三", 23), "s002");hm.put(new Student("李四", 24), "s003");hm.put(new Student("王五", 25), "s004");//遍历Set<Student> students = hm.keySet();for (Student key : students) {String value = hm.get(key);System.out.println(key.getName()+"=="+key.getAge()+"==="+value);}System.out.println("============================");Set<Map.Entry<Student, String>> entries = hm.entrySet();for (Map.Entry<Student, String> en : entries) {Student key = en.getKey();String value = en.getValue();System.out.println(key.getName() + "==" + key.getAge() + "===" + value);}System.out.println("===============================");hm.forEach(new BiConsumer<Student, String>() {@Overridepublic void accept(Student key, String value) {System.out.println(key.getName() + "==" + key.getAge() + "===" + value);}});}
}
class Student implements Comparable<Student>{private String name;private int age;public Student() {}public Student(String name, int age) {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;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Student student = (Student) o;return age == student.age &&Objects.equals(name, student.name);}@Overridepublic int hashCode() {return Objects.hash(name, age);}@Overridepublic int compareTo(Student s) {//按照年龄大小来排序int num = this.age - s.age;//年龄一样并不能说明是同一个对象,还得比较姓名int num2=num==0?this.name.compareTo(s.name):num;return num2;}
}

HashMap和HashTable

HashMap 允许 null值和 null键。线程不安全效率高
Hashtable 不允许存储null值和null键 线程安全效率低HashMap<Object, Object> hm = new HashMap<>();hm.put(null,"abc");hm.put("aaa",null);hm.put(null,null);System.out.println(hm);Hashtable<Object, Object> hashtable = new Hashtable<>();//hashtable.put("abc",null); 不允许键或者值 为 null

LinkedHashMap

Map 接口的哈希表和链接列表实现,具有可预知的迭代顺序
LinkedHashMap的特点: 底层的数据结构是链表和哈希表 元素有序 并且唯一元素的有序性由链表数据结构保证 唯一性由 哈希表数据结构保证Map集合的数据结构只和键有关

TreeMap

键的数据结构是红黑树,可保证键的排序和唯一性  排序分为自然排序和比较器排序 线程是不安全的效率比较高
package org.westos.作业;import java.util.Comparator;
import java.util.TreeMap;public class TreeMapTest1 {public static void main(String[] args) {//创建TreeMap集合TreeMap<Student,String > treeMap = new TreeMap<>(new Comparator<Student>() {@Overridepublic int compare(Student o1, Student o2) {int i = o1.getAge() - o2.getAge();int j = i == 0 ? o1.getName().compareTo(o2.getName()) : i;return j;}});treeMap.put(new Student("马云",55),"aaa");treeMap.put(new Student("马超",985),"bbb");treeMap.put(new Student("马画藤",45),"ccc");treeMap.put(new Student("高司令",25),"ddd");System.out.println(treeMap);}
}
class Student{String name;int age;public Student() {}public Student(String name, int age) {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;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}
}

统计字符串中每个字符出现的次数

package org.westos.作业;import java.util.HashMap;
import java.util.Scanner;public class Test1 {public static void main(String[] args) {/* A:案例演示:作业:你自己先做需求:统计字符串中每个字符出现的次数"aababcabcdabcde", 获取字符串中每一个字母出现的次数要求结果:a(5) b(4) c(3) d(2) e(1)*/Scanner sc = new Scanner(System.in);System.out.println("请随便输入一段字符串");String s = sc.nextLine();// 我们最后得到的字符传  a(3)b(3)c(3)d(2)//你可以用到双列集合来做//输入的字符串转换为字符数组//String s = "aaabbbcccdd";char[] ch = s.toCharArray();//创建HashMap集合HashMap<Character, Integer> hashMap = new HashMap<>();//遍历字符for (char c : ch) {//aaabbbcccdd如果HashMap中无当前字符,则添加进去,1作为第一个存进去的起始值if (!hashMap.containsKey(c)) {hashMap.put(c, 1);} else {//如果存在当前字符,则覆盖,然后值加1hashMap.put(c, hashMap.get(c) + 1);}}//获取HashMap中的所有键//Set<Character> keySet = hashMap.keySet();//System.out.println(key);//字符拼接StringBuilder sb = new StringBuilder();//遍历所有键for (Character key : hashMap.keySet()) {//System.out.println(hashMap.get(key));sb.append(key).append("(").append(hashMap.get(key)).append(")");}System.out.println(sb);}
}

HashMap嵌套HashMap

基础班张三        20李四        22就业班王五     21赵六        23
package org.westos.作业;import java.util.HashMap;
import java.util.Set;public class Test2 {public static void main(String[] args) {//基础班集合HashMap<String, Integer> jcMap = new HashMap<>();//添加jcMap.put("张三",20);jcMap.put("李四",22);//就业班集合HashMap<String, Integer> jyMap = new HashMap<>();jyMap.put("王五",21);jyMap.put("赵六",23);HashMap<String, HashMap<String, Integer>> allMap = new HashMap<>();allMap.put("基础班",jcMap);allMap.put("就业班",jyMap);//获取总的集合中的键的集合Set<String> keySet = allMap.keySet();//遍历键的集合for (String s : keySet) {//输出键System.out.println(s);//获取值(这个值是一个集合)HashMap<String, Integer> stu = allMap.get(s);//获取上一个值集合中的所有的键Set<String> keySet1 = stu.keySet();//遍历所有的键for (String s1 : keySet1) {//输出键和输出调用获取值System.out.println("\t" + s1 + "\t"+ stu.get(s1));}System.out.println();}}
}

HashMap嵌套ArrayList

 集合嵌套之HashMap嵌套ArrayList假设HashMap集合的元素是ArrayList。有3个。每一个ArrayList集合的值是字符串。三国演义吕布周瑜笑傲江湖令狐冲林平之神雕侠侣郭靖杨过
package org.westos.作业;import java.util.ArrayList;
import java.util.HashMap;
import java.util.Set;public class Test3 {public static void main(String[] args) {ArrayList<String> aList = new ArrayList<>();aList.add("吕布");aList.add("周瑜");ArrayList<String> aList1 = new ArrayList<>();aList1.add("令狐冲");aList1.add("林平之");ArrayList<String> aList2 = new ArrayList<>();aList2.add("郭靖");aList2.add("黄蓉");HashMap<String, ArrayList<String>> hashMap = new HashMap<>();hashMap.put("三国演义",aList);hashMap.put("笑傲江湖",aList1);hashMap.put("神雕侠侣",aList2);Set<String> keySets = hashMap.keySet();for (String s : keySets) {System.out.println(s);ArrayList<String> value = hashMap.get(s);for (int i = 0; i < value.size() ; i++) {System.out.println("\t" + value.get(i));}}}
}

ArrayList嵌套HashMap

集合嵌套之ArrayList嵌套HashMap假设ArrayList集合的元素是HashMap。有3个。每一个HashMap集合的键和值都是字符串。周瑜---小乔吕布---貂蝉郭靖---黄蓉杨过---小龙女令狐冲---任盈盈林平之---岳灵珊
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;public class MyTest3 {public static void main(String[] args) {HashMap<String, String> sgMap = new HashMap<>();sgMap.put("周瑜","小乔");sgMap.put("吕布", "貂蝉");HashMap<String, String> sdMap = new HashMap<>();sdMap.put("郭靖", "黄蓉");sdMap.put("杨过", "小龙女");HashMap<String, String> xaMap = new HashMap<>();xaMap.put("令狐冲", "任盈盈");xaMap.put("林平之", "岳灵珊");ArrayList<HashMap<String, String>> bigList = new ArrayList<>();bigList.add(sgMap);bigList.add(sdMap);bigList.add(xaMap);//遍历for (HashMap<String, String> hashMap : bigList) {Set<Map.Entry<String, String>> entries = hashMap.entrySet();for (Map.Entry<String, String> en : entries) {String key = en.getKey();String value = en.getValue();System.out.println(key+"------"+value);}System.out.println();}}
}

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):随机置换

斗地主思路

模拟斗地主洗牌和发牌

模拟斗地主洗牌和发牌并对牌进行排序的代码实现package org.westos.demo92;import java.util.ArrayList;
import java.util.Collections;
public class 斗地主 {public static void main(String[] args) {//先得有一副牌//先创建一个集合充当牌盒子ArrayList<String> pokerBox = new ArrayList<>();//生成54张牌放进牌盒子String[] colors={"♠","♥","♦","♣"};String[] nums={"A","2","3","4","5","6","7","8","9","10","J","Q","K"};//向集合中添加元素for (String color : colors) {for (String num : nums) {//将nums连接到花色后面String poker = color.concat(num);pokerBox.add(poker);}}//手动添加大小王pokerBox.add("☀");pokerBox.add("☼");//洗牌三次Collections.shuffle(pokerBox);Collections.shuffle(pokerBox);Collections.shuffle(pokerBox);//发牌:得有三个人来斗地主,还得留三张底牌ArrayList<String> 星仔 = new ArrayList<>();ArrayList<String> 刀仔 = new ArrayList<>();ArrayList<String> 高进 = new ArrayList<>();ArrayList<String> 底牌 = new ArrayList<>();Collections.sort(星仔);//发牌方式1: 一人数个10来张发给你// 星仔 = (ArrayList<String>) pokerBox.subList(0, 11);// 方式2:传统发牌 一人一张转着发//用牌的索引对3取余/*  星仔 0 3 6 9   余数 0刀仔 1 4 7 10  余数 1高进 2 5 8  11  余数 2 */for (int i = 0; i < pokerBox.size(); i++) {//留底牌if(i>=pokerBox.size()-3){底牌.add(pokerBox.get(i));}else if(i%3==0){星仔.add(pokerBox.get(i));} else if (i % 3 == 1) {刀仔.add(pokerBox.get(i));}else{高进.add(pokerBox.get(i));}}//Collections.sort(星仔);//看牌lookPoker("星仔",星仔);lookPoker("刀仔",刀仔);lookPoker("高进",高进);lookPoker("底牌",底牌);//作业:做一个斗地主排序版,牌发好之后,从小到大排好}private static void lookPoker(String name, ArrayList<String> list) {System.out.println(name);for (String poker : list) {System.out.print(poker+"\t");}System.out.println();}
}

按照大小顺序

package org.westos.作业;import java.util.ArrayList;
import java.util.Collections;
import java.util.TreeMap;
import java.util.TreeSet;public class Test8 {}
class Demo3 {public static void main(String[] args) {//定义一个map集合存放牌和索引TreeMap<Integer, String> pokers = new TreeMap<>();//向集合中存储元素String[] color = {"♥","♠","♣","♦"};String[] number = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"};//创建一个list数组存放map中 键的集合ArrayList<Integer> indexs = new ArrayList<>();//定义一个索引int index=0;for (String numbers : number) {//先遍历数字,再为每个数字配上4中花色for (String colors : color) {pokers.put(index, colors.concat(numbers));//向list数组中存放键indexs.add(index);index++;//每次添加一张牌的时候索引页加1}}System.out.println(index);//添加大王 index++是先用后加添加大王的时候先不用加1pokers.put(index,"大王");indexs.add(index);index++;pokers.put(index,"小王");indexs.add(index);//洗牌Collections.shuffle(indexs);//创建treeset集合存放每一个斗地主的人的牌TreeSet<Integer> 星仔 = new TreeSet<>();TreeSet<Integer> 刀仔 = new TreeSet<>();TreeSet<Integer> 高进 = new TreeSet<>();TreeSet<Integer> 底牌 = new TreeSet<>();//每一个人的牌通过观察可以发现分别是3余0,1,2for (int i = 0; i < indexs.size(); i++) {if (i>=indexs.size()-3) {底牌.add(indexs.get(i));}else if(i%3==0){星仔.add(indexs.get(i));}else if (i%3==1) {刀仔.add(indexs.get(i));}else if (i%3==2) {高进.add(indexs.get(i));}}//由于要实现对3个人的加底牌的排序,所以为了简化代码,创建一个方法进行调用lookPoker("星仔",星仔,pokers);lookPoker("刀仔",刀仔,pokers);lookPoker("高进",高进,pokers);lookPoker("底牌",底牌,pokers);}private static void lookPoker(String name, TreeSet<Integer> indexs,TreeMap<Integer, String> pokers){System.out.print(name+"的牌是:");//遍历每一个人的牌也就是TreeSet集合,同时利用索引相同的特点,在TreeMap集合中找到索引对应的牌for (Integer index : indexs) {System.out.print(pokers.get(index)+"\t"); //将牌输出}System.out.println();//在输出一个人的牌后换行/*private static void lookPoker(String name, ArrayList<String> list) {System.out.println(name);for (String poker : list) {System.out.print(poker+"\t");}System.out.println();*/}
}

javase笔记day18相关推荐

  1. Javase 笔记知识点概要

    Javase 笔记知识点概要 Java 概述 计算机基础知识 |-计算机概述了解,键盘功能键的认识和快捷键,常见的DOS命令, Java语言概述 |-Java语言的特点,JDK,JRE,JVM的作用及 ...

  2. JavaSE笔记 [全文字数7.1W]

    JavaSE笔记 文章目录 JavaSE笔记 第一章 初识Java 1.1 java发展史 1.2 特点 1.3 语言特性 1.4 JDK.JRE.JVM三者关系 1.5 Java加载与执行 1.6 ...

  3. JavaSE笔记 30天学Java打卡 Day06

    JavaSE笔记 30天学Java打卡 Day06 本笔记配套[零基础 快速学Java]韩顺平 零基础30天学会Java 视频一起食用 链接

  4. 尚硅谷JavaSE笔记(四)

    系列文章目录 尚硅谷JavaSE笔记(一) 尚硅谷JavaSE笔记(二) 尚硅谷JavaSE笔记(三) 尚硅谷JavaSE笔记(四) 文章目录 十六.File 类与 IO 流 1.java.io.Fi ...

  5. JavaSE笔记详细整理

    JavaSE笔记 文章目录 JavaSE笔记 第一章 初识Java 1.1 java发展史 1.2 特点 1.3 语言特性 1.4 JDK.JRE.JVM三者关系 1.5 Java加载与执行 1.6 ...

  6. 传z播客 刘意_2015年Java基础视频笔记(day18~day20(2016年3月20日14:36:05)

    day18 1.Map引入 Map是区分于Collection的另外一个"老大" 作为学生来说,是根据学号来区分不同的学生的,那么假设我现在已经知道了学生的学号,我要根据学号去获取 ...

  7. 传z播客 刘意_2015年Java基础视频笔记(day18~day20)(2016年3月20日14:33:31)

    day18 1.Map引入 Map是区分于Collection的另外一个"老大" 作为学生来说,是根据学号来区分不同的学生的,那么假设我现在已经知道了学生的学号,我要根据学号去获取 ...

  8. 十五、IO流【黑马JavaSE笔记】(本文文中记录了个人学习感受)

    文章目录 IO流 (一)File 1.File类的概述和构造方法 2.File类的创建功能 3.File类判断和获取功能 4.File类的删除功能 5.递归 6.案例(递归求阶乘) 7.案例(遍历目录 ...

  9. JAVASE笔记回顾

    第一部分,JAVA基础和面向对象 part01 入门与开发环境搭建 1: 计算机基础知识(了解) (1)计算机 (2)计算机硬件 (3)计算机软件 系统软件:windows,linux,mac 应用软 ...

最新文章

  1. Django源码分析7:migrate命令的浅析
  2. Ceylon语言加入Eclipse基金会
  3. 39.拖曳排序插件——sortable
  4. el search 查询排序
  5. PID控制器改进笔记之四:改进PID控制器之设定值响应
  6. SpringBoot 2.0 集成 JavaMail ,实现异步发送邮件
  7. 实战 | Vue + Element UI 页面创建
  8. POI生成Web版Word文件
  9. python产生随机数_python技能:random库的使用
  10. 技术对游戏公司来讲到底有多重要?
  11. 单片机蜂鸣器编程音乐_单片机系统硬件调试方法
  12. python-回调函数
  13. Quartz定时任务手动触发
  14. 数字谐音记忆编码连连看网页应用
  15. 2006高考之后又诞生了很多神一样的同学
  16. excel提取数字的方法
  17. ITK入门教程(13)点集之得到点中的存储数据
  18. 遇到问题---maven----Unable to process Jar entry
  19. 这份职业我有多少期许
  20. python百万邮件群发软件_python如何群发邮件

热门文章

  1. RT-Thread--外部 flash 挂载 fatfs 文件系统
  2. 光传输-ROADM技术总结
  3. [Effective C++]条款14:在资源管理类中小心copying行为
  4. Cisco Packet Tracer配置操作的三种命令模式
  5. 基于微信小程序的宠物用品商城小程序
  6. IOS 关于UINavigationBar的使用
  7. Android手机底部NavigationBar挡住界面的解决方法
  8. node 模块 fs-extra
  9. 中国医用口罩市场前瞻及投资策略建议报告2022-2028年
  10. 游历魔法王国——网易校招