Set:元素是无序的(存入和取出的顺序不一定一致),元素不可以重复。
|--HashSet:底层数据结构是哈希表(存放哈希值的表)
|--TreeSet:可以对Set集合中的元素进行排序,底层是二叉树.
- TreeSet排序第一种方式:让元素自身具备比较性。元素需要实现Comparable接口,覆盖compareTo方法。这种方式也称为元素的自然顺序,或者叫做默认顺序。
- TreeSet排序第二种方式:当元素自身不具备比较性时,或者具备的比较性不是所需要的,这就需要让集合自身具备比较性。定义比较器实现Comparator接口,将比较器对象作为参数传递给TreeSet集合的构造函数。定义一个类,实现Comparator接口,覆盖compare方法。
Q:HashSet是如何保证元素唯一性的呢?
A:通过hashCode()方法和equals()方法完成。如果元素的hashCode相同,则用equals判断;如果hashCode不同,不会再调用equals()。
所以判断元素是否存在以及删除等操作,是调用完hashCode()后再调用equals()来判断。
Q:TreeSet是如何保证元素唯一性的呢?
A:保证元素唯一性的方法是compareTo方法返回0.
最后来一个例子:将字符串放入容器TreeSet并按照字符串长度排序。
import java.util.*;
class Cmprt implements Comparator //比较器
{
public int compare(Object o1, Object o2)
{
String s1 = (String)o1;
String s2 = (String)o2;
int result = new Integer(s1.length()).compareTo(new Integer(s2.length())); //调用Integer的compareTo方法比较
if(result != 0)
return result;
else
return s1.compareTo(s2); //如果长度相等,比较字符串
}
}
class TreeSetDemo
{
public static void main(String[] args)
{
TreeSet t = new TreeSet(new Cmprt()); //Cmprt其实可以写为匿名内部类
t.add("aaaaaaaa");
t.add("dsads");
t.add("iojojoi");
t.add("sbcc");
t.add("abcd");
Iterator i = t.iterator();
while(i.hasNext())
System.out.println(i.next());
}
}