Java 集合基础

ArrayList:

1.允许为空、允许重复、有序、非线程安全

2.底层以elementDate数组实现,初始数组大小为10,扩容是(当前size*3)/2+1

3.顺序插入(在数组尾部直接插入)时速度较快,当在指定位置插入或者删除元素时涉及到数据搬运,速度会较慢。

LinkedList:

1.允许为空、允许重复、有序、非线程安全

2.底层以双向列表实现(每个元素前后都有个引用地址)

3.插入和删除数据时只需查到到数据位置然后改变前后引用,查询时底层实现会判断查找位置大于或小于列表中间位置,确定往前查找还是往后查找。

所以,如果待插入、删除的元素是在数据结构的前半段尤其是非常靠前的位置的时候,LinkedList的效率将大大快过ArrayList,因为ArrayList将批量copy大量的元素;越往后,对于LinkedList来说,因为它是双向链表,所以在第2个元素后面插入一个数据和在倒数第2个元素后面插入一个元素在效率上基本没有差别,但是ArrayList由于要批量copy的元素越来越少,操作速度必然追上乃至超过LinkedList。

从这个分析看出,如果你十分确定你插入、删除的元素是在前半段,那么就使用LinkedList;如果你十分确定你删除、删除的元素在比较靠后的位置,那么可以考虑使用ArrayList。如果你不能确定你要做的插入、删除是在哪儿呢?那还是建议你使用LinkedList吧,因为一来LinkedList整体插入、删除的执行效率比较稳定,没有ArrayList这种越往后越快的情况;二来插入元素的时候,弄得不好ArrayList就要进行一次扩容,记住,ArrayList底层数组扩容是一个既消耗时间又消耗空间的操作。

HashMap:

1.key,value都允许为空、key不能重复否则value值会被覆盖、无序、非线程安全

2.底层以单向列表实现,初始化大小为16的Entry数组,每次扩充为原来的2倍

3.当添加元素key为空时,会放在第一个位置,put操作时会重新计算key的hashCode,HashMap它的顺序是基于HashCode,HashCode是一个随机性很强的数字,所以HashMap中的Entry完全是随机存放的。HashMap又不像LinkedHashMap这样维护了插入元素的顺序

HashTable:

1.key,value都不允许为空、key不能重复否则value值会被覆盖、无序、非线程安全

2.每次扩充为原来的2n+1

3.hashTabel的对外方法都用synchronized修饰了

LinkedHashMap:

1.key,value都允许为空、key不能重复否则value值会被覆盖、有序、非线程安全
2.LinkedHashMap可以认为是HashMap+LinkedList,即它既使用HashMap操作数据结构,又使用LinkedList维护插入元素的先后顺序,采用双向链表(doubly-linked list)的形式将所有entry连接起来,这样是为保证元素的迭代顺序跟插入顺序相同
3.每次访问一个元素(get或put),被访问的元素都被提到最后面去了

TreeMap:
1.TreeMap是用红黑树作为基础实现的,红黑树是一种二叉搜索树,特点是左子树的值小于根节点,右子树的值大于根节点




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章