集合类——集合输出、栈和队列及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();


  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. }

原文地址:https://www.cnblogs.com/edda/p/12601166.html

时间: 2024-10-20 11:05:57

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

【JavaSE】day05_List集合_List排序_队列和栈

1.List集合 1)有序集,可重复集.List的特点是可以像数组一样,根据下标操作元素.所以List提供了一些独有的方法. 2)常用实现类: --ArrayList:内部由数组实现,查询快. --LinkedList:内部由链表实现,增删快. 3)E get(int index) 获取指定下标对应的元素.(下标从0开始) 4)E set(int index,E e) 将给定的元素设置到指定的位置上,返回值为原位置上的元素.所以该操作是替换元素操作. 注:需在现有的元素上进行操作. 代码演示:

9.9-全栈Java笔记:遍历集合的N种方式总结&Collections工具类

遍历集合的N种方式总结 [示例1]遍历List方法1,使用普通for循环 for(int i=0;i<list.size();i++){         //list为集合的对象名 String temp = (String)list.get(i); System.out.println(temp); } [示例2]遍历List方法2,使用增强for循环(使用泛型定义类型!) for (String   temp : list) { System.out.println(temp); } [示例

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

1 集合 1.1 为什么会出现集合框架 [1] 之前的数组作为容器时,不能自动拓容 [2] 数值在进行添加和删除操作时,需要开发者自己实现添加和删除. 1.2 Collection接口 1.2.1 Collection基础API Java集合框架提供了一套性能优良.使用方便的接口和类,它们位于java.util包中. Collection表示集合的根接口,可以看成一个容器,存储了很多对象,这些对象称为Collection元素.Collection要求元素必须是引用数据类型. Collection

数据结构回顾之顺序存储结构中的线性表(栈与队列顺序线性表实现)

说到数据结构呢,对于一个Coder来说还是蛮重要的啦,每次看数据结构的东西都有新的收获,这两天在回顾数据结构的知识.当然啦,虽然数据结构有些是理论的东西,如果好好的理解数据结构的东西还是少不了的代码的支撑的.数据结构简单的来说吧,可以分为两大类,一个是数据的"物理存储结构",另一种是数据的"逻辑存储结构".数据的"物理存储结构"又可分为顺序的和链式的(下面将会结合着代码打印内存地址的形式来观察物理存储结构). 逻辑存储结构又可分为集合,线性, 树

用JS描述的数据结构及算法表示——栈和队列(基础版)

前言:找了上课时数据结构的教程来看,但是用的语言是c++,所以具体实现在网上搜大神的博客来看,我看到的大神们的博客都写得特别好,不止讲了最基本的思想和算法实现,更多的是侧重于实例运用,一边看一边在心里隐隐歌颂大神的厉害,然后别人的厉害不是我的,所以到底看得各种受打击+头昏脑涨,写这个系列是希望自己能够总结学到东一块.西一下的知识,因为水平有限+经验不足,所以在此只说最基础的思想,附上我自己的算法实现(肯定还有更优解),如果要想看进阶版的,可以在园里搜“数据结构”,各种语言实现和进阶提升的文章有很

浅析栈与队列在java中的基本应用

一.前提 摘自java程序设计教程(华盛顿大学/斯坦福大学著,陈志等译)-机械工业出版社 1.1栈/队列基础 像线性表一样,栈与队列中存储一组有序的值.这类数据结构至少需要支持下面几种操作: 将值放入数据结构中(添加操作): 将值从数据结构中取出(删除操作): 检查数据结构中是否还有值(判断数据结构是否为空). 栈与队列很相似:都是以某种特定的顺序存储元素序列.栈是一种先进先出/LIFO(LAST IN FIRST OUT)的结构,也就是最后保存到结构中的元素会最先被访问.队列则是一种先进先出/

Java多线程 阻塞队列和并发集合

转载:大关的博客 Java多线程 阻塞队列和并发集合 本章主要探讨在多线程程序中与集合相关的内容.在多线程程序中,如果使用普通集合往往会造成数据错误,甚至造成程序崩溃.Java为多线程专门提供了特有的线程安全的集合类,通过下面的学习,您需要掌握这些集合的特点是什么,底层实现如何.在何时使用等问题. 3.1 BlockingQueue接口 java阻塞队列应用于生产者消费者模式.消息传递.并行任务执行和相关并发设计的大多数常见使用上下文. BlockingQueue在Queue接口基础上提供了额外

数据结构习题之栈和队列

第三章  栈和队列 一.    基本要求.重点.难点 本章的目的是介绍栈和队列的逻辑结构定义及在两种存储结构上如何实现栈和队列的基本运算.要求在掌握栈和队列的特点的基础上,懂得在什么样的情况下能够使用栈或队列.本章重点是掌握栈和队列在两种存储结构上实现的基本运算,难点是循环队列中对边界条件的处理. 二.    考核目标和考核要求 要求达到识记层次的有:栈和队列的特点,什么样的情况下能够使用栈或队列 要达到综合应用层次的有:栈的逻辑结构特点,栈与线性表的异同:顺序栈和链栈上实现的进栈.退栈等基本算

【数据结构】栈和队列

栈和队列 容器数据结构是指一些包含了若干个其他相同或不同的数据结构的数据结构,被包含的这些每一个独立的数据结构都被称为一个元素,在一个容器中的元素往往支持相同的操作,具有类似的性质.之前说到过的线性表其实就是一种容器数据结构,本文中介绍的两种最常用的容器数据结构是栈和队列. 从功能上看,栈和队列大多用于计算过程中保存临时数据,这些数据是在计算过程中发现或产生的.在而后的计算中可能会用到这些数据.如果这些数据是固定的个数以及大小的话,可以构建几个变量来储存它们,但是如果这些数据不确定的话,就需要一