Set接口定义集合中没有重复元素,Java中有3种常用的Set实现:HashSet,TreeSet和LinkedHashSet。什么时候使用应该使用哪个需要根据实际情况来确认,比如:如果我们期望访问速度快,那么我们应该使用HashSet,如果我们需要一个有序集合,那么应该使用TreeSet, 如果我们想要保留其插入顺序,则应该使用LinkedHashSet。
- HashSet:基于哈希表实现,内部元素无序,基本方法增、删、判断是否存在(add, remove, and contains )时间复杂度O(1)。
- TreeSet:基于红黑树实现,内部元素有序,基本方法增、删、判断是否存在(add, remove, and contains )时间复杂度O(logN)。此外,TreeSet本身还提供实现了first(), last(), headSet(), tailSet()等方法来处理有序集合
- LinkedHashSet:基于哈希表,同时维护一个内部链表以维护元素插入顺序,基本方法增、删、判断是否存在(add, remove, and contains )时间复杂度O(1)。
TreeSet示例:
插入基础类型数据
TreeSet tree = new TreeSet();
tree.add(12);
tree.add(63);
tree.add(34);
tree.add(45);
Iterator iterator = tree.iterator();
System.out.print("Tree set data: ");
while (iterator.hasNext()) {
System.out.print(iterator.next() + " ");
}
结果输出:
12 34 45 63
定义对象:
class Dog {
int size;
public Dog(int s) {
size = s;
}
public String toString() {
return size + "";
}
}
插入对象
public class TestTreeSet {
public static void main(String[] args) {
TreeSet dset = new TreeSet();
dset.add(new Dog(2));
dset.add(new Dog(1));
dset.add(new Dog(3));
Iterator<Dog> iterator = dset.iterator();
while (iterator.hasNext()) {
System.out.print(iterator.next() + " ");
}
}
}
编译没有问题,但执行会抛出异常
Exception in thread "main" java.lang.ClassCastException:
collection.Dog cannot be cast to java.lang.Comparable
at java.util.TreeMap.put(Unknown Source)
at java.util.TreeSet.add(Unknown Source)
at collection.TestTreeSet.main(TestTreeSet.java:22)
因为TreeSet内部元素是有序的,所以对于插入到TreeSet中的对象需要实现java.lang.Comparable接口中的compareTo方法
class Dog implements Comparable{
int size;
public Dog(int s) {
size = s;
}
public String toString() {
return size + "";
}
@Override
public int compareTo(Object o) {
return ((Dog) o).size - size;
}
}
或者在TreeSet初始化时指定Comparator
class CatComparator implements Comparator<Cat> {
@Override
public int compare(Cat o1, Cat o2) {
return o1.size - o2.size;
}
}
TreeSet catSet = new TreeSet(new CatComparator());
Cat cat1 = new Cat(1);
Cat cat2 = new Cat(2);
Cat cat3 = new Cat(3);
Cat cat4 = new Cat(4);
catSet.add(cat1);
catSet.add(cat2);
catSet.add(cat3);
catSet.add(cat4);
System.out.println(catSet.size());