JavaSE笔记(1.1)Java集合-list

前言

集合类存放于 Java.util 包中,主要有 3 种:set(集)、list(列表包含 Queue)和 map(映射)。

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

许多集合底层都是依赖于数组的实现,但是数组一旦初始化,就确定了长度,不能动态存储数据对象,其次数组存储元素不便于对数组进行添加、修改、删除操作,而且数组可以存储重复元素,这个时候就需要一个更方便的操作处理对象的工具-集合
在这里插入图片描述

Collection

collection是一个接口,包含了集合的操作和属性(在jdk -> rt.jar-> java -> util 下的Collection接口)
在这里插入图片描述
比如这个size()方法:集合长度、对象个数,isEmpty()方法:判断集合是否为空
在这里插入图片描述

List

List 接口的特点:有序集合,可以精确控制列表中每个元素的位置插入, 用户可以通过整数索引访问元素,并搜索列表中的元素,就是 顺序存储,顺序取出,可以重复

Java 的 List 是非常常用的数据类型。List 是有序的 Collection。
在这里插入图片描述
可以看出list继承Collection接口
在这里插入图片描述Java List 一共三个实现类:分别是 ArrayList(数组)、Vector (数组实现、线程同步)和 LinkedList(链表)

  • ArrayList(数组)

ArrayList 是最常用的 List 实现类,内部是通过数组实现的,它允许对元素进行快速随机访问
ArrayList 的底层是数组队列,相当于动态数组
在这里插入图片描述
List的实现类ArrayList:
在这里插入图片描述

数组的缺点是每个元素之间不能有间隔,当数组大小不满足时需要增加存储能力,就要将已经有数组的数据复制到新的存储空间中。当从 ArrayList 的中间位置插入或者删除元素时,需要对数组进行复制、移动、代价比较高。
因此,它适合随机查找和遍历,不适合插入和删除
ArrayList的具体使用,ArrayList比较常用,应该熟练掌握,当然常用的也就那几种方法:

添加
add(E e):将指定的元素添加到此列表的尾部;

add(int index, E element):将指定的元素插入此列表中的指定位置;

删除
remove(int index):移除此列表中指定位置上的元素;

remove(Object o):移除此列表中首次出现的指定元素(如果存在);

扫描二维码关注公众号,回复: 9174613 查看本文章

removeRange(int fromIndex, int toIndex):移除列表中索引在 fromIndex(包括)和 toIndex(不包括)之间的所有元素;

removeAll():是继承自AbstractCollection的方法,ArrayList本身并没有提供实现;

查找

Contains(object obj):查找数组中是否有obj元素,存在返回true;
IndexOf(object obj):从0开始查找obj元素,只第一个obj元素,并返回起在数组中的位置,如果不存在,返回-1;

IndexOf(object obj,int startIndex):从startIndex开始查找obj元素,只第一个obj元素,并返回起在数组中的位置;

IndexOf(object obj,int startIndex,int count):从startIndex开始想后查找count个元素,如果存在obj元素,则返回其在数组中的位置;

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

Vector 与 ArrayList 一样,也是通过数组实现的,不同的是它支持线程的同步,即某一时刻只有一个线程能够写 Vector,避免多线程同时写而引起的不一致性,但实现同步需要很高的花费,因此,访问它比访问 ArrayList 慢
Vector方法是同步的,即是线程安全的,如果有多个线程访问集合,使用Vector就不用考虑线程安全
在这里插入图片描述
Vector是List的实现类:
在这里插入图片描述

java.util.vector提供了向量类(Vector)以实现类似动态数组的功能。
创建了一个向量类的对象后,可以往其中随意插入不同类的对象,即不需顾及类型也不需预先选定向量的容量,并可以方便地进行查找。
对于预先不知或者不愿预先定义数组大小,并且需要频繁地进行查找,插入,删除工作的情况或者考虑线程安全的情况,可以考虑使用向量类
Vector的使用
常用方法也是增删改查那几个:
添加
在这里插入图片描述
删除:
在这里插入图片描述

  • LinkList(链表)

LinkedList 是用链表结构存储数据的,很适合数据的动态插入和删除,随机访问和遍历速度比较慢。
另外,他还提供了 List 接口中没有定义的方法,专门用于操作表头和表尾元素,可以当作堆栈、队列和双向队列使用。
在这里插入图片描述
LinkedList是List的实现类:
在这里插入图片描述LinkedList的操作也相似:增删改查
LinkedList详解
LinkedList的底层是一个双向链表结构,在进行查找操作的时候需要花费很多的时间来遍历整个链表(因为只能通过从头开始遍历找到指定元素,要移动指针,建议使用迭代器iterator遍历),这就是LinkedList在查找效率不如ArrayList、Vector快的原因。
但是由于其链表结构的特殊性,在插入、删除数据的时候,只需要修改链表节点的前后指针就可以完成操作,其的效率远远高于ArrayList、Vector。

总结

collection是一个接口,包含了集合的操作和属性
List接口继承collection接口,List 是有序的 Collection
List 一共三个实现类:分别是 ArrayList(数组)、Vector (数组实现、线程同步)和 LinkedList(链表)

三者区别:

  1. 存储结构:ArrayList和Vector是基于数组实现的,LinkedList是基于双向链表实现的
  2. 线程安全性:ArrayList,LinkedList不具有线程安全性,Vector是线程安全的
  3. 扩容机制:ArrayList扩容后的容量是之前的1.5倍,然后把之前的数据拷贝到新建的数组中去。而Vector默认情况下扩容后的容量是之前的2倍,Vector可以设置容量增量,而ArrayList不可以
  4. 增删改查的效率(总体来讲,数据数量级不同又有区别效率测试):ArrayList、Vector完成插入、删除操作,其效率不如LinkedList;LinkedList在查找效率不如ArrayList、Vector快,在插入、删除数据的时候其的效率远远高于ArrayList、Vector;而因为线程同步的原因,ArrayList访问比Vector快
发布了49 篇原创文章 · 获赞 0 · 访问量 1240

猜你喜欢

转载自blog.csdn.net/key_768/article/details/104166983