Java集合之List(超详细)

🏠个人主页:黑洞晓威
🧑个人简介:大家好,我是晓威,一名普普通通的大二在校生,希望在CSDN中与大家一起成长。
🎁如果你也在正在学习Java,欢迎各位大佬来到我的博客查漏补缺呀,如果有哪里写的不对的地方也欢迎诸佬指正啊。

1. List实现类的对比

List接口:存储有序的,可重复的数据。

  • ArrayList : 作为List的主要实现类;线程不安全,效率高;底层使用Object[] elementDatec存储
  • LinkedList : 作为频繁的插入,删除操作,使用此类效率比ArrayList高;底层使用双向链表存储
  • Vector:作为List接口的古老实现类;线程安全的,效率低;底层使用Object[] elementDatec存储
2. ArrayList底层结构和源码分析

1、注意事项:

  • 允许存储所有元素,包括null,ArrayList可以加入一个或者多个null
  • ArrayList是由数组来实现数据存储的
  • ArrayList基本等同于Vector,除了ArrayList是线程不安全的(源码中没有synchronized关键字,执行效率高)

2、ArrayList底层操作机制源码分析

ArrayList中维护了一个Object类型的数组elementData:

transient Object[] elementData;//transient关键字表示,该属性不会被序列化
  • 当创建ArrayList对象的时候,如果使用的是无参构造器,则初始elementData容量为0,第一次添加,则扩容elementData为10,如需再次扩容, 则扩容elementData1.5倍
  • 如果使用的是指定大小的构造器,则初始化elementData容量为指定大小,如果需要扩容,则直接扩容elementData为1.5倍
3. LinkedList底层结构与源码分析

LinkedList说明:

  • LinkedList底层实现了双向链表和双端队列的特点
  • 可以添加任意元素(可以重复), 包括null
  • 线程不安全,没有实现同步

LinkedList底层机制

  • LinkedList底层维护了一个双向链表
  • LinkedList中维护了两个属性first和last分别指向首节点和尾节点
  • 每个节点(Node对象),里面又维护了prev、next、item三个属性,其中prev指向前一个,通过next指向后一个节点,最终实现双向链表
  • 所以LinkedList的元素添加和删除,不是通过数组实现的,相对来说效率较高
4 . List中的常用方法
方法作用
add(int index,Object obj)在index位置插入元素
allAdd(int index ,Collection coll)从index位置开始将coll总所有元素添加进来
get(int index)获取指定index位置的元素
remove(int index)移除指定index位置的元素并返回此元素
set(int index , Object obj)设置指定index位置的元素为obj
subList(int fromIndex,int toIndex)返回从fromIndex到 toIndex位置的子集合
indexOf(Object obj)返回obj在集合中首次出现的位置
LastIndexof(Object obj)返回obj在当前集合中末次出现的位置
List中的增删改查插

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jq4sYKaM-1666266311217)(C:\Users\sp815\AppData\Roaming\Typora\typora-user-images\image-20220930170403352.png)]

public static void main(String[] args) {
    ArrayList list = new ArrayList();
    //增
    list.add(123);
   list.add(456);
   list.add(new String("AA"));
   list.add(new Student("张三",18));
    System.out.println(list);

    //删
    list.remove(0);
    list.remove(new Integer(123));
   


    System.out.println(list);

    //改:
    list.set(0,007);
    
    //查:
    list.get(0);
    
    //插:
    list.add(1,234);


}

遍历的两种方法:

ArrayList list = new ArrayList();
 //增
 list.add(123);
list.add(456);
list.add(new String("AA"));
list.add(new Student("张三",18));
 System.out.println(list);
 
 //方式一:
 //Iterator迭代器
 Iterator iterator = list.iterator();
 while (iterator.hasNext()){
     System.out.println(iterator.next());
 }

//方式二:
 //增强for循环
 for(Object obj:list){
            System.out.println(obj);
        }
一道面试题

区分List中remove(int index)和remove(Object obj)

remove(int index)通过下标删除

remove(Object obj)通过元素删除

如何选择ArrayList和LinkedList:

1)如果改查操作多,选择ArrayList

2)如果增删操作多,选择LinkedList

3)一般来说,在程序中,80%-90%都是查询,因此大部分情况下都会选择ArrayList

4)在一个项目中,根据业务灵活选择。

🎉文章到这里就结束了,感谢诸佬的阅读。🎉

💕欢迎诸佬对文章加以指正,也望诸佬不吝点赞、评论、收藏加关注呀😘在这里插入图片描述

  • 9
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

黑洞晓威

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

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

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

打赏作者

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

抵扣说明:

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

余额充值