一、Set集合 Set集合类似于一个罐子,程序可以依次把多个对象“丢进”Set集合,而Set集合通常不能记住元素的添加顺序。 Set集合不允许包含相同的元素,如果试图把两个相同的元素加入同一个Set集合中,则添加操作失败,add()方法返回false,且新元素不会被加入。 Set常用方法 1.HashSet类 HashSet类是Set接口的典型实现类,大多数时候使用Set集合时就是使用这个实现类。HashSet类按Hash算法来存储集合中的元素,因此具有很好的存取和查找性能。 HashSet类具有以下特点: 不能保证元素的排列顺序,顺序可能与添加顺序不同,顺序也有可能发生变化。 HashSet不是同步的(不是线程安全的),如果多个线程同时访问一个 HashSet,假设有两个或者两个以上线程同时修改了 HashSet集合时,则必须通过代码来保证其同步。 集合元素值可以是null,但只能放入一个null。 当向 HashSet集合中存入一个元素时,HashSet会调用该对象的hashCode()方法来得到该对象的hashCode值,然后根据该hashCode值决定该对象在HashSet中的存储位置。如果有两个元素通过equals方法比较返回true,但它们的hashCode()方法返回值不相等, HashSet将会把它们存储在 不同的位置,依然可以添加成功。 HashSet判断元素是否相等的依据:hashCode()相同,equals()方法相同; 2.LinkedHashSet类 HashSet类还有一个子类LinkedHashSet,LinkedHashSet集合也是根据元素的hashCode值来决定元素的存储位置,但它同时使用链表维护元素的次序,这样使得元素看起来是以插入的顺序保存的。也就是说,当遍历LinkedhashSet集合里的元素时,LinkedHashSet将会按元素的添加顺序来访问集合里的元素。 LinkedHashSet需要维护元素的插入顺序,因此性能略低于HashSet的性能,但在迭代访问Set里的全部元素时将有很好的性能,因为它以链表来维护内部顺序。 3.TreeSet类 TreeSet是SortedSet接口的实现类,正如SortedSet名字所暗示的,TreeSet可以确保集合元素处于排序状态。与Set集合相比,TreeSet还提供了如下几个额外的方法。 4. 各Set实现类的选择 HashSet和TreeSet是Set的两个典型实现,如何选择HashSet和TreeSet?HashSet的性能总是比TreeSet好(特别是最常用的添加、查询元素等操作),因为TreeSet需要额外的红黑树算法来维护集合元素的次序。 只有当需要一个保持排序的Set时,才应该使用TreeSet,否则一般都应该使用HashSet。HashSet还有一个子类:LinkedHashSet,对于普通的插入、删除操作,LinkedHashSet比HashSet要略微慢一点,这是由维护链表所带来的额外开销造成的,但由于有了链表,遍历LinkedHashSet会更快。 Set的实现类HashSet、TreeSet都是线程不安全的。如果有多个线程同时访问一个Set集合,并且有 超过一个线程修改了该Set集合,则必须手动保证该Set集合的同步性。通常可以通过Collections工具类的synchronizedSortedSet方法来“包装”该Set集合。 二、Queue 队列 Queue:基本上,一个队列就是一个先入先出(FIFO)的数据结构 Queue接口与List、Set同一级别,都是继承了Collection接口。LinkedList实现了Deque接口
|