学习java第15天
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集合
元素没有索引
元素不可重复
元素存储有序
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集合
元素没有索引
元素不可重复
元素会自动排序
底层是二叉查找树
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天相关推荐
- Java架构师笔记-你必须掌握学习Java需要掌握哪些技能
闲来无事,师长一向不(没)喜(有)欢(钱)凑热闹,倒不如趁着这时候复盘复盘.而写这篇文章的目的是想总结一下自己这么多年来使用java的一些心得体会,希望可以给大家一些经验,能让大家更好学习和使用Jav ...
- 大学学了java可以做点什么_学习Java的,大学毕业一般从事些什么工作?
展开全部 我这是拷贝的,62616964757a686964616fe59b9ee7ad9431333332643361不过也就差不多了,说实话,java的东西太多了.还是要到工作的时候慢慢用的,学好 ...
- 学习Java需要达到的25个目标
本文将告诉你学习Java需要达到的25个目标希望能够对你的学习及找工作有所帮助.对比一下自己你已经掌握了这25条中的多少 条了呢? 1.你需要精通面向对象分析与设计(OOA/OOD).涉及模式(GOF ...
- 学习 Java 8 - 函数式接口 Lambda
学习 Java 8 - 函数式接口 Java 8 引入了函数式接口的概念.函数式接口其实就是只包含一个抽象方法的普通 Java 接口.在没有引入函数式接口之前,我们通常使用内部类和匿名类来实现类似的功 ...
- 简单的介绍一下怎样如何学习Java基础
在我看来,学习Java最好的方式就是通过书籍(或博客)+动手写代码,辅以视频,通过多写多练,达到熟练掌握的程度.博主曾经看过一篇文章,讲的是费曼学习法,其中讲到学习的四个步骤:选择目标.教学.纠错学习 ...
- 学习java 的30个目标
1.你需要精通面向对象分析与设计(OOA/OOD).涉及模式(GOF,J2EEDP)以及综合模式.你应该十分了解UML,尤其是class,object,interaction以及statediagra ...
- 学习Java的三十三个建议
学习Java的三十三个建议 1把Java当成一门新的语言学习(和C++差别很大,真的,我觉得和Delphi的Object Pas cal反而更像一点): 2看<Thinking in Java& ...
- 新手学习Java必需要知道的这些基本概念!
学习好比盖房子,打地基好很重要,房了能盖多高关键看地基:学习同样道理,基础知识是以后学习一切技术的必要条件,我们在准备学习一门开发语言时,首先要学习它的基础,不仅要会,更要融会贯通:万变不离其宗,无论 ...
- java编程学习方法_在线学习Java编程的最佳方法
java编程学习方法 1.简介 Java是使用最广泛的编程语言之一. 根据Github的最新报告 ,Java被列为仅次于JavaScript的第二大最常用的编程语言. 掌握Java的人有很多话题. 好 ...
- java8 函数式编程_您必须学习Java 8的函数式编程吗?
java8 函数式编程 我最近一直在研究Java 8,并掌握了Manning出版的" Java 8 In Action" . 让我印象深刻的第一件事是Java 8独特的销售主张是函 ...
最新文章
- android relativelayout 点击事件,Android Relativelayout点击背景行为
- php获取头像,WordPress中用于获取及自定义头像图片的PHP脚本详解
- Html中元素的分类
- 使用Logstash filter grok过滤日志文件
- 设计模式 之 --- GRASP
- (z)如何在SignalTAP II中保留特定节点
- 【OS学习笔记】三十三 保护模式九:分页机制对应的汇编代码之---用户程序代码
- 希望我在开始第一个机器学习项目之前就了解的那些事儿
- setint 的用法
- 插头dp ——从入门到跳楼
- 网上赚钱的平台哪个好?7个方式总有你喜欢的!
- 学习dicom没什么窍门
- 管理部门使用计算机属于固定资产核算吗,固定资产核算管理内容
- 苹果电脑双系统正确打开方式,虚拟机已经Out了
- 掉入黑洞会怎样?被拉成面条,还是前往另一个宇宙?
- 大萧条:反思1929
- 【AI视野·今日CV 计算机视觉论文速览 第236期】Tue, 28 Sep 2021
- 大疆无人机空三建模干货分享(大疆智图集群建模超详细教程)
- 华为笔记本软件商店_华为要消灭流氓软件?干净的电脑应用商店来了!
- C语言全网最详细的分支和循环语句讲解
热门文章
- 掉头发厉害,是为什么呢?
- c语言 设圆的半径,【c语言】设圆半径r = 1.5,圆柱高h = 3,求圆周长,圆面积,圆球表面积,圆球体积,圆柱体积...
- python项目:基于OpenCV的学生网课睡意检测系统
- es7之Reflect Metadata
- 2.reflect.TypeOf()
- ES新特性之Reflect对象
- matlab中断路器怎么表示什么,断路器的符号各代表什么意思
- Android游戏破解 入门级零基础起步学习破解!MT管理器+修改器使用方法 小白看了绝对有用
- 题解 P2504 【[HAOI2006]聪明的猴子】
- uniapp canvas生成海报不显示问题