30.Java之List集合类(List 接口常用方法、ArrayList 类、Vector 类、LinkedList 类)

30.1.List 接口基本介绍

图片来源b站韩顺平老师

List 接口是 Collection 接口的子接口
  1. List 集合类中元素有序(即 添加顺序 和 取出顺序 一致,不是指元素值大小排列顺序)、且可重复
  2. List 集合中的每个元素都有其对应的顺序索引,即支持索引
  3. List 容器中的元素都对应一个整数型的序号记载其在容器中的位置,可以根据序号存取容器中的元素
30.2.List 接口常用方法

List 集合里添加了一些根据索引来操作集合的方法

  1. void add(int index, Object ele):在 index 位置插入 ele 元素
  2. boolean addAll(int index,Collection eles):从 index 位置开始将 eles 中的所有元素添加进来
  3. Object get(int index):获取指定 index 位置的元素
  4. int indexOf(Object obj):返回 obj 在当前集合中首次出现的位置
  5. int lastIndexOf(Object obj):返回 obj 在当前集合中末次出现的位置
  6. Object remove(int index / Object):移除指定 index 位置的元素,并返回此元素,也可以移除指定元素
  7. Object set(int index,Object ele):设置指定 index 位置的元素为 ele,相当于是替换
  8. List subList(int fromIndex,int toIndex):返回从 fromIndex 到 toIndex 位置的子集合
30.3.ArrayList 类
  1. 可以加入 null ,并且多个
  2. 是由数组来实现数据存储的
  3. 基本等同于 Vector,执行效率高,但 线程不安全,适合单线程,不适合多线程
ArrayList 底层操作机制(看源码)
  1. 维护了一个 Object 类型的数组 elementData
transient Object[] elementData;
// tansient 表示瞬间,短暂的,表示该属性不会被序列化
  1. 当创建ArrayList对象时,如果使用的是无参构造器,则初始化 elementDate 容量为 0 ,第一次添加,则扩容 elementData 为 10,如需要再次扩容,则扩容 elementData 为 1.5
  2. 如果使用的是指定大小的构造器,则初始 elementData 容量为指定大小,如果需要扩容,则直接扩容 elementData 为 1.5
30.4.Vector 类
  1. Vector 底层也是一个对象数组
    protected Object[] elementData;
  2. 线程同步的,即 线程安全
  3. 在开发中,需要线程同步安全,考虑使用 Vector
Vector 和 ArrayList 的比较
底层结构版本线程安全(同步)效率扩容倍数
ArrayList可变数组JDK 1.2不安全,效率高如果有参构造1.5倍;无参第一次10,第二次开始按1.5倍扩
Vector可变数组JDK 1.0安全,效率不高如果是无参,默认10,满后就按2倍扩容;如果指定大小,则每次直接按2倍扩
30.5.LinkedList 类
  1. LinkedList 底层实现了双向链表双端队列特点
  2. 可以添加任意元素(元素可重复),包括 Null
  3. 线程不安全,没有实现同步
LinkedList 的底层操作机制
  1. LinkedList 底层维护了一个双向链表
  2. LinkedList 中维护两个属性 first 和 last 分别指向 首节点和尾节点
  3. 每个节点(Node对象),里面又维护了 prev、next、item 三个属性,其中通过prev指向前一个,通过next指向后一个节点,最终实现双向链表
  4. 添加和删除不是通过数组完成,相对来说效率更高
class Node {
	public Object item;
	public Node next;
	public Node pre;
	public Node(Object name) {
		this.item = name;
	}
	public String toString() {
		return "Node name=" + item;
	}
}

在这里插入图片描述

ArrayList 和 LinkedList 的比较
底层结构增删的效率改查的效率
ArrayList可变数组较低(数组扩容)较高(根据索引)
LinkedList双向链表较高(通过链表追加)较低
30.6.如何选择 ArrayList 、LinkedList 、Vector:
  1. 如果改查的操作多,选择 ArrayList
  2. 如果增删的操作多,选择 LinkedList
  3. ArrayList 和 LinkedList 是针对于单线程情况,若在多线程情况下,则选择 Vector
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值