ArrayList,Vector, LinkedList 的存储性能和特性

123 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

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)。