Java中的Vector和ArrayList区别及比较

yizhihongxing

Java中的Vector和ArrayList区别及比较

1. Vector和ArrayList的区别

Vector和ArrayList是Java集合框架中两个常用的数组实现类,它们的区别主要有以下几点:

1.1 线程安全

Vector是线程安全的,而ArrayList不是线程安全的。这是由于Vector中的方法都是用synchronized关键字修饰的,而ArrayList则没有。

1.2 自动增长

Vector和ArrayList都支持自动增长,当元素个数超过当前容量时,它们都会自动调整数组的大小以容纳更多的元素。不同的是,Vector默认情况下会将容量增加一倍,而ArrayList默认情况下只会增加50%。

1.3 初始容量

Vector默认情况下的初始容量是10,而ArrayList是0。

1.4 迭代器实现

从Java 5开始,Vector和ArrayList都支持迭代器(Iterator)遍历元素,但它们的迭代器实现是不同的。Vector的迭代器是同步的(即支持多线程并发访问),而ArrayList的迭代器是非同步的。

2. Vector和ArrayList的比较

虽然Vector和ArrayList之间有一些区别,但它们也有一些相似之处。比如它们的操作效率都为O(1)(如果不考虑数组大小调整的时间),都可以实现快速随机访问,都可以在末尾快速添加或删除元素等等。

下面我们通过两条代码示例来具体说明它们的不同之处:

2.1 线程安全示例

import java.util.ArrayList;
import java.util.List;

public class UnsafeArrayList {
    private static List<Integer> list = new ArrayList<>();

    public static void main(String[] args) {
        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 10000; i++) {
                    list.add(i);
                }
            }
        });

        Thread t2 = new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 10000; i++) {
                    list.add(i);
                }
            }
        });

        t1.start();
        t2.start();

        try {
            t1.join();
            t2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println(list.size());
    }
}

上面的代码用多线程向一个ArrayList中添加10000个元素,由于ArrayList不是线程安全的,所以有可能出现并发问题。结果可能会输出小于20000的数字,因为在多线程执行时,有可能会出现两个线程同时尝试在同一个位置添加元素的情况。

我们可以通过使用 Vector 来解决线程安全问题,把ArrayList 改为Vector:

import java.util.Vector;

public class safeVector {
    private static Vector<Integer> list = new Vector<>();

    public static void main(String[] args) {
        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 10000; i++) {
                    list.add(i);
                }
            }
        });

        Thread t2 = new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 10000; i++) {
                    list.add(i);
                }
            }
        });

        t1.start();
        t2.start();

        try {
            t1.join();
            t2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println(list.size());
    }
}

这里我们使用了Vector代替ArrayList,并且Vector由于是线程安全的,所以不会出现并发问题。结果将会输出20000。

2.2 初始容量示例

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

public class InitialCapacity {
    public static void main(String[] args) {
        ArrayList<String> arrayList = new ArrayList<>();
        Vector<String> vector = new Vector<>();
        System.out.println("ArrayList初始容量:" + arrayList.size());
        System.out.println("Vector初始容量:" + vector.size());
    }
}

上面的代码分别创建了一个ArrayList和一个Vector对象,并输出它们的初始容量。你会发现在没有添加任何元素之前,ArrayList的初始容量是0,而Vector的初始容量是10。

这是由于ArrayList的初始容量默认为0,而Vector的初始容量默认为10。

所以,当你在开发中需要使用自动增长的数组时,建议你首选ArrayList,这是因为ArrayList比Vector更加高效和易用。而当你需要线程安全时,建议使用Vector。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java中的Vector和ArrayList区别及比较 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • Java编程之jdk1.4,jdk1.5和jdk1.6的区别分析(经典)

    Java编程之jdk1.4,jdk1.5和jdk1.6的区别分析(经典)攻略 1. JDK1.4、JDK1.5、JDK1.6的简介 Java Development Kit(JDK)是Java的核心开发工具包,它包含了Java编译器、运行时环境和Java类库(JDK1.6及以下版本)或Java类库和JavaFX SDK(JDK1.7及以上版本)。JDK版本的…

    Java 2023年5月26日
    00
  • Java后端真实、靠谱、强大的面试题网站:面试梯

    ​  本文分享一个给力的Java后端面试题网站:面试梯。 网址:https://offer.skyofit.com 这套题真实、高频、全面、有详细答案、保你稳过面试,让你成为offer收割机。题目包括:Java基础、多线程、JVM、数据库、Redis、Shiro、Spring、SpringBoot、MyBatis、MQ、ELK、分布式、SpringCloud…

    Java 2023年5月8日
    00
  • Java循环队列原理与用法详解

    Java循环队列原理与用法详解 什么是循环队列 循环队列是一种经典的队列实现方式,它的特点是:队列的头尾相连,形成了一个环形结构。当队列满时,新的数据会从队列头部开始覆盖旧的数据。因此,循环队列在使用过程中,需要记录队列的头部和尾部指针,以便能够正确地判断队列是空还是满,以及在队列中添加、删除元素时,正确地定位到队列的头部和尾部。 基本实现方法 在Java中…

    Java 2023年5月26日
    00
  • Java的Struts2框架配合Ext JS处理JSON数据的使用示例

    下面我来详细讲解一下Java的Struts2框架配合Ext JS处理JSON数据的使用示例的完整攻略。 简介 在开发Web应用程序时,常常需要使用JSON(JavaScript对象表示法)来进行数据的传递,而Struts2框架可以帮助我们很好地处理JSON数据。而Ext JS是一款优秀的JavaScript框架,可以让我们轻松地构建富客户端的Web应用程序。…

    Java 2023年5月20日
    00
  • Java FileUploadUtil工具类详解

    Java FileUploadUtil工具类详解 简介 FileUploadUtil是一个Java的上传文件工具类,提供了一些上传文件操作的辅助方法,如将上传的文件保存到服务器上指定的路径,获取上传文件的名称和大小等信息等。 使用方法 1. 导入工具类 首先需要将FileUploadUtil类导入到自己的项目中。 2. 初始化上传配置 在使用之前,需要初始化…

    Java 2023年5月19日
    00
  • Swagger2配置Security授权认证全过程

    Swagger2是一款开源的API框架,可以用于API文档的生成、测试和部署。Security授权认证则可以增强API的安全性,防止未经授权的用户访问API资源。下面是Swagger2配置Security授权认证全过程的完整攻略: 第一步:添加Security依赖 在pom.xml文件中添加如下依赖: <dependency> <group…

    Java 2023年5月20日
    00
  • JavaScript中将字符串转换为数字的七种方法总结

    下面是详细讲解“JavaScript中将字符串转换为数字的七种方法总结”的攻略。 攻略 1. 使用parseFloat()函数将字符串转换为浮点数 可以使用JavaScript内置的parseFloat()函数将字符串转换为浮点数。该函数会尝试将给定的字符串解析为一个浮点数,并返回一个浮点数结果。 示例: var str = "3.14"…

    Java 2023年5月27日
    00
  • Java中四种线程池的使用示例详解

    Java中四种线程池的使用示例详解 前言 线程池可以实现线程的复用, 表示为一个线程池中的线程可以多次使用, 而不是单个线程只能被使用一次。Java中的线程池主要有四种, 分别是固定线程数线程池、可缓存的线程池、单线程化线程池和定时器线程池。接下来我们将介绍这四种线程池的使用详细攻略。 一、固定线程数线程池 固定线程数线程池,顾名思义,就是只有固定数量的线程…

    Java 2023年5月18日
    00
合作推广
合作推广
分享本页
返回顶部