Java中各样集合问题

一,java种集合关系图

Collection            
   接口的接口      
          
 对象的汇集

–List          子接口
有序 可重复

  –LinkedList
               接口已毕类  链表  插入删除  没有共同  线程不安全

  –ArrayList
                 接口完结类  数组  随机访问  没有联手
 线程不安全

  –Vector    
                 接口已毕类  数组               同步      
 线程安全

    –Stack

–Set          
                   子接口  仅吸纳四次,并做内部排序  不可重复

  –HashSet

    –LinkedHashSet

  –TreeSet

 

Map                  
    接口                            键值对的聚集

–Hashtable      
     接口已毕类  同步        线程安全     不得以储存null值

–HashMap      
                 接口完结类  没有共同   线程不安全
 可以储存null值

  –LinkedHashMap

  –WeakHashMap

–TreeMap

–IdentifyHashMap

Map选拔哈希散列,查找元素时比ArrayList快

二、详细介绍

1、List接口

  1.1 次序是List最重点的特性,可以用索引来访问元素,允许有一致元素;

  1.2
除了Collection接口必备的iterator()方法,List提供了一个listIterator()方法,允许添加删减,设定元素,向前向后遍历;

  YutangkedList:对各类访问进行了优化,随机走访相对较慢

  1.3
林玉堂kedList允许null值,提供了addFirst(),getFirst()等格局在林玉堂kedList的首部或底部,使linkedList可被看做仓库,队列或双向队列;

  1.4 林语堂kedList没有一并方法,要是四线程访问时,必须协调落成访问同步

    如  List list=Collection.synchronizedList(new LinkedList(…));

  ArrayList:向List中间插入与移除元素的快慢很慢,随机访问相对较快

  1.5 ArrayList有数组达成,允许具备因素,包涵null

  1.6  ListIterator 只应该用来由后迈入遍历 ArrayList,
而不是用来插入和移除元素。因为那比 LinkedList 成本要大过多;

  Vector:

  1.7
由Vector创造的iterator被创立而且正在被使用,另一线程改变了vector的情形,那时调用
Iterator 的艺术时将抛出 ConcurrentModificationException
,由此必须捕获该越发

  Stack:

  1.8 已毕一个后进先出的库房,Stack 提供 5 个附加的主意使得 Vector
得以被看做储藏室使用。基本的 push 和 pop 方法,还有 peek
方法赢得栈顶的元素, empty 方法测试堆栈是还是不是为空, search
方法检测一个因素在仓房中的地点。 Stack 刚创制后是空栈;

2 Set接口

  2.1 set不有限帮忙维护元素的主次,最多有一个null值;

  2.2 Set的构造函数有一个束缚原则
,传入的Collection参数不可能包罗重复的要素;

  HashSet:

  LinkedHashSet:

  TreeSet:

3.Map接口

  3.1
可以用containsKey()和containsValue()测试Map中是或不是含有某个”键”或“值”,有内置的排序;

  3.2
HsahMap使用对象的hashCode()进行急忙查询,“散列码”是“绝对唯一”用以代表对象的
int 值,它是因而将该目标的某些新闻进行更换而变化的,所有 Java
对象都能暴发散列码,因为 hashCode() 是概念在基类 Object 中的方法;

  HashTable:

  3.3
实现了一个key-value映射的哈希表,任何非空对象都能够视作key或者value;

  3.4 添加多少put,去除数据get;

  3.5 Hashtable 通过初阶化容量 (initial capacity) 和负载因子 (load
factor) 七个参数调整性能,常常缺省的 load factor 0.75
较好地落成了光阴和空间的平均。增大 load factor
可以节省空间但相应的查找时间将附加,那会潜移默化像 get 和 put 那样的操作;

  3.6
作为key的靶子将经过测算散列函数来规定与之相应的value的岗位,由此任何作为
key 的目的都不可以不兑现 hashCode 方法和 equals 方法。hashCode 方法和 equals
方法继承自根类 Object ,假若您用自定义的类当作 key
的话,要一定小心,依照散列函数的概念,若是多个目的相同,即
obj1.equals(obj2)=true ,则它们的 hashCode
必须一致,但一旦多个目的分歧,则它们的 hashCode
不肯定差别,即使三个差别目的的 hashCode
相同,那种光景叫做争执,争持会导致操作哈希表的流年支出增大,所以尽可能定义好的
hashCode() 方法,能加快哈希表的操作;

  HashMap:

  3.7 hashmap非同步,允许null值。将 HashMap 视为 Collection 时(
values() 方法可回到 Collection
),插入和查询“键值对”的开销是一贯的,但其迭代子操作时间支出和 HashMap
的容量成比例。由此,即使迭代操作的属性非凡重大的话,不要将 HashMap
的开头化容量 (initial capacity) 设得过高,或者负载因子 (load factor)
过低;

  LinkedHashMap

  3.8 类似于 HashMap
,但是迭代遍历它时,取得“键值对”的依次是其插入次序,或者是近日起码使用
(LRU) 的主次。只比 HashMap
慢一点。而在迭代访问时发而更快,因为它应用链表维护内部次序;

  WeakHashMap:

  3.9 弱键( weak key ) Map 是一种立异的 HashMap
,它是为竭泽而渔出色题材安插的,对 key 举行 “ 弱引用 ” ,即使一个 key
不再被表面所引用(没有 map 之外的引用),那么该 key 可以被垃圾收集器
(GC) 回收;

  TreeMap:

  基于红黑树数据结构的兑现。查看“键”或“键值对”时,它们会被排序 (
次序由 Comparabel 或 Comparator 决定 ) 。 TreeMap
的表征在于,你获取的结果是经过排序的。 TreeMap 是绝无仅有的涵盖 subMap()
方法的 Map ,它能够回去一个子树;

  IdentifyHashMap:

  使用 == 代替 equals() 对“键”作比较的 hash map
。专为解决卓越题材而安插。

三  比较

1.数组(Array) 数组类(Arrays)

  1.1
java存储及随意访问延续串目的时,array最有功用,但缺点是容量固定且不能动态改变,不可能看清实际存在多少元素,length为容量;

  1.2 数组类专门操作数组,数组类拥有一组static函数:equals() ,fill()
,sort(),binarySearch() 在排好序的array中搜寻元素 ,System.arraycopy()
array复制;

  1.3 若编写程序时不知晓到底必要有些对象,需求在空中不足时自动扩增容量,则须求运用容器类库,
array 不适用;

2.容器(Collection)和map

  2.1
collection每个岗位唯有一个要素;map持有key-value对,像个小型数据库
( Collections.max(Collection coll); 取 coll 中最大的因素);

四、总结

1 List,Set,Map将持有对象一律视为object型别;

2 Collection 、 List 、 Set 、 Map 都是接口,不可能实例化。继承自它们的
ArrayList, Vector, HashTable, HashMap 是实际 class ,那一个才可被实例化;

3 使用keySet()抽取key系列,将 map 中的所有 keys 生成一个
Set(不可重复);

   使用 values() 抽取 value 种类,将 map 中的所有 values 生成一个
Collection ;

4 在各类 Lists ,对于需求快速插入,删除元素,应该选用 林和乐kedList (可用
LinkedList 构造堆栈 stack 、队列 queue
),假使须要急忙随机走访元素,应该利用 ArrayList 。最好的做法是以
ArrayList 作为缺省接纳。 Vector 总是比 ArrayList
慢,所以要尽量防止使用;

5 在种种 Sets 中, HashSet 日常优于 HashTree
(插入、查找)。唯有当要求发出一个透过排序的种类,才用 TreeSet 。
HashTree 存在的绝无仅有理由:可以保证其内元素的排序状态;在各个 Maps 中
HashMap 用于飞快搜索

6 当元素个数固定,用 Array ,因为 Array 作用是最高的

 

 

原文:http://blog.csdn.net/jackie03/article/details/7312481

 

相关文章