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. 攻防世界 WEB 高手进阶区 csaw-ctf-2016-quals mfw Writeup

    攻防世界 WEB 高手进阶区 csaw-ctf-2016-quals mfw Writeup 题目介绍 题目考点 PHP代码审计 git源码泄露 Writeup 进入题目,点击一番,发现可能出现git ...

  2. 彻底掌握 Commonjs 和 Es Module

    目录 Commonjs commonjs 实现原理 require 文件加载流程 require 模块引入与处理 require 加载原理 require 避免重复加载 require 避免循环引用 ...

  3. [python]django rest framework写POST和GET接口

    版本声明 python3.6.5 Django-2.0.6 djangorestframework-3.8.2 mysqlclient-1.3.12 1.写一个登录接口,不多说,直接上代码 login ...

  4. css--元素居中常用方法总结

    前言 元素居中是日常开发和学习中最常见的问题,同时也是面试中经常考察的知识点,本文来总结一下这方面的知识点. 正文 1.水平居中 (1)子父元素宽度固定,子元素设置 margin:auto,并且子元素 ...

  5. c++学习笔记目录

    chapter name menu 一 从c到c++ 1.引用2.const关键词的用法3.动态内存分配4.内联函数5.函数重载6.函数的缺省参数7.结构化程序设计的不足8.面向对象的程序设计 二 类 ...

  6. python一对一教程:Computational Problems for Physics chapter 1-B Code Listings 1.7 - 1.12

    作者自我介绍:大爽歌, b站小UP主 ,直播编程+红警三 ,python1对1辅导老师 . 本博客为一对一辅导学生python代码的教案, 获得学生允许公开. 具体辅导内容为<Computati ...

  7. 常用的Dos(Win+R)命令

    打开CMD的方式 开始 + 系统 + 命令提示符 win + R --> 输入CMD 管理员方式运行:开始-->windows系统-->右击命令提示符-->管理员身份运行(最高 ...

  8. 时间处理,类似"xxxx-xx-xxTxx:xx:xx187+0000"格式

    后端返回的时间:"2020-04-24T09:12:51.187+0000" 目标显示时间:2020-04-24   09:12:51 <!DOCTYPE html> ...

  9. [zoj3990]Tree Equation

    记$dep(T)$为树$T$的深度(根节点深度为0),则有$\begin{cases}dep(A+B)=\max(dep(A),dep(B))\\dep(A\cdot B)=dep(A)+dep(B) ...

  10. [cf1305G]Kuroni and Antihype

    对整个过程构造一张有向图,其中$(x,y)\in E$当且仅当$x$把$y$加入,且边权为$a_{x}$ 显然这是一棵外向树森林,并再做如下两个构造: 1.新建一个点$a_{0}=0$,将其向所有入度 ...