2020/8/14

1.Collections工具类

  • 介绍

    • 单列集合的工具类,全是静态方法 只能List及其子类用
  • 常用方法

    方法 说明
    static void shuffle(List<?> list) 随机打乱集合元素的顺序
    static void sort(List list) 集合的排序(从小到大)
    static void sort(List list,Comparator<? super T> ) 按照指定的方式排序
    • shuffle(List<?> list) 打乱顺序
    • sort(List list) 从小大大排序
      • Arrays.sort() 数组排序
    • sort(List,Comparator<? super T>)
      • 后者要的接口,传的子类对象
      • 匿名内部类
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;public class Test1_1 {public static void main(String[] args) {List<Integer> list = new ArrayList<>();Collections.addAll(list, 1, 2, 3, 4, 5, 6, 7, 8);Collections.shuffle(list);System.out.println(list);Collections.sort(list);System.out.println(list);Collections.sort(list, new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {return o2 - o1;}});System.out.println(list);}
}
  • 字符串排序规则
  • 从前往后一个个判断字符的Ascii码值
  • 汉字排后面
  • 看Ascii码:+0
import java.util.ArrayList;
import java.util.Collections;public class Test02 {public static void main(String[] args) {//创建集合ArrayList<String> list = new ArrayList<>();list.add("abc");list.add("def");list.add("abcd");list.add("123");list.add("a12");list.add("柳岩");//排序Collections.sort(list);//从小到大/*字符串排序规则:从前往后一个一个判断字母的字符值*/System.out.println(list);System.out.println('a'+0);    //97System.out.println('柳'+0);   //26611}
}

2.Comparator比较器

Comparator.sort(list,new Comparator<Integer>(){public int compare(Integer o1,Integer o2){return o1-o2;//从小到大排序//return o2-o1;//从大到小}
}//从小到大
//如果一个正数,会把这个元素放在后面
//如果一个负数,会把这个元素放在前面
//如果返回0,认为元素相同,不移动元素
//o1要比较的元素,o2已经排序好的元素
//依次轮流比较//return -1; 反转
  • 案例

    //存储的学生对象,报错不知道学生排序比较规则,给出一个排序规则
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Comparator;public class Test05 {public static void main(String[] args) {//创建集合ArrayList<Student> list = new ArrayList<>();//添加list.add(new Student("柳岩",38));list.add(new Student("张三",23));list.add(new Student("刘帅雷",28));list.add(new Student("马尔扎哈",28));list.add(new Student("崔航",28));//排序//按照年龄从小到大排列,如果年龄相同,姓名短的在前,姓名长的在后Collections.sort(list, new Comparator<Student>() {@Overridepublic int compare(Student o1, Student o2) {if(o1.getAge() == o2.getAge()){//年龄相同//比较姓名从短到长return o1.getName().length() - o2.getName().length();}else{//年龄不相同//年龄从小到大return o1.getAge() - o2.getAge();}}});//打印System.out.println(list);}
    }
    

3.可变参数

  • 作用

    • 可变指的是个数可变,可变参数可以接受任意个数的参数。
  • 示例代码

    public void method(数据类型...  变量名){}public class Test01 {public static void main(String[] args) {//可以传递数字或数组method();method(1,2);method(1,2,3,46,52,6);int[] arr = {22,342,43};method(arr);}//int可变参数//可以接受任意个数的参数public static void method(int... arr){//可以把可变参数当做是数组来使用for (int i = 0; i < arr.length; i++) {System.out.println(arr[i]);}}
    }
    
  • 注意事项

    • 可变参数必须是最后一个参数,后面不能出现别的参数
    • 一个方法只能有一个可变参数
    • 可变参数的本质是一个数组
  • 可变参数和数组的区别

    • 数组只能接受数组类型
    • 可变参数可以接受对应类型或数组类型
  • 应用场景

    //给集合添加多个元素
    ArrayList<String> list = new ArrayList<>();
    //工具类
    Collections.addAll(list,"123","abc","def");
    //打印
    System.out.println(list);
    

4.Set接口及子类

4.1 HashSet集合

4.1.1 特点

  • 元素没有索引

  • 元素不能重复

  • 元素存储无序

    import java.util.HashSet;
    public class Test01 {public static void main(String[] args) {//HashSetHashSet<Integer> set = new HashSet<>();//添加set.add(123);set.add(345);set.add(333);set.add(678);set.add(123);System.out.println(set);  //[678, 345, 123, 333]}
    }
    

4.1.2 HashSet的底层数据结构

  • 每一列叫桶

4.1.3 hash值

Object类中有一个方法hashCode()方法返回的是对象的地址值,在子类中重写此方法,,用hashCode()方法返回hash值。

  • 结论:哈希值不同对象一定不同,哈希值相同对象不一定相同。

4.1.4 保证元素不重复的源码分析

if (p.hash == hash && ((k = p.key) == key || (key != null && key.equals(k))))先调用hashCode()方法判断哈希值是否相同如果哈希值不同,直接认为元素不重复,就能存储如果哈希值相同,就调用equals()方法判断对象的内容是否相同如果内容不相同,就不重复,就能存储如果内容相同,就重复了,就不存储

4.1.5 HashSet的存储题解、

4.1.6 存储自定义类型演示

  • 自己重写HashCode()和equals()方法

    import java.util.Objects;
    public class 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 +'}';}//hashCode() equals()//判断对象的内容是否相同@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);}
    }import java.util.HashSet;
    public class Test03 {public static void main(String[] args) {//创建集合HashSet<Student> set = new HashSet<>();set.add(new Student("柳岩",38));set.add(new Student("张三",23));set.add(new Student("刘帅雷",28));set.add(new Student("刘帅雷",28));set.add(new Student("崔航",28));//不重复 存取无序System.out.println(set);}
    }
    

4.2 LinkedHashSet集合

  1. 元素没有索引

  2. 元素不可重复

  3. 元素存储有序

    import java.util.LinkedHashSet;public class Test04 {public static void main(String[] args) {//创建对象LinkedHashSet<Integer> set = new LinkedHashSet<>();//添加set.add(123);set.add(345);set.add(567);set.add(111);set.add(111);System.out.println(set);  //[123, 345, 567, 111]}
    }
    

4.3 TreeSet集合

  1. 元素没有索引

  2. 元素不可重复

  3. 元素会自动排序

    底层是二叉查找树

    import java.util.TreeSet;public class Test05 {public static void main(String[] args) {//创建对象TreeSet<Integer> set = new TreeSet<>();//添加set.add(123);set.add(345);set.add(567);set.add(111);set.add(111);System.out.println(set);  //[111, 123, 345, 567]}
    }
    
  • 存储自定义类型

    • 如果使用TreeSet存储自定义类型,必须给定比较规则。
    import java.util.Comparator;
    import java.util.TreeSet;public class Test06 {public static void main(String[] args) {//创建对象//使用比较器给定比较规则/*如果返回的是正数,放在后面如果返回的是负数,放在前面如果返回的是零,认为相同,去重*/TreeSet<Student> set = new TreeSet<>(new Comparator<Student>() {@Overridepublic int compare(Student o1, Student o2) {//比如按照年龄从小到大return o1.getAge() - o2.getAge();}});set.add(new Student("柳岩",38));set.add(new Student("张三",23));set.add(new Student("刘帅雷",28));set.add(new Student("刘帅雷",28));set.add(new Student("崔航",29));//排序System.out.println(set);}
    }
    

5.Map接口

5.1 Map集合作用

  • Map表示双列集合,用来保存一对一的键值对,也叫做映射。

5.2 Map集合体系

5.3Map常用方法

方法 说明
V put(K key, V value) 添加键值对
V remove(Object key) 根据键删除对应的键值对
V get(Object key) 根据键获取值
Set keySet() 把键转换成Set集合
Set<Map.Entry<K,V>> entrySet() 把键值对转成Set集合
boolean containsKey(Object key) 判断是否包含某个键
boolean containsValue(Object value) 判断是否包含某个值
import java.util.HashMap;
import java.util.Map;public class Test01 {public static void main(String[] args) {//创建对象Map<String,String> map = new HashMap<>();//V put(K key, V value)//添加键值对map.put("孙俪","邓超");map.put("马蓉","王宝强");map.put("白百何","陈羽凡");//V remove(Object key)//根据键删除对应的键值对map.remove("马蓉");//V get(Object key)//根据键获取值String s = map.get("白百何");System.out.println(s);//boolean containsKey(Object key)//判断是否包含某个键boolean b1 = map.containsKey("白百何");System.out.println(b1);//boolean containsValue(Object value)//判断是否包含某个值boolean b2 = map.containsValue("邓超");System.out.println(b2);//获取集合的长度int size = map.size();System.out.println(size);  //2//打印System.out.println(map);}
}

5.4 Map的遍历

  • KeySet() 键找值方式

    import java.util.HashMap;
    import java.util.Map;
    import java.util.Set;public class Test02 {public static void main(String[] args) {//创建对象Map<String,String> map = new HashMap<>();//添加键值对map.put("孙俪","邓超");map.put("马蓉","王宝强");map.put("白百何","陈羽凡");//把key变成单列集合Set<String> set = map.keySet();//增强forfor (String s : set) {//根据键获取值String value = map.get(s);System.out.println(s + " " + value);}//快捷键:iter}
    }
    
  • entrySet()键值对方式

    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.Map;
    import java.util.Set;public class Test03 {public static void main(String[] args) {//创建对象Map<String,String> map = new HashMap<>();//添加键值对map.put("孙俪","邓超");map.put("马蓉","王宝强");map.put("白百何","陈羽凡");//把键值对变成Set集合Set<Map.Entry<String, String>> set = map.entrySet();//增强forfor (Map.Entry<String, String> entry : set) {//获取键String key = entry.getKey();//获取值String value = entry.getValue();System.out.println(key + " " +value);}}
    }
    

5.5 HashMap集合

  • 元素没有索引

  • 键不能重复,值没有要求

  • 元素存取无序

    import java.util.HashMap;
    public class Test04 {public static void main(String[] args) {//创建对象HashMap<String,String> map = new HashMap<>();map.put("白百何","陈羽凡");map.put("孙俪","邓超");map.put("马蓉","王宝强");//如果键重复,会用新的值替换旧的值map.put("马蓉","宋喆");System.out.println(map);   //{孙俪=邓超, 马蓉=宋喆, 白百何=陈羽凡}}
    }
    

HashMap存储自定义类型

  • 如果使用HashMap的键存储自定义类型,需要重写hashCode()和equals

    import java.util.HashMap;public class Test05 {public static void main(String[] args) {//创建集合HashMap<Student,Integer> map = new HashMap<>();//添加键值对map.put(new Student("柳岩",38),100);map.put(new Student("崔航",23),59);map.put(new Student("马蓉",26),80);map.put(new Student("马蓉",26),70);System.out.println(map);}
    }
    

5.6 LinkedHashMap集合

  • 元素没有索引
  • 元素键不重复
  • 元素存取有序
import java.util.LinkedHashMap;public class Test06 {public static void main(String[] args) {//创建对象LinkedHashMap<String,String> map = new LinkedHashMap<>();map.put("白百何","陈羽凡");map.put("马蓉","王宝强");map.put("孙俪","邓超");//如果键重复,会用新的值替换旧的值map.put("马蓉","宋喆");System.out.println(map);   //{白百何=陈羽凡, 马蓉=宋喆, 孙俪=邓超}}
}

5.7 TreeMap

  • 元素没有索引

  • 元素键不能重复

  • 元素按照键默认排序

    import java.util.TreeMap;
    public class Test07 {public static void main(String[] args) {//创建对象TreeMap<String,String> map = new TreeMap<>();map.put("abc","陈羽凡");map.put("qwe","王宝强");map.put("abd","邓超");//如果键重复,会用新的值替换旧的值map.put("acb","宋喆");System.out.println(map);   //{abc=陈羽凡, abd=邓超, acb=宋喆, qwe=王宝强}}
    }
    
  • TreeMap比较器排序

    • 如果使用TreeMap的键存储自定义类型,就必须给出比较规则。
    import java.util.Comparator;
    import java.util.TreeMap;public class Test08 {public static void main(String[] args) {//创建集合//排序TreeMap<Student,Integer> map = new TreeMap<>(new Comparator<Student>() {@Overridepublic int compare(Student o1, Student o2) {//按照年龄从小到大 年龄相同就是重复return o1.getAge()-o2.getAge();}});//添加键值对map.put(new Student("柳岩",38),100);map.put(new Student("崔航",23),59);map.put(new Student("马蓉",26),80);map.put(new Student("马蓉",26),70);System.out.println(map);}
    }
    

8.练习题

需求:输入一个字符串判断里面每个字符出现次数。

​ 键盘输入一个字符串:

​ 34wew4r33343

​ 显示每个字符出现的次数

import java.util.LinkedHashMap;
import java.util.Scanner;public class Test09 {public static void main(String[] args) {//案例//键盘输入一个字符串Scanner sc = new Scanner(System.in);System.out.println("请输入一个字符串:");String s = sc.nextLine();//创建集合LinkedHashMap<Character,Integer>  map = new LinkedHashMap<>();//遍历字符串for (int i = 0; i < s.length(); i++) {//获取每个字符char ch = s.charAt(i);//判断字符在集合中是否存在if(!map.containsKey(ch)) {//如果字符不存在就存放字符第一次出现map.put(ch,1);}else {//如果字符存在就在原来的值上加一重写存放Integer count = map.get(ch);map.put(ch,count+1);}}System.out.println(map);}
}

6.集合的嵌套

Map
String               ArrayList<String>
草原最美的花儿队        白百何 马蓉 李小璐
最毒的华子队            陈羽凡  李代沫  宋冬野import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;public class Test10 {public static void main(String[] args) {/*String       ArrayList<String>草原队        白百何 马蓉 李小璐华子队        陈羽凡  李代沫  宋冬野*///创建Map集合Map<String,ArrayList<String>> map = new HashMap<>();//创建ArrayListArrayList<String> list1 = new ArrayList<>();list1.add("白百何");list1.add("马蓉");list1.add("李小璐");//创建ArrayListArrayList<String> list2 = new ArrayList<>();list2.add("陈羽凡");list2.add("李代沫");list2.add("宋冬野");//map添加map.put("草原队",list1);map.put("华子队",list2);//打印System.out.println(map);}
}

7.模拟斗地主发牌

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lOg52DBU-1597547103713)(day06.assets/%E6%96%97%E5%9C%B0%E4%B8%BB%E5%88%86%E6%9E%90.png)]

import java.util.*;public class Test01 {public static void main(String[] args) {//创建Map集合Map<Integer,String> map = new TreeMap<>();//定义ArrayListArrayList<Integer> list = new ArrayList<>();//定义花色数组String[] color = {"♥","♠","♣","♦"};//定义数字数组String[] num = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"};//定义计数器int count = 1;//循环for (String n : num) {for (String c : color) {map.put(count,c+n);list.add(count);count++;}}//大小王list.add(53);map.put(count++,"小王");list.add(54);map.put(count,"大王");//洗牌Collections.shuffle(list);TreeSet<Integer> set1 = new TreeSet<>();TreeSet<Integer> set2 = new TreeSet<>();TreeSet<Integer> set3 = new TreeSet<>();TreeSet<Integer> set4 = new TreeSet<>();//发牌(需要有索引索引要用普通for)for (int i = 0; i < list.size(); i++) {Integer pai = list.get(i);//底牌if(i>=51)set4.add(pai);else if(i%3==0)set1.add(pai);else if(i%3==1)set2.add(pai);elseset3.add(pai);}//看牌look(set1,map,"柳岩");look(set2,map,"卢本伟");look(set3,map,"阿姨");look(set4,map,"底牌");}//看牌public static void look(TreeSet<Integer> set,Map<Integer,String> map,String name){System.out.print(name + ":   ");for (Integer n : set) {String s = map.get(n);System.out.print(s+" ");}System.out.println();}
}

学习java第15天相关推荐

  1. Java架构师笔记-你必须掌握学习Java需要掌握哪些技能

    闲来无事,师长一向不(没)喜(有)欢(钱)凑热闹,倒不如趁着这时候复盘复盘.而写这篇文章的目的是想总结一下自己这么多年来使用java的一些心得体会,希望可以给大家一些经验,能让大家更好学习和使用Jav ...

  2. 大学学了java可以做点什么_学习Java的,大学毕业一般从事些什么工作?

    展开全部 我这是拷贝的,62616964757a686964616fe59b9ee7ad9431333332643361不过也就差不多了,说实话,java的东西太多了.还是要到工作的时候慢慢用的,学好 ...

  3. 学习Java需要达到的25个目标

    本文将告诉你学习Java需要达到的25个目标希望能够对你的学习及找工作有所帮助.对比一下自己你已经掌握了这25条中的多少 条了呢? 1.你需要精通面向对象分析与设计(OOA/OOD).涉及模式(GOF ...

  4. 学习 Java 8 - 函数式接口 Lambda

    学习 Java 8 - 函数式接口 Java 8 引入了函数式接口的概念.函数式接口其实就是只包含一个抽象方法的普通 Java 接口.在没有引入函数式接口之前,我们通常使用内部类和匿名类来实现类似的功 ...

  5. 简单的介绍一下怎样如何学习Java基础

    在我看来,学习Java最好的方式就是通过书籍(或博客)+动手写代码,辅以视频,通过多写多练,达到熟练掌握的程度.博主曾经看过一篇文章,讲的是费曼学习法,其中讲到学习的四个步骤:选择目标.教学.纠错学习 ...

  6. 学习java 的30个目标

    1.你需要精通面向对象分析与设计(OOA/OOD).涉及模式(GOF,J2EEDP)以及综合模式.你应该十分了解UML,尤其是class,object,interaction以及statediagra ...

  7. 学习Java的三十三个建议

    学习Java的三十三个建议 1把Java当成一门新的语言学习(和C++差别很大,真的,我觉得和Delphi的Object Pas cal反而更像一点): 2看<Thinking in Java& ...

  8. 新手学习Java必需要知道的这些基本概念!

    学习好比盖房子,打地基好很重要,房了能盖多高关键看地基:学习同样道理,基础知识是以后学习一切技术的必要条件,我们在准备学习一门开发语言时,首先要学习它的基础,不仅要会,更要融会贯通:万变不离其宗,无论 ...

  9. java编程学习方法_在线学习Java编程的最佳方法

    java编程学习方法 1.简介 Java是使用最广泛的编程语言之一. 根据Github的最新报告 ,Java被列为仅次于JavaScript的第二大最常用的编程语言. 掌握Java的人有很多话题. 好 ...

  10. java8 函数式编程_您必须学习Java 8的函数式编程吗?

    java8 函数式编程 我最近一直在研究Java 8,并掌握了Manning出版的" Java 8 In Action" . 让我印象深刻的第一件事是Java 8独特的销售主张是函 ...

最新文章

  1. android relativelayout 点击事件,Android Relativelayout点击背景行为
  2. php获取头像,WordPress中用于获取及自定义头像图片的PHP脚本详解
  3. Html中元素的分类
  4. 使用Logstash filter grok过滤日志文件
  5. 设计模式 之 --- GRASP
  6. (z)如何在SignalTAP II中保留特定节点
  7. 【OS学习笔记】三十三 保护模式九:分页机制对应的汇编代码之---用户程序代码
  8. 希望我在开始第一个机器学习项目之前就了解的那些事儿
  9. setint 的用法
  10. 插头dp ——从入门到跳楼
  11. 网上赚钱的平台哪个好?7个方式总有你喜欢的!
  12. 学习dicom没什么窍门
  13. 管理部门使用计算机属于固定资产核算吗,固定资产核算管理内容
  14. 苹果电脑双系统正确打开方式,虚拟机已经Out了
  15. 掉入黑洞会怎样?被拉成面条,还是前往另一个宇宙?
  16. 大萧条:反思1929
  17. 【AI视野·今日CV 计算机视觉论文速览 第236期】Tue, 28 Sep 2021
  18. 大疆无人机空三建模干货分享(大疆智图集群建模超详细教程)
  19. 华为笔记本软件商店_华为要消灭流氓软件?干净的电脑应用商店来了!
  20. C语言全网最详细的分支和循环语句讲解

热门文章

  1. 掉头发厉害,是为什么呢?
  2. c语言 设圆的半径,【c语言】设圆半径r = 1.5,圆柱高h = 3,求圆周长,圆面积,圆球表面积,圆球体积,圆柱体积...
  3. python项目:基于OpenCV的学生网课睡意检测系统
  4. es7之Reflect Metadata
  5. 2.reflect.TypeOf()
  6. ES新特性之Reflect对象
  7. matlab中断路器怎么表示什么,断路器的符号各代表什么意思
  8. Android游戏破解 入门级零基础起步学习破解!MT管理器+修改器使用方法 小白看了绝对有用
  9. 题解 P2504 【[HAOI2006]聪明的猴子】
  10. uniapp canvas生成海报不显示问题