JAVA容器

 Iterable->Collection->List/Set
 Map

Collection接口

 JDK中没有提供Collection的直接实现,而是提供了Set List的直接实现。
 Collection接口中定义了很多集合接口通用的方法,toArray()和toArray(T[] a)是算法中常用的方法。

List接口

  List即序列,是有序的Collection。因为有索引所以可以通过索引的方式获取和改动成员(get/set方法)。值得一提的是List有4中方式获得元素:get、iterator、listIterator的两个重载。注意这几种方式对于不同的实现类的效率是不同的,比如LinkedList 如果调用get来获取某个元素则会从头到这个元素的,因而索引值越靠近中间效率越低(双向链表)。这时候在列表元素上迭代通常要比索引遍历要强。(如果用get遍历,越靠后的时间越长)
典型实现类:
 Vector:这个类的底层实现方式是数组,他会初始申请大小为10的数组空间,如果大小大于10了之后会增加capacityIncrement个(这是Vector的一个字段,如果初值为0,0的话并不是不扩大,而是扩大一倍)。允许存null

 ArrayList:这个类的size isEmpty get set iterator listIterator操作都是以固定的时间运行的,这取决于ArrayList的底层实现方式是数组,参考文章http://zhangshixi.iteye.com/blog/674856。因而对于定点查询和修改的操作要快。ArrayList是Vector的非同步版本,因而是线程不安全的,但是合理使用锁效率会高,另外ArrayList满了会申请当前大小一半的额外空间,并且没有像Vector一样提供构造函数来修改这个值。允许存null

 LinkedList:底层实现方式是双向循环链表,参考文章http://www.cnblogs.com/ITtangtang/p/3948610.html,所以对于add和remove以及对首个和尾元素的操作要比ArrayList快,因为数组要重新申请大小然后构造,链表只需要把下一跳上一跳地址进行相应修改。也不是同步的实现方式。允许存null

Set接口

 Set是一个不包含重复元素(这里的重复是equals返回true)的collection,一般是无序的。最多只能包含一个null,在某些实现类中则不允许null。实现方式往往依赖某种Map
经典实现类:
 HashSet:底层实现方式是HashMap,参考文章http://alex09.iteye.com/blog/539549。将要存的对象放到Map的Key中,value中则存放一个静态的对象: static final Object PRESENT = new Object()。允许null,不同步

 TreeSet:基于TreeMap和NavigableSet实现,使用元素的自然顺序对元素进行排序,或者根据创建 set 时提供的 Comparator 进行排序,具体取决于使用的构造方法。add,remove等基本操作log(n)的时间开销。

Map接口

 Map提供三种集合视图keys、values和key-values。
经典实现类:
 HashMap的底层实现方式是Entity[],参考文章http://zhangshixi.iteye.com/blog/672697以及http://blog.csdn.net/lksodit_yiyi/article/details/7926130,每个Entity中不仅有k和v,而且还有下一个Entity对象:next(对象名本质是指针),这个next很有用通过hash算法得出key在数组中的位置可能出现相同的情况,如果相同的话,需要放到原来的那个的下一跳的位置,而不是数组里新的位置。HashMap其实并不能通过get/set(index)获取数组中的每个元素,在put的时候其实是根据key的Hash算法进行排序存储的。如果是null则放在数组首位。默认数组大小是16,加载因子是0.75,16*0.75=12,也就是存的值超过12的时候就要申请一倍的空间即32大小的空间来存。为什么不是16的时候呢?如果你有这样的疑问可能你还没搞懂存储模式。我会在后面仔细介绍HashMap的存储模式。

 HashTable底层实现方式和HashMap一致,但是不允许键或值为null,而且是非同步的。

 LinkedHashMap与HashMap的不同之处在于维护一个插入顺序的链表,该链表定义了迭代顺序,即插入的顺序。

 TreeMap基于红黑树(Red-Black tree)的 NavigableMap 实现。像TreeSet一样根据键排序,性能也类似。因为是经过排序的,所以如果要按照自然顺序或给定排序方式来遍历的话,性能较好。
小结:
 1 List接口用于需要get/set或者模拟堆栈、队列(LinkedList)的场景;Set接口用于非重复,接近数学中的集合概念;Map则是键值对;
 2 一般Hashxxx都是访问速度较快,因为Hash算法快速找到数组中的位置。LinkedHashxxx则是按照插入顺序遍历的。Treexxx是按照自然顺序(或给定规则)遍历输出的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值