Java 容器(Collection和Map)介绍

  • 概念分类 

    Java 2将容器分为两个不同的概念: Collection 与Map 

    Collection: 提供对一组各自独立的元素的集合,List 、Queue与和Set接口都继承自Collection接口。 

    Map:提供了一组key-value(键值对)。

  两种类型的主要区别在于: Collection类型每个位置只持有一个元素(Object),比如List以加入到容器中的先后顺序来持有一个独立的的对象。Set中的对象不得重复,并且它会使用自己内部的一种排序机制。Map类型所持有的是key-value(键值对)Map不接受重复的key

  • 容器分类

Java的所有容器类都实现了来自于List, Set, Map三种接口中的一个。我们可以通过Think in Java里面的类图来观察他们之间的关系:

  • List

List定义了一个线性表接口,Java2中的List实现方式分为两种:

 

ArrayList(插入慢、查找快) 是以array(数组)实现的线性表数据结构,其get(int index)方法的时间复杂度为O(1)。而其插入与删除操作的元素在中央时,其效率较低。因为每次都要对插入或删除位置(index)后面的array的进行数组拷贝。每个ArrayList实例都有一个容量(Capacity),即用于存储元素的数组的大小。这个容量可随着不断添加新元素而自动增加,但是增长算法并没有定义。当需要插入大量元素时,在插入前可以调用ensureCapacity方法来增加ArrayList的容量以提高插入效率.和LinkedList一样,ArrayList也是非同步的(unsynchronized)。

 

LinkedList (插入快、查找慢)是一个双向链表数据结构。其插入与删除操作效率要明显高于ArrayList而且其随机查找的时间复杂度为O(n) (其实每次随机查找的次数要依赖于size/2到要查找的目标index之间的个数)其查找的效率要低于ArrayListO(1)。LinkedList实现了List接口,允许null元素。此外LinkedList提供额外的get,remove,insert方法在 LinkedList的首部或尾部。这些操作使LinkedList可被用作堆栈(stack),队列(queue)或双向队列(deque)。注意LinkedList没有同步方法。如果多个线程同时访问一个List,则必须自己实现访问同步。一种解决方法是在创建List时构造一个同步的List: 
  List  list  =  Collections.synchronizedList(new  LinkedList(...)); 


Vector类非常类似ArrayList,但是Vector是同步的。由Vector创建的Iterator,虽然和ArrayList创建的 Iterator是同一接口,但是,因为Vector是同步的,当一个Iterator被创建而且正在被使用,另一个线程改变了Vector的状态(例如,添加或删除了一些元素),这时调用Iterator的方法时将抛出ConcurrentModificationException,因此必须捕获该异常。

Stack类继承自Vector,实现一个后进先出的堆栈。Stack提供5个额外的方法使得Vector得以被当作堆栈使用。基本的push和pop 方法,还有peek方法得到栈顶的元素,empty方法测试堆栈是否为空,search方法检测一个元素在堆栈中的位置。Stack刚创建后是空栈。

 

 

 

 

 

  • Set

Set是集合类,该集合不能有“重复”对象存在,Java2Set实现方式分成两种:

HashSet 将持有对象映射到在哈希表中。  (JDK1.6的内部实现是 HashSet只是个适配器,其将适配对象HashMap适配成了Set接口)

TreeSet 将持有对象放入RBTree(红黑树)中。(TreeSet也将适配对象TreeMap适配成了Set接口)

  • Queue

  • Map

Map是一组key-value(键值对)集合,其中的key()不能重复。实现Map接口的类有Hashtable、HashMap、TreeMap和SortedMap类。 

 

 

 

Hashtable是继承Dictionary类,Hashtable的方法是同步的。Hashtable的key和value都不能为null。  

 

 

 

HashMap实现Map接口的,HashMap的方法不是同步的。HashMap可以让null作为一个表的条目的key或value,但HashMap中只有一条记录可以是一个null的key,而任意数量的条目可以是null的value。

 

TreeMapkey对象为关键值存放在RBTree(红黑树)中。其get(Object key)方法的平均时间复杂度为O(logn)key对象为关键值存放在RBTree(红黑树)中。其get(Object key)方法的平均时间复杂度为O(logn)  

 

WeakHashMap是一种改进的HashMap,它对key实行“弱引用”,如果一个key不再被外部所引用,那么该key可以被GC回收

  • Iterator

 Iterator迭代器实现对: 哈希表HashMap,红黑树TreeMap,链表LinkedList,动态数组ArrayList等数据结构的迭代。

 

 

  • 总结

ArrayListLinkedList效率比较

ArrayList查找操作的效率最高为,但其在添加和删除操作时需要拷贝数组所以效率较低,尤其是删除操作。该数据结构适用于需要频繁快速查找的地方。

LinkList 查找操作效率较低为,但其插入与删除操作效率较高,适用于需要频繁进行插入删除操作的情况。

HashMapTreeMap效率比较

HashMap 的查找、添加、删除的效率都要高于TreeMap

TreeMap存在是唯一理由就是它内部是一个树形结构存储结构,而Java中的其他的容器都是线性的(arraylist,linkedlist)或者说是线性的扩展(hashmap)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值