<
java容器、集合
>
上一篇

WebSocket
下一篇

java框架

集合

collection的子类

1.set:无序,不可重复。

2.list:有序,可重复。

(1)LinkList:底层实现是链表,插入、删除、改比较快,查询慢些。线程不安全,效率高。

(2)ArrayList:底层实现是数组,查询比较快,插入、删除、改慢些。线程不安全,效率高。

(3)Vector:底层实现是数组。线程安全,效率低。

注意:重复指的是,equals相等。

层次图:

image

(4)关于ArrayList在遍历的同时删除元素

a.使用for循环遍历删除:错误,删除时,改变了元素的index和size,可能会有数组越界访问等问题

b.使用增强for循环(foreach)遍历删除:删除一个元素没有问题,删除多个元素会报错ConcurrentModificationException

c.使用迭代器Iterator遍历循环删除:正确,但是必须使用迭代器的remove方法,且remove之前必须显式调用next方法,否则会出错

注意:对于并发容器CopyOnWriteArrayList集合来说,需要使用增强for循环删除元素,使用迭代器的方法反而会报错

3.map:键值对存储,key不可重复,value可重复。

(1)HashMap:底层使用数组+链表实现,数组线程不安全。

只允许一个键的值是null,允许多个value的值是null。

不支持线程同步(多个线程可以同时读取 HashTable),线程不安全。

如果要使线程安全,可以使用Collections的synchronizedMap方法进行同步,或者使用ConcurrentHashMap。

(2)HashTable:底层使用数组和链表,线程安全(实现线程安全的方法,修改时锁住整个 HashTable,让线程独占,效率低)。

不支持键或者值为null。

支持线程同步,同一时刻只有一个线程可以操作 HashTable,所以他写入的速度比较慢。

(3)ConcurrentHashMap:底层使用数组+链表实现,线程安全(使用锁分离技术),效率比 HashTable 高。

ConcurrentHashMap锁分离技术:一次锁住一个桶,默认将hash分成16个表,如remove、get、put只锁住当前需要用到的桶。这样原来每次只能有一个线程进入,现在每次就可以就有16个线程可以进入,提高并发能力。

Top
Foot