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


  1. /*
  2. * Iterator输出
  3. * */
  4. public class Test{
  5. public static void main(String[] args) {
  6. List<String> list = new ArrayList<>();
  7. list.add("hello");
  8. list.add("world!");
  9. list.add("\n hello");
  10. list.add("lemon!");
  11. //实例化Iterator对象
  12. Iterator<String> iterable = list.iterator();
  13. //循环输出
  14. while(iterable.hasNext()) {
  15. System.out.print(" "+iterable.next());
  16. }
  17. }
  18. }

下面我们来观察在集合输出的过程中对集合中的元素进行更改的情况:


  1. /*
  2. * 输出过程中对集合内容进行更改
  3. * */
  4. public class Test{
  5. public static void main(String[] args) {
  6. List<String> list = new ArrayList<>();
  7. list.add("hello");
  8. list.add("world!");
  9. list.add("\n hello");
  10. list.add("lemon!");
  11. //实例化Iterator对象
  12. Iterator<String> iterable = list.iterator();
  13. //循环输出
  14. while(iterable.hasNext()) {
  15. String string = iterable.next();
  16. if(string.equals("hello")) {
  17. //使用集合提供的remove()方法时,会抛出java.util.ConcurrentModificationException异常
  18. //list.remove(string);
  19. //使用Iterator的remove()方法则不会抛出异常
  20. iterable.remove();
  21. continue;
  22. }
  23. System.out.print(" "+string);
  24. }
  25. }
  26. }

使用list的remove()方法运行结果:

使用Iterator的remove()方法运行结果:

所以一般在集合输出时,我们不对其元素进行修改。

(2)ListIterator(双向迭代接口)

只有List接口有,而Set接口没有。


  1. /*
  2. * ListIterator双向迭代输出
  3. * */
  4. public class Test{
  5. public static void main(String[] args) {
  6. List<String> list = new ArrayList<>();
  7. list.add("hello");
  8. list.add("world!");
  9. list.add("hello");
  10. list.add("lemon!");
  11. //实例化Iterator对象
  12. ListIterator<String> listIterator = list.listIterator();
  13. // //向前循环输出
  14. // while(listIterator.hasPrevious()) {
  15. // System.out.print(" "+listIterator.previous());
  16. // }
  17. //向后循环输出
  18. while(listIterator.hasNext()) {
  19. System.out.print(" "+listIterator.next());
  20. }
  21. System.out.println();
  22. //向前循环输出
  23. while(listIterator.hasPrevious()) {
  24. System.out.print(" "+listIterator.previous());
  25. }
  26. }
  27. }

先向后输出在向前输出运行结果:

在向后输出之前先进行向前输出运行结果:

所以要使用双向迭代输出,不仅要是List的子类,而且必须先实现向后输出才可执行向前输出,要不然不能出现向前执行的结果,无法实现双向。

(3)Enumeration(枚举输出)

只有Vector类才有。

Enumeration的接口定义

判断是否有下一个元素:public  boolean  hasMoreElements();

取得元素:public  E  nextElement();

但是要想取得这个接口的实例化对象,是不能依靠Collection、List、Set等接口的。只能够依靠Vector子类,因为Enumeration最早的设计就是为Vector服务的,在Vector类中提供有一个取得Enumeration接口对象的方法:

取得Enumeration接口对象:public Enumeration elements()


  1. /*
  2. * Enumeration枚举输出
  3. * */
  4. public class Test{
  5. public static void main(String[] args) {
  6. Vector< String> vector = new Vector<>();
  7. vector.add("hello");
  8. vector.add("lemon!");
  9. vector.add("hello");
  10. vector.add("world!");
  11. //取得对象
  12. Enumeration<String> enumeration = vector.elements();
  13. //循环输出
  14. while(enumeration.hasMoreElements()) {
  15. System.out.print(" "+enumeration.nextElement());
  16. }
  17. }
  18. }

(4)foreach

从JDK1.5开始foreach可以输出数组,实际上除了数组之外也可以输出集合.


  1. /*
  2. * foreach输出
  3. * */
  4. public class Test{
  5. public static void main(String[] args) {
  6. Vector< String> vector = new Vector<>();
  7. vector.add("hello");
  8. vector.add("lemon!");
  9. vector.add("hello");
  10. vector.add("world!");
  11. for (String string : vector) {
  12. System.out.print(" "+string);
  13. }
  14. }
  15. }


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()


  1. /*
  2. * Stack栈
  3. * */
  4. public class Test{
  5. public static void main(String[] args) {
  6. Stack<String> stack = new Stack<>();
  7. //入栈
  8. stack.push("hello");
  9. stack.push("world");
  10. stack.push("hello");
  11. stack.push("lemon");
  12. System.out.println("打印栈中元素:"+stack);
  13. //取栈顶元素
  14. System.out.println("栈顶元素:"+stack.peek());
  15. //出栈
  16. System.out.println("出栈元素为:");
  17. System.out.println(stack.pop());
  18. System.out.println(stack.pop());
  19. System.out.println(stack.pop());
  20. System.out.println(stack.pop());
  21. //对空栈进行出栈操作
  22. System.out.println(stack.pop());
  23. }
  24. }

(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()


  1. /*
  2. * Queue队列
  3. * */
  4. public class Test{
  5. public static void main(String[] args) {
  6. Queue<String> queue = new LinkedList<>();
  7. //入队列
  8. queue.add("hello");
  9. queue.add("world");
  10. queue.add("hello");
  11. queue.add("lemon");
  12. //取队首元素
  13. System.out.println("队首元素:"+queue.peek());
  14. //出队列
  15. System.out.println("出队元素:");
  16. System.out.print(queue.poll());
  17. System.out.print(" "+queue.poll());
  18. System.out.print(" "+queue.poll());
  19. System.out.print(" "+queue.poll());
  20. }
  21. }

3、Collections工具类

Collections是一个集合操作的工具类,包括集合的反转、排序等操作。


  1. /*
  2. *Collections工具类
  3. * */
  4. public class Test{
  5. public static void main(String[] args) {
  6. List<String> list = new ArrayList<>();
  7. //相当于调用三次add()方法
  8. Collections.addAll(list,"hello","world","lemon");
  9. System.out.println("反转之前的集合:"+list);
  10. //对集合进行反转
  11. Collections.reverse(list);
  12. System.out.println("反转之后的集合:"+list);
  13. List<Integer> list1 = new ArrayList<>();
  14. Collections.addAll(list1, 4,9,6,3,1,8);
  15. System.out.println("排序前集合:"+list1);
  16. //对list1集合进行排序
  17. Collections.sort(list1);
  18. System.out.println("排序后集合:"+list1);
  19. }
  20. }

集合类——集合输出、栈和队列及Collections集合的更多相关文章

  1. 用LinkedList集合演示栈和队列的操作

    在数据结构中,栈和队列是两种重要的线性数据结构.它们的主要不同在于:栈中存储的元素,是先进后出:队列中存储的元素是先进先出.我们接下来通过LinkedList集合来演示栈和队列的操作. import ...

  2. LinkedList集合 实现栈和队列

    LinkedList集合的底层是链表结构实现的,所以可以模拟栈(先进后出)和队列(先进先出). 方法: addFirst() //添加元素到列表的起始位置 addLast() //添加元素到列表的结束 ...

  3. Collection集合重难点梳理,增强for注意事项和三种遍历的应用场景,栈和队列特点,数组和链表特点,ArrayList源码解析, LinkedList-源码解析

    重难点梳理 使用到的新单词: 1.collection[kəˈlekʃn] 聚集 2.empty[ˈempti] 空的 3.clear[klɪə(r)] 清除 4.iterator 迭代器 学习目标: ...

  4. java集合详解(附栈,队列)

    1 集合 1.1 为什么会出现集合框架 [1] 之前的数组作为容器时,不能自动拓容 [2] 数值在进行添加和删除操作时,需要开发者自己实现添加和删除. 1.2 Collection接口 1.2.1 C ...

  5. 集合第七发练习之利用ArrayList做栈、队列

    栈:后进先出. 队列:先进先出. 利用这个核心思想,结合集合的add和remove方法做的栈和队列如下代码所示: 主类(t1()和t2()分别演栈和队列):   package cn.hncu.myS ...

  6. 剑指Offer的学习笔记(C#篇)-- 用两个栈实现队列

    题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 一 . 概念! 首先要理解栈和队列的概念. 1. 栈:咱可以简单的把栈理解成装羽毛球的球桶.或者我们吃的 ...

  7. 25、typing导入Python的数据类型模块、collections集合模块

    一.typing模块 1.typing模块的作用 类型检查,防止运行时出现参数和返回值类型不符合. 作为开发文档附加说明,方便使用者调用时传入和返回参数类型. 该模块加入后并不会影响程序的运行,不会报 ...

  8. LeetCode刷题 --杂篇 --数组,链表,栈,队列

    武汉加油,中国加油.希望疫情早日结束. 由于疫情,二狗寒假在家不能到处乱逛,索性就在家里系统的刷一下算法的内容,一段时间下来倒也有些小小的收获.只是一来家中的小破笔记本写起博客来实在不是很顺手,二来家 ...

  9. 学习javascript数据结构(一)——栈和队列

    前言 只要你不计较得失,人生还有什么不能想法子克服的. 原文地址:学习javascript数据结构(一)--栈和队列 博主博客地址:Damonare的个人博客 几乎所有的编程语言都原生支持数组类型,因 ...

随机推荐

  1. Downward API —— 在容器内部获取 Pod 信息

    我们知道,每个 Pod 在被超过创建出来之后,都会被系统分配唯一的名字.IP地址,并且处于某个 Namespace 中,那么我们如何在 Pod 的容器内获取 Pod 的这些重要信息呢? 答案就是使用 ...

  2. centos如何上网

    问题 centos如何上网 解决方法 第一步: 打开VMware,选择菜单栏的Edit->Virtual Network Editor(虚拟网络编辑器).点击Restore Defaults(即 ...

  3. Linux NameSpace (目录)

    1. User Namespace 详解 2. Pid Namespace 详解 3. Mnt Namespace 详解 4. UTS Namespace 详解 5. IPC Namespace 详解 ...

  4. ofd文件电子签章实现方法

    前言 文档处理一般经过三个环节:流.版.签:流式软件负责编辑,如:office.wps等.版式软件负责文档定型,保证显示样式不跑偏:版式文件格式有两种:pdf.ofd.签章软件负责对版式文档签章.签章 ...

  5. 3组-Alpha冲刺-1/6

    一.基本情况 队名:发际线和我作队 组长博客:链接 小组人数:10 二.冲刺概况汇报 黄新成(组长) 过去两天完成了哪些任务 文字描述 组织会议,讨论了alpha冲刺的分工,确定了收集数据的渠道,为拍 ...

  6. RabbitMQ Network Partitions 处理策略

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 网络分区的意义 RabbitMQ的模型 ...

  7. 第02章_MySQL环境搭建

    第02章_MySQL环境搭建 1. MySQL的卸载 步骤1:停止MySQL服务 在卸载之前,先停止MySQL8.0的服务.按键盘上的"Ctrl + Alt + Delete"组合 ...

  8. .NET E F(Entity Framework)框架 DataBase First 和 Code First 简单用法。

    EF是微软.NET平台官方的ORM(objet-relation mapping),就是一种对象-关系 映射,是将关系数据库种的业务数据用对象的形式表现出来,并通过面向对象的方式讲这些对象组织起来,实 ...

  9. Linux 使用wpa_supplicant手动配置连接wifi

    Linux 使用wpa_supplicant手动配置连接wifi wpa_supplicant 简介 wpa_supplicant是Linux BSD, Mac OSX和Windows的WPA的服务, ...

  10. 数值最优化:一阶和二阶优化算法(Pytorch实现)

    1 最优化概论 (1) 最优化的目标 最优化问题指的是找出实数函数的极大值或极小值,该函数称为目标函数.由于定位\(f(x)\)的极大值与找出\(-f(x)\)的极小值等价,在推导计算方式时仅考虑最小 ...