Java集合之List(超详细)

简介: List接口:存储有序的,可重复的数据。ArrayList : 作为List的主要实现类;线程不安全,效率高;底层使用Object[] elementDatec存储LinkedList : 作为频繁的插入,删除操作,使用此类效率比ArrayList高;底层使用双向链表存储Vector:作为List接口的古老实现类;线程安全的,效率低;底层使用Object[] elementDatec存储
🏠个人主页: 黑洞晓威
🧑个人简介:大家好,我是晓威,一名普普通通的大二在校生,希望在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)在一个项目中,根据业务灵活选择。

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

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

相关文章
|
2月前
|
存储 安全 Java
Java 集合框架中的老炮与新秀:HashTable 和 HashMap 谁更胜一筹?
嗨,大家好,我是技术伙伴小米。今天通过讲故事的方式,详细介绍 Java 中 HashMap 和 HashTable 的区别。从版本、线程安全、null 值支持、性能及迭代器行为等方面对比,帮助你轻松应对面试中的经典问题。HashMap 更高效灵活,适合单线程或需手动处理线程安全的场景;HashTable 较古老,线程安全但性能不佳。现代项目推荐使用 ConcurrentHashMap。关注我的公众号“软件求生”,获取更多技术干货!
52 3
|
2月前
|
存储 缓存 安全
Java 集合江湖:底层数据结构的大揭秘!
小米是一位热爱技术分享的程序员,本文详细解析了Java面试中常见的List、Set、Map的区别。不仅介绍了它们的基本特性和实现类,还深入探讨了各自的使用场景和面试技巧,帮助读者更好地理解和应对相关问题。
60 5
|
3月前
|
存储 缓存 安全
Java 集合框架优化:从基础到高级应用
《Java集合框架优化:从基础到高级应用》深入解析Java集合框架的核心原理与优化技巧,涵盖列表、集合、映射等常用数据结构,结合实际案例,指导开发者高效使用和优化Java集合。
72 4
|
3月前
|
存储 Java 开发者
在 Java 中,如何遍历一个 Set 集合?
【10月更文挑战第30天】开发者可以根据具体的需求和代码风格选择合适的遍历方式。增强for循环简洁直观,适用于大多数简单的遍历场景;迭代器则更加灵活,可在遍历过程中进行更多复杂的操作;而Lambda表达式和`forEach`方法则提供了一种更简洁的函数式编程风格的遍历方式。
|
3月前
|
Java
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式。本文介绍了 Streams 的基本概念和使用方法,包括创建 Streams、中间操作和终端操作,并通过多个案例详细解析了过滤、映射、归并、排序、分组和并行处理等操作,帮助读者更好地理解和掌握这一重要特性。
62 2
|
3月前
|
存储 Java
判断一个元素是否在 Java 中的 Set 集合中
【10月更文挑战第30天】使用`contains()`方法可以方便快捷地判断一个元素是否在Java中的`Set`集合中,但对于自定义对象,需要注意重写`equals()`方法以确保正确的判断结果,同时根据具体的性能需求选择合适的`Set`实现类。
|
3月前
|
安全 Java
Java多线程集合类
本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。
|
3月前
|
Java 开发者
从 Java 中的 Set 集合中删除元素
【10月更文挑战第30天】
|
4月前
|
安全 Java 程序员
深入Java集合框架:解密List的Fail-Fast与Fail-Safe机制
本文介绍了 Java 中 List 的遍历和删除操作,重点讨论了快速失败(fail-fast)和安全失败(fail-safe)机制。通过普通 for 循环、迭代器和 foreach 循环的对比,详细解释了各种方法的优缺点及适用场景,特别是在多线程环境下的表现。最后推荐了适合高并发场景的 fail-safe 容器,如 CopyOnWriteArrayList 和 ConcurrentHashMap。
99 5
|
4月前
|
Java 程序员 编译器
Java|如何正确地在遍历 List 时删除元素
从源码分析如何正确地在遍历 List 时删除元素。为什么有的写法会导致异常,而另一些不会。
91 3