List集合概述

上篇总结了Set集合,这回总结下List集合。。。。先来框架图:

一、List集合

List集合代表一个元素有序,可重复的集合,集合中每个元素都有对应的顺序索引。List接口中增加了一些根据索引操作元素的方法:

void add(int index,E element )  在列表的指定位置插入该元素。

boolean addAll(int index,Collection c)  将集合c包含的所有元素都插入到List集合的index处。

Object get(int index)    返回集合index索引出的元素。

。。。。。详见

1.ListIterator接口:List额外提供的一个listIterator()方法,提供了专门操作List的方法。

ListIterator接口在Iterator的基础上增加了如下方法:

boolean hasPrevious(): 返回该迭代器关联的集合是否还有上一个元素。

Object previous(): 返回该迭代器的上一个元素。

void add((E e): 在指定位置插入一个元素。

示例:

import java.util.*;

public class TestListIterator
{
	public static void main(String[] args)
	{
		String[] books = {
			"我是帅哥",
			"帅哥是我"
		};
		List bookList = new ArrayList();
		for (int i = 0; i < books.length ; i++ )
		{
			bookList.add(books[i]);
		}
		ListIterator lit = bookList.listIterator();
		while (lit.hasNext())
		{
			System.out.println(lit.next());
			lit.add("-------分隔符-------");  //加入一个元素
		}
		System.out.println("==========下面开始反向迭代===========");
		while(lit.hasPrevious())
		{
			System.out.println(lit.previous());
		}
	}
}

 输出结果:

我是帅哥
      帅哥是我
      ==========下面开始反向迭代===========
      -------分隔符-------
      帅哥是我
     -------分隔符-------
     我是帅哥

输出完成 (耗时 0 秒) - 正常终止

2.ArrayList实现类和Vector实现类:

ArrayList和Vector是基于数组实现的list类,所以ArrayList和Vector封装了一个动态的,允许再分配的Object[]数组,不指定的话长度默认为10。ArrayList和Vector对象使用initialCapacity参数来设置该数组的长度,当向集合添加大量元素时,可以使用ensureCapac(int minCapacity)方法一次性的增加initialCapacity。

ArrayList和Vector在用法上几乎完全相同,但Vector比较古老,方法名比较长,最好是不使用。ArrayList是线程不安全的,Vector是线程安全的,但这个完全可以手动将一个ArrayList变成线程安全的。

ArrayList示例:

import java.util.*;

public class TestList
{
	public static void main(String[] args)
	{
		List books = new ArrayList();
		//向books集合中添加三个元素
		books.add(new String("轻量级J2EE企业应用实战"));
		books.add(new String("Struts2权威指南"));
		books.add(new String("基于J2EE的Ajax宝典"));
		System.out.println(books);
		//将新字符串对象插入在第二个位置
		books.add(1 , new String("ROR敏捷开发最佳实践"));//add是插入,插入到当前位置,当前的元素向后退,并没有覆盖!
		for (int i = 0 ; i < books.size() ; i++ )
		{
			System.out.println(books.get(i));
		}
		System.out.println("size:"+books.size());
		//删除第三个元素
		books.remove(2);
		System.out.println(books);
		//判断指定元素在List集合中位置:输出1,表明位于第二位
		System.out.println(books.indexOf(new String("ROR敏捷开发最佳实践")));//1
		//将第二个元素替换成新的字符串对象
		books.set(1, new String("Struts2权威指南"));
		System.out.println(books);
		//将books集合的第二个元素(包括)到第三个元素(不包括)截取称子集合
		System.out.println(books.subList(1 , 2));

	}
}

  输出结果:

---------- java运行 ----------
[轻量级J2EE企业应用实战, Struts2权威指南, 基于J2EE的Ajax宝典]
轻量级J2EE企业应用实战
ROR敏捷开发最佳实践
Struts2权威指南
基于J2EE的Ajax宝典
size:4
[轻量级J2EE企业应用实战, ROR敏捷开发最佳实践, 基于J2EE的Ajax宝典]
1
[轻量级J2EE企业应用实战, Struts2权威指南, 基于J2EE的Ajax宝典]
[Struts2权威指南]

输出完成 (耗时 0 秒) - 正常终止

二、Queue集合

Queue用于模拟队列这种数据结构,先进先出。

Queue接口定义的方法如下:

boolean add(E e):   将指定的元素插入此队列(如果立即可行且不会违反容量限制),在成功时返回 true,如果当前没有可用的空间,则抛出 IllegalStateException

E element(): 获取队列头部元素,但不删除该元素。

boolean offer(E e):  将指定的元素插入此队列,当使用有容量限制的队列时,此方法通常要优于 add(E)。

E peek():   获取但不移除此队列的头;如果此队列为空,则返回 null

E poll(): 获取并移除此队列的头,如果此队列为空,则返回 null

E remove(): 获取并移除此队列的头。

1.PriorityQueue实现类

PriorityQueue是一个比较标准的队列实现类,之所以说比较标准,而不是绝对标准,是因为PriorityQueue保存队列元素的顺序并不是按加入队列的顺序,而是按队列元素的大小进行重新排序。

示例:

import java.util.*;

public class TestPriorityQueue
{
	public static void main(String[] args)
	{
		PriorityQueue pq = new PriorityQueue();
		//下面代码依次向pq中加入四个元素
		pq.offer(6);
		pq.offer(-3);
		pq.offer(9);
		pq.offer(0);
		//输出pq队列,并不是按元素的加入顺序排列,而是按元素的大小顺序排列
		System.out.println(pq);
		//访问队列第一个元素,其实就是队列中最小的元素:-3
		System.out.println(pq.peek());
	}
}

  输出结果:

---------- java运行 ----------
[-3, 0, 9, 6]
-3

输出完成 (耗时 0 秒) - 正常终止

2.Deque接口与ArrayQueue实现类

Deque接口是Queue接口的子接口,它代表一个双端队列,Deque接口里定义了一些双端队列的方法,允许从两端来操作队列的元素。

Void addFirst(Object e):将指定元素插入该双端队列的开头。

Void addLast(Object e):将指定队列插入该双端队列的末尾。

Iterator descendingIterator():返回该双端队列对应的迭代器,该迭代器将以逆向顺序来迭代队列中的元素。

Object getFirst(): 获取但不删除队列的第一个元素。

详细参考api

ArrayQueue是Deque接口的典型实现类,他是一个基于数组实现的双端队列,底部也是采用动态的、可重新分配的Object[]数组存储集合元素。

示例:把ArrayQueue当”栈“使用

import java.util.*;

public class ArrayDequeTest
{
	public static void main(String[] args)
	{
        ArrayDeque stack = new ArrayDeque();
		//依次将三个元素push入栈
        stack.push("java");
		stack.push("java EE");
		stack.push("Android");
		System.out.println(stack);  //输出
		//访问第一个元素,但不将其pop出栈
        System.out.println(stack.peek());//
		//
        System.out.println(stack);
		//pop出第一个元素
        System.out.println(stack.pop());
         //
        System.out.println(stack);
	}
}

  输出结果:

[Android, java EE, java]
Android
[Android, java EE, java]
Android
[java EE, java]

**在现在的程序中需要使用“栈”这种数据结构时,推荐使用ArrayDeque或LinkedList,而不是Stack。

3.LinkedList实现类

LinkedList实现了List接口和Deque接口(好像图上没有画出来。。。。。),因此他是一个List集合还可以被当成双端队列来使用。

LinkedList与ArrayList,ArrayDeque的实现机制完全不同,ArrayList、ArrayDeque内部以数组的形式来保存集合中的元素,因此随机访问集合元素时有较好的性能;而LinkedList内部以链表的形式来保存集合中的元素,因此随机访问性能较差,但是插入、删除元素时非常快。

示例:

import java.util.*;

public class TestLinkedList
{
	public static void main(String[] args)
	{
		LinkedList books = new LinkedList();
		//将字符串元素加入队列的尾部
		books.offer("Java");
		//将一个字符串元素入栈
		books.push("J2EE");
		//将字符串元素添加到队列的头部
		books.offerFirst("Android");
		for (int i = 0; i < books.size() ; i++ )
		{
			System.out.println(books.get(i));
		}
		//访问、并不删除队列的第一个元素
		System.out.println(books.peekFirst());
		//访问、并不删除队列的最后一个元素
		System.out.println(books.peekLast());
		//采用出栈的方式将第一个元素pop出队列
		System.out.println(books.pop());
		//下面输出将看到队列中第一个元素被删除
		System.out.println(books);
		//访问、并删除队列的最后一个元素
		System.out.println(books.pollLast());
		//下面输出将看到队列中只剩下中间一个元素:轻量级J2EE企业应用实战
		System.out.println(books);

	}
}

  输出结果:

Android
J2EE
Java
Android
Java
Android
[J2EE, Java]
Java
[J2EE]

**上面的代码分别示范了双端队列,栈的用法,所以LinkedList是一个功能非常强大的集合类。

4.各种线性表的性能分析:


实现机制


随机访问排名


迭代操作排名


插入操作排名


删除操作排名


数组


连续内存区保存元素


1


不支持


不支持


不支持


ArrayList/ArrayDeque


以数组保存元素


2


2


2


2


Vector


以数组保存元素


3


3


3


3


LinkedList


链表保存元素


4


1


1


1

  示例:

import java.util.*;
/**
 * Description:
 * <br/>Copyright (C), 2005-2008, Yeeku.H.Lee
 * <br/>This program is protected by copyright laws.
 * <br/>Program Name:
 * <br/>Date:
 * @author  Yeeku.H.Lee [email protected]
 * @version  1.0
 */
public class TestPerformance
{
	public static void main(String[] args)
	{
		//创建一个字符串数组
		String[] tst1 = new String[900000];
		//动态初始化数组元素
		for (int i = 0; i < 900000; i++)
		{
			tst1[i] = String.valueOf(i);
		}

		ArrayList al = new ArrayList();
		//将所有数组元素加入ArrayList集合中
		long start = System.currentTimeMillis();
		for (int i = 0; i < 900000 ; i++)
		{
			al.add(tst1[i]);
		}
		System.out.println("ArrayList集合添加元素的时间:" + (System.currentTimeMillis() - start));
		LinkedList ll = new LinkedList();
		//将所有数组元素加入LinkedList集合中
		start = System.currentTimeMillis();
		for (int i = 0; i < 900000 ; i++)
		{
			ll.add(tst1[i]);
		}
		System.out.println("LinkedList集合添加元素的时间:" + (System.currentTimeMillis() - start));
		//迭代访问ArrayList集合的所有元素,并输出迭代时间
		start = System.currentTimeMillis();
		for (Iterator it = al.iterator();it.hasNext() ; )
		{
			it.next();
		}
		System.out.println("迭代ArrayList集合元素的时间:" + (System.currentTimeMillis() - start));
		//迭代访问LinkedList集合的所有元素,并输出迭代时间
		start = System.currentTimeMillis();
		for (Iterator it = ll.iterator();it.hasNext() ; )
		{
			it.next();
		}
		System.out.println("迭代LinkedList集合元素的时间:" + (System.currentTimeMillis() - start));

	}
}

  输出结果:

ArrayList集合添加元素的时间:446
LinkedList集合添加元素的时间:16
迭代ArrayList集合元素的时间:11
迭代LinkedList集合元素的时间:12

**可以看出LinkedList添加元素特别快,是ArrayList的几十倍,但遍历时不相上下。用foreach遍历LinkedList也比ArrayList快。

java中的集合到这里基本上总结完啦。。。

下篇会总结下操作集合的工具类:Collections,用它可以方便的把集合变成线程安全的。

转载请注明出处:http://www.cnblogs.com/jycboy/p/javalist.html

时间: 2024-12-18 13:12:45

List集合概述的相关文章

Java基础知识强化之集合框架笔记38:Set集合之Set集合概述和特点

1. Set集合概述和特点 Collection            |--List                     有序(存储顺序和取出顺序一致),可重复            |--Set                     无序(存储顺序和取出顺序不一致),唯一  HashSet:它不保证 set 的迭代顺序:特别是它不保证该顺序恒久不变. 注意:虽然Set集合的元素无序,但是,作为集合来说,它肯定有它自己的存储顺序, 而你的顺序恰好和它的存储顺序一致,这代表不了有序,你可以

Map集合概述和特点

A:Map集合概述和特点(Set底层依赖的是Map) 将键映射到值的对象 一个映射不能包含重复的键 每个键最多只能映射到一个值 B:Map接口和Collection接口的不同 Map是双列的(是双列集合的根接口),Collection是单列的(是单列集合的根接口) Map的键唯一,Collection的子体系Set是唯一的 Map集合的数据结构值针对键有效,跟值无关;如:TreeMap:键是用二叉树算法,HashMap:键是hash算法, Collection集合的数据结构是针对元素有效 图解:

java高级特性之集合概述

java中的集合概述 map 接口 总结 java集合学习 1 java中存储数据的方式 1 数组 (基本数据类型+引用数据类型).2 集合(对象) 数组存储数据的缺点1:数组一旦创建,长度固定 2:数组不能直接确定有效元素的个数 java中的集合概述: java集合接口:Collection 接口 和Map 接口 (Collection接口 表示不按照添加顺序存放对象的集合,而且集合内的元素可以重复即 无序可重复 集合,它是List,Set,Queue..接口的父接口) Collection

java之集合概述

集合也称容器:从大的类别分成两类:Collection和Map,也即:单列和双列列表. java编程思想中一张图说明该体系的整体结构:其中黑色着重的类是经常使用的类. 1 Collection Collection:作为单列集合的根接口.该类集合的继承体系如下: Collection分为两大类:List和Set 1)List: 特点:有序的 collection(也称为序列):列表通常允许重复的元素.       List 接口提供了特殊的迭代器,称为 ListIterator,除了允许 Ite

C#集合概述

C#集合概述 2016-11-29 集合 顺序排列 连顺存储 直接访问方式 访问时间 操作时间 备注 Dictionary 是 Key Key:O(1) O(1) 访问性能最快,不支持排序 SortedDinctionary 顺序排列 否 Key Key:O(log   n) O(log   n) 快速访问和支持排序的折衷 SortedList 顺序排列 是 Key Key:O(log   n) O(n) 和SortedDictionary相似,只是内部用数据替代树作为存储结构. List 使用

跟王老师学集合(一)为什么要使用集合和Java集合概述

为什么要使用集合和Java集合概述 主讲人:王少华  QQ群号:483773664 学习目标 1 理解为什么使用集合 2 掌握Java集合框架 一.使用数组缺陷: 在电子宠物系统中,如果想存储多个宠物信息,可以使用数组来实现.例如,可以定义一个长度50的Dog类型的数组,存储多个Dog对象的信息.但是采用数组存在以下一些明显的缺陷: 数组长度固定不变,不能很好适应元素数量动态变化的情况.若要存储大于50个狗狗的信息,则数组长度不足:若只存储20个狗狗的信息,则造成内存空间浪费 可通过数组名.le

《java集合概述》

1 JAVA集合概述: 2 3 Collection: 4 |---List有序的:通过索引就可以精确的操作集合中的元素.元素是可以重复的. 5 List提供了增删改查的动作. 6 增加add(element) add(index,element); 7 删除remove(element) remove(index); 8 修改set(index,element); 9 查询get(index); 10 |---Vector:是可增长的数组结构.是同步的.增和查速度都慢,效率很低.目前不在使用.

Java集合(一):Java集合概述

注:本文基于JDK 1.7 1 概述 Java提供了一个丰富的集合框架,这个集合框架包含了许多接口.虚拟类和实现类.这些接口和类提供了丰富的功能,能够满足基本的聚合需求.下图就是这个框架的整体结构图: 可以看见,这个框架非常大,大到吃惊的地步.这个图的左面部分是接口,右面部分是类,中间的线代表了右面的类实现了左面的哪些接口.比如,AbstractList类实现了List接口,那么继承自AbstractList类的子类都实现了这个接口.还有,如果一个类实现了一个接口,那么这个类也实现了这个接口的所

Java基础_集合概述以及Colletion集合

集合 1.集合的概述 (1).集合的来由 我们学习的是面向对象的语言,而面向对象语言对事物的描述是通过对象体现的,为了方便对多个对象进行操作,我们必须把这个对象进行 存储,而要想存储多个对象,就不能是一个基本的变量,而应该是一个容器类型的变量,在我们目前所学过的只是里面,有哪一些是容器类 型的呢? 数组和StrngBuffer.但是呢?StringBuffer的结果是一个字符串,不一定满足我们的要求,所以我们只能够选择数组,也就是对象数组. 而对象数组又并不能够适应变化的需求,因为数组的长度是固

一大波Java来袭(五)——Java集合概述

把"Java集合"比作是容器,可以把多个对象(实际:是对象的引用),扔在容器中. JDK1.5之前,被丢进集合中的对象,会丢失起数据类型.默认为Object类型 JDK1.5之后,不会丢失数据类型,因为引入了"泛型"(作为下文重点) 本文将结合数据结构,重点讲述Java的4种集合体系的功能和用法,并给出不同应用场景改如何选择? 一.同样是用于"存储数据",既可以使用"数组",有可以使用"集合",有什么区别吗