【Java进阶最详解】List入门一篇看懂(一)继承关系和区别了解

本文详细介绍了Java中的List接口,重点分析了ArrayList、LinkedList和Vector这三个实现类的实现方式、特性及扩容策略。通过阅读,你可以理解List的有序和可重复特性,了解数组与List的区别,并掌握在不同场景下选择合适List实现类的依据。
摘要由CSDN通过智能技术生成

在这里插入图片描述

List简介

引言: Java中List是一个有序的、可重复的集合,扩展Collection接口的接口,在java.util包下,提供增删改查数据的基本功能,且可以通过索引来插入替换和删除集合元素的方法。
集合的出现就是为了持有对象,集合中可以存储任意类型的对象,而且长度可变

java.util包下容器的分类图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CmkFUIFO-1598173707698)(8299922027A14D05A9F45F3F71D25C59)]

  • ?List是什么
1.List是有序的Collection。
2.使用此接口能够精确的控制每个元素插入的位置。
3.用户能够使用索引(元素在List中的位置,类似于数组下标)来访问List中的元素。
4.这类似于Java的数组。 
  • ? 数组Array和集合ArrayList的区别
# 数组Array(Array([])

1.数组在内存中是连续存储的,所以它的索引速度是非常的快,而且赋值与修改元素也很简单
2.声明数组的时候,必须同时指明数组的长度,数组的长度过长,会造成内存浪费,数组和长度过短,会造成数据溢出的错误。
3. 数组只能存放类型一样的数据(基本类型/引用类型)

# 集合List(ArrayList)

1.容量可动态增长;但牺牲效率
2.ArrayList内部封装了一个Object类型的数组
3.可以将 ArrayList想象成一种“会自动扩增容量的Array”

  • ?有了数组为什么还需要List集合
# 存在问题:

数组长度是固定的,在日常编程中可能经常不确定会有多少个对象。
如果使用数组那么一旦数量超过了数组的长度就将发生异常:
java.lang.ArrayIndexOutOfBoundsException
这个异常表示数组下标越界

# 解决:

集合的出现就是为了持有对象,集合中可以存储任意类型的对象,而且长度可变
  • ?List的特性有什么
List允许添加重复元素
List允许拥有'null'元素
List支持泛型
  • ?List的继承关系和区别
|--List:元素是有序的(怎么存的就怎么取出来,顺序不会乱),元素可以重复(角标1上有个3,角标2上也可以有个3)因为该集合体系有索引,
  |-- ArrayList:底层的数据结构使用的是数组结构(数组长度是可变的百分之五十延长)(特点是查询很快,但增删较慢)线程不同步
  |-- LinkedList:底层的数据结构是链表结构(特点是查询较慢,增删较快)
  |-- Vector:底层是数组数据结构 线程同步(数组长度是可变的百分之百延长)(无论查询还是增删都很慢,被ArrayList替代了)
  • ? 如何使用总结
# 基于Array的List(Vector,ArrayList)适合查询
# 而LinkedList 适合添加,删除操作

1. 所有的List中只能容纳单个不同类型的对象组成的表,而不是Key-Value键值对。例如:[ tom,1,c ]
2. 所有的List中可以有相同的元素,例如Vector中可以有 [ tom,koo,too,koo ]
3. 所有的List中可以有null元素,例如[ tom,null,1 ]

实现类

ArrayList

  • ?如何实现
# ArrayList是基于数组实现的

继承自AbstractList实现了List中所有方法
该集合可以插入任何元素包括null元素
除继承过来的方法外,还提供一些方法来操作内部用来存储列表的数组的大小
public class Hello {
	public static void main(String[] args) {
		List list = new ArrayList();
	}
}
  • ?如何扩容
# Arraylist有一个初始的大小(10)
# 该大小会随着元素的增加而增长/在创建的时候自定义大小

public static void main(String[] args) {
		List list = new ArrayList(20);
}

# Arraylist的空间容量扩展:如果空间不够时则取原集合大小扩展2倍和最小需求大小中较大的那个进行扩展。
  • ?有什么特性
1、底层使用 数组 数据结构
2、由于本质是数组,所以实现随机访问,而且速度较快,按照元素插入的顺序保持数据
3、删除和移动元素性能较低,因为会导致整个集合元素的移动
4、集合中的元素是可以重复的
5、有顺序
6、线程不安全的
  • ?怎么实现操作
# 插入,删除,查找等操作如下:

1. 插入操作需要先检查是否需要扩容数组,如果数据是插入到尾部的则可直接赋值,否则插入到中部则需要调用System.arraycopy()方法(JNI方法)移动数据腾出空间,再插入数据。
2. 删除操作直接通过System.arraycopy()操作覆盖目标值的位置
3. 修改元素值只需要在数组中直接替换。
4. 查找操作是简单的遍历查找,因此效率可能不高 。但是比LinkedList的遍历速度快。
5. 获取元素操作通过index直接返回,比较高效。

LinkedList

  • ?如何实现
# LinkedList是基于链表实现的

是一种线性的存储结构
继承自AbstractSequentialList抽象类,实现了List等接口
能对它进行队列操作,LinkedList内部基于双向链表实现,允许插入任何元素,包括null

# LinkedList是一种双向链表,头结点中不存放数据

链表中任意一个存储单元都可以通过向前或者向后寻址的方式获取到其前一个存储单元和其后一个存储单元
链表的尾节点的后一个节点是链表的头结点,链表的头结点的前一个节点是链表的尾节点
public class Hello {
	public static void main(String[] args) {
		List list = new LinkedList()
	}
}
  • ?有什么特性
LinkedList的特点是查询速度慢,增删快。
  • ?如何扩容
# Arraylist有一个初始的大小(10)
# 该大小会随着元素的增加而增长/在创建的时候自定义大小

public static void main(String[] args) {
		List list = new ArrayList(20);
}

# Arraylist的空间容量扩展:如果空间不够时则取原集合大小扩展2倍和最小需求大小中较大的那个进行扩展。

Vector

  • ?如何实现
!!!与ArrayList及LinkedList最大的不同:
!!!Vector中的操作是线程安全的
其大部分方法都使用了synchronized修饰来保证同步

# Vector 是矢量队列,它是JDK1.0版本添加的类
继承于AbstractList,实现了List, RandomAccess, Cloneable接口。

#Vector 类可以实现可增长的对象数组
与数组一样,它包含可以使用整数索引进行访问的组件
但是,Vector 的大小可以根据需要增大或缩小,以适应创建 Vector 后进行添加或移除项的操作
public static void main(String[] args) {
		List list = new Vector();
		list.add("123");
		list.add("456");
}
  • ?有什么特性
Vector中的操作是线程安全的
其大部分方法都使用了synchronized修饰来保证同步

总结

ArrayList和LinkedList区别

# 存储方式和实现效率

将ArrayList和LinkedList放在一起,观察它们对于List接口的实现在效率、行为上有什么不同点。首先ArrayList的底层使用数组,LinkedList使用链表来存储数据,LinkedList会同时保存链表的头指针和尾指针
# 在执行指定位置的增删改查操作时最重要的不同点有三个:

1.ArrayList在执行add操作时可能会涉及到底层数组的扩容。
2.ArrayList能够通过数组下标直接定位到指定位置,LinkedList需要从头指针或者尾指针遍历。
3.ArrayList在非头尾位置进行add或者remove操作,会涉及到数组中其他元素的拷贝。而LinkedList不会拷贝其他位置的元素。

ArrayList和Vector

# 两者的底层实现用的都是数组

# 它们的主要区别在于【安全和扩容】:

1.Vector是线程安全的列表,它通过对关键方法使用synchronize关键字的方式实现线程安全

2.在扩容方面,Vector如果未指定每次扩容的大小,会扩容为原先的2倍,而ArrayList扩容为原先的1.5倍。

—end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值