本文已参与「新人创作礼」活动,一起开启掘金创作之路。
ArrayList 和 Vector: 都是使用数组方式存储数据,此数组元素数大于实际存储的数 据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组 元素移动等内存操作,所以索引数据快而插入数据慢,Vector 由于使用了 synchronized 方法(线程安全)。 通常性能上较 ArrayList 差。
LinkedList : 使用双向链表实现存储,按序号索引数 据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插 入速度较快 。 线程不安全。
总结:ArrayList 在查找时速度快,LinkedList 在插入与删除时更具优势。
关于性能测试代码:
@Test
public void 集合List性能测试 () throws InterruptedException {
LinkedList linkedList = new LinkedList();
ArrayList arrayList = new ArrayList();
Thread.sleep(1000);
long startTime = System.currentTimeMillis();
for(int i = 0 ;i<100000;i++){
if(i>=100){
arrayList.add(100,i);
}else{
arrayList.add(i);
}
}
long endTime = System.currentTimeMillis();
long startTime2 = System.currentTimeMillis();
for(int j=0;j<100000;j++){
if(j>=100){
linkedList.add(100,j);
}else{
linkedList.add(j);
}
}
long endTime2 = System.currentTimeMillis();
System.out.println("ArrayList程序运行时间:" + (endTime - startTime) + "ms"); //输出程序运行时间
System.out.println("LinkedList程序运行时间:" + (endTime2 - startTime2) + "ms"); //输出程序运行时间
}
总结:数组索引,读取性能方便快,中间插入就要命,双向链随便插入不会重新排,查询就没有数组索引那么快。
3.1.6 List线程安全的类
CopyOnWriteArrayList 适用于读多写少的场景,是以空间换时间的思想。
Vector
Collections.synchronizedList
3.1.7 . HashMap 的工作原理是什么
HashMap : Java 中的 HashMap 是以键值对 (key-value) 的形式存储元素的。HashMap 需要 一个 hash 函数,它使用 hashCode()和 equals()方法来向集合 / 从集合添加和检 索元素。当调用 put() 方法的时候,HashMap 会计算 key 的 hash 值,然后把键 值对存储在集合中合适的索引上。 如果 key 已经存在了,value 会被更新成新值。 HashMap 的一些重要的特性是它的容量 (capacity),负载因子 (load factor) 和扩 容极限(threshold resizing)。