架构
- ArrayList:线程不安全,底层数组,增删慢,查询快
- LinkedList:线程不安全,底层链表,增删快,查询慢
- Vector:线程安全,底层数组
- HashSet:元素不能重复,无序,增删慢,查询快
- LInkedHashSet:元素不能重复,无序,增删快,查询慢
- TreeSet:元素不能重复,有序
- TreeMap:有序
- HashMap:无序,增删慢,查询快
- LinkedHashMap:无序,增删快,查询慢
ArrayList线程不安全
两个线程同时往一个list中添加数据。list底层是数组,添加时做的操作是先判断数组长度,再添加。两个线程同时判断长度够,但是添加的时候,会出现数组下标越界,或者添加进去的是null。
public static void main(String[] args) throws InterruptedException {
ArrayList list = new ArrayList();
new Thread(new Runnable() {
@SneakyThrows
@Override
public void run() {
for (int i = 0; i < 10; i++) {
TimeUnit.MILLISECONDS.sleep(100);
list.add("T1" + i);
}
}
}, "T1").start();
new Thread(new Runnable() {
@SneakyThrows
@Override
public void run() {
for (int i = 10; i < 20; i++) {
TimeUnit.MILLISECONDS.sleep(100);
list.add("T2" + i);
}
}
}, "T2").start();
TimeUnit.SECONDS.sleep(2);
list.stream().forEach(System.out::println);
}
list数据查询的时候,就会出现插入为null的结果,使用vector则不会出现该情况