ArrayList,LinkedList,Vector

本文介绍了ArrayList,LinkedList和Vector的区别与特点。ArrayList基于动态数组,适合随机访问,但插入删除效率较低。LinkedList采用链表结构,适合插入删除操作,但随机访问性能较差。Vector与ArrayList类似,但线程安全,性能较ArrayList慢。Set接口存储无序不重复数据,插入删除高效,而List接口存储有序可重复元素,查找效率高。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

   

      一:概念介绍 

       List接口的实现类有3个:ArrayList(常用) ,LinkedList,Vector。

      ArrayList:它是最常用的List实现类,内部是通过数组实现的,数组的缺点是它需要一块连续的内存空间,数组内的元素必须是连续的,所以每当数组大小不能满足时需要增加存储能力,就需要将已经有数据的数据复制到新的存储空间中。所以ArrayList它的优点是能对元素进行快速随机的访问,缺点是对ArrayList进行元素的插入或者删除时,需要对数组进行复制、移动,代价比较高。因此,ArrayList适合随机查找或者遍历元素,不适合插入和删除。

      LinkedList:它也是List实现类,内部是用链表结构存储数据的,故避免了数组需要一块连续存储空间的缺点。LinkedList优点:很适合元素的动态插入和删除;缺点:对于元素的随机访问和遍历速度比较慢。另外LinkedList还提供了List接口中没有定义的方法,专门用于操作表头和表尾元素,可以当做堆栈、队列和双向队列使用。

      Vector:和ArrayList类似,内部也是通过数组实现的,不同的是它支持线程的同步,即某一时刻只有一个线程能够写Vector,避免多线程同时写而引起的不一致性,但是同步需要很高的花费,因此,Vector访问元素的速度要比ArrayList慢。

     二:性能比较

       ArrayList和LinkedList的区别:

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

      2: 对于随机访问set和get,ArrayList性能要优于LinkedList,因为LinkedList是链表,而ArrayList是动态数组。时间复杂度LinkedList要远远大于ArrayList。特殊情况:对于访问开头元素,ArrayList和LinkedList性能一样。

      3: 对于增加add和删除remove,LinkedList性能要优于ArrayList,因为ArrayList是动态数组,删除和增加元素要移动数组内相关的元素,而LinkedList则不需要。LinkedList删除和增加任意位置的元素,性能都一样,而ArrayList对于删除和增加元素的位置在开头花销最大。时间复杂度ArrayList要远远大于LinkedList。特殊情况:对于增加和删除末尾元素,LinkedList和ArrayList性能一样。

      4:ArrayList和LinkedList是两个集合类,都可以用于存储一系列的对象(String, Integer)引用(references)。但是性能上差别好大。随机访问ArrayList性能要优于LinkedList;而对于增加、删除、反转,LinkedList性能要优于ArrayList。

      ArrayList和Vector的区别:

      1:ArrayList在内存不够时默认的扩展是:新内存容量=(旧内存容量*3)/ 2 + 1;即每次容量扩展为50%+1个,而Vector默认的扩展是增加一倍。

      2:Vector提供了indexOf( obj, start )接口,ArrayList没有。

      3:Vector属于线程级别安全的,但是大多数情况下不提倡使用,因为保证线程安装会使系统的开销加大。

    Set和List的区别

   1. Set 接口实例存储的是无序的,不重复的数据。List 接口实例存储的是有序的,可以重复的元素。

     2. Set检索效率低下,删除和插入效率高,插入和删除不会引起元素位置改变 <实现类有HashSet,TreeSet>

     3. List和数组类似,可以动态增长,根据实际存储的数据的长度自动增长List的长度。查找元素效率高,插入删除效率低,因为会引起其他元素位置改变 <实现类有ArrayList,LinkedList,Vector> 。

      三:代码例子

       java代码:

package com.panli.list;

import java.util.ArrayList;
import java.util.Enumeration;
import java.util.LinkedList;
import java.util.Vector;

public class ListTest {

	public static void testArrayList() {
		ArrayList<Object> al = new ArrayList<Object>();
		al.add("abc");
		al.add(1);
		al.add('A');
		al.add(true);
		System.out.println("al顺序添加元素:" + al);

		// 如果没有两个数据,则会报出异常java.lang.IndexOutOfBoundsException
		al.add(2, false);
		System.out.println("al在1后面添加元素:" + al);

		ArrayList<Object> al2 = new ArrayList<Object>();
		al2.addAll(al);
		System.out.println("al2添加al全部元素:" + al2);

		ArrayList<Object> al3 = new ArrayList<Object>();
		al3.add(12);
		al3.add("abd");
		al3.add("abe");
		al3.addAll(0, al);
		System.out.println("al3添加在指定位置的al全部元素:" + al3);

		al3.remove("abd");
		System.out.println("al3中删除指定元素:" + al3);

		al3.remove(6);
		System.out.println("al3中删除索引为6的元素:" + al3);

		al3.removeAll(al);
		System.out.println("al3中删除包含al的全部元素:" + al3);

		al3.set(0, "abc");
		System.out.println("al3修改第一个元素值:" + al3);

		Object ob1 = al3.get(0);
		System.out.println("得到al3中索引为0的元素值:" + ob1);

		al3.clear();
		System.out.println("al3中元素清空:" + al3);

		for (Object obj : al) {
			System.out.println(obj);
		}
	}

	public static void testLinkedList() {
		LinkedList<Object> ll = new LinkedList<Object>();

		// 添加操作
		ll.add("abc");
		ll.add('d');
		ll.add(1, true);

		// 链表添加首元素
		ll.addFirst("start");

		// 链表添加尾元素
		ll.addLast("last");
		System.out.println("ll链表的元素:" + ll);

		// 移去链表首元素
		ll.removeFirst();
		// 移去链表尾元素
		ll.removeLast();

		System.out.println("ll链表的元素:" + ll);

		// 移去链表第索引为1的元素
		ll.remove(1);
		System.out.println("ll链表的元素:" + ll);

		// remove()默认删除第一个元素
		ll.remove();
		System.out.println("ll链表的元素:" + ll);

		LinkedList<Object> ll2 = new LinkedList<Object>();
		// 添加操作
		ll2.add(1);
		ll2.add(2);
		ll2.add(2, 3);

		// 在ll2末尾处添加ll元素
		ll2.addAll(ll);
		// 在ll2开头处添加ll元素
		ll2.addAll(0, ll);

		System.out.println("ll2链表的元素:" + ll2);

		// 修改索引为1的元素
		ll2.set(0, 0);

		// 修改索引为4的元素
		ll2.set(4, 4);
		System.out.println("ll2链表的元素:" + ll2);

		System.out.println("得到首元素:" + ll2.get(0));

		System.out.println("得到首元素:" + ll2.getFirst());
		System.out.println("得到尾元素:" + ll2.getLast());

		// 生成索引为2到4的子链表
		System.out.println("ll2的子链表:" + ll2.subList(2, 4));

	}

	public static void testVector() {
		Vector v = new Vector(3, 2);
		System.out.println("Initial size: " + v.size());
		System.out.println("Initial capacity: " + v.capacity());
		v.addElement(new Integer(1));
		v.addElement(new Integer(2));
		v.addElement(new Integer(3));
		v.addElement(new Integer(4));
		System.out.println("Capacity after four additions: " + v.capacity());

		v.addElement(new Double(5.45));
		System.out.println("Current capacity: " + v.capacity());
		v.addElement(new Double(6.08));
		v.addElement(new Integer(7));
		System.out.println("Current capacity: " + v.capacity());
		v.addElement(new Float(9.4));
		v.addElement(new Integer(10));
		System.out.println("Current capacity: " + v.capacity());
		v.addElement(new Integer(11));
		v.addElement(new Integer(12));
		System.out.println("First element: " + (Integer) v.firstElement());
		System.out.println("Last element: " + (Integer) v.lastElement());
		if (v.contains(new Integer(3)))
			System.out.println("Vector contains 3.");
		// enumerate the elements in the vector.
		Enumeration vEnum = v.elements();
		System.out.println("\nElements in vector:");
		while (vEnum.hasMoreElements())
			System.out.print(vEnum.nextElement() + " ");
		System.out.println();

	}

	public static void main(String[] args) {

		// ListTest.testArrayList();

		// ListTest.testLinkedList();

		ListTest.testVector();

	}
}



      

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值