对比看待集合问题

从元素有序和重复看集合框架

List是有序,可重复。set无序不可重复,但是treeset有序。map无序,但treeMap有序 ,键值对中,键不可重复,值可以重复。

集合和数组

数组和集合都是用于存储对象数据的一种容器。数组长度是定长,但是集合长度可以变化。

ArrayList和LinkedList

ArrayList和LinkedList都是list接口下面的实现类。ArrayList查询快,linkedList增删改快。原因就是因为ArrayList底层是可变长数组结构,LinkedList是双向链表结构。ArrayList通过system.arraycopy方法进行扩容,复制为原来的1.5倍+1,linkedList通过Node扩容。Vector是个list接口下线程安全的实现类。他扩容为原来的2倍。

HashMap和HashTable

HashMap访问速度快,因为其存储对象是根据对象的键的hash值来存放的,根据键直接获取到其在数组中对应的位置。因为键对象不能重复,所以只允许一个null键。这样也无法避免键的hash值重复而造成hash冲突(碰撞),当hash值重复时,就会找到对应相同hash值下的数组位置,这个地方生成一个以这个数组里的元素为头的单链表用于解决hash冲突,对key求值生成相同hash值的就通过这个链表存放,jdk1.8后如果链表存放个数大于8,后面的就是通过红黑树存储。

HashTable是hashMap线程安全版,他支持同步。也就导致他写入速度慢。不允许有null值和null键,同时效率低。

HashTable和ConcurrentHashMap

hashTable和ConcurrentHashMap都是线程安全的,但是ConcurrentHashMap锁是分离的,内部分了很多不同的部分,每部分都是小的HashTable,所以支持并发。

你可能感兴趣的:(对比看待集合问题)