LinkList、ArrayList、Vector区别;及 Set

来源:互联网 发布:xls打开软件 编辑:程序博客网 时间:2024/06/05 15:11

先看下拓扑: 

          java.util

(1)Collection 
        +Collection 这个接口extends自 --java.lang.Iterable接口
           +List 接口 
              -ArrayList 类
              -LinkedList 类
              -Vector 类     此类是实现同步的

           +Queue 接口
              +不常用,在此不表.

           +Set 接口
              +SortedSet 接口
                 -TreeSet 类
              -HashSet

-------------------------------------------------------------------------------------------------------------------------    

(2)map

    +Map 接口
          -HashMap 类 (除了不同步和允许使用 null 键/值之外,与 Hashtable 大致相同.)
          -Hashtable 类 此类是实现同步的,不允许使用 null 键值
          +SortedMap 接口
             -TreeMap 类




1、线程安全:

  • LinkList、ArrayList 线程不安全,需要进行Collections.synchronizedList(List<T> list) 加同步锁
  • Vector 线程安全操作

    Vector是同步的。这个类中的一些方法保证了Vector中的对象是线程安全的。而ArrayList则是异步的,因此ArrayList中的对象并不是线程安全的。因为同步的要求会影响执行的效率,所以如果你不需要线程安全的集合那么使用ArrayList是一个很好的选择,这样可以避免由于同步带来的不必要的性能开销。

 

2、访问上:

  • LinkList 随机访问或者选取元素代价高
  • ArrayList 随机访问效率高,且时间恒定

3、向序列中插入新元素

  • ArrayList、Vector 都采用数组存储方式,都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢。
  • LinkList 使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快

4、当需要增长时,Vector默认增长为原来一培,而ArrayList却是原来的一半

 

从内部实现机制来讲ArrayList和Vector都是使用数组(Array)来控制集合中的对象。当你向这两种类型中增加元素的时候,如果元素的数目超出了内部数组目前的长度它们都需要扩展内部数组的长度,Vector缺省情况下自动增长原来一倍的数组长度,ArrayList是原来的50%,所以最后你获得的这个集合所占的空间总是比你实际需要的要大。所以如果你要在集合中保存大量的数据那么使用Vector有一些优势,因为你可以通过设置集合的初始化大小来避免不必要的资源开销。

 

5、LinkedList   调用.listIterator()产生一个ListIterator迭代器,可以很方便的进行元素操作 
              使用.hasprevious()、.previous()对集合进行向前、向后的遍例    
              使用.add()方法可以在集合的任意位置增加对象    
                    iter.next();       
                    iter.add("a");跳过第一个元素,将a添加到第二个元素之前。  
              使用.set()方法可以修改对象       
                    取代通过调用next或者previous方法而返回的上一个元素




二.Set的功能方法

 

Set(interface): 存入Set的每个元素必须是唯一的,因为Set不保存重复元素。加入Set的Object必须定义equals()方法以确保对象的唯一性。Set与Collection有完全一样的接口。Set接口不保证维护元素的次序。

 

HashSet: 为快速查找而设计的Set。存入HashSet的对象必须定义hashCode()。

 

TreeSet: 保持次序的Set,底层为树结构。使用它可以从Set中提取有序的序列。

 

LinkedHashSet: 具有HashSet的查询速度,且内部使用链表维护元素的顺序(插入的次序)。于是在使用迭代器遍历Set时,结果会按元素插入的次序显示。

 

HashSet采用散列函数对元素进行排序,这是专门为快速查询而设计的;TreeSet采用红黑树的数据结构进行排序元素;LinkedHashSet内部使用散列以加快查询速度,同时使用链表维护元素的次序,使得看起来元素是以插入的顺序保存的。需要注意的是,生成自己的类时,Set需要维护元素的存储顺序,因此要实现Comparable接口并定义compareTo()方法。

原创粉丝点击