`
Tristan_S
  • 浏览: 383981 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

ArrayList vs Vector

 
阅读更多
大家都知道Vector是线程安全的,ArrayList是不安全的, 现在测试下ArrayList怎么个不安全法

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

public class HelloThread implements Runnable {
	List<String> v = new ArrayList<String>();

	// Vector<String> v = new Vector<String>();

	// synchronized
	public void run() {
		try {
			while (true) {
				System.out.println(Thread.currentThread().getName() + " list size is " + v.size());
				Thread.sleep(3);
				v.add("tristan");

				if (v.size() > 100) {
					System.exit(1);
				}
			}
		} catch (Exception e) {
			System.err.println(Thread.currentThread().getName());
			
			e.printStackTrace();
			
			System.err.println("v.size(): " + v.size());
			System.exit(-1);
		}
	}

	public static void main(String args[]) throws InterruptedException {

		HelloThread hello1 = new HelloThread();

		Thread h1 = new Thread(hello1);
		Thread h2 = new Thread(hello1);
		Thread h3 = new Thread(hello1);
		Thread h4 = new Thread(hello1);
		Thread h5 = new Thread(hello1);
		Thread h6 = new Thread(hello1);
		Thread h7 = new Thread(hello1);
		Thread h8 = new Thread(hello1);
		Thread h9 = new Thread(hello1);

		h1.start();
		h2.start();
		h3.start();
		h4.start();
		h5.start();
		h6.start();
		h7.start();
		h8.start();
		h9.start();

	}
}


运行多次可以发现ArrayList有很大的报错概率, Vector则不会,
如何在run 方法上加上同步锁那也不会出现问题, 所以ArrayList的非线程安全性就体现在这里, 多个线程同时操作时可能会出现数组越界的异常。

再来看ArrayList和Vector的源代码,可以发现ArrayList的add方法没有同步锁,而Vector则有
add 方法不是原子性的操作,需要将数组扩充后,再放值,所以会出现问题
public boolean add(E e) {
        ensureCapacityInternal(size + 1);  // Increments modCount!!
        elementData[size++] = e;
        return true;
    }

以后在成员变量中尽量用Vector, 临时变量用ArrayList
分享到:
评论

相关推荐

    ArrayList LinkedList Vector区别

    ArrayList LinkedList Vector 区别 ArrayList、LinkedList、Vector 是 Java 中常用的数据结构实现类,它们都实现了 List 接口,但它们在存储方式、性能、线程安全性等方面有着不同特点。 首先,ArrayList 和 ...

    ArrayList LinkedList Vector性能测试

    在Java编程语言中,ArrayList、LinkedList和Vector是三种常见的动态数组实现,它们都在java.util包中,用于存储和管理对象的集合。这三个类都实现了List接口,提供了多种操作方法,但它们在内部实现和性能特性上有所...

    经典讲解List和ArrayList和Vector和HashTable和HashMap区别

    在Java编程语言中,集合框架是处理对象数组的重要工具,其中`List`、`ArrayList`、`Vector`、`HashTable`和`HashMap`是五个关键的接口和类,它们各有不同的特性和用途。以下是这些概念的详细解释: 1. **List接口**...

    ArrayList、Vector、LinkedList 的区别.docx

    ArrayList、Vector、LinkedList 的区别 在 Java 集合框架中,ArrayList、Vector、LinkedList 是三个常用的 List 实现类,虽然它们都实现了 List 接口,但是它们在继承关系、实现接口、底层数据结构、扩容机制等方面...

    ArrayList LinkedList Vector性能对比

    ArrayList、LinkedList和Vector是三种常见的动态数组实现,它们各自有特定的特性和使用场景。这里我们将深入探讨这三个类的性能对比,以及它们在不同操作下的表现。 ArrayList是基于动态数组实现的,它提供了随机...

    List、ArrayList、Vector及map、HashTable、HashMap分别的区别

    List、ArrayList、Vector及map、HashTable、HashMap分别的区别 List、ArrayList、Vector及map、HashTable、HashMap是Java容器类中的几个重要的接口和实现类,了解它们之间的区别是非常重要的。 首先,我们来看List...

    Java容器类List、ArrayList、Vector及map、HashTable应用

    Java容器类List、ArrayList、Vector及map、HashTable应用 List、ArrayList、Vector及map、HashTable是Java中常用的容器类,它们都继承自Collection接口,并提供了不同的实现方式和特点。在实际开发中,选择合适的...

    Java中ArrayList和Vector的区别共2页.p

    在Java编程语言中,ArrayList和Vector是两种常用的动态数组实现,它们都属于集合框架的一部分,用于存储和操作对象。虽然它们在用途上相似,但在性能、线程安全性和同步机制等方面存在显著区别。以下是关于ArrayList...

    ArrayList LinkList和vector的区别

    ArrayList、LinkList和Vector的区别 ArrayList、LinkList和Vector是Java中三个常用的集合类,它们都实现了List接口,但是在实现方式和性能上有所不同。 ArrayList ArrayList是使用数组方式存储数据的,数组元素数...

    ArrayList Vector LinkedList 区别与用法.

    ### ArrayList、Vector、LinkedList 的区别与用法详解 在Java编程中,选择合适的数据结构对于程序的性能至关重要。本文将深入探讨ArrayList、Vector和LinkedList三种集合类的特点与使用场景,帮助开发者更好地理解...

    JDK1.6中Arraylist,Vector,LinkedList源码

    在Java编程语言中,ArrayList、Vector和LinkedList是三种常见的动态数组实现,它们都属于集合框架中的List接口。这里我们将深入探讨这三种数据结构的源码,理解它们的内部实现、性能特性和适用场景。 首先,...

    ArrayList 和 Vector 的区别和常用方法

    ArrayList 和 Vector 的区别和常用方法

    Java容器集合(equals 和 hashCode+基础数据结构+ArrayList+Vector和LinkedList)

    Java容器集合(equals和hashCode+基础数据结构+ArrayList+Vector和LinkedList) Java容器集合是Java中的一种基础数据结构,用于存储和管理数据。其中,equals和hashCode方法是Java容器集合中两个非常重要的方法,...

    Java中ArrayList的使用方法以及与vector的对比

    Java 中 ArrayList 的使用方法以及与 Vector 的对比 ArrayList 是 Java 中的一种动态数组,它提供了很多有用的特性,例如动态地增加和减少元素,实现了 ICollection 和 IList 接口,灵活的设置数组的大小等。下面...

    Vector 与ArrayList区别

    ### Vector 与 ArrayList 的区别详解 #### 一、前言 在 Java 集合框架中,`Vector` 和 `ArrayList` 是两种常用的动态数组实现。它们提供了灵活的数据存储方式,能够根据需要自动调整大小。然而,这两种类型的列表...

    Java中List、ArrayList、Vector及map、HashTable、HashMap分别的区别.

    Vector与ArrayList类似,但它提供了一种线程安全的实现,这意味着在多线程环境中,多个线程可以同时访问和修改Vector,而不会导致数据不一致。然而,由于其同步机制,Vector的性能通常低于ArrayList。 3. Map接口与...

    Java基础–为什么ArrayList,Vector等都不支持循环中remove?

    为什么ArrayList,Vector等都不支持循环中remove1 Vector 直接删除2 Vector 遍历元素2.1 for循环遍历2.2 迭代器循环2.3 任意方向遍历2.4 Vector的foreach3. Vector迭代器删除4. Vector不使用迭代器删除元素5. Vector...

    比较分析Vector、ArrayList和hashtable hashmap数据结构

    比较分析Vector、ArrayList和hashtable hashmap数据结构

    Arraylist、Hashtable、Vector

    在Java编程语言中,ArrayList、Hashtable和Vector是三种常见的数据结构,它们都用于存储和管理对象,但各有特点和适用场景。以下是对这三个容器的详细解释: ArrayList是Java集合框架中的一部分,它实现了List接口...

Global site tag (gtag.js) - Google Analytics