一、ArrayList
ArrayList可以看做实现List接口的数组,它的容量是自增长的,机制是重新申请一个新的数组,然后把旧的copy到新的数组里,因此ArrayList增长的代价非常高昂。
ArrayList是一个非同步的数组列表,如果多个线程同时操作同一个ArrayList,其中一个进行修改,可能会引起安全性问题,所以最好在ArrayList的外部代码加锁。
对于ArrayList而言,它实现List接口、底层使用数组保存所有元素。其操作基本上是对数组的操作
ArrayList可以存储null。
二、LinkedList
LinkedList是非同步实现List接口的双向链表,可以存入null。
底层是链表节点,每个节点都是一个Entry,Entry包含previous,element,next。
三、HashMap
HashMap是非同步实现Map接口的实现类,允许存入null值null键,但不保证映射的顺序。
HashMap底层是数组,每个数组项是一个链表,是一个散列结构。

HashMap进行数组扩容需要重新计算扩容后每个元素在数组中的位置,很耗性能。
使HashMap能同步,可以使用这句Map m = Collections.synchronizedMap(new HashMap());
四、HashTable
HashTable 是同步的不允许存储null值的HashMap。
ArrayList可以看做实现List接口的数组,它的容量是自增长的,机制是重新申请一个新的数组,然后把旧的copy到新的数组里,因此ArrayList增长的代价非常高昂。
ArrayList是一个非同步的数组列表,如果多个线程同时操作同一个ArrayList,其中一个进行修改,可能会引起安全性问题,所以最好在ArrayList的外部代码加锁。
对于ArrayList而言,它实现List接口、底层使用数组保存所有元素。其操作基本上是对数组的操作
ArrayList可以存储null。
二、LinkedList
LinkedList是非同步实现List接口的双向链表,可以存入null。
底层是链表节点,每个节点都是一个Entry,Entry包含previous,element,next。
三、HashMap
HashMap是非同步实现Map接口的实现类,允许存入null值null键,但不保证映射的顺序。
HashMap底层是数组,每个数组项是一个链表,是一个散列结构。

HashMap进行数组扩容需要重新计算扩容后每个元素在数组中的位置,很耗性能。
使HashMap能同步,可以使用这句Map m = Collections.synchronizedMap(new HashMap());
四、HashTable
HashTable 是同步的不允许存储null值的HashMap。