`
youyu4
  • 浏览: 442086 次
社区版块
存档分类
最新评论

java -- List总结

 
阅读更多

java -- List总结

 

 

概括

 

  1. List 是一个接口,它继承于Collection的接口。它代表着有序的队列。

 

  2. AbstractList 是一个抽象类,它继承于AbstractCollection。AbstractList实现List接口中除size()、get(int location)之外的函数。

 

  3. AbstractSequentialList 是一个抽象类,它继承于AbstractList。AbstractSequentialList 实现了“链表中,根据index索引值操作链表的全部函数”。

 

  4. ArrayList, LinkedList, Vector, Stack是List的4个实现类。

 

  • ArrayList 是一个数组队列,相当于动态数组。它由数组实现,随机访问效率高,随机插入、随机删除效率低。
  • LinkedList 是一个双向链表。它也可以被当作堆栈、队列或双端队列进行操作。LinkedList随机访问效率低,但随机插入、随机删除效率高。
  • Vector 是矢量队列,和ArrayList一样,它也是一个动态数组,由数组实现。但是ArrayList是非线程安全的,而Vector是线程安全的。
  • Stack 是栈,它继承于Vector。它的特性是:先进后出(FILO, First In Last Out)。

 

 

 

应用场景

 

    如果涉及到“栈”、“队列”、“链表”等操作,应该考虑用List,具体的选择哪个List,根据下面的标准来取舍。

 

  • 对于需要快速插入,删除元素,应该使用LinkedList。
  • 对于需要快速随机访问元素,应该使用ArrayList。
  • 对于“单线程环境” 或者 “多线程环境,但List仅仅只会被单个线程操作”,此时应该使用非同步的类(如ArrayList)。
  • 对于“多线程环境,且List可能同时被多个线程操作”,此时,应该使用同步的类(如Vector)。

 

 

 

LinkedList和ArrayList性能差异分析

 

问题一:为什么LinkedList中随机访问很慢,而ArrayList中随机访问很快

 

LinkedList找元素的过程:双向链表查找index位置的节点时,有一个加速动作:若index < 双向链表长度的1/2,则从前向后查找; 否则,从后向前查找。

 

ArrayList找元素的过程:直接返回数组中index位置的元素,而不需要像LinkedList一样进行查找。

 

 

 

问题二:为什么LinkedList中插入元素很快,而ArrayList中插入元素很慢

 

LinkedList插入过程

 

  • 不需要扩容,LinkedList的容量随着插入而增加
  • 根据index,找到对应元素,查找过程如上面
  • 在index位置插入元素,并且修改元素前后的指针就好,不需要移动元素

 

 

ArrayList插入过程

 

  • 确认ArrayList的容量,若容量不够,则增加容量。
  • 根据index找到元素,这个比较快
  • 插入元素后,会移动index之后所有元素,这就意味着,ArrayList的add(int index, E element)函数,会引起index之后所有元素的改变!
  • 注意:如果插入的是List的尾部,还是挺快的

 

 

 

Vector和ArrayList比较

 

相同之处

 

  1. 它们都是List,都继承于AbstractList

 

  2. 它们都实现了RandomAccess和Cloneable接口

 

  •   实现RandomAccess接口,意味着它们都支持快速随机访问;
  •   实现Cloneable接口,意味着它们能克隆自己。

  3. 它们都是通过数组实现的,本质上都是动态数组

 

  4. 它们的默认数组容量是10

 

  5. 它们都支持Iterator和listIterator遍历

 

 

 

不同之处

 

  1. 线程安全性不一样

 

  •   ArrayList是非线程安全;
  •   Vector是线程安全的,它的函数都是synchronized的,即都是支持同步的。
  •   ArrayList适用于单线程,Vector适用于多线程。

  2. 对序列化支持不同

  ArrayList支持序列化,而Vector不支持;即ArrayList有实现java.io.Serializable接口,而Vector没有实现该接口。

 

  3. 构造函数个数不同

  ArrayList有3个构造函数,而Vector有4个构造函数。Vector除了包括和ArrayList类似的3个构造函数之外,另外的一个构造函数可以指定容量增加系数。

 

  ArrayList的构造函数如下:

 

// 默认构造函数
ArrayList()

// capacity是ArrayList的默认容量大小。当由于增加数据导致容量不足时,容量会添加上一次容量大小的一半。
ArrayList(int capacity)

// 创建一个包含collection的ArrayList
ArrayList(Collection<? extends E> collection)

 

 

  Vector的构造函数如下:

 

// 默认构造函数
Vector()

// capacity是Vector的默认容量大小。当由于增加数据导致容量增加时,每次容量会增加一倍。
Vector(int capacity)

// 创建一个包含collection的Vector
Vector(Collection<? extends E> collection)

// capacity是Vector的默认容量大小,capacityIncrement是每次Vector容量增加时的增量值。
Vector(int capacity, int capacityIncrement)

 

 

  4. 扩容方式不同

 

  • ArrayList容量不足时,“新的容量”=“(原始容量x3)/2 + 1”。
  • Vector的容量增长与“增长系数有关”,若指定了“增长系数”,且“增长系数有效(即,大于0)”;那么,每次容量不足时,“新的容量”=“原始容量+增长系数”。若增长系数无效(即,小于/等于0),则“新的容量”=“原始容量 x 2”。

  5. 对Enumeration的支持不同。Vector支持通过Enumeration去遍历,而List不支持

 

 

分享到:
评论

相关推荐

    javalist数据结构-Java数据结构-------List.pdf

    Java中的List接口是集合框架的重要组成部分,它定义了一组有序的元素序列,允许有重复的元素。ArrayList、Vector和LinkedList都是List接口的实现类,它们各自具有不同的特性和使用场景。 1. ArrayList: ArrayList...

    计算机后端-Java-Java核心基础-第24章 集合01 18. List遍历及方法总结.avi

    计算机后端-Java-Java核心基础-第24章 集合01 18. List遍历及方法总结.avi

    java 技术总结.--java 技术

    Java集合框架是存储和管理对象的重要工具,包括List、Set、Map等接口以及ArrayList、LinkedList、HashSet、HashMap等实现类。这些容器允许我们高效地组织和操作数据。 五、输入/输出(I/O)与网络编程 Java的I/O库...

    整理的Java-EE面试总结.pdf

    这份名为《整理的Java-EE面试总结.pdf》的文档是一份关于Java基础面试知识点的总结,内容涉及了多个在面试中常见的问题和概念,以及它们的区别和使用场景。根据提供的文件信息,下面将详细解读其中的关键知识点。 ...

    java-api中文

    总结来说,"java-api中文"提供了一个中文版的Java API查询资源,对于学习和使用Java编程语言的开发者而言,这是一个不可或缺的工具。"javamsdn"可能是这种资源的具体实现,它可能是一个本地化的、便于查询的API文...

    java-se-summary-JavaSE相关的总结文章

    这个总结文章将深入探讨Java SE的主要知识点,帮助开发者全面理解并掌握这一强大的编程工具。 1. **基础语法**:Java是一种强类型、面向对象的语言,其基础语法包括变量声明、数据类型(如整型、浮点型、字符型、...

    java-se 学习总结项目 Java学习资料

    这个"java_se 学习总结项目"包含了丰富的Java学习资料,旨在帮助开发者深入理解Java编程语言,提升技能。以下是对这个项目中可能包含的知识点的详细说明: 1. **Java基础**: - **语法特性**:包括变量、数据类型...

    Think-in-JAVA-4th-Edition

    - **集合框架**:详述Java集合框架的核心类和接口,如List、Set、Map等。 - **异常处理**:讲解如何使用异常处理机制编写健壮的Java程序。 - **输入/输出流**:探讨Java中的文件和流处理技术。 - **网络编程**:介绍...

    jni操作list集合,来存储对象

    总结起来,JNI操作Java的List集合存储对象涉及到以下步骤: - 定义Java层的JNI接口。 - 初始化JNI环境,找到相关类和方法ID。 - 在C/C++中实现JNI方法,创建和操作Java对象。 - 注意对象序列化和内存管理。 - 处理...

    java知识总结------关键知识点总结

    - `Collection` 是集合框架的顶级接口,包括 Set 和 List 接口。 - `Collections` 是一个工具类,提供了对集合进行操作的静态方法,如排序、查找、线程安全化等。 6. **assert**: - 断言是一种调试工具,用于...

    java-corejava

    2. **集合框架**:Java集合框架是处理对象集合的核心工具,包括List、Set、Queue和Map四大接口,以及ArrayList、LinkedList、HashSet、HashMap等实现类。理解和掌握它们的特性和使用场景,能够帮助开发者高效地管理...

    java-collections-framework1016

    #### 八、总结 本教程全面介绍了Java Collections Framework的基础知识,涵盖了集合的基本概念、核心接口、具体实现类以及相关的算法支持等内容。通过学习这些知识,开发者将能够更加熟练地使用Java中的集合类,...

    Java--工作面试总结.doc

    【Java面向对象编程】 面向对象编程(Object-Oriented Programming,简称OOP)是Java语言的核心编程思想。在Java中,万物皆对象,每个类都继承自基础的`Object`类,遵循单一继承的原则,即一个类只能有一个父类。...

    java 处理Excel 带 List

    总结来说,使用Java和Apache POI处理Excel文件,特别是将List对象导出为Excel,是一种高效且灵活的方法。通过熟练掌握这些技术,开发者可以轻松地实现数据的导入导出功能,提升项目的工作效率。

    bcs_Baidu-BCS-SDK-Java-1.4.5.zip_Baidu-BCS-SDK-Java_baidu-sdk-1.

    总结,百度云存储BCS Java SDK 1.4.5版本为开发者提供了强大的工具,简化了与BCS的交互流程。通过学习和掌握SDK的使用,我们可以轻松地将程序文件存入云端,享受到BCS带来的高效、稳定和安全的数据存储服务。无论是...

    java集合类知识总结--思维导图文件xmind

    java集合类知识总结--思维导图文件xmind xmind文件类型 总结了java常用集合相关问题 包括map、set、list、数组等

    如何轻松打java-jar包

    总结来说,打包Java `.jar`文件涉及到编译源码,配置合适的环境变量,使用`jar`命令进行打包,并确保有正确的主类声明。通过这些步骤,开发者可以方便地管理和分发他们的Java应用程序。在实际开发中,还可以使用构建...

    [java面试宝典word]阿里巴巴-java-研发成功笔面试总结

    【Java面试宝典】阿里巴巴Java研发成功笔面试总结 在准备阿里巴巴Java研发岗位的面试时,深入理解Java语言的关键概念和技术至关重要。这份文档是基于实际的面试经历和经验总结,旨在帮助求职者全面掌握Java面试的...

    java List 深度复制方法

    总结来说,Java中实现List的深度复制,可以采用序列化和反序列化的方法,或者手动复制每个元素。选择哪种方法取决于你的具体需求,例如对象是否支持序列化,以及性能和代码复杂性的考量。在处理可变对象时,确保深...

    Java-ppt.rar_PPT java_java ppt_java.ppt_java源代码教学

    Java集合框架提供了一组接口(如List、Set、Queue)和实现这些接口的类(如ArrayList、HashSet、LinkedList等),用于处理动态数据集。 **异常处理** Java的异常处理机制使得程序员能够优雅地处理程序运行时可能...

Global site tag (gtag.js) - Google Analytics