一,简述:
1. Collection接口
(1) Set接口
常用的实现类有:HashSet、TreeSet
(2) List接口
常用的实现类有:ArrayList、LinkedList、Vector
(3) Map接口
常用的实现类有:HashMap、TreeMap
二,常用实现类。
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 新值 替换旧值,
并且把旧值返回。