19.javase-javaAPI-集合之List集合

集合

1.集合的由来?
我们学习的是Java – 面向对象 – 操作很多对象 – 存储 – 容器(数组和StringBuffer) – 数组,而数组的长度固定,所以不适合做变化的需求,Java就提供了集合供我们使用。
2.集合和数组的区别?

A:长度区别
数组固定
集合可变,但其实底层也是其他方式实现的.
B:内容区别
数组可以是基本类型,也可以是引用类型
集合只能是引用类型
C:元素内容
数组只能存储同一种类型
集合可以存储不同类型(其实集合一般存储的也是同一种类型)

3.集合的继承体系结构?
由于需求不同,Java就提供了不同的集合类。这多个集合类的数据结构不同,但是它们都是要提供存储和遍历功能的,我们把它们的共性不断的向上提取,最终就形成了集合的继承体系结构图。
集合类存放于 Java.util 包中,主要有 3 种:set(集)、list(列表包含 Queue)和 map(映射)。

  1. Collection:Collection 是集合 List、Set、Queue 的最基本的接口。
  2. Iterator:迭代器,可以通过迭代器遍历集合中的数据
  3. Map:是映射表的基础接口
    在这里插入图片描述

List

Java 的 List 是非常常用的数据类型。List 是有序的 Collection。Java List 一共三个实现类:
分别是 ArrayList、Vector 和 LinkedList
在这里插入图片描述

一.ArrayList(数组)

特点:
1.底层是数组实现,也就代表了元素是存储地址连续.
2.线程不安全的
3.增删慢,查询快,增删都有可能导致数组扩容,因为数组的容量是固定的,所以如果要扩容就会重新创建一个数组,并且复制原数组的元素.

底层:
1.底层是对象数组.
2.默认初始容量为10.
3.扩容时,扩容0.5.

底层数组.
在这里插入图片描述
当数组容量满了之后,扩容倍数.
在这里插入图片描述

常用方法:

增加
boolean add(Element e) //增加指定元素到链表尾部.
void add(int index, Element e) //增加指定元素到链表指定位置.
boolean addAll(Collection<? extends E> c) //将指定collection中的所有元素插入到ArrayList中
boolean addAll(int index, Collection<? extends E> c) //从指定的位置开始,将指定collection 中的所有元素插入到ArrayList中

删除
void clear() //从链表中删除所有元素.
E remove(int index) //删除链表中指定位置的元素.
boolean removeIf(Predicate<? super E> filter) //根据重写Predicate类的test方法选择删除集合中的元素
boolean removeAll(Collection<?> c) //移除ArrayList中Collection所包含的所有元素
boolean remove(Object o) //移除ArrayList中首次出现的指定元素(如果存在则移除并返回true,否则返回false)

获取
E get(int index) //获取链表中指定位置处的元素.
Object[] toArray() //获取一个数组,数组中所有元素是链表中的元素.(即将链表转换为一个数组)
T[] toArray(T[] a) //构造一个数组
List subList(int fromIndex, int toIndex) //获取从fromIndex到toIndex位置的元素

查询
E set(int index, E element) //将链表中指定位置上的元素替换成新元素。
搜索元素
boolean contains(Object o) //如果链表包含指定元素,返回true.
int indexOf(Object o) //返回元素在链表中第一次出现的位置,如果返回-1,表示链表中没有这个元素。
int lastIndexOf(Object o) //返回元素在链表中最后一次出现的位置,如果返回-1,表示链表中没有这个元素。
检查链表是否为空
boolean isEmpty() //返回true表示链表中没有任何元素. 判断逻辑是size == 0 获取链表大小
int size() //返回链表长度(链表包含元素的个数).

二.Vector(数组实现、线程同步)

特点:
1.同ArrayList一样底层是数组.
2.线程安全的,加了锁,影响性能.
3.增删慢,查询快,增删都有可能导致数组扩容,因为数组的容量是固定的,所以如果要扩容就会重新创建一个数组,并且复制原数组的元素.
底层:
1.底层是数组.
2.初始容量和容量增幅由自己创建对象时传入.

创建Vector对象时指定初始容量,和扩容容量增幅.
在这里插入图片描述
数组容量增幅,如果指定了,用指定的增幅,如果没有则扩容一倍.
在这里插入图片描述
线程锁,用synchronized关键字实现
在这里插入图片描述
常用方法:

三.LinkList(链表)

LinkedList双向链表:其实java中并不存在什么集合的存储结构,包括链表这种存储结构也是相同的,他其实就是把一堆存储在存储在不同位置的内存区域通过一个关系联系起来,合起来就叫做链表.举个例子来说:ArrayList就是住在一个村的人也就是存储位置连续,而LinkedList就是你的同学,你们只是有一种逻辑上的联系在.

特点:
1.底层是双向链表.Node对象.
2.线程不安全.
3.增删快,查询慢.

数据结构模型:双向链表在这里插入图片描述
LinkedList的元素结构,他的属性里列出了头元素和尾部元素,以及链表尺寸三个属性.
在这里插入图片描述
这个LinkedList的内部内Node节点类,节点类的属性有三个,第一个E就是存储的元素值,next和prev就是存储的上下节点.
在这里插入图片描述
常用方法:
LinkedList的常用方法相对于ArrayList多了多余收尾位置的元素的操作,因为链表增加删除都比较快,所以多了索引操作相关的方法.

增加

LinkedList提供了多个添加元素的方法:

●boolean add(E e)

在链表尾部添加一个元素,如果成功,返回true,否则返回false。

●void addFirst(E e)

在链表头部插入一个元素。

●addLast(E e)

在链表尾部添加一个元素。

●void add(int index, E element)

在指定位置插入一个元素。
删除

LinkedList提供了多个删除元素的方法:

●boolean remove(Object o)

从当前链表中移除指定的元素。

● E remove(int index)

从当前链表中移除指定位置的元素。

● E removeFirst()

从当前链表中移除第一个元素。

● E removeLast()

从当前链表中移除最后一个元素。

● E remove()

从当前链表中移除第一个元素,同removeLast()相同。
获取

LinkedList提供了多个获取元素的方法:

● E get(int index)

从当前链表中获取指定位置的元素。

● E getFirst()

从当前链表中获取第一个元素。

● E getLast()

从当前链表中获取最后一个元素。

LinkedList可实现队列的FIFO(first in first out)和栈的LIFO(last in first out)算法.
具体实现就是正向取值为栈LIFO算法,逆向取值为队列FIFO算法.

发布了42 篇原创文章 · 获赞 0 · 访问量 668

猜你喜欢

转载自blog.csdn.net/weixin_45449911/article/details/104479003