JAVA之旅(十九)——ListIterator列表迭代器,List的三个子类对象,Vector的枚举,LinkedList,ArrayList和LinkedList的小练习
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的小练习的更多相关文章
- JAVA之旅(九)——Object类,equals,toString,getClass,内部类访问规则,静态内部类,内部类原则,匿名内部类
JAVA之旅(九)--Object类,equals,toString,getClass,内部类访问规则,静态内部类,内部类原则,匿名内部类 天天被一些琐事骚扰,学习还得继续 一.Object类 Obj ...
- “全栈2019”Java多线程第二十九章:可重入锁与不可重入锁详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- “全栈2019”Java多线程第十九章:死锁详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- “全栈2019”Java异常第十九章:RuntimeException详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java异 ...
- “全栈2019”Java第八十九章:接口中能定义内部类吗?
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- “全栈2019”Java第七十九章:类中可以嵌套接口吗?
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- “全栈2019”Java第六十九章:内部类访问外部类成员详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- “全栈2019”Java第五十九章:抽象类与抽象方法详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- “全栈2019”Java第四十九章:重载与重写对比详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
随机推荐
- python基础学习(一)
python简介 python的创始人为吉多·范罗苏姆(Guido van Rossum),诞生时间1989年圣诞 一.变量的命令规则 1.变量只能由大小写字母.数字和下划线三部分组成,并且不能以数字 ...
- Web API对application/json内容类型的CORS支持
假设有一简单架构分为前后两部分,其一是Angular构成的前端页面站点,另一个则是通过ASP.NET Web API搭建的后端服务站点.两个站点因为分别布署,所有会有CORS(Cross-Origin ...
- 潜谈IT从业人员在传统IT和互联网之间的择业问题(上)-传统乙方形公司
外包能去吗?项目型公司如何?甲方比乙方好?互联网公司就一定好吗? 相信许多从业者在经历了3-5年的工作期后都会带着这样的疑问或者疑惑. 2012年-2014年间,曾经面试过500人,亲身面试的也有15 ...
- linux下内存的统计和内存泄露类问题的定位
在产品的开发中,通过对当前系统消耗内存总量的统计,可以对产品所需内存总量进行精确的评估,从而选择合适的内存芯片与大小,降低产品的成本.在遇到内存泄露类问题时,经常会对此束手无策,本文通过对proc下进 ...
- PGM:部分有向模型之条件随机场与链图模型
http://blog.csdn.net/pipisorry/article/details/52529287 贝叶斯网与马尔可夫网 [PGM:无向图模型:马尔可夫网]中例3.8和例4.8显示,贝叶斯 ...
- 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 ...
- Android Studio下多渠道打包
Android Studio下实现多渠道打包 直接上步骤 步骤 1. 清单文件添加属性(以友盟统计为例) 在application标签下添加meta-data属性 <application -- ...
- SceneKit:简单的3D游戏场景搭建
SceneKit是Apple用来开发休闲3D游戏的框架,不同于底层的OpenGL库,你仅仅需要很少的代码就可以快速看到实际的3D场景效果.下面简单的聊聊搭建一个3D游戏场景需要做的事情. 首先你必须用 ...
- 2.Cocos2dx 3.2中的重力系统Box2D
1 添加Box2D相关的库 步骤1:右击项目所在的解决方案à添加->现有项目àE:\Installed\cocos2d-x-3.2\cocos2d-x-3.2\external\Box2D ...
- JAVA面向对象-----继承
类和类之间的常见关系. 既然继承是描述类和类之间的关系,就需要先来了解类和类之间的常见关系 现实生活的整体与部分 举例说明 现实生活 学生 是人 狗 是动物 球队 包含 球员 整体与部分的关系,部分可 ...