JAVA之旅(十九)——ListIterator列表迭代器,List的三个子类对象,Vector的枚举,LinkedList,ArrayList和LinkedList的小练习


关于数据结构,所讲的知识太多了,我们只能慢慢的来分析了

一.ListIterator列表迭代器

ListIterator列表迭代器是个什么鬼?我们通过一个小例子来认识他

package com.lgl.hellojava;

import java.util.ArrayList;
import java.util.Iterator;

import javax.print.attribute.standard.MediaSize.Other;

//公共的   类   类名
public class HelloJJAVA {
    public static void main(String[] args) {
        listiterator();
    }

    /**
     * 演示列表迭代器
     */
    public static void listiterator() {
        /**
         * 需求:对集合中的元素取出,在取的过程中进行操作
         */
        ArrayList al = new ArrayList<>();
        al.add("hello 01");
        al.add("hello 02");
        al.add("hello 03");
        al.add("hello 04");

        // 在迭代过程中,准备添加或者删除元素
        Iterator it = al.iterator();
        while (it.hasNext()) {
            Object obj = it.next();

            if (obj.equals("hello 02")) {
                // 将这个元素删除
                al.add("hello 05");
                sop(obj);
            }
        }
    }

    /**
     * 输出
     */
    public static void sop(Object obj) {
        System.out.println(obj);
    }

}

我们用老方法的思路去做我们的需求,是这样的,你运行后悔发现

他打印了02缺报异常了,我们于是要去查看API

他不清楚怎么去操作,这也是这个迭代器的缺陷

  • list集合特有的迭代器叫做ListIterator,是Iterator的子接口,在迭代时,不可以通过集合对象的方法操作集合中的元素,因为会发现并发修改异常,所以,在迭代器时,只能用迭代器的方式操作元素,可是Iterator方法有限,如果想要其他的操作如添加,修改等,就需要使用其子接口:ListIterator,该接口只能通过list集合的ListIterator方法获取

所以我们可以这样去修改

package com.lgl.hellojava;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.ListIterator;

//公共的   类   类名
public class HelloJJAVA {
    public static void main(String[] args) {
        listiterator();
    }

    /**
     * 演示列表迭代器
     */
    public static void listiterator() {
        /**
         * 需求:对集合中的元素取出,在取的过程中进行操作
         */
        ArrayList al = new ArrayList<>();
        al.add("hello 01");
        al.add("hello 02");
        al.add("hello 03");
        al.add("hello 04");

        sop(al);

        ListIterator li = al.listIterator();
        while (li.hasNext()) {
            Object object = li.next();
            if (object.equals("hello 03")) {
                li.add("lgl");
            }

        }
        sop(al);

        // 在迭代过程中,准备添加或者删除元素
        // Iterator it = al.iterator();
        // while (it.hasNext()) {
        // Object obj = it.next();
        //
        // if (obj.equals("hello 02")) {
        // // 将这个元素删除
        // // al.add("hello 05");
        // it.remove();
        // sop(obj);
        // }
        // sop(al);
        // }
    }

    /**
     * 输出
     */
    public static void sop(Object obj) {
        System.out.println(obj);
    }

}

不仅可以增加,还可以修改,删除等操作

二.List的三个子类对象

List有三个子类对象

  • ArrayList
  • LinkedList
  • Vector

为什么会有三个?因为底层的数据结构不一样,那具体是怎么样的呢?

  • ArrayList

    • 底层的数据结构使用的是数组结构,特点:查询速度很快,但是增删稍慢,元素不多的话,你体会不到的。线程不同步。
  • LinkedList
    • 底层使用的链表数据结构,特点:增删的速度很快,查询的速度慢。
  • Vector
    • 底层是数组数据结构,线程同步。做什么都慢,被ArrayList替代了

ArrayList和Vector都是数组结构,他们有什么具体的区别呢?

  • ArrayList构造一个初始容量为10的空列表,当长度超过10之后增加50%,而后者,长度也为10,超过的话,是100%延长至20,比较浪费空间

三.Vector的枚举

上面说了这么多,虽然Vector不用,但是我们还是要熟悉一下,面试的时候也是会问到的,所以我们写个小例子

package com.lgl.hellojava;

import java.util.Enumeration;
import java.util.Vector;

//公共的   类   类名
public class HelloJJAVA {
    public static void main(String[] args) {
        Vector v = new Vector();

        v.add("hello 01");
        v.add("hello 02");
        v.add("hello 03");
        v.add("hello 04");

        // 返回枚举
        Enumeration elements = v.elements();
        while (elements.hasMoreElements()) {
            sop(elements.nextElement());
        }
    }

    /**
     * 输出
     */
    public static void sop(Object obj) {
        System.out.println(obj);
    }

}

这样就输出了

枚举就是Vector特有的取出方式,我们发现枚举和迭代器很像,其实枚举和迭代时一样的,因为枚举的名称以及方法的名称都过长,所以被迭代器所取代了。枚举就郁郁而终了

四.LinkedList

我们继续来说list的子类对象LinkedList,事实上区别都不是很大,所以我们只说一些特有的特点

LinkedList特有方法:

  • addFirst()
  • addLast();
  • getFirst();
  • getLast();
  • removeFirst();
  • removeLast();

我们来看

package com.lgl.hellojava;

import java.util.LinkedList;

//公共的   类   类名
public class HelloJJAVA {
    public static void main(String[] args) {

        LinkedList list = new LinkedList<>();

        list.addFirst("hello 0");
        list.addFirst("hello 1");
        list.addFirst("hello 2");
        list.addFirst("hello 3");

        sop(list);
    }

    /**
     * 输出
     */
    public static void sop(Object obj) {
        System.out.println(obj);
    }

}

输出的结果

我们一直添加头部,就是倒序了,这个逻辑应该都知道吧!要是addLast(),那就是顺序了,我们要想知道他们的头部和尾部的数值,也就直接get就是了

    sop(list.getFirst());
    sop(list.getLast());

获取元素,但是元素被删除,如果集合中没有元素,会出异常,在JDK1.6版本后出现了替代方法

  • offerFirst();
  • offerLast();

  • peekFirst();

  • peekLast();

  • pollFist();

  • pollLast();

之类的

五.小练习

我们写个小练习吧,我们先看LinkedList

package com.lgl.hellojava;

import java.util.LinkedList;

//公共的   类   类名
public class HelloJJAVA {
    public static void main(String[] args) {
        /**
         * 使用LinkedList模拟一个堆栈或者队列数据模式 堆栈:现进后出 队列:先进先出
         */
        DuiLie dl = new DuiLie();
        dl.MyAdd("hello 01");
        dl.MyAdd("hello 02");
        dl.MyAdd("hello 03");
        dl.MyAdd("hello 04");

        while (!dl.isNull()) {
            sop(dl.myGet());
        }

    }

    /**
     * 输出
     */
    public static void sop(Object obj) {
        System.out.println(obj);

    }

}

/**
 * 队列
 *
 * @author LGL
 *
 */
class DuiLie {

    private LinkedList link;

    public DuiLie() {
        link = new LinkedList<>();
    }

    public void MyAdd(Object obj) {
        link.addFirst(obj);
    }

    public Object myGet() {
        return link.removeLast();
    }

    public boolean isNull() {
        return link.isEmpty();
    }

}

自己写的一个链表,去使用它,这样输出的结果就是

OK,那我们继续,写一个ArrayList的小例子

package com.lgl.hellojava;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;

//公共的   类   类名
public class HelloJJAVA {
    public static void main(String[] args) {
        /**
         * 去除ArrayList的重复元素
         */

        ArrayList list = new ArrayList<>();

        list.add("Hello 01");
        list.add("Hello 02");
        list.add("Hello 03");
        list.add("Hello 02");
        list.add("Hello 05");

        sop(list);
        list = Method(list);
        sop(list);

    }

    public static ArrayList Method(ArrayList list){
        //临时容器
        ArrayList newList = new ArrayList<>();
        Iterator iterator = list.iterator();
        while (iterator.hasNext()) {
            Object object = (Object) iterator.next();

            if(!newList.contains(object)){
                newList.add(object);
            }
        }
        return newList;
    }

    /**
     * 输出
     */
    public static void sop(Object obj) {
        System.out.println(obj);

    }

}

输出的结果

好的,我们本篇幅到这里,就写完了,但是我们的数据结构只是讲了一些皮毛而已,我们接下来的几天,将会一一为大家讲解

我的群:555974449

JAVA之旅(十九)——ListIterator列表迭代器,List的三个子类对象,Vector的枚举,LinkedList,ArrayList和LinkedList的小练习的更多相关文章

  1. JAVA之旅(九)——Object类,equals,toString,getClass,内部类访问规则,静态内部类,内部类原则,匿名内部类

    JAVA之旅(九)--Object类,equals,toString,getClass,内部类访问规则,静态内部类,内部类原则,匿名内部类 天天被一些琐事骚扰,学习还得继续 一.Object类 Obj ...

  2. “全栈2019”Java多线程第二十九章:可重入锁与不可重入锁详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  3. “全栈2019”Java多线程第十九章:死锁详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  4. “全栈2019”Java异常第十九章:RuntimeException详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java异 ...

  5. “全栈2019”Java第八十九章:接口中能定义内部类吗?

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  6. “全栈2019”Java第七十九章:类中可以嵌套接口吗?

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  7. “全栈2019”Java第六十九章:内部类访问外部类成员详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  8. “全栈2019”Java第五十九章:抽象类与抽象方法详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  9. “全栈2019”Java第四十九章:重载与重写对比详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

随机推荐

  1. 使用foreach需要判空。

    今天写代码的时候,需要遍历一个作为参数传递进来的容器, 当时顺手就加上了判空条件: if(null==list)return; 后来就像,不知道遍历(foreach)有没有帮我做这个工作: 下面看实验 ...

  2. rhel7 配置普通用户使用sudo

    rhel服务器版本安装之后,默认创建的用户不能使用sudo.使用sudo,会提示 user1 is not in the sudoers file. This incident will be rep ...

  3. Linux下安装oracle的一般步骤

    1.配置内核参数2.创建用户和用户组3.创建安装目录4.配置oracle用户环境5.安装数据库软件6.创建数据库7.配置监听

  4. Minimize the error CodeForces - 960B

    You are given two arrays A and B, each of size n. The error, E, between these two arrays is defined  ...

  5. Docker 列出镜像

    使用 docker images 显示本地已有的镜像. $ sudo docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE ubuntu ...

  6. 虚拟机访问互联网的方法 -- 以RedHat系为例

    在虚拟机的三种网络模式中(Host-Only.桥接.NAT),能够实现虚拟机访问互联网的只有桥接与NAT模式,而Host-only主能实现虚拟机与主机两者间的通信.下面以RedHat系虚拟机系统为例, ...

  7. “ML学分计划”说明书

    计划的由来 我们是一群对机器学习感兴趣的小伙伴,对于神奇的机器学习经常有"一探究竟"的冲动,却因为孤身一人学习的寂寞.亦或繁忙考试工作之余的小小拖延症,而没有持续这份对知识的渴求和 ...

  8. iOS开发基础:最新的APP打包上架流程

    之前有人留言让我更新部分文章,下面就为大家分享一下iOS的APP打包上架流程: 上传至apple developer 1.1 上传准备工作 更新上架和发布上架不同,在原始版本首次上架的时候就将描述文件 ...

  9. Java经典设计模式之五大创建型模式(附实例和详解)

    一.概况 总体来说设计模式分为三大类: (1)创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. (2)结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥 ...

  10. 【mybatis深度历险系列】mybatis中的动态sql

    最近一直做项目,博文很长时间没有更新了,今天抽空,学习了一下mybatis,并且总结一下.在前面的博文中,小编主要简单的介绍了mybatis中的输入和输出映射,并且通过demo简单的介绍了输入映射和输 ...