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

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

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值