Java中的Vector和ArrayList区别及比较

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日

相关文章

  • springmvc接收json串,转换为实体类List方法

    “springmvc接收json串,转换为实体类List方法”主要分为以下几步: 接收请求并获取JSON数据 创建实体类 创建Controller方法 将JSON转换为实体类 返回Json数据 具体操作如下: 1. 接收请求并获取JSON数据 首先,我们需要创建一个POST请求来接收JSON数据 @RequestMapping(value = "/…

    Java 2023年5月26日
    00
  • Java反射概念与使用实例代码

    Java反射是Java语言自带的一种强大的机制,允许在运行时动态地获取类的信息、访问或修改类的属性和方法等。本文将详细讲解Java反射的概念和使用,包含以下内容: 反射概述 反射实现方式 反射的作用与优缺点 反射使用的实例代码 反射概述 Java反射(Reflection)是Java语言中的一种机制。它可以让我们在运行时动态地获取类的信息、访问或修改类的属性…

    Java 2023年5月30日
    00
  • java 多态实例代码

    我们来讲解一下“java 多态实例代码”的完整攻略。 什么是多态 多态是指同一种行为具有多个不同表现形式或形态的能力,即同一种行为基于不同的对象会产生不同的结果。在Java中,多态是指一个对象的实例在不同的情况下会表现出不同的行为。 多态的实现 在Java中,多态的实现主要有两种方式:继承和接口。通过继承实现多态,我们可以创建一个父类,然后在子类中重写其中一…

    Java 2023年5月30日
    00
  • SpringBoot Application注解原理及代码详解

    SpringBootApplication注解原理及代码详解 1. Spring Boot介绍 ​ Spring Boot是一个应用于快速创建基于Spring框架的应用程序的工具。它大大简化了Spring应用程序的搭建和开发流程, 十分适合用于微服务开发等快速迭代的场景。 2. SpringBootApplication注解 ​ SpringBootAppl…

    Java 2023年5月15日
    00
  • 使用Spring Boot搭建Java web项目及开发过程图文详解

    下面我会为您详细讲解使用SpringBoot搭建JavaWeb项目及开发过程。本文将按照以下步骤详细展开: 环境准备及SpringBoot的简介 创建一个简单的SpringBoot项目 开发一个简单的RESTful接口 创建一个数据库,并通过MyBatis实现与之交互 使用Thymeleaf模板引擎开发前端页面 部署及运行项目 环境准备及SpringBoot…

    Java 2023年5月15日
    00
  • 如何保证Java线程安全性?

    为了保障Java程序的正确运行,我们需要确信Java线程的安全性。在Java语言中,可以使用以下几种方式来保证线程安全性: 使用同步块(Synchronized Block)或者同步方法(Synchronized Method)来保护共享变量。将多个线程对共享变量的访问限制为同一时间内只能有一个线程进行操作,从而保障数据的正确性和线程安全性。示例代码如下: …

    Java 2023年5月11日
    00
  • java(包括springboot)读取resources下文件方式实现

    下面是详细讲解“java(包括springboot)读取resources下文件方式实现”的完整攻略。 1. 背景 在Java中,经常需要读取resources下的文件。resources文件夹通常位于项目的classpath下,可以存放各种类型的文件,如文本文件、配置文件、图片等。这里将对读取resource文件夹下文件的几种常用方法进行讲解。 2. 使用…

    Java 2023年5月19日
    00
  • Lombok基本注解之@SneakyThrows的作用

    下面是关于Lombok基本注解之@SneakyThrows的作用的完整攻略。 1. @SneakyThrows简介 在Java中,我们通常使用try-catch语句捕获异常。但是,有时候代码中出现的异常并不是我们想要处理的,而是完全出乎意料的异常情况,这时候需要抛出异常。抛出异常通常要求在方法签名上声明当前方法可能会抛出某种类型的异常,这会使代码变得冗长,甚…

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