JAVA进阶--Collection集合之Set系列集合、可变参数、Collections工具类、Map集合体系、集合的嵌套--2022年9月3日
作者:互联网
第一节 Set系列集合
1、Set系列
2、HashSet集合元素无序的底层原理:哈希表
a、Set集合的底层原理是什么样的
JDK8之前,哈希表:底层使用数组+链表组成
JDK8开始后,哈希表:底层使用数组+链表+红黑树组成
b、哈希表的详细流程
创建一个默认长度16,默认加载因 为0.75的数组,数组名table
根据元素的哈希值根数组的长度计算出应存入的位置
判断当前位置是否为null,如果是null直接存入,如果位置不为null,表示有元素,则调用equals方法比较属性值,如果一样,则不存,如果不一样,则存入数据。
当数组存满16*0.75=12时,就自动扩容,每次扩容原先的两倍
====================================================================================================
==========================================================================================================
================================================================================================================
3、HashSet元素去重复的底层原理
a、如果希望Set集合认为2个内容相同的对象是重复的应该怎么办
重写对象的hashCode和equals方法
4、LinkedHashSet
a、LinkedHaseSet集合的特点和原理是怎么样的
有序、不重复、无索引
底层基于哈希表,使用双链表记录添加顺序
5、treeSet
a、TreeSet集合的特点是怎么样的
可排序,不重复,无索引
b、TreeSet集合自定义排序规则有几种方式
2种
类实现Comparable接口,重写比较规则
集合自定义Comparator比较器对象,重写比较规则
==============================================================================================
=================================================================================================================
1 package com.itheima.d1_collection_set; 2 3 import java.util.Set; 4 import java.util.TreeSet; 5 6 /** 7 目标:观察TreeSet对于有值特性的数据如何排序。 8 学会对自定义类型的对象进行指定规则排序 9 */ 10 public class SetDemo5 { 11 public static void main(String[] args) { 12 Set<Integer> sets = new TreeSet<>(); // 不重复 无索引 可排序 13 sets.add(23); 14 sets.add(24); 15 sets.add(12); 16 sets.add(8); 17 System.out.println(sets); 18 19 Set<String> sets1 = new TreeSet<>(); // 不重复 无索引 可排序 20 sets1.add("Java"); 21 sets1.add("Java"); 22 sets1.add("angela"); 23 sets1.add("黑马"); 24 sets1.add("Java"); 25 sets1.add("About"); 26 sets1.add("Python"); 27 sets1.add("UI"); 28 sets1.add("UI"); 29 System.out.println(sets1); 30 31 System.out.println("------------------------------"); 32 // 方式二:集合自带比较器对象进行规则定制 33 // 34 // Set<Apple> apples = new TreeSet<>(new Comparator<Apple>() { 35 // @Override 36 // public int compare(Apple o1, Apple o2) { 37 // // return o1.getWeight() - o2.getWeight(); // 升序 38 // // return o2.getWeight() - o1.getWeight(); // 降序 39 // // 注意:浮点型建议直接使用Double.compare进行比较 40 // // return Double.compare(o1.getPrice() , o2.getPrice()); // 升序 41 // return Double.compare(o2.getPrice() , o1.getPrice()); // 降序 42 // } 43 // }); 44 45 Set<Apple> apples = new TreeSet<>(( o1, o2) -> Double.compare(o2.getPrice() , o1.getPrice()) ); 46 apples.add(new Apple("红富士", "红色", 9.9, 500)); 47 apples.add(new Apple("青苹果", "绿色", 15.9, 300)); 48 apples.add(new Apple("绿苹果", "青色", 29.9, 400)); 49 apples.add(new Apple("黄苹果", "黄色", 9.8, 500)); 50 System.out.println(apples); 51 } 52 }View Code
第二节 Collection体系的特点、使用场景总结
1、如果希望元素可以重复,又有索引,索引查询要快?
ArrayList集合,基于数组的(用的最多)
2、如果希望元素可以重复,又有索引,增删首尾操作快
LinkedList集合,基于链表的
3、如果洗完增删改查都快,但是元素不重复、无序、无索引
HashSet集合,基于哈希表的
4、如果希望增删改查都快,但是元素不重复,有序,无索引
LinkedHashSet集合,基于哈希表和双链表的
5、如果要对对象进行排序
TreeSet集合,基于红黑树,后续也可以用List集合实现排序
第三节 补充知识:可变参数
1 package com.itheima.d2_params; 2 3 import java.util.Arrays; 4 5 /** 6 目标:可变参数。 7 8 可变参数用在形参中可以接收多个数据。 9 可变参数的格式:数据类型...参数名称 10 11 可变参数的作用: 12 传输参数非常灵活,方便。 13 可以不传输参数。 14 可以传输一个参数。 15 可以传输多个参数。 16 可以传输一个数组。 17 18 可变参数在方法内部本质上就是一个数组。 19 可变参数的注意事项: 20 1.一个形参列表中可变参数只能有一个!! 21 2.可变参数必须放在形参列表的最后面!! 22 小结: 23 记住。 24 */ 25 public class MethodDemo { 26 public static void main(String[] args) { 27 28 sum(); // 1、不传参数 29 sum(10); // 2、可以传输一个参数 30 sum(10, 20, 30); // 3、可以传输多个参数 31 sum(new int[]{10, 20, 30, 40, 50}); // 4、可以传输一个数组 32 } 33 34 /** 35 注意:一个形参列表中只能有一个可变参数,可变参数必须放在形参列表的最后面 36 * @param nums 37 */ 38 public static void sum( int...nums){ 39 // 注意:可变参数在方法内部其实就是一个数组。 nums 40 System.out.println("元素个数:" + nums.length); 41 System.out.println("元素内容:" + Arrays.toString(nums)); 42 } 43 }View Code
第四节 补充知识:集合工具类Collections
1、
2、
3、
第五节 Collection体系的综合案例:斗地主小游戏
1 package com.itheima.d4_collection_test; 2 3 public class Card { 4 private String size; 5 private String color; 6 private int index; // 牌的真正大小 7 8 public Card(){ 9 } 10 11 public Card(String size, String color, int index) { 12 this.size = size; 13 this.color = color; 14 this.index = index; 15 } 16 17 public String getSize() { 18 return size; 19 } 20 21 public void setSize(String size) { 22 this.size = size; 23 } 24 25 public String getColor() { 26 return color; 27 } 28 29 public void setColor(String color) { 30 this.color = color; 31 } 32 33 public int getIndex() { 34 return index; 35 } 36 37 public void setIndex(int index) { 38 this.index = index; 39 } 40 41 @Override 42 public String toString() { 43 return size + color; 44 } 45 }卡牌类
1 package com.itheima.d4_collection_test; 2 3 import java.util.*; 4 5 /** 6 目标:斗地主游戏的案例开发。 7 8 业务需求分析: 9 斗地主的做牌, 洗牌, 发牌, 排序(拓展知识), 看牌。 10 业务: 总共有54张牌。 11 点数: "3","4","5","6","7","8","9","10","J","Q","K","A","2" 12 花色: "♠", "♥", "♣", "♦" 13 大小王: "标签:Map,10,--,maps,集合,println,out 来源: https://www.cnblogs.com/Flower--Dance/p/16651913.html