Set元素不可以重复,是无序的。
Set 接口的方法和Collection一致。
|——-HashSet:
内部数据结构是哈希表,是不同步的。
是通过HashCode和equals方法来完成判断对象的唯一性。
如果对象的hashcode值不同,不用判断equals方法。
如果对象的hashcode值相同,则判断equals方法是否为true。
如果为true,视为元素相同,不存。如果为false,那么视为元素不同,就进行存储。
【注意】
1、如果元素要存储到HashSet集合中,就必须覆盖hashCode方法和equals方法。建立判断对象是否相同的依据。
2、如果想保证存入的元素有序,改用LinkedSet集合进行存储。
|——–TreeSet:
可以对元素进行排序,内部数据结构是二叉树,是不同步的,
判断元素唯一性的方法:就是根据比较方法的返回结果是否为0,是0,就是相同,不存。
TreeSet对元素进行排序的方式—:
让元素自身具备比较性,(元素对应的类要实现Comparable)接口。覆盖compare方法。
TreeSet对元素进行排序的方式二:
让集合自身具备比较功能,定义一个实现Comparator接口,覆盖compare方法。
将该类对象作为参数传递给TreeSet集合的构造函数。
【注意】
如果在集合的构造函数中传入了比较器。那么自动屏蔽元素自身具备的比较方法。
为了提高二叉树的查找效率,在在存入新的元素之前,对已有的有序元素进行折半,再确定新元素的位置。
代码演示:
1.创建要在集合中添加的类
public class Person implements Comparable{
private int age;
private String name;
public Person(int age, String name) {
super();
this.age = age;
this.name = name;
}
public int getAge() {
return age;
}
public String getName() {
return name;
}
@Override
public int compareTo(Object o) {
//强制类型转换
Person temp=(Person)o;
int flag=this.age-temp.age;
return flag==0?this.name.compareTo(temp.getName()):flag;
}
}
2.创建一个比较器类
import java.util.Comparator;
public class CompareByName implements Comparator {
@Override
public int compare(Object o1, Object o2) {
Person p=(Person)o1;
Person p1=(Person)o2;
int flag=p1.getName().compareTo(p.getName());
return flag==0?p1.getAge()-p.getAge():flag;
//根据二叉树的特性,如果想要元素有序存储,只需要更改返回值即可。
//例如:正序return 1;逆序return -1;
}
}
3.测试类
import java.util.Iterator;
import java.util.TreeSet;
public class TreeSetDemo {
public static void main(String[] agrs)
{
//创建一个TreeSet对象
TreeSet ts=new TreeSet(new CompareByName());
ts.add(new Person(16,"zhangsan"));
ts.add(new Person(20,"lisi"));
ts.add(new Person(20,"wangwu"));
ts.add(new Person(19,"zhouqi"));
Iterator it=ts.iterator();
while(it.hasNext())
{
Person p=(Person)it.next();
System.out.println(p.getAge()+"==="+p.getName());
}
}
}
测试结果: