JAVASE高级 day_3 集合2:数据结构、ArrayList、LinkedList

本文深入探讨了Java中的List接口实现,重点关注ArrayList和LinkedList的实现细节,包括迭代器的使用、数据结构如数组和链表的区别,以及在并发修改异常、扩容机制等方面的分析。同时,讨论了在不同场景下选择ArrayList或LinkedList的策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

List迭代器的源码分析

在这里插入图片描述

使用迭代器来修改集合中的元素

// 用于允许程序员沿任一方向遍历列表的列表的迭代器,
 while(listIterator.hasNext()){//从前往后遍历
    Object obj = listIterator.next();
    if(obj.equals(0)){
       listIterator.set("java");//慎用 此处执行的是修改操作 此时已经将3号位置的元素修改为了java
        listIterator.previous();//但是course 已经跳过了3号位置 指向了4 所以我们需要回退重新获取3号位置的新值
    }else{
        System.out.println(obj);
    }
 }

添加

while(listIterator.hasNext()) {//从前往后遍历
    Object obj = listIterator.next();
    if (obj.equals(0)) {
        listIterator.add("java");//慎用
        listIterator.previous();
    }
    System.out.println(obj);
}

删除

while(listIterator.hasNext()) {//从前往后遍历
    Object obj = listIterator.next();
    if (obj.equals(0)) {
        listIterator.remove();//慎用
       // listIterator.previous();
    }else{
        System.out.println(obj);
    }
}

并发修改异常

1. 使用普通for实现
2. 使用迭代器进行迭代,同时使用迭代器进行修改

List接口的典型实现

ArrayList

可调整大小的数组的实现List接口。 实现所有可选列表操作,并允许所有元素,包括null 。 除了实现List 接口之外,该类还提供了一些方法来操纵内部使用的存储列表的数组的大小。 (这个类是大致相当于Vector,不同之处在于它是不同步的)。

Vector

Vector类实现了可扩展的对象数组 他是同步的

LinkedList

双链表实现 并允许所有元素(包括null ) 此实现不同步

数据结构

指的是数据在计算机中存储的结构及存储的方式。

结构1 : 数组

在内存中是连续存储的 可以通过索引来访问到数组中的每一个元素
在这里插入图片描述

结构2 : 栈

栈的特点: 先进后出
在这里插入图片描述

结构3:队列

在这里插入图片描述

结构4:链表

单向链表 双向链表 循环链表

链表在计算机中的存储的地址是不连续

单向链表
在这里插入图片描述
双向链表
在这里插入图片描述

循环链表
在这里插入图片描述

数组和链表的区别:

数组:查询效率高  插入  删除 都包含了移位操作 因此效率低
链表:查找效率低  插入 删除 效率高

二叉树

在这里插入图片描述

前序遍历:根 左 右
后序遍历:左 右 根
中序遍历:左 根 右

红黑树:

ArrayList的实现

底层实现使用的是数组 数组的默认容量为10

容量增长方式:0.5系数
在这里插入图片描述
在这里插入图片描述

添加

在这里插入图片描述

扩容机制

在这里插入图片描述
在这里插入图片描述

    public static void main(String[] args) {
        // 在实际使用中  都是用的多态的形式
        List list = new ArrayList();
        Student st1 = new Student("张三",20);
        Student st2 = new Student("李四",22);
        list.add(st1);
        list.add(st2);
        //进行遍历
//        for(int i = 0 ; i < list.size();i++){
//           Object obj =  list.get(i);
//            System.out.println(obj);
//        }
        //增强for
//        for (Object  obj : list){
//            System.out.println(obj);
//        }
        //使用迭代器
        Iterator iter = list.iterator();
        while(iter.hasNext()){
            Object obj = iter.next();
            System.out.println(obj);
        }
    }

Vector

在这里插入图片描述
Vector的默认容量也是10

LinkedList

LinkedList底层实现是双向链表
在这里插入图片描述
添加元素
在这里插入图片描述
头插法的实现
在这里插入图片描述
尾插法
在这里插入图片描述
默认采用尾插法

public static void main(String[] args) {
    LinkedList  list = new LinkedList();
    Student st1 = new Student("张三",20);
    Student st2 = new Student("李四",22);
    Student st3 = new Student("王五",23);
    Student st4 = new Student("赵四",22);
    list.add(st1);
    list.add(st2);
    list.add(st3);
    list.add(st4);
    Iterator iter = list.iterator();
    while(iter.hasNext()){
        Object obj = iter.next();
        System.out.println(obj);
    }
    System.out.println("------------------");
    Object first = list.getFirst();//获取头节点
    System.out.println(first);
    Object last = list.getLast();//获取尾节点
    System.out.println(last);
}

Vector和ArrayList的使用场景

1. 在多线程的环境中使用Vector
2. 在不需要保证数据同步的时候 优先使用ArrayList

因为Vector的效率较ArrayList低

在开发中 一般都 使用ArrayList

ArrayList 和LinkedList的使用场景

如果数据查询的频率高 而删除和插入的频率低 则使用ArrayList

如果查询的频率低 而删除和插入的频率高 则使用LinkedList

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值