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. python基础学习(一)

    python简介 python的创始人为吉多·范罗苏姆(Guido van Rossum),诞生时间1989年圣诞 一.变量的命令规则 1.变量只能由大小写字母.数字和下划线三部分组成,并且不能以数字 ...

  2. Web API对application/json内容类型的CORS支持

    假设有一简单架构分为前后两部分,其一是Angular构成的前端页面站点,另一个则是通过ASP.NET Web API搭建的后端服务站点.两个站点因为分别布署,所有会有CORS(Cross-Origin ...

  3. 潜谈IT从业人员在传统IT和互联网之间的择业问题(上)-传统乙方形公司

    外包能去吗?项目型公司如何?甲方比乙方好?互联网公司就一定好吗? 相信许多从业者在经历了3-5年的工作期后都会带着这样的疑问或者疑惑. 2012年-2014年间,曾经面试过500人,亲身面试的也有15 ...

  4. linux下内存的统计和内存泄露类问题的定位

    在产品的开发中,通过对当前系统消耗内存总量的统计,可以对产品所需内存总量进行精确的评估,从而选择合适的内存芯片与大小,降低产品的成本.在遇到内存泄露类问题时,经常会对此束手无策,本文通过对proc下进 ...

  5. PGM:部分有向模型之条件随机场与链图模型

    http://blog.csdn.net/pipisorry/article/details/52529287 贝叶斯网与马尔可夫网 [PGM:无向图模型:马尔可夫网]中例3.8和例4.8显示,贝叶斯 ...

  6. Ubuntu LTS 系统学习使用体会和实用工具软件汇总 6.04 8.04 10.04 12.04 14.04 16.04

    Ubuntu LTS 系统学习体会和工具软件汇总 6.04 8.04 10.04 12.04 14.04 16.04 ubuntu入门必备pdf:http://download.csdn.net/de ...

  7. Android Studio下多渠道打包

    Android Studio下实现多渠道打包 直接上步骤 步骤 1. 清单文件添加属性(以友盟统计为例) 在application标签下添加meta-data属性 <application -- ...

  8. SceneKit:简单的3D游戏场景搭建

    SceneKit是Apple用来开发休闲3D游戏的框架,不同于底层的OpenGL库,你仅仅需要很少的代码就可以快速看到实际的3D场景效果.下面简单的聊聊搭建一个3D游戏场景需要做的事情. 首先你必须用 ...

  9. 2.Cocos2dx 3.2中的重力系统Box2D

     1 添加Box2D相关的库 步骤1:右击项目所在的解决方案à添加->现有项目àE:\Installed\cocos2d-x-3.2\cocos2d-x-3.2\external\Box2D ...

  10. JAVA面向对象-----继承

    类和类之间的常见关系. 既然继承是描述类和类之间的关系,就需要先来了解类和类之间的常见关系 现实生活的整体与部分 举例说明 现实生活 学生 是人 狗 是动物 球队 包含 球员 整体与部分的关系,部分可 ...