【java】ArrayList和LinkedList集合容器

数组(Array)有什么缺点

1.在创建数组的时候,就需要定死长度,在运行过程中需要判断剩余长度,并动态扩容

2.在中间插入的时候,需要将后面的元素进行后移

3.在中间删除的时候,需要将后面的元素进行前移

4.数组的封装类 -列表(ArrayList)

数组的特点:有序的,不唯一的

 - 构造方法    先研究如何构造对象

ArrayList()

ArrayList(int)//一般不用

 - 成员变量    研究构造出来的对象中有什么

elementData -- Object[] 类型

size   --int 类型

 - 成员方法    研究如何操作对象中的成员

add(int) --- 在数组尾部的第一个不为空的位置添加元素

add(int,E) ---在数组中指定位置插入

set(int,E) --- 修改数组指定位置

remove(int) --- 根据索引号移除

remove(Object) --- 根据指针移除,如果存在多个,只会移除第一个

get(int)--- 根据指定的索引号查询某个元素并返回

ArrayList类中的“E”到底是什么?

泛型

用泛型来实现类中数据类型(可以是参数类型,可以是返回值类型,可以是任意变量的类型,可以是向下转型的类型)的未知

作者在编写的时候用E来表达未知数据类型,调用者在使用的时候可以给出E的具体的类型,也可以不给,不给的话,E=Object;//多态指针

如果给出E的具体类型,是在声明指针的时候给出

给出E的具体数据类型的语法:

ArrayList<String> al1=new ArrayList();//单态指针

ArrayList<Car> al2=new ArrayList();

用泛型的好处:被调用方可以帮调用方写向下转型的代码

双向链表类 LinkedList

底层:Node(节点)对象

构造方法

成员变量

成员方法

  1. 增:addFirst(E) 在头部添加

addLast(E) 在尾部添加

add(E) 在尾部追加

add(int, E) 在指定位置插入

链表在中间插入的速度要优于数组,只需要找到插入位置的节点,创建新的节点,然后修改指针即可

数组在尾部插入很快,但是其他比较慢,因为要后移

  1. 删:removeFirst() 删除头部

removeLast() 删除尾部

Remove(int) 根据指定位置删除

Remove(object) 根据指定元素删除

  1. 改:set(int,E)
  2. 查:get(int)

链表并没有索引的机制,所以需要二分查找法遍历链表找到指定位置的节点,并返回节点的item;数组的查找要优于链表

中间插入和删除,链表优于数组,原因是数组需要前移和后移

查询和修改,数组优于链表,原因是链表没有索引号

链表不存在扩容和转移,数组需要

LinkedList的内部类 - node类(用于创建双向链表中的节点对象)

节点的双向链表表示:

遍历ArrayList和LinkedList的几种方式:

  1. 普通for循环
  2. 增强型for循环
  3. forEach循环
  4. 迭代器

Array和ArrayList的区别是什么?

Array是数组ArrayList是类

Array是定长的(需要手动扩容),ArrayList长度可变(使用过程中自动扩容)

ArrayList的底层是Array

ArrayList和LinkedList的区别是什么?

  1. 底层数据结构实现︰ArrayList底层数据结构是动态数组,而 LinkedList的底层数据结构是双向链表
  2. 随机访问(即读)效率∶ArrayList比LinkedList在随机访问的时候效率要高,因为ArrayList底层是数组,可以通过索引号快速访问,LinkedList是通过二分查找法遍历链表节点进行查找的
  3. 增加和删除效率∶在非首尾的增加和删除操作,LinkedList 要比 ArrayList 效率要高,因为ArrayList增删操作需要大量的前移或后移,这个过程中涉及到大量的赋值操作比较耗时间,LinkedList只需要修改节点对象的左右指针即可。
  4. 内存空间占用:LinkedList 比 ArrayList更占内存,因为 LinkedList的节点除了存储数据,还存储了两个引用,一个指向前一个元素,一个指向后一个元素。

5.综合来说,在需要频繁读取集合中的元素时,更推荐使用ArrayList,而在插入和删除操作较多时,更推荐使用 LinkedList。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码老祖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值