Set系列集合
特点:
无序不重复,无索引
set系列实现类的特点:
- HashSet:无序,不重复,无索引
- LinkedHashSet:有序,不重复,无索引
- TreeSet:排序(按大小排序),不重复,无索引
哈希值:JDK根据对象的地址,按照某种规则算出来的int类型的数值
Object类的API:
public int hashCode();//返回对象的哈希值
对象哈希值的特点:
- 同一个对象多次调用hashCode()方法返回的哈希值是相同的
- 默认情况下,不同对象的哈希值是不同的
set系列集合底层的数据结构
HashSet
现在哈希值跟数组的长度求余计算出应存入的位置,在JDK8之前,采用数组+链表的方式。哈希表是一种对于增删改查数据性能都较好的结构,在JDK8之后就采用数组+链表+红黑树的结构。
set集合可以去除重复的原因:先判断哈希值,在判断equals
那么如果希望set集合认为两个内容相同的对象不应该去除重复的咋办?
在实体类中,增加equals和hashCode(使用快捷键自动生成即可)。
LinkedHashSet
有序,不重复,无索引
底层数据结构依然是哈希表,只是每个元素又额外的多了一个双链表的机制记录存储的顺序
TreeSet
排序,不重复,无索引
基于红黑树数据结构实现排序的
注意:TreeSet集合是一定要排序的,可以将元素按照指定的规则进行排序
TreeSet的排序规则
数值:Integer,Double按大小升序排序
字符串:按首字母编号升序排序
自定义类型:需要制定排序规则
方式一:使用类自定义比较规则(在实体类中实现)
首先需要在实体类中实现自定义比较规则的接口implements Comparable<Apple>
,这一步不要忘记
@Override
public int compareTo(Apple o){
/*
>:正整数
<:负整数
=:0.去重复
*/
return this.wigth-o.wigth>=0?1:-1;
}
方式二:集合自带比较器对象进行规则定制(在实现类中使用)
Set<Apple> apples=new TreeSet<>(new comparator<Apple(){
@Override
public int compare(Apple o1,Apple o2){
return o1.getweight()-o2.getweight();//升序
}
}>)
浮点类型建议直接使用Double.compare进行比较
Set<Apple> apples=new TreeSet<>(new comparator<Apple(){
@Override
public int compare(Apple o1,Apple o2){
return Double.compare(o1.getPrice()-o2.getPrice());//升序
}
}>)
使用lambda表达式书写:
Set<Apple> apples=new TreeSet<>((o1,o2)->Double.compare(o2))
假设同时使用了这两种方式,则采用就近原则。
可变参数
public static void sum(int...nums){
}
- 一个形参列表中只能有一个可变参数()
- 可变参数必须放在形参列表的最后面