- Collection划分为:List,Set,Queue
- List接口常见有:ArrayList,LinkedList,AbstractList, CopyOnWriteArrayList, Vector,Stack
- Set接口常见有:HashSet,TreeSet,LinkedHashSet,AbstractSet,CopyOnWriteArraySet,EnumSet
- Queue接口常见有:(阻塞队列)ArrayBlockQueue、PriorityBlockingQueue、LinkedBlockingQueue(双端队列)ArrayDeque、LinkedBlockingDeque、LinkedList
- Map一般使用:Hashmap、Treemap、Hashtable、AbstractMap、ConcurrentHashMap、 LinkedHashMap、WeakHashMap
一、Collection接口
最基本的集合接口。
二、List接口
List接口为Collection直接接口。List所代表的的是有序的Collection,即它用凑中特定的插入顺序来维护元素顺序。
实现List接口的集合主要有:ArrayList、LinkedList、Vecotr、Stack。
2.1 ArrayList 是一个【标记1】动态数组,也是我们最常用的集合。允许任何符合规则的元素插入,甚至包括null。每个ArrayList都有一个初始容量(10),该容量代表了数组的大小。每次向容器中增加元素的时候都会进行容量检查,数组快溢出时,就会进行扩容操作。扩容操作会浪费时间和效率,最好在操作之前明确插入元素的数量。
public ArrayList(int initialSize);
2.2 LinkedList LinkedList【标记2】是一个双向链表。所以它除了有ArrayList的基本操作方法之外还额外提供了get,remove,insert方法在LinkedList的首部或尾部。LinkedList继承了AbstractSequentialList。LinkedList不能随机访问,它所有的操作都是要按照双重链表的需要执行。在列表中索引的操作将从开头或结尾遍历列表(从靠近指定索引的一端)。这样做的好处就是可以通过较低的代价在List中进行插入和删除操作。ArrayList和LinkedList都是非同步的。如果多个线程同时访问一个List,必须自己实现访问同步。
List list = Collections.synchronizedList(new LinkedList(...));
2.3 Vector 和ArrayList相似,但是Vector是同步的,所以说Vector是线程安全的动态数组。
2.4 Stack Stack 继承自Vector,实现一个后进先出的堆栈。Stack提供5个额外的方法使得Vector可以当做堆栈使用。
push();//将元素入栈
pop();//删除最后一个元素,并返回该元素的值。
peek();//得到栈顶元素
empty();//测试堆栈是否为空
search();//检测元素在栈内位置
三、Set接口
Set是一种不包括重复元素的Collection。它维持自己的内部排序,所以随机访问没有任何意义【标记3】。由于Set接口的特殊性,所有传入Set集合的元素都必须不同,同时要注意任何可变对象,如果在对集合元素进行操作时,导致导致e1.equals(e2)==true,则必定会产生某些问题。实现了Set接口的集合有:EnumSet、HashSet、TreeSet。
3.1 EnumSet 是枚举的专用Set,所有的元素都是枚举类型。
3.2 HashSet 堪称查询速度最快的集合,因为其内部由HashCode实现,其内部元素的顺序由哈希吗来决定,所以不保证set的迭代顺序。
3.3TreeSet 基于TreeMap,生成一个总是处于排序状态的Set,内部以TreeMap实现,使用元素的自然顺序对元素进行排序,或根据创建Set时提供的Comparator进行排序,具体排序方式取决于构造方法。
四、Map接口【标记4】
Map与List、Set接口不同,它是由一系列键值对组成的集合,提供了key到Value的映射。没有继承Collection接口。在Map中它保证了key与value的一一对应关系,所以它不能存在相同的key值,实现map的有:HashMap、TreeMap、HashTable、Properties、EnumMap。
4.1 HashMap 以哈希表数据结构实现,查找对象时通过哈希函数计算其位置,可以说是为快速查询而设计的,内部定义了一个hash表数组(Entry[] table),通过哈希转换函数将元素的哈希地址转换成数组中存放的索引,如果有冲突,则使用散列链表的形式将所有相同哈希地址的元素穿起来。
4.2 TreeMap 键以某种排序规则排序,内部以红黑树数据接口实现,实现了SortMap接口
4.3 HashTable 也以哈希表数据结构实现,解决冲突时与HashMap也一样也是采用了散列链表的形式,不过性能比HashMap要低。
标记1:
静态数组是在声明时已经确定子数组大小的数组,即数组元素的个数固定不变。
动态数组并不是真正意义上的动态的内存,而是一块连续的内存,当添加新的元素时,容量已经等于当前的大小的时候(存不下了),执行下面3步
- 重新开辟一块大小为当前容量两倍的数组
- 把原数据拷贝过去
- 释放掉旧的数组
最后再把这个元素加在后面。
标记2:
1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
2.对于随机访问get和set,ArrayList绝对优于LinkedList,因为LinkedList要移动指针。
3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。
这一点要看实际情况的。若只对单条数据插入或删除,ArrayList的速度反而优于LinkedList。但若是批量随机的插入删除数据,LinkedList的速度大大优于ArrayList. 因为ArrayList每插入一条数据,要移动插入点及之后的所有数据。
标记3:set是不能随机存取的,而且set的顺序是不固定的,读的顺序跟存的顺序也不同。set集合是根据哈希值来进行存储。
标记4:
1、HashMap通过hashcode对其内容进行快速查找,而TreeMap中所有的元素都保持着某种固定的顺序,如果你需要得到一个有序的结果你就应该使用TreeMap(HashMap中元素的排列顺序是不固定的)。HashMap中元素的排列顺序是不固定的)。
2、 HashMap通过hashcode对其内容进行快速查找,而TreeMap中所有的元素都保持着某种固定的顺序,如果你需要得到一个有序的结果你就应该使用TreeMap(HashMap中元素的排列顺序是不固定的)。集合框架”提供两种常规的Map实现:HashMap和TreeMap (TreeMap实现SortedMap接口)。
3、在Map 中插入、删除和定位元素,HashMap 是最好的选择。但如果您要按自然顺序或自定义顺序遍历键,那么TreeMap会更好。使用HashMap要求添加的键类明确定义了hashCode()和 equals()的实现。 这个TreeMap没有调优选项,因为该树总处于平衡状态(多看看数据结构)。
来自:
http://www.cnblogs.com/chenssy/p/3495238.html
https://www.cnblogs.com/yyf0309/p/vector.html
==============================================================================
差不多都是对着敲的,抄一遍有助自己理解,chenssy大佬总结的好棒,大家可以多看看他的博客