目录
1.2HashSet元素无序的底层原理:哈希表 134(无序的原因)
编辑 1.3HashSet元素去重复的底层原理 134 (不重复的原因)
本部分的学习目标:133
一、Set系列集合 134
1.1Set系列集系概述 134
总结:
1.2HashSet元素无序的底层原理:哈希表 134(无序的原因)
结论:哈希表是一种对于增删改查数据性能都比较好的结构。
HashSet1.8版本的原理解析:
问题:如何将链表转换为红黑树,实际上用的是根据哈希值进行比较得到最终的红黑树。
结论:JDK8开始后,哈希表对于红黑树的引入进一步提高了操作数据的性能。
总结:
1.3HashSet元素去重复的底层原理 134 (不重复的原因)
HashSet去重复原理解析:
set去重的原理:先进行对象的哈希值判断,然后再判断equals。
案例:
在没有使用哈希值与equals进行双重判断时,集合中的元素是没有被去重复的。
代码如下:
import java.util.HashSet;
import java.util.Set;
public class SetDemo3 {
public static void main(String[] args){
//Set集合去重复原因:先判断哈希值,在判断equals
Set<Student> sets = new HashSet<>();
Student s1 = new Student("wuyang",20,'男');
Student s2 = new Student("wuyang",20,'男');
Student s3 = new Student("tangsan",21,'男');
sets.add(s1);
sets.add(s2);
sets.add(s3);
System.out.println(sets);
}
}
结果:
此时集合中数据依旧出现重复的情况,并没有去重复。
在使用哈希值与equals进行双重判断时,集合中的元素是被去重复的。
在自己所编写的类中,和生成构造器的方式一样,进行生成哈希值和equals。
本部分的展示如下所示:
代码如下:
import java.util.HashSet;
import java.util.Set;
public class SetDemo3 {
public static void main(String[] args){
//Set集合去重复原因:先判断哈希值,在判断equals
Set<Student> sets = new HashSet<>();
Student s1 = new Student("wuyang",20,'男');
Student s2 = new Student("wuyang",20,'男');
Student s3 = new Student("tangsan",21,'男');
sets.add(s1);
sets.add(s2);
sets.add(s3);
System.out.println(s1.hashCode());
System.out.println(s2.hashCode());
System.out.println(s3.hashCode());
System.out.println(sets);
}
}
结果:
结果解释说明:
总结:
去掉集合中重复的对象,使用hashSet集合。
1.4实现类:LinkedHashSet 134
说明:
顺着红线找就能找到开始的顺序。本部分是在最右侧的青色开始的,陆续的向左进行。
总结:
1.5实现类:TreeSet集合概述和特点 134
对于常见的数据类型:整型(按照数字大小进行排序)、字符串(根据首字母ASCII码进行排序)
中文是按首字符的utf-8编码升序排的
自定义排序规则:
两种方式的集合都存在的话,优先根据集合中自带的比较器规则进行比较。
方式一:
方式二:
总结:
二、Collection体系的特点、使用场景总结 134
总结:
三、补充知识:可变参数 135
学习可变参数的目的是为了后面集合工具类Collections的使用。
根据上面的需求,就可以使用可变参数进行使用,来解决该问题。
对注意事项的解释:
需要符合注意事项要求进行规范的使用可变参数,违反注意事项中的之一,就会出现报错。
代码如下:
import java.util.Arrays;
public class MethodDemo {
public static void main(String[] args){
sum();//1、不传参数
sum(10);//2、可传递一个参数
sum(10,20,30);//3、可传递多个参数
sum(new int[]{10,20,30,40,50,60});//4、可传递数组
}
public static void sum(int...nums){
// 注意:可变参数在方法内部其实是一个数组的形式存在,所以如果想要提取数据,通过处理数组一样皆可对数据进行处理
System.out.println("元素个数:" + nums.length);
System.out.println("元素内容:" + Arrays.toString(nums));//读取数组内容
}
}
结果:
注意:
1、最主要的是如何使用可变参数的方法使用
2、如何提取可变参数的数据
四、Collection体系的综合案例 135
不是集合,只是个工具类。
代码解释:
批量的在集合中添加元素内容。
对于排序方式1解释:
该排序方式能够进行对按照自定排序方式进行排序后,其重复的数据不会被删除掉,会进行保留。 相比本文中1.5中方式二更方便。
方式2:
小技巧:
快捷键:
shift+F6,同时批量修改同一变量名
Alt+j,可进行同一变量名筛选修改
五、Collection体系的综合案例 136
案例:斗地主
解释:为什么使用静态的集合作为54张牌的对象?
因为静态变量在类加载是就运行了,只需要加载一次。
斗地主案例的空位坑。。。。。。。
六、Map集合体系 137
Map集合不属于Collection集合的体系,两者是互不相属的。
6.1Map集合的概述 137
双列集合:实际上就是键值对,一个键值对称之为一个元素。
举例:
该Map集合内容只有三个元素。
使用场景的介绍:
总结:
6.2Map集合体系特点 137
Map集合体系
对于Map集合中的键值对的解释:可以理解为一个老公只能有一个老婆,但是一个老婆可以有两个老公。所以才会有下面Map集合是由键决定的。
总结:
6.3Map集合中的API 137
6.4Map集合的遍历方式一:键找值 137
6.5Map集合的遍历方式二:键值对 137
把元素当作一个整体来处理即键值对。
快捷键小技巧:
ctrl+alt+v:自动补全将Map集合转换成Set集合
输入maps.entrySet()后再用快捷键就会自动补全。
6.6Map集合的遍历方式三:Lambda 137
案例:Map集合案例-统计投票人数 138 (未做)
6.7Map集合的实现类HashMap 138
Map集合体系
HashMap的特点
总结:
6.8Map集合的实现类LinkedHashMap 138
LinkedHashMap集合概述和特点
快捷键小技巧:
shift+alt+方向上下键:实现代码行整体的上下移动
总结:
七、补充知识:集合的嵌套 139 (未理解和未操作)
案例: