Java高级_Day03(List迭代器、数据结构、ArrayList,Vector,LinkedLis的实现及使用场景)

Java高级_Day03(List迭代器、数据结构、ArrayList,Vector,LinkedLis的实现及使用场景)

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);
    }
}

并发修改异常

  • 使用普通for解决
  • 使用迭代器进行迭代,同时使用迭代器进行修改

List接口的典型实现

ArrayList

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

数据结构:

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

数组

在内存中是连续存储的 可以通过索引来访问到数组中的每一个元

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

队列

在这里插入图片描述

链表

单向链表 双向链表 循环链表
链表在计算机中的存储的地址是不连续
单向链表:
在这里插入图片描述
双向链表:
在这里插入图片描述
循环链表:
在这里插入图片描述

数组和链表的区别:

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

二叉树

在这里插入图片描述
前序遍历:根左右
后序遍历:左右根
中序遍历:左根右

ArrayList的 实现

底层实现使用的是数组 数组的默认容量为1
在这里插入图片描述
在这里插入图片描述
添加的方式:
在这里插入图片描述
扩容机制
在这里插入图片描述
在这里插入图片描述

    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

LinkedLis

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的使用场景

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

因为Vector的效率较ArrayList低
在开发中 一般都 使用ArrayList

ArrayList 和LinkedList的使用场景.

  • 如果数据查询的频率高 而删除和插入的频率低 则使用ArrayList
  • 如果查询的频率低 而删除和插入的频率高 则使用LinkedList
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值