集合类——集合输出、栈和队列及Collections集合
1、集合输出
在之前我们利用了toString()及get()方法对集合进行了输出,其实那都不是集合的标准输出,集合输出有四种方式:Iterator、ListIterator、Enumeration、foreach。
(1)Iterator(迭代输出)
在jdk1.5之前,在Collection接口中就有iterator()方法来获取Iterator接口的实例化对象,而在jdk1.5之后该方法被提升到Iterable接口中,但是不管怎么提升,只要Collection有该方法,则List和Set也有此方法。
Iterator接口中的方法:
|
1. 判断是否有下一个元素: public boolean hasNext(); 2. 取得当前元素: public E next(); 3. 删除元素: public default void remove(); |
-
/*
-
* Iterator输出
-
* */
-
public class Test{
-
public static void main(String[] args) {
-
List<String> list = new ArrayList<>();
-
list.add("hello");
-
list.add("world!");
-
list.add("\n hello");
-
list.add("lemon!");
-
//实例化Iterator对象
-
Iterator<String> iterable = list.iterator();
-
//循环输出
-
while(iterable.hasNext()) {
-
System.out.print(" "+iterable.next());
-
}
-
}
-
}
下面我们来观察在集合输出的过程中对集合中的元素进行更改的情况:
-
/*
-
* 输出过程中对集合内容进行更改
-
* */
-
public class Test{
-
public static void main(String[] args) {
-
List<String> list = new ArrayList<>();
-
list.add("hello");
-
list.add("world!");
-
list.add("\n hello");
-
list.add("lemon!");
-
//实例化Iterator对象
-
Iterator<String> iterable = list.iterator();
-
//循环输出
-
while(iterable.hasNext()) {
-
String string = iterable.next();
-
if(string.equals("hello")) {
-
//使用集合提供的remove()方法时,会抛出java.util.ConcurrentModificationException异常
-
//list.remove(string);
-
//使用Iterator的remove()方法则不会抛出异常
-
iterable.remove();
-
continue;
-
}
-
System.out.print(" "+string);
-
}
-
}
-
}
使用list的remove()方法运行结果:
使用Iterator的remove()方法运行结果:
所以一般在集合输出时,我们不对其元素进行修改。
(2)ListIterator(双向迭代接口)
只有List接口有,而Set接口没有。
-
/*
-
* ListIterator双向迭代输出
-
* */
-
public class Test{
-
public static void main(String[] args) {
-
List<String> list = new ArrayList<>();
-
list.add("hello");
-
list.add("world!");
-
list.add("hello");
-
list.add("lemon!");
-
//实例化Iterator对象
-
ListIterator<String> listIterator = list.listIterator();
-
// //向前循环输出
-
// while(listIterator.hasPrevious()) {
-
// System.out.print(" "+listIterator.previous());
-
// }
-
//向后循环输出
-
while(listIterator.hasNext()) {
-
System.out.print(" "+listIterator.next());
-
}
-
System.out.println();
-
//向前循环输出
-
while(listIterator.hasPrevious()) {
-
System.out.print(" "+listIterator.previous());
-
}
-
}
-
}
先向后输出在向前输出运行结果:
在向后输出之前先进行向前输出运行结果:
所以要使用双向迭代输出,不仅要是List的子类,而且必须先实现向后输出才可执行向前输出,要不然不能出现向前执行的结果,无法实现双向。
(3)Enumeration(枚举输出)
只有Vector类才有。
Enumeration的接口定义
|
判断是否有下一个元素:public boolean hasMoreElements(); 取得元素:public E nextElement(); |
但是要想取得这个接口的实例化对象,是不能依靠Collection、List、Set等接口的。只能够依靠Vector子类,因为Enumeration最早的设计就是为Vector服务的,在Vector类中提供有一个取得Enumeration接口对象的方法:
取得Enumeration接口对象:public Enumeration elements()
-
/*
-
* Enumeration枚举输出
-
* */
-
public class Test{
-
public static void main(String[] args) {
-
Vector< String> vector = new Vector<>();
-
vector.add("hello");
-
vector.add("lemon!");
-
vector.add("hello");
-
vector.add("world!");
-
//取得对象
-
Enumeration<String> enumeration = vector.elements();
-
//循环输出
-
while(enumeration.hasMoreElements()) {
-
System.out.print(" "+enumeration.nextElement());
-
}
-
}
-
}
(4)foreach
从JDK1.5开始foreach可以输出数组,实际上除了数组之外也可以输出集合.
-
/*
-
* foreach输出
-
* */
-
public class Test{
-
public static void main(String[] args) {
-
Vector< String> vector = new Vector<>();
-
vector.add("hello");
-
vector.add("lemon!");
-
vector.add("hello");
-
vector.add("world!");
-
for (String string : vector) {
-
System.out.print(" "+string);
-
}
-
}
-
}
2、栈和队列
(1)Stack栈(类)
栈是一种后进先出的数据结构,常见的浏览器的退出、文件的撤销等都属于栈的功能。
在Java中提供有Stack类,这个类是Vector的子类。
public class Stack<E> extends Vector<E>
Stack在使用时不是使用Vector的方法而是使用其自定义的方法,且在使用时不需要向上转型,因为要操作的方法不是有List定义的而是Stack自定义的。
常用方法:
|
入栈:public E push(E item) |
|
出栈:public synchronized E pop() |
|
返回栈顶元素:public synchronized E peek() |
-
/*
-
* Stack栈
-
* */
-
public class Test{
-
public static void main(String[] args) {
-
Stack<String> stack = new Stack<>();
-
//入栈
-
stack.push("hello");
-
stack.push("world");
-
stack.push("hello");
-
stack.push("lemon");
-
System.out.println("打印栈中元素:"+stack);
-
//取栈顶元素
-
System.out.println("栈顶元素:"+stack.peek());
-
//出栈
-
System.out.println("出栈元素为:");
-
System.out.println(stack.pop());
-
System.out.println(stack.pop());
-
System.out.println(stack.pop());
-
System.out.println(stack.pop());
-
//对空栈进行出栈操作
-
System.out.println(stack.pop());
-
}
-
}
(2)Queue队列(接口)
Stack栈是后进先出,而与之对应的Queue队列则是先进先出。
在java.util包下的Queue接口实现队列操作,而Queue提供有一个子类LinkedList.
public interface Queue<E> extends Collection<E>
常用方法:
|
入队列:public boolean add(E e) |
|
出队列:public E poll() |
|
取队首元素:public E peek() |
-
/*
-
* Queue队列
-
* */
-
public class Test{
-
public static void main(String[] args) {
-
Queue<String> queue = new LinkedList<>();
-
//入队列
-
queue.add("hello");
-
queue.add("world");
-
queue.add("hello");
-
queue.add("lemon");
-
//取队首元素
-
System.out.println("队首元素:"+queue.peek());
-
//出队列
-
System.out.println("出队元素:");
-
System.out.print(queue.poll());
-
System.out.print(" "+queue.poll());
-
System.out.print(" "+queue.poll());
-
System.out.print(" "+queue.poll());
-
}
-
}
3、Collections工具类
Collections是一个集合操作的工具类,包括集合的反转、排序等操作。
-
/*
-
*Collections工具类
-
* */
-
public class Test{
-
public static void main(String[] args) {
-
List<String> list = new ArrayList<>();
-
//相当于调用三次add()方法
-
Collections.addAll(list,"hello","world","lemon");
-
System.out.println("反转之前的集合:"+list);
-
//对集合进行反转
-
Collections.reverse(list);
-
System.out.println("反转之后的集合:"+list);
-
-
List<Integer> list1 = new ArrayList<>();
-
Collections.addAll(list1, 4,9,6,3,1,8);
-
System.out.println("排序前集合:"+list1);
-
//对list1集合进行排序
-
Collections.sort(list1);
-
System.out.println("排序后集合:"+list1);
-
}
-
}
集合类——集合输出、栈和队列及Collections集合的更多相关文章
- 用LinkedList集合演示栈和队列的操作
在数据结构中,栈和队列是两种重要的线性数据结构.它们的主要不同在于:栈中存储的元素,是先进后出:队列中存储的元素是先进先出.我们接下来通过LinkedList集合来演示栈和队列的操作. import ...
- LinkedList集合 实现栈和队列
LinkedList集合的底层是链表结构实现的,所以可以模拟栈(先进后出)和队列(先进先出). 方法: addFirst() //添加元素到列表的起始位置 addLast() //添加元素到列表的结束 ...
- Collection集合重难点梳理,增强for注意事项和三种遍历的应用场景,栈和队列特点,数组和链表特点,ArrayList源码解析, LinkedList-源码解析
重难点梳理 使用到的新单词: 1.collection[kəˈlekʃn] 聚集 2.empty[ˈempti] 空的 3.clear[klɪə(r)] 清除 4.iterator 迭代器 学习目标: ...
- java集合详解(附栈,队列)
1 集合 1.1 为什么会出现集合框架 [1] 之前的数组作为容器时,不能自动拓容 [2] 数值在进行添加和删除操作时,需要开发者自己实现添加和删除. 1.2 Collection接口 1.2.1 C ...
- 集合第七发练习之利用ArrayList做栈、队列
栈:后进先出. 队列:先进先出. 利用这个核心思想,结合集合的add和remove方法做的栈和队列如下代码所示: 主类(t1()和t2()分别演栈和队列): package cn.hncu.myS ...
- 剑指Offer的学习笔记(C#篇)-- 用两个栈实现队列
题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 一 . 概念! 首先要理解栈和队列的概念. 1. 栈:咱可以简单的把栈理解成装羽毛球的球桶.或者我们吃的 ...
- 25、typing导入Python的数据类型模块、collections集合模块
一.typing模块 1.typing模块的作用 类型检查,防止运行时出现参数和返回值类型不符合. 作为开发文档附加说明,方便使用者调用时传入和返回参数类型. 该模块加入后并不会影响程序的运行,不会报 ...
- LeetCode刷题 --杂篇 --数组,链表,栈,队列
武汉加油,中国加油.希望疫情早日结束. 由于疫情,二狗寒假在家不能到处乱逛,索性就在家里系统的刷一下算法的内容,一段时间下来倒也有些小小的收获.只是一来家中的小破笔记本写起博客来实在不是很顺手,二来家 ...
- 学习javascript数据结构(一)——栈和队列
前言 只要你不计较得失,人生还有什么不能想法子克服的. 原文地址:学习javascript数据结构(一)--栈和队列 博主博客地址:Damonare的个人博客 几乎所有的编程语言都原生支持数组类型,因 ...
随机推荐
- 西邮Linux兴趣小组第一次技术分享会
2016年10月30日晚,西邮Linux兴趣小组技术分享会在西安邮电大学长安校区东区逸夫教学楼FF305室成功举办.200多名来自全校不同专业的15,16级同学参加了此次分享会. 分享会于20:00正 ...
- windows端口占用处理方法
(1)输入命令:netstat -ano,列出所有端口的情况.在列表中我们观察被占用的端口,比如是8081,首先找到它.C:\Users\Administrator>netstat -ano活动 ...
- 使用python操作HDF5文件
HDF Hierarchical Data Format,又称HDF5 在深度学习中,通常会使用巨量的数据或图片来训练网络.对于如此大的数据集,如果对于每张图片都单独从硬盘读取.预处理.之后再送入网络 ...
- flume的配置详解
Flume:===================== Flume是一种分布式的.可靠的.可用的服务,可以有效地收集.聚合和移动大量的日志数据. 它有一个基于流数据的简单而灵活的体系结构. 它具有健壮 ...
- R数据分析:如何给结构方程画路径图,tidySEM包详解
之前一直是用semPlot这个包给来进行结构方程模型的路径绘制,自从用了tidySEM这个包后就发现之前那个包不香了,今天就给大家分享一下tidySEM. 这个包的很大特点就是所有的画图原始都是存在数 ...
- hexo+腾讯云
hexo+腾讯云主机搭建博客 参考链接1 参考链接2 参考链接3 说明:不建议用hexo在云主机上搭建博客,感觉多此一举,建议hexo+github, wordpress+云主机(宝塔界面更快哦) 一 ...
- [cf1236F]Alice and the Cactus
首先,我们要用到期望的一个性质: 对于两个随机变量$X$和$Y$(不需要相互独立),有$E(X+Y)=E(X)+E(Y)$ 另外,对于一个仙人掌,令$n$为点数,$m$为边数,$c$为简单环个数,$X ...
- 一文详解 OpenGL ES 3.x 渲染管线
OpenGL ES 构建的三维空间,其中的三维实体由许多的三角形拼接构成.如下图左侧所示的三维实体圆锥,其由许多三角形按照一定规律拼接构成.而组成圆锥的每一个三角形,其任意一个顶点由三维空间中 x.y ...
- linux命令-压缩数据
linux文件压缩工具:bzip2 文件扩展名 .bz2 compress 文件扩展名 .Z linux上很少看到了 uncompress解压 gzip 文件扩展名,.gz,gzip压缩文件,gzca ...
- uniapp增加自定义埋点功能
起因 首先来说,uniapp其实是自带系统埋点统计功能的.基本也算是面面俱到. 但是一些未知原因,貌似数据有所丢失,再加上没有一些重要的定制化功能,以及最重要的数据安全方面的考虑,还是决定接入公司的埋 ...