List
# 前言
Java
集合可分为Collection
和Map
两种体系:
Collection
接口:单列数据,定义了存取一组对象的方法的集合List
:元素有序、可重复的集合ArrayList
、LinkedList
、Vector
Set
:元素无序、不可重复的集合HashSet
、LinkedHashSet
、TreeSet
Map
接口:双列数据,保存具有映射关系“key-value对
”的集合,也称为键值对。HashMap
、LinkedHashMap
、TreeMap
、Hashtable
、Properties
现在我们开始学习List接口。
# 概述
- 鉴于
Java
中数组用来存储数据的局限性,我们通常使用List
替代数组 List
集合类中元素有序、且可重复,集合中的每个元素都有其对应的顺序索引。List
容器中的元素都对应一个整数型的序号记载其在容器中的位置,可以根据序号存取容器中的元素。JDK API
中List
接口的实现类常用的有:ArrayList
、LinkedList
和Vector
。
# List接口方法
List
除了从Collection
集合继承的方法外,List
集合里添加了一些根据索引来操作集合元素的方法。
void add(int index, Object ele)
:在index
位置插入ele
元素boolean addAll(int index, Collection eles)
:从index
位置开始将eles
中的所有元素添加进来Object get(int index)
:获取指定index
位置的元素int indexOf(Object obj)
:返回obj在集合中首次出现的位置,如果找不到返回-1。int lastIndexOf(Object obj)
:返回obj在当前集合中末次出现的位置Object remove(int index)
:移除指定index位置的元素,并返回此元素。- 注意父类
Collection
也有一个方法是boolean remove(Object obj)
- 通过元素的
equals
方法判断是否是要删除的那个元素。只会删除找到的第一个元素。
- 通过元素的
- 所以List类可以按索引或者对象来删除。
- 注意父类
Object set(int index, Object ele)
:设置指定index位置的元素为eleList subList(int fromIndex, int toIndex)
:返回从fromIndex到toIndex位置的子集合(左闭右开区间)- 本身list不会改变。
# 面试题
请问
ArrayList
/LinkedList
/Vector
的异同?谈谈你的理解?ArrayList
底层是什么?扩容机制?Vector
和ArrayList
的最大区别?
ArrayList和LinkedList的异同
二者都线程不安全,相对线程安全的
Vector
,执行效率高。此外,
ArrayList
是实现了基于动态数组的数据结构,LinkedList
基于链表的数据结构。对于随机访问
get
和set
,ArrayList
优于LinkedList
,因为LinkedList
要移动指针。对于新增和删除操作
add(特指插入)
和remove
,LinkedList
比较占优势,因为ArrayList
要移动数据。
ArrayList和Vector的区别
Vector
和ArrayList
几乎是完全相同的,唯一的区别在于Vector
是同步类(synchronized
),属于强同步类。因此开销就比ArrayList
要大,访问要慢。正常情况下,大多数的Java程序员使用
ArrayList
而不是Vector
,因为同步完全可以由程序员自己来控制。Vector
每次扩容请求其大小的2倍空间,而ArrayList
是1.5倍。Vector
还有一个子类Stack
。
# 总结
ArrayList
、LinkedList
和Vector
三者的异同
同:
- 三各类都是实现了List接口, 存储数据的特点相同:存储有序的、可重复的数据。
不同:
ArrayList
:作为List接口的主要实现类,线程不安全的,效率高;底层使用动态数组存储LinkedList
:对于频繁的插入、删除操作,使用此类比Arraylist
效率高;底层使用双向链表存储Vector
:作为List接口的古老实现类,线程安全的,效率低;底层使用动态数组存储
常用方法
- 增:
add(Object obj)
- 删:
remove(int index)
/remove(Object obj)
- 改:
set(int index, Object ele)
- 查:
get(int index)
- 插:
add(int index,Object obj)
- 长度:
size()
- 遍历:
- 1、
Iterator
迭代器 - 2、增强
for
循环 - 3、普通
for
循环
- 1、
帮我改善此页面 (opens new window)
上次更新: 2020/12/27, 05:00:47