一、简介
是Collection的子接口,存储无序的,不可重复的数据,使用的都是Collection中定义的方法
它的实现类有HashSet和TreeSet
二、HashSet
特点:
1.无序性:不等于随机性,它的的底层数据结构虽然是数组但是存储的数据在底层数组中并非按照数组索引的顺序添加,而是根据哈希值。
2.不可重复性:会先根据hashcode()判断hash值是否相同,如果相同再调用equals()方法来判断元素是否相同,如果相同则不再添加进去
3.它是线程不安全的
添加元素的过程:
1、向HashSet中添加元素a,首先调用元素a所在类的hashCode()方法,计算元素a的哈希值
,判断数组此位置上是否已经有元素,如果此位置上没有其他元素,则元素a添加成功;
2、如果此位置上有其他元素b(或以链表形式存放的多个元素),则需要再调用元素equals()方法比较元素a和b如果返回true,元素a添加失败;否则将元素a添加到b元素所在的链表中
对于链表中的存放顺序,jdk7和jdk8有所不同
jdk7:元素a放在数组中,指向原来的元素
jdk8:原来的元素在数组中,指向元素a
总结:七上八下
HashSet 集合判断两个元素相等的标准:
两个对象通过 hashCode() 方法比较相等,并且两个对象的 equals() 方法返回值也相等。
HashSet的底层:数组+链表+红黑树
三、LinkedHashSet
它是HashSet的子类
它相比于HashSet,多了个双向链表来维护元素的次序,因此它能根据插入的顺序遍历出来。但是它实际上存储的时候还是无序的。
四、TreeSet
可以按照对象指定的属性进行排序
特点:
1.不能添加不同数据类型的数据,要求添加进来的数据类型相同
2.要求添加的数据具备比较性
3.它是根据compareTo()来判断元素是否相同的
4.它的底层是红黑数
两种方法让数据具备比较性:
1)自然排序:让类实现Comparable接口
package set.treeset;
import org.testng.annotations.Test;
import java.util.Iterator;
import java.util.TreeSet;
/**
* Created by lenovo on 2020/11/17.
*/
class User implements Comparable
{
int age;
String name;
public User() {
}
public User(int age, String name) {
this.age = age;
this.name = name;
}
@Override
public String toString() {
return "User{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
@Override
public int compareTo(Object o) {
if(!(o instanceof User))
throw new RuntimeException("输入类型不匹配");
User user= (User) o;
int compare=this.name.compareTo(((User) o).name);
if(compare==0){
compare=Integer.compare(this.age,user.age);
}
return compare;
}
}
public class TreeSetDemo {
@Test
public void test(){
TreeSet set=new TreeSet();
set.add(new User(20,"zhangsan"));
set.add(new User(21,"lisi"));
set.add(new User(22,"lisi"));
set.add(new User(22,"wangwu"));
set.add(new User(20,"zhangsan"));
Iterator iterator=set.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
}
}
执行结果:
2)定制排序:
package set.treeset;
import org.testng.annotations.Test;
import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;
/**
* Created by lenovo on 2020/11/17.
*/
class User implements Comparable
{
int age;
String name;
public User() {
}
public User(int age, String name) {
this.age = age;
this.name = name;
}
@Override
public String toString() {
return "User{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
@Override
public int compareTo(Object o) {
if(!(o instanceof User))
throw new RuntimeException("输入类型不匹配");
User user= (User) o;
int compare=this.name.compareTo(((User) o).name);
if(compare==0){
compare=Integer.compare(this.age,user.age);
}
return compare;
}
}
public class TreeSetDemo {
@Test
public void test2(){
Comparator comparator=new Comparator() {
@Override
public int compare(Object o1, Object o2) {
int compare=0;
if((o1 instanceof User)&&(o2 instanceof User)){
User user1= (User) o1;
User user2= (User) o2;
compare=Integer.compare(user1.age,user2.age);
if(compare==0){
compare=user1.name.compareTo(user2.name);
}
}
return compare;
}
};
TreeSet set=new TreeSet(comparator);
set.add(new User(20,"zhangsan"));
set.add(new User(21,"lisi"));
set.add(new User(22,"lisi"));
set.add(new User(22,"wangwu"));
set.add(new User(20,"zhangsan"));
Iterator iterator=set.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
}
}
执行结果: