总结一下这两天看的有关Set的东西
Set是Collection的子类,当中的数据元素是无序不可重复的,Set判断两个对象是否相同不是通过“==”号,而是通过equals方法比较的,也就是说只要equals方法比较返回true,则这两个对象不能同时添加到Set中。
public class TestSet {
public static void main(String[] args) {
Set books = new HashSet();
books.add(new String("java"));
//再添加一个字符串
boolean result = books.add(new String("java"));
System.out.println(result);
}
}
上述代码将输出false.
HashSet是Set接口的实现,也是一般经常用的一个。HashSet是按Hash算法来存储集合中的元素的,因此具有很好的查找和存取性能。
HashSet有一下三个特点:
1.不能保证元素的顺序,顺序有可能变化;
2.元素可以为null;
3.不是线程同步的,如果有多个线程同时修改同一元素,需要用代码进行其同步。
HashSet是根据对象的HashCode决定对象的存储位置的,当两个对象通过equals方法比较返回true,但他们HashCode值不同,则HashSet将会把这两个对象存储在不同的位置。所以HashSet判断两个对象相等的条件是通过equals方法返回true,且hashcode值也相等。
Hash算法功能:通过一个对象快速找到另一个对象,hash算法的优点在于迅速,通过一个元素的值就可以得到该元素的存储位置,保证查询快速执行。
当需要将某个对象保存到HashSet集合里时,当重写equals方法返回true时,也应尽量保证HashCode的值相等。如果在一个集合里出现了几个HashCode值相同的对象,则会导致性能下降。
LinkedHashSet是HashSet的一个子类,它也是通过HashCode的值来存储元素位置的,不同的是其内部是通过链表来维护元素的顺序,也就是LinkedHashSet里的集合元素的顺序是元素添加时的顺序。因为要用链表进行顺序的维护,所以在性能上低于HashSet。
TreeSet是SortedSet接口的唯一实现,可以保证集合里的元素是有序的。TreeSet不是根据元素的插入顺序进行排序,而是根据元素的实际值。TreeSet有两种排序规则,是基于红黑树这种数据结构实现的。
1.自然排序:调用集合的compareTo方法比较元素之间的大小关系,然后将集合进行升序排序,这种排序时默认实现的。
2.定制排序:如要实现定制排序,如降序,则需要使用Comparator接口。
EnumSet是一个枚举类 的集合类,该集合里的所有值必须是指定枚举类型的枚举值。EnumSet里的元素是有序的,这种顺序是以枚举值在枚举类中的定义顺序来定义的。EnumSet不允许插入null值,会抛出空指针异常。EnumSet内部以位向量的形式存储,存储形式紧凑、高效,因次其占用内存小,运行效率高。