Day06、Set系列集合-集合嵌套
Set系列集合
Set系列集合特点
无序:存取顺序不一致
不重复:可以去除重复
无索引:没有带索引的方法,所以不能使用普通for循环遍历,也不能通过索引来获取元素
Set 集合实现类特点
HashSet : 无序、不重复、无索引。
LinkedHashSet: 有序、不重复、无索引。
TreeSet: 排序、不重复、无索引。
Set 集合的功能上基本上与collection的API一致。
HashSet底层原理
. HashSet 集合底层采取哈希表存储的数据。
. 哈希表是一种对于增删改查数据性能都较好的结构。
哈希表的组成
. JDK8 之前的, 底层使用数组+ 链表组成
. JDK8 开始后,底层采用数组+ 链表+ 红黑树组成。
哈希值
是JDK根据对象的地址,按照某种规则算出来的int类型的数值
Object类的API
public int hashCode():返回对象的哈希值
对象的哈希值特点
同一个对象多次调用hashCode()方法返回的哈希值是相同的
默认情况下,不同对象的哈希值是不同的。
哈希表的详细流程:
-
创建一个默认长度16 , 默认加载因为0.75 的数组, 数组名table
-
根据元素的哈希值跟数组的长度计算出应存入的位置
-
判断当前位置是否为null , 如果是null 直接存入, 如果位置不为null , 表示有元素,则调用equals 方法比较属性值, 如果一样, 则不存, 如果不一样, 则存入数组。
-
当数组存满到16 * 0.75 = 12 时, 就自动扩容, 每次扩容原先的两倍
HashSet去重复原理解析
案例:
LinkedHashSet集合概述和特点:
有序、不重复、无索引
TreeSet集合概述和特点
-
不重复、无索引、可排序
-
可排序: 按照元素的大小默认升序( 有小到大) 排序。
-
TreeSet 集合底层是基于红黑树的数据结构实现排序的, 增删改查性能都较好。
-
注意: TreeSet 集合是一定要排序的可以将元素按照指定的规则进行排序。
TreeSet集合默认的规则
-
对于数值类型: lnteger, Double, 官方默认按照大小进行升序排序。
-
对于字符串类型: 默认按照首字符的编号升序排序。
-
对于自定义类型如Student 对象, TreeSet 无法直接排序。
结论: 想要使用TreeSet 存储自定义类型需要制定排序规则
自定义排序规则
-
TreeSet 集合存储对象的的时候有2 种方式可以设计自定义比较规则
方式一
-
让自定义的类( 如学生类) 实现Comparable接口重写里面的compareTo方法来定制比较规则。
方式二
-
Treeset 集合有参数构造器, 可以设置Comparator 接口对应的比较器对象, 来定制比较规则。
可变参数
可变参数的作用
-
传输参数非常灵活, 方便。可以不传输参数, 可以传输1 个或者多个, 也可以传输一个数组
-
可变参数在方法内部本质上就是一个数组。
可变参数的注意事项:
-
一个形参列表中可变参数只能有一个
-
可变参数必须放在形参列表的最后面
-
public static void sum1(int age,int... nums)
Collection集合工具类
. java.utiIs.coIIections: 是集合工具类
. 作用: collection并不属于集合, 是用来操作集合的工具类。
Collections 常用的API
方法名称 |
说明 |
public static boolean addAII(CoIIection<? super T> c ,T...elements) |
给集合对象批量添加元素 |
public static void shuffIe(List<?> list) |
打乱List 集合元素的顺序 |
Collections排序相关API
排序方式1 :
方法名称 |
说明 |
public static void sort(List list) |
将集合中元素按照指定规则排序 |
注意: 本方式不可以直接对自定义类型的List 集合排序, 除非自定义类型实现了比较规则Comparable接口。 |
|
排序方式2 :
方法名称 |
说明 |
public static void sort(List list,Comparator<? super T > c) |
将集合中元素按照默认规则排序 |
Collections.sort(apples, new Comparator<Apple>() {
@Override
public int compare(Apple o1, Apple o2) {
return Double.compare(o1.getPrice(),o2.getPrice());
}
});
Collection体系的综合案例:斗地主
public class GameDemo {
/*
1、定义一个静态的集合存储54张牌对象;
*/
public static List<Card> allCards = new ArrayList<>();
/*
2、做牌:定义静态代码块初始化牌数据
*/
static {
//3、定义点数:个数确定,类型确定,使用数组
String[] sizes = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"};
//4.定义花色:个数确定、类型确定,使用数组
String[] colors = {"♠", "♥", "♦", "♣"};
//5.组合点数和花色
int index = 0;
for (String size : sizes) {
index++;
for (String color : colors) {
//6.封装成一个牌对象
Card c = new Card(size, color, index);
//7.存入到集合容器中去
allCards.add(c);
}
}
//8、大小王存入到集合对象中去
Card c1 = new Card("", "标签:Map,Set,put,Day06,maps,集合,排序,public
来源: https://www.cnblogs.com/cafune02/p/16268720.html