ArrayList、Vector、LinkedList区别

本文探讨了Java中ArrayList、Vector和LinkedList三种集合类的异同。ArrayList和Vector基于动态数组实现,支持快速索引访问,但在插入元素时效率较低,且Vector是线程安全的。LinkedList通过双向列表实现,适合频繁插入但不适合随机访问。示例代码展示了在多线程环境下,线程安全的Vector能确保元素数量正确,而ArrayList则可能出现不一致的结果。
摘要由CSDN通过智能技术生成

ArrayList、Vector、LinkedList类均在java.util包中,均为可伸缩数组,即可以动态改变长度的数组。

ArrayList 和 Vector都是基于存储元素的Object[] array来实现的,它们会在内存中开辟一块连续的内存来存储,由于数据存储是连续的,因此,它们支持用序号(下标)来访问元素,同时索引数据的速度比较快。但是在插入元素时需要移动容器中的元素,所以对数据的插入操作执行得比较慢。

ArrayList和Vector都有一个初始化的容量的大小,当里面的存储的元素超过这个大小时就需要动态地扩充它们的存储空间。为了提高程序的效率,每次扩充容量,不是简单地扩充一个存储单元,而是一次增加多个存储单元。Vector默认扩充为原来的2倍(每次扩充空间的大小是可以设置的),而ArrayList默认扩充为原来的1.5倍(没有提供方法来设置空间扩充的方法)。

ArrayList与Vector最大的区别就是synchronized(同步)的使用,没有一个ArrayList的方法是同步的,而Vector的绝大多数方法(例如add、insert、remove、set、equals、hashcode等)都是直接或者间接同步的,所以Vector是线程安全的,ArrayList不是线程安全的。正式由于Vector提供了线程安全机制,其性能上也要略逊于ArrayList。

LinkedList是采用双向列表来实现的,对数据的索引需要从列表头开始遍历,因此用于随机访问则效率比较低。但是插入元素时不需要对数据进行移动,因此插入效率较高。同时,LinkedList是非线程安全的容器。

Vector是线程安全的

下面代码,通过for循环启动1000个线程去操作arr。每次执行都得到1000.

package com.song;

import java.util.ArrayList;
import java.util.Random;
import java.util.Vector;

public class Main {
    public static void main(String[] args) {
        Vector arr = new Vector<>();
//        ArrayList<Object> arr = new ArrayList<>();

       final Random rand = new Random();

        for (int i = 0; i < 1000; i++) {
            Thread t1 = new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        Thread.sleep(rand.nextInt(2));
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    arr.add("1");
                }
            });
            t1.start();
        }

        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(arr.size());
    }
}

ArrayList是线程不安全的

下面代码输出结果不一样,有时候992、999、100等等都可能。

package com.song;

import java.util.ArrayList;
import java.util.Random;
import java.util.Vector;

public class Main {
    public static void main(String[] args) {
//        Vector arr = new Vector<>();
        ArrayList<Object> arr = new ArrayList<>();

       final Random rand = new Random();

        for (int i = 0; i < 1000; i++) {
            Thread t1 = new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        Thread.sleep(rand.nextInt(2));
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    arr.add("1");
                }
            });
            t1.start();
        }

        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(arr.size());
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值