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