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:
entry
连接起来,这样是为保证元素的迭代顺序跟插入顺序相同