元素不能重复
- TreeSet:基于红黑树实现,支持有序性操作,例如根据一个范围查找元素的操作。
但是查找效率不如 HashSet,HashSet 查找的时间复杂度为 O(1),TreeSet 则为 O(logN)。 - HashSet:基于哈希表实现,支持快速查找,但不支持有序性操作。
并且失去了元素的插入顺序信息,也就是说使用 Iterator 遍历 HashSet 得到的结果是不确定的。 - LinkedHashSet:具有 HashSet 的查找效率,且内部使用双向链表维护元素的插入顺序。
实现类
HashSet
HashSet扩展AbstractSet并且实现Set接口。
无序排列
基于哈希表实现,支持快速查找,但不支持有序性操作。
失去了元素的插入顺序信息,也就是说使用 Iterator 遍历 HashSet 得到的结果是不确定的。HashSet(); // 建立默认的散列集合
HashSet(Collection c); // 用c中元素初始化散列集合
HashSet(int capacity); // 建立指定初始化容量的散列集合
HashSet(int capacity,float fillRatio); // 初始化容量和填充比(加载容量)的散列集合
/**
* 填充比必须介于0.0~1.0之间,它决定在散列集合向上调整大小之前,有多少能被充满。
* 具体说,就是当元素个数大于容量*填充比时,散列集合扩大
* 没有填充比的构造方法,默认0.75
*/
判断重复元素,需要靠hashCode和equals
class Box {
private String name;
private Integer size;
public Box(String name,Integer size){
this.name=name;
this.size=size;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
Box box = (Box) o;
return Objects.equals(name, box.name) &&
Objects.equals(size, box.size);
}
@Override
public int hashCode() {
return Objects.hash(name, size);
}
@Override
public String toString(){
return "name:"+this.name+"-size:"+this.size+"\n";
}
}
public class Main {
public static void main(String[] args) throws Exception{
Set<Box> all = new HashSet<>();
all.add(new Box("Java",3));
all.add(new Box("Java",3));
all.add(new Box("JSP",3));
all.add(new Box("Android",5));
System.out.println(all);
}
}
TreeSet
TreeSet为使用树来进行存储的Set接口提供了一个工具,对象按升序自动存储。
在存储了大量的需要进行快速检索排序信息的情况下,TreeSet是一个很好的选择。
基于红黑树实现,支持有序性操作,例如根据一个范围查找元素的操作。 但是查找效率不如 HashSet,HashSet 查找的时间复杂度为 O(1),TreeSet 则为 O(logN)。
TreeSet(); // 建立空的树集合,该树集合将根据其元素的自然顺序按升序排序。
TreeSet(Collection c); // 构造了包含c的元素的树集合
TreeSet(Comparator comp); // 构造了空的树集合,它按照由comp指定的比较方法进行排序
TreeSet(SortedSet ss); // 构造包含ss的元素的树集合
TreeSet排序
class Box implements Comparable<Box> {
private String name;
private Integer size;
public Box(String name,Integer size){
this.name=name;
this.size=size;
}
@Override
public String toString(){
return "name:"+this.name+"-size:"+this.size;
}
@Override
public int compareTo(Box o) {
if (this.size > o.size){
return 1;
}else if(this.size < o.size){
return -1;
}else {
return this.name.compareTo(o.name);
// return 0;
}
}
}
public class Main {
public static void main(String[] args) throws Exception{
Set<Box> all = new TreeSet<>();
all.add(new Box("A",3));
all.add(new Box("B",2));
all.add(new Box("C",1));
System.out.println(all);
}
}
LinkedHashSet
具有 HashSet 的查找效率,且内部使用双向链表维护元素的插入顺序。