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不支持
相关推荐
Java中的List接口是集合框架的重要组成部分,它定义了一组有序的元素序列,允许有重复的元素。ArrayList、Vector和LinkedList都是List接口的实现类,它们各自具有不同的特性和使用场景。 1. ArrayList: ArrayList...
计算机后端-Java-Java核心基础-第24章 集合01 18. List遍历及方法总结.avi
Java集合框架是存储和管理对象的重要工具,包括List、Set、Map等接口以及ArrayList、LinkedList、HashSet、HashMap等实现类。这些容器允许我们高效地组织和操作数据。 五、输入/输出(I/O)与网络编程 Java的I/O库...
这份名为《整理的Java-EE面试总结.pdf》的文档是一份关于Java基础面试知识点的总结,内容涉及了多个在面试中常见的问题和概念,以及它们的区别和使用场景。根据提供的文件信息,下面将详细解读其中的关键知识点。 ...
总结来说,"java-api中文"提供了一个中文版的Java API查询资源,对于学习和使用Java编程语言的开发者而言,这是一个不可或缺的工具。"javamsdn"可能是这种资源的具体实现,它可能是一个本地化的、便于查询的API文...
这个总结文章将深入探讨Java SE的主要知识点,帮助开发者全面理解并掌握这一强大的编程工具。 1. **基础语法**:Java是一种强类型、面向对象的语言,其基础语法包括变量声明、数据类型(如整型、浮点型、字符型、...
这个"java_se 学习总结项目"包含了丰富的Java学习资料,旨在帮助开发者深入理解Java编程语言,提升技能。以下是对这个项目中可能包含的知识点的详细说明: 1. **Java基础**: - **语法特性**:包括变量、数据类型...
- **集合框架**:详述Java集合框架的核心类和接口,如List、Set、Map等。 - **异常处理**:讲解如何使用异常处理机制编写健壮的Java程序。 - **输入/输出流**:探讨Java中的文件和流处理技术。 - **网络编程**:介绍...
总结起来,JNI操作Java的List集合存储对象涉及到以下步骤: - 定义Java层的JNI接口。 - 初始化JNI环境,找到相关类和方法ID。 - 在C/C++中实现JNI方法,创建和操作Java对象。 - 注意对象序列化和内存管理。 - 处理...
2. **集合框架**:Java集合框架是处理对象集合的核心工具,包括List、Set、Queue和Map四大接口,以及ArrayList、LinkedList、HashSet、HashMap等实现类。理解和掌握它们的特性和使用场景,能够帮助开发者高效地管理...
#### 八、总结 本教程全面介绍了Java Collections Framework的基础知识,涵盖了集合的基本概念、核心接口、具体实现类以及相关的算法支持等内容。通过学习这些知识,开发者将能够更加熟练地使用Java中的集合类,...
【Java面向对象编程】 面向对象编程(Object-Oriented Programming,简称OOP)是Java语言的核心编程思想。在Java中,万物皆对象,每个类都继承自基础的`Object`类,遵循单一继承的原则,即一个类只能有一个父类。...
总结来说,使用Java和Apache POI处理Excel文件,特别是将List对象导出为Excel,是一种高效且灵活的方法。通过熟练掌握这些技术,开发者可以轻松地实现数据的导入导出功能,提升项目的工作效率。
总结,百度云存储BCS Java SDK 1.4.5版本为开发者提供了强大的工具,简化了与BCS的交互流程。通过学习和掌握SDK的使用,我们可以轻松地将程序文件存入云端,享受到BCS带来的高效、稳定和安全的数据存储服务。无论是...
java集合类知识总结--思维导图文件xmind xmind文件类型 总结了java常用集合相关问题 包括map、set、list、数组等
总结来说,打包Java `.jar`文件涉及到编译源码,配置合适的环境变量,使用`jar`命令进行打包,并确保有正确的主类声明。通过这些步骤,开发者可以方便地管理和分发他们的Java应用程序。在实际开发中,还可以使用构建...
【Java面试宝典】阿里巴巴Java研发成功笔面试总结 在准备阿里巴巴Java研发岗位的面试时,深入理解Java语言的关键概念和技术至关重要。这份文档是基于实际的面试经历和经验总结,旨在帮助求职者全面掌握Java面试的...
总结来说,Java中实现List的深度复制,可以采用序列化和反序列化的方法,或者手动复制每个元素。选择哪种方法取决于你的具体需求,例如对象是否支持序列化,以及性能和代码复杂性的考量。在处理可变对象时,确保深...
Java集合框架提供了一组接口(如List、Set、Queue)和实现这些接口的类(如ArrayList、HashSet、LinkedList等),用于处理动态数据集。 **异常处理** Java的异常处理机制使得程序员能够优雅地处理程序运行时可能...