`

List接口(主要ArrayList 和LinkedList以及Vector区别(转))

 
阅读更多

实现List接口的常用类有LinkedList,ArrayList,Vector和Stack。

(1)以下两篇是关于ArrayList和LinkedList的文章,本人觉得描述的非常到位,在此分享下,顺便也方便自己在此翻阅。

            1.ArrayList:http://286.iteye.com/blog/2178518

            2.LinkedList:http://286.iteye.com/blog/2181299

 

两者大致区别:

            1. pengcqu.iteye.com/blog/502676

 

总结: 

            1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。 

            2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。 
            3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。 

但:

      ArrayList和LinkedList在性能上各有优缺点,都有各自所适用的地方,总的说来可以描述如下: 
            1.对ArrayList和LinkedList而言,在列表末尾增加一个元素所花的开销都是固定的。对ArrayList而言,主要是在内部数组中增加一项,指向所添加的元素,偶尔可能会导致对数组重新进行分配;而对LinkedList而言,个                     开销是统一的,分配一个内部Entry对象。

            2.在ArrayList的中间插入或删除一个元素意味着这个列表中剩余的元素都会被移动;而在LinkedList的中间插入或删除一个元素的开销是固定的。

            3.LinkedList不支持高效的随机元素访问。

            4.ArrayList的空间浪费主要体现在在list列表的结尾预留一定的容量空间,而LinkedList的空间花费则体现在它的每一个元素都需要消耗相当的空间


     可以这样说:当操作是在一列数据的后面添加数据而不是在前面或中间,并且需要随机地访问其中的元素时,使用ArrayList会提供比较好的性能;当你的操作是在一列数据的前面或中间添加或删除数据,并且按照顺序访问其中            的元素时,就应该使用LinkedList了。

 

 

应用场合:

        1.ArrayList底层的实现是数组,所以用下标访问的速度比较快,但是插入和删除元素,会有移动元素的开销,所以速度比LinkedList差。

        2.LikedList底层是链表实现的,所以插入和删除元素时间复杂度较LinkedList好,但是随即访问需要遍历元素,所以效率比ArrayList差。

        3.一般情况下,用ArrayList就可以了,如果涉及到频繁的插入和删除元素,这个时候考虑使用LinkedList,另外Java里面的Queue和Stack也是依赖LinkedList实现的。

       4.LinkedList内数据根本没有固定的容器存储。而是通过对象关联引用,一层一层深入下去的。简单的说,就是保存在一个对象的无限引用中,引用链有多深取决数据量的大小。 具体数据结构如下:

Entry<E> {
E element;
Entry<E> previous;
Entry<E> next;
}
所以无论是查找还是插入,删除,都要从第一个元数据开始找。这样效率自然就很低。

 

(2):Vector

        Vector几乎和ArrayList相等,主要的区别在于Vector是同步的。正因为此,Vector比ArrayList的开销更大。通常大部分程序员都使用ArrayList,他们可以自己写代码进行同步。

     

    这里写了一个demo:    

 

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


public class ThreadAccessArrayList extends Thread {
	
	private List list;
	
	CountDownLatch countDownLatch;
	
	public ThreadAccessArrayList(List list,CountDownLatch countDownLatch){
		this.list = list;
		this.countDownLatch = countDownLatch;
	}
	
	public void run(){
		for (int i = 0; i < 2000; i++) {
			list.add("lopez" + i);
		}
		try {
			countDownLatch.countDown();//每条线程减一
		} catch (Exception e) {
			System.out.println(0000);
		}
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		
		CountDownLatch countDownLatch = new CountDownLatch(20);//计数器
		List list = new ArrayList();//使用ArrayList输出是:Exception in thread "Thread-1" java.lang.ArrayIndexOutOfBoundsException: 452	                         
		//List list = new Vector();//使用Vector时输出是:list的size是:40000
		ThreadAccessArrayList threadAccessArrayList = new ThreadAccessArrayList(list,countDownLatch);
		for (int i = 0; i < 20; i++) {
			new Thread(threadAccessArrayList).start();
		}
		try {
			countDownLatch.await();//,任何调用这个对象上的await()方法都会阻塞,直到这个计数器的计数值被其他的线程减为0为止。
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("list的size是:" + list.size());
	}

}
   以上可以看出ArrayList在多线程访问时有可能出错的,而vector则不会,所以说vector是线程安全(同步加锁)的,但开销更大。

 

  解决方案1:用java5.0新加入的ConcurrentLinkedQueue、ConcurrentHashMap、CopyOnWriteArrayList 和 CopyOnWriteArraySet . 

  用CopyOnWriteArrayList取代ArrayList:

                     缺点:性能低,以上例子,同等情况之下,用vector所需时间为:15ns;而用CopyOnWriteArrayList却用3723ns。

 

  解决方案2:使用ArrayList/HashMap和同步包装器:List list = Collections.synchronizedList(new ArrayList());;

                     耗时:15ns(推荐)在大数据量情况之下比Vector快

 遍历要注意:

synchronized (list) {
			for (String str : list) {
				System.out.println("遍历list为:" + str);
			}
		}

 

  解决方案3:使用Vector

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    ArrayList LinkedList Vector区别

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

    比较ArrayList、LinkedList、Vector1

    List接口的实现类主要有ArrayList、LinkedList和Vector。 2. **ArrayList** - **实现原理**:ArrayList基于动态数组实现,它提供快速的按索引访问,因为数组支持直接通过索引获取元素。 - **添加和删除**:对于在...

    ArrayList LinkedList Vector性能测试

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

    ii0#book-3#ArrayList 、 LinkedList 、 Vector 的底层实现和区别1

    Java基础之集合List-ArrayList、LinkedList、Vector的底层实现和区别ArrayList底层实际是采用数组实现的(并且该数组的类型是

    第8讲 对比Vector、ArrayList、LinkedList有何区别1

    在Java集合框架中,Vector、ArrayList和LinkedList都是List接口的实现,它们提供了有序集合的功能,允许根据位置进行元素的添加、删除和查找。然而,它们在设计和性能上有着显著的区别。 首先,Vector是Java早期...

    Java 各种集合的区别ArrayList Vector LinkedList map区别

    今天,我们将深入了解 Java 中的集合类别,包括 ArrayList、Vector、LinkedList 和 Map 等。 ArrayList ArrayList 是一种基于数组的集合类别,它可以存储大量的数据。ArrayList 的特点是:它可以动态地增加或减少...

    ArrayList LinkList和vector的区别

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

    对比Vector、ArrayList、LinkedList1

    在Java集合框架中,Vector、ArrayList和LinkedList是三种常见的List接口实现类,它们各自具有不同的特点和适用场景。下面我们将详细对比这三个类的区别。 1. **Vector** - **线程安全**:Vector是线程安全的,因为...

    ArrayList、Vector、LinkedList 的区别.docx

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

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

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

    JDK1.6中Arraylist,Vector,LinkedList源码

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

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

    ArrayList和LinkedList虽然不是Set,但它们的父接口List属于Collection,而Collection接口有一个子接口Set,例如HashSet是Set接口的一个实现,它内部基于HashMap实现,保证元素唯一性。 7. WeakHashMap WeakHashMap...

    java8源码-csn-list:ArrayList、LinkedList、Vector、Stack源码分析

    List接口 ArrayList 是一个数组队列,相当于 动态数组。与Java中的数组相比,它的容量能动态增长。不是线程安全的。ArrayList包含了两个重要的对象:elementData(Object[]类型的数组) 和 size 遍历ArrayList时,使用...

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

    ArrayList和Vector的主要区别在于Vector使用了synchronized方法,线程安全,而ArrayList则没有。 ArrayList是Java中最常用的List实现类,它提供了高效的插入、删除和遍历元素的方法。ArrayList基于数组实现,故插入...

    比较Vector、ArrayList和hashtable hashmap

    - Vector 和 ArrayList 都实现了 List 接口,其中 Vector 是线程安全的,而 ArrayList 不是。ArrayList 在插入和查找性能上通常优于 Vector,因为 Vector 的同步操作会带来额外的性能开销。 - LinkedList 实现了 ...

    ArrayList和LinkedList区别及使用场景代码解析

    ArrayList和LinkedList都是Java集合框架中的重要成员,它们都是List接口的实现类,但它们在实现机制、性能和使用场景等方面存在着很大的差异。 ArrayList ArrayList是基于数组实现的,其构造函数为: ```java ...

    10个Java经典的List面试题!.pdf

    Vector是List接口下的一种线程安全的集合实现,Vector的所有方法都是同步的,而ArrayList和LinkedList不是线程安全的。因此,如果需要在多线程环境下使用List,应该选择Vector或使用Collections.synchronizedList()...

    10个Java经典的List面试题

    在 Java 中,List 是一个接口,提供了多种实现类,如 ArrayList、LinkedList、Vector 等。下面我们将详细介绍 Java 中的 List 面试题。 1. 你知道的 List 都有哪些? List 是一个接口,具有多种实现类,常见的实现...

    Java中Vector与ArrayList的区别详解

    Java中的ArrayList和Vector都是列表(List)接口的实现类,它们在功能上相似,但在细节上存在一些重要的差异。这两个类都是基于数组实现的,但它们的性能特点、线程安全性和扩容策略有所不同。 1. **扩容策略**: ...

    java集合-练习题.pdf

    本篇资源摘要信息主要讲解 Java 集合框架的相关知识点,包括 Collection 接口、List 接口、Set 接口、Map 接口的特点和区别,以及 ArrayList、LinkedList、Vector 等实现类的使用和区别。 一、Collection 接口的...

Global site tag (gtag.js) - Google Analytics