集合总结

一 ,java集合框架概览。



 一,简述:
1. Collection接口
(1) Set接口
经常使用的实现类有:HashSet、TreeSet
(2) List接口
经常使用的实现类有:ArrayList、LinkedList、Vector
(3) Map接口
经常使用的实现类有:HashMap、TreeMaphtml

 二,经常使用实现类。java

 List:集合中的元素有序,元素值可重复。数组

 List 有两个经常使用的实现类,ArrayList和LinkedList安全

 

1,ArrayList:长度可变的的数组数据结构

(1)数据结构:一个长度可变的数据多线程

(2)特色:查找快,增删改速度相对较慢。并发

        当调用默认构造方法建立ArrayList对象的时候,默认会建立一个长度为10的数组。框架

        当达到数组长度上限的时候,会1.5倍的增加长度函数

 

 

2,LinkedList性能

(1)数据结构:双向链表

(2)特色:增删改速度较快,查询的速度较慢。

 

Set:集合中的元素无序,元素不可重复;

3,HashSet

(1)数据结构:哈希表(用HashMap中的key实现的)

(2)特色:不能出现“重复”元素,集合中的没有顺序。

         容许出现null,可是只能出现一次。为了HashSet能够正常工做,放入其中的元素须要重写 hashCode 和equals方法

         由于结合中的元素不能重复,当添加一个元素的时候会先判断hashcode值是否相同(hascode算出的是哈希表中的索引,这个索引下可能会有多个元素)

         ,而后在调用equals逐个进行比较(不了解哈希表的人 能够baidu/google)

         这种比较方式是高效的。若是仅仅用equals的话,当数据不少的时候逐个比较起来会很低效。

 

4,TreeSet

(1)数据结构:红黑树,也就说是一棵自平衡的排序二叉树,这样就能够保证当须要快速检索指定节点(利用TreeMap中的Key实现的)。

(2)特色:不可重复,可是有序。能对集合中的对象进行排序,有两种排序的方式

         第一,集合中的元素须要实现Comparable接口。内部会调用compareTo()方法进行比较

         第二,在建立TreeSet的时候在构造函数中传入一个比较器Comparator。集合中的元素就会按照比较器中规定的方式进行排序(这个方式是优先执行)

 

Map key-value一 一 对 应。

Map 常见的实现类 HashMap TreeMap。(key的特色 已经在上面的Set中说过了)

 5,HashMap

(1)数据结构:用哈希表实现的map结构,存储形式都是键值对

(2)特色:key不能重复,无序。 value 能够重复 ,容许 null key null value

 

6,TreeMap

(1)数据结构:用红黑树实现的map结构,存储形式都是键值对

(2)特色:key有序,不可重复。value能够重复

 

7,vector

 (1)数据结构:数组

 (2)特色:线程安全,若是达到数组长度上限,2倍增加,由于是线程安全的因此效率低于ArrayList

 

8,HashTable

 (1)数据结构:哈希表实现的map结构

 (2)特色:线程安全,因此效率HashMap 不容许出现空 key value

 

三,使用集合类的一些技巧

      1,若是使用到堆栈,队列,首先应该考虑List。若是涉及大量的 增长 删除 操做应该考虑 LinkedList

若是涉及到 大量的随机访问 应该考虑 ArrayList ,另外Arraylist 默认初始化一个10长度的数组,

增加倍数是1.5倍,因此若是要给ArrayList添加大量数据的时候应该 初始化一个较大的 Arraylist

或者调用 ensureCapacity(int minCapacity) 增长 ArrayLisy的长度。在一些主球效率的

程序中能够用数组去代替ArrayLisy,由于使用数组(Array)避免了同步、额外的方法调用和没必要要的

从新分配空间的操做。

 

     2,单线程中使用 非同步类的 效率要高 LinkedList、ArrayList、HashSet、TreeSet、HashMap、            TreeMap 多线程中 应该考虑的是“并发容器” 而不是“同步容器” 并发容器有:ConcurrentHashMap

 CopyOnWriteArrayList 等等 性能要高于 同步容器 Vector 和 HashTable

 

     3,返回值类型尽可能是接口,为了 若是须要更改 数据结构,例如把数据结构 ArrayList 更改成

LinkedList 的时候 调用端,也就是客户端代码不用改变。

 

     4,注意集合中的一些方法 remove(Object obj)、indexOf(Object obj)、contains(Object obj)

会遍历集合 调用 equals 方法。若是集合很大,效率会比较低。

 

     5,在操做底层为哈希表的集合的时候,注意合理重写 equals 和 hashCode方法

 

     6,注意 map 中put (key,value) 一个元素的时候 若是 put的key已经“存在” value 新值 替换旧值,

而且把旧值返回。