List接口
List是有序的
Collection,使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引(元素在List中的位置,类似于数组下标)来访问List中的元素,这类似于Java的数组。
和Set不同,List允许有相同的元素
。
除了具有Collection接口必备的iterator()方法外,List还提供一个listIterator()方法,返回一个
ListIterator接口,和标准的Iterator接口相比,ListIterator多了一些add()之类的方法,允许添加,删除,设定元素,
还能向前或向后遍历。
实现List接口的常用类有LinkedList,ArrayList,
Vector和Stack。
LinkedList类
LinkedList实现了List接口,允许null元素。此外LinkedList提供额外的get,remove,insert方法在
LinkedList的首部或尾部。这些操作使LinkedList可被用作堆栈(stack),队列(queue)或双向队列(deque)。
注意LinkedList没有同步方法。如果多个线程同时访问一个List,则必须自己实现访问同步。一种解决方法是在创建List时构造一个同步的List:
List list = Collections.synchronizedList(new LinkedList(...));
ArrayList类
ArrayList实现了可变大小的数组。它允许所有元素,包括null。ArrayList没有同步。
size,isEmpty,get,set方法运行时间为常数。但是add方法开销为分摊的常数,添加n个元素需要O(n)的时间。其他的方法运行时间为线性。
每个ArrayList实例都有一个容量(Capacity),即用于存储元素的数组的大小。这个容量可随着不断添加新元素而自动增加,但是增长算法并
没有定义。当需要插入大量元素时,在插入前可以调用ensureCapacity方法来增加ArrayList的容量以提高插入效率。
和LinkedList一样,ArrayList也是非同步的(unsynchronized)。
Vector类
Vector非常类似ArrayList,但是
Vector是同步的。由
Vector创建的Iterator,虽然和ArrayList创建的Iterator是同一接口,但是,因为
Vector是同步的,当一个Iterator被创建而且正在被使用,另一个线程改变了
Vector的状态(例如,添加或删除了一些元素),这时调用Iterator的方法时将抛出ConcurrentModificationException,因此必须捕获该异常。
Stack 类
Stack继承自
Vector,实现一个后进先出的堆栈。Stack提供5个额外的方法使得
Vector得以被当作堆栈使用。基本的push和pop方法,还有peek方法得到栈顶的元素,empty方法测试堆栈是否为空,search方法检测一个元素在堆栈中的位置。Stack刚创建后是空栈。
ArrayList,
Vector和
LinkedList的比较
ArrayList
和Vector是采用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,都允许直接序号索引元素,但是插入数据要设计到数组元素移动等内存操作,所以 索引数据快 插入数据慢
;Vector由于使用了synchronized方法(线程安全)所以性能上比ArrayList要差。
LinkedList使用双向链表实现存储,按序号索引数据需要进行向前或向后遍历,但是插入数据时只需要记录本项的前后项即可,所以插入数度较快
!
下面通过程序来验证一下:
import java.util.*;
public class TestList{
private List ll=new LinkedList();
private List al=new ArrayList();
private Vector v=new Vector();
private long start;
private long end;
private long time;
public TestList(){
for(int i=0;i<10000;i++)
ll.add(i);
for(int i=0;i<10000;i++)
al.add(i);
for(int i=0;i<10000;i++)
v.add(i);
}
public void testAddLinkedList(){
start=System.currentTimeMillis();
for(int i=0;i<1000;i++)
ll.add(5,5);
for(int i=0;i<1000;i++)
ll.remove(100);
end=System.currentTimeMillis();
time=end-start;
System.out.println("add time in LinkedList:"+time);
System.out.println();
}
public void testAddArrayList(){
start=System.currentTimeMillis();
for(int i=0;i<1000;i++)
al.add(5,5);
for(int i=0;i<1000;i++)
al.remove(100);
end=System.currentTimeMillis();
time=end-start;
System.out.println("add time in ArrayList:"+time);
System.out.println();
}
public void testAddVector(){
start=System.currentTimeMillis();
for(int i=0;i<1000;i++)
v.add(5,5);
for(int i=0;i<1000;i++)
v.remove(100);
end=System.currentTimeMillis();
time=end-start;
System.out.println("add time in Vector:"+time);
System.out.println();
}
public void testGetLinkedList(){
start=System.currentTimeMillis();
for(int i=0;i<2000;i++)
ll.get(i);
end=System.currentTimeMillis();
time=end-start;
System.out.println("get time in LinkedList:"+time);
System.out.println();
}
public void testGetArrayList(){
start=System.currentTimeMillis();
for(int i=0;i<2000;i++)
al.get(i);
end=System.currentTimeMillis();
time=end-start;
System.out.println("get time in ArrayList:"+time);
System.out.println();
}
public void testGetVector(){
start=System.currentTimeMillis();
for(int i=0;i<2000;i++)
v.get(i);
end=System.currentTimeMillis();
time=end-start;
System.out.println("get time in Vector:"+time);
System.out.println();
}
public static void main(String args[]){
TestList tl=new TestList();
tl.testAddLinkedList();
tl.testAddArrayList();
tl.testAddVector();
tl.testGetLinkedList();
tl.testGetArrayList();
tl.testGetVector();
}
}
运行结果
add time in LinkedList:0
add time in ArrayList:31
add time in Vector:63
get time in LinkedList:15
get time in ArrayList:0
get time in Vector:0
分享到:
相关推荐
通过PPT讲解和代码演示,我们可以更直观地了解这些容器的工作原理以及在不同场景下的选择。例如,对比vector和list在添加元素时内存分配的差异,map和set在查找元素时的时间复杂度,以及deque在处理双端操作时的优势...
`ExportDB`类中的`main`方法使用`SchemaExport`工具根据配置文件创建数据库表结构。`HibernateUtils`类提供了一个静态工厂方法来获取`SessionFactory`,这是Hibernate的主要入口点,用于创建`Session`实例,进而执行...
NumPy(Numerical Python)是Python的一种开源的数值计算扩展。...本资源通过源码实例讲解的方式展示了Numpy库的简明使用方法,对快速学习掌握numpy具有很强指导作用。同时也可作为使用numpy库的参考手册。
8. **列表连接**:使用`+`或`extend()`方法可以连接两个列表,如`new_list = my_list + [5, 6]`或`my_list.extend([7, 8])`。 9. **列表排序**:`sort()`方法对列表进行原地排序,`sorted(list)`返回一个新的已排序...
总结来说,这个实例演示了如何利用Ajax、JSON和Struts2框架在客户端与服务器之间传递和展示List数据,无需刷新整个页面。通过这种方式,可以提高用户体验,使Web应用更加动态和交互性更强。在实际开发中,这样的技术...
在"ExcelTest"这个压缩包文件中,很可能包含了示例代码或者演示如何使用SortedList和VSTO合并Excel文件的项目。为了进一步学习和实践,你可以解压文件,查看其中的代码和步骤,通过运行程序理解其工作原理,并根据...
【标题】"VH系列PLC使用讲解"涵盖了PLC(可编程逻辑控制器)的基础知识,特别是关于VH系列的PLC。这一主题主要面向初学者和工程师,旨在帮助他们理解和掌握如何有效地运用PLC进行自动化系统的控制。 PLC是一种专为...
本文介绍了使用Python列表的常用操作方法完成课后练习的解答过程。通过示例代码演示了如何创建空列表、向列表中添加元素、访问列表元素并计算列表元素之和。 通过学习本文,您将了解以下内容: 使用循环和用户输入...
本篇文章将深入探讨如何扩展MFC ListControl的功能,特别是实现按字符串、日期和数字的排序,并讲解如何通过点击列表头来触发排序操作。 首先,我们需要了解ListControl的基本结构。在MFC中,ListControl控件是...
本教程将重点讲解在使用Hibernate时,如何处理查询结果集合,特别是通过`list()`和`iterator()`方法进行数据迭代的操作。 【描述】"http://blog.csdn.net/e421083458/article/details/8794127" 这个链接指向的是一...
本教程将详细讲解如何在VC++中使用List控件,特别是涉及到排序和颜色设置的实例。 首先,`CReportCtrl`是MFC(Microsoft Foundation Classes)库中的一个类,它封装了Windows API中的`LISTVIEW`控件,支持报告视图...
在Web开发中,尤其是使用ASP.NET技术时,`CheckBoxList`控件经常被用来呈现一组可多选的选项。在用户界面中,用户可以勾选他们感兴趣的选项,然后提交表单。开发人员需要获取这些选中的选项的值(`value`)和文本(`...
下面是一个简单的Java代码示例,演示如何将List传给存储过程: ```java import java.sql.*; public class JavaCallProcedureDemo { public static void main(String[] args) { String url = "jdbc:mysql://...
Java平台提供了一个全新的集合框架,框架的核心为Collection、List(列表)、Set(集合)和Map(映射)。集合类的框架为集合的实现者提供了大量的接口和抽象类,并对...collection.rar分别对上述内容进行详细讲解演示。
下面是一个简单的示例代码,演示如何使用JDOM读取和修改XML文件: ```java import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import org....
现代前端开发还常常使用jQuery、Vue.js、React或Angular等库或框架,以提高开发效率和用户体验。 最后,部署Java Web应用通常需要应用服务器,如Tomcat、Jetty或WebLogic。这些服务器提供了运行Java Web应用的环境...
学习者还将接触到动态内存管理,包括new和delete操作符的使用,以及防止内存泄漏的方法。 容器库(STL,Standard Template Library)是C++中的重要组成部分,它提供了各种数据结构(如vector、list、set、map等)和...
本文将详细讲解如何使用Java标准库中的`Collections`类的`max()`和`min()`方法来找到`List`中的最大和最小元素。 首先,`Collections`类是Java `java.util`包下的一个工具类,它提供了各种静态方法,用于操作集合,...
在这个"数据结构算法演示"的压缩包中,我们可以期待找到一系列与这些主题相关的资源,包括但不限于代码示例、讲解文档或者教学视频,覆盖了.NET、C#、C++以及Java这四种主流编程语言。 数据结构是关于如何在计算机...
高级界面开发2Command事件和List3.rar”的压缩包中,可能包含了一个名为“03-7.swf”的文件,这通常是一个Flash动画或演示,用于直观地展示Command事件和List组件的使用方法。尽管SWF文件在J2ME环境中无法直接运行...