Java Set的五种遍历方式
摘要:介绍Java遍历Set的五种方式,并分析哪中方式效率高,建议使用增强for循环变量。
Set 和 List 遍历方式基本一致,本文介绍Set的遍历方式,并比较那种方法执行效率最高。
1、迭代器方法
/**
/**
* 1 iterator
* 迭代器
*
* @param set
*/
public static void iteratorTest(Set<Integer> set) {
System.out.println("1 iterator 遍历方法");
long start = System.currentTimeMillis();
set.forEach(item -> {
// System.out.println(item);
});
System.out.println("耗时 time=\t" + (System.currentTimeMillis() - start));
StringBuilder sb = new StringBuilder(set.size());
for (Iterator<Integer> iterator = set.iterator(); iterator.hasNext(); ) {
sb = sb.append(iterator.next()).append(",");
}
System.out.println(sb.length());
/**
* while 循环写法
*/
Iterator<Integer> iterator = set.iterator();
while (iterator.hasNext()) {
iterator.next();
}
}
该方法用到了Iterator迭代器,略显繁琐,请考虑使用增强for遍历的方法。
2、增强for遍历
/**
* 2 增强for循环
*
* @param set
*/
public static void forTest(Set<Integer> set) {
System.out.println("2 增强for循环");
long start = System.currentTimeMillis();
// StringBuilder sb = new StringBuilder(set.size());
for (int item : set) {
// sb = sb.append(item).append(",");
}
// System.out.println(sb);
System.out.println("耗时 time=\t" + (System.currentTimeMillis() - start));
}
温馨提示:在对set集合成进行遍历的时候,请勿同时执行修改操作,比如删除,这样会导致程序崩溃。
forEach方法
set.forEach 自java 8 才支持。forEach 效率最低,不推荐!
/**
* 3 forEach 遍历方式
* forEach 最慢不推荐 java8 lambda
* 注意:在对set集合成进行遍历的时候不能同时进行修改操作,比如删除,这样会导致崩溃。
*
* @param set
*/
public static void forEachTest(Set<Integer> set) {
System.out.println("3 forEach 遍历方式");
long start = System.currentTimeMillis();
set.forEach(item -> {
// System.out.println(item);
});
System.out.println("耗时 time=\t" + (System.currentTimeMillis() - start));
}
stream.forEach方法
set.stream().forEach也是在java 8 才支持。
/**
* 4 stream forEach
* stream foreach java8 特有
*
* @param set
*/
public static void streamForEachTest(Set<Integer> set) {
System.out.println("4 stream forEach");
long start = System.currentTimeMillis();
set.stream().forEach(item -> {
// System.out.println(item);
});
System.out.println("耗时 time=\t" + (System.currentTimeMillis() - start));
}
耗时和增强for差不多。
5 forEachRemaining方法
此方法也是在java 8 才支持,主要用于继续输出集合中剩余的元素。这里用于遍历全部元素:
/**
* 5 forEachRemaining
*
* @param set
*/
public static void forRemainingTest(Set<Integer> set) {
System.out.println("5 forEachRemaining");
int i = 0;
long start = System.currentTimeMillis();
Iterator<Integer> iterator = set.iterator();
// set.iterator().forEachRemaining(value -> System.out.print(value + " "));
iterator.forEachRemaining(
new Consumer<Integer>() {
@Override
public void accept(Integer value) {
// System.out.println(value);
}
}
);
System.out.println("耗时 time=\t" + (System.currentTimeMillis() - start));
}
案例分析
使用如下main函数,调用如上几种方法,以分析各个方法执行效率:
public static void main(String[] args) {
int n = 1000000;
Set<Integer> set = new HashSet<>(n);
for (int i = 0; i < n; i++) {
set.add(i);
}
iteratorTest(set);
forTest(set);
forEachTest(set);
streamForEachTest(set);
forRemainingTest(set);
}
执行结果如下:
1 iterator 遍历方法
耗时 time= 130
6888890
2 增强for循环
耗时 time= 9
3 forEach 遍历方式
耗时 time= 15
4 stream forEach
耗时 time= 12
5 forEachRemaining
耗时 time= 16
Process finished with exit code 0
由执行结果可知,增强for循环效率最高。
Java Set的五种遍历方式的更多相关文章
- iOS开发中数组常用的五种遍历方式
随着iOS的不断发展,apple也不断推出性能更高的数组遍历方式,下面将对熟悉的五种遍历方式进行列举. 首先定义一个数组,并获取数组长度 NSArray *array=@[",]; NSIn ...
- java Map的四种遍历方式
1.这是最常见的并且在大多数情况下也是最可取的遍历方式,在键值都需要时使用. Map<Integer, Integer> map = new HashMap<Integer, Int ...
- java list 的 四种遍历方式
在java中遍历一个list对象的方法主要有以下四种: 1. For Loop —— 普通for循环 2. Advanced For Loop —— 高级for循环 3. Iterator Loop ...
- List集合五种遍历方式
一.使用Iterator接口遍历 二.普通for循环遍历 三.增强for循环遍历 四.List集合自带迭代器 五.Lambda(JDK8新增特性) //使用多态方式创建对象 List<Strin ...
- java集合的三种遍历方式
import java.util.ArrayList; import java.util.Collection;import java.util.Iterator;public class Home ...
- java集合四种遍历方式
package conection; import java.util.Iterator;import java.util.LinkedList;import java.util.List; publ ...
- Java中List集合的三种遍历方式(全网最详)
List集合在Java日常开发中是必不可少的,只要懂得运用各种各样的方法就可以大大提高我们开发的效率,适当活用各种方法才会使我们开发事半功倍. 我总结了三种List集合的遍历方式,下面一一来介绍. 首 ...
- 二叉树及其三种遍历方式的实现(基于Java)
二叉树概念: 二叉树是每个节点的度均不超过2的有序树,因此二叉树中每个节点的孩子只能是0,1或者2个,并且每个孩子都有左右之分. 位于左边的孩子称为左孩子,位于右边的孩子成为右孩子:以左孩子为根节点的 ...
- Java中Map的4种遍历方式
第一种方式:这是平常用的最多也最可取的一种遍历方式. for (Map.Entry<String, Object> entry : map.entrySet()) { System.out ...
- 基于Java的二叉树的三种遍历方式的递归与非递归实现
二叉树的遍历方式包括前序遍历.中序遍历和后序遍历,其实现方式包括递归实现和非递归实现. 前序遍历:根节点 | 左子树 | 右子树 中序遍历:左子树 | 根节点 | 右子树 后序遍历:左子树 | 右子树 ...
随机推荐
- ABC392E翻译
AT_abc392_e [ABC392E] Cables and Servers 题目描述 有编号从 \(1\) 到 \(N\) 的 \(N\) 台服务器和编号从 \(1\) 到 \(M\) 的 \( ...
- go time包:秒、毫秒、纳秒时间戳输出
时间戳 10 位数的是以 秒 为单位: 13 位数的是以 毫秒 为单位: 19 位数的是以 纳秒 为单位: golang 中可以这样写: package main import ( "fmt ...
- Linux下使用sz/rz命令从服务器下载或上传文件
简介 Linux中rz命令和sz命令都可用于文件传输,而rz命令主要用于文件的上传,sz命令用于从Linux服务器下载文件到本地. 安装 yum安装 yum -y install lrzsz 源码安装 ...
- Error: Address already in use
端口被某个进程占用 使用命令 lsof -i:端口号 然后看到进程号,直接杀掉进程就好 kill -9 进程号
- 人工智能-A*算法-最优路径搜索实验
上次学会了<A*算法-八数码问题>,初步了解了A*算法的原理,本次再用A*算法完成一个最优路径搜索实验. 一.实验内容1. 设计自己的启发式函数.2. 在网格地图中,设计部分障碍物.3. ...
- google_hacking_study
简单了解一下Google Hacking语法. 这是goolehacking十个基本语法. ""完全匹配 据说匹配比较精准,但是我不加引号好像也没什么区别耶 *模糊匹配.?表示单个 ...
- 一款 .NET 开源、功能强大的远程连接管理工具,支持 RDP、VNC、SSH 等多种主流协议!
前言 今天大姚给大家分享一款基于 .NET 开源(GPL-2.0 license).免费.功能强大的 Windows 远程连接管理工具,支持 RDP.VNC.SSH 等多种主流协议:mRemoteNG ...
- 【视频编辑】Pr视频编辑软件导出的视频声音有一段会变大怎么解决
导出视频后为什么有段声音会突然变大? 也就是可能存在编辑器导出的时候有自动增益声音的行为. 具体描述: 工程文件里我没动过声音,工程文件里听也是很正常的,但是导出后有一小段音乐会突然变大(存在自动增益 ...
- @PathVaribale
/** * @pathVaribale * 作用: 用于获取url 中的占位符的值. * 例如:请求 url 中 /delete/{id},这个{id}就是 url 占位符. * url 支持占位符是 ...
- jmeter使用时报错问题
一.打开时命令行提示按任意键继续图形界面无法打开 如图,打开时jmeter命令行报错 根据报错内容,是Java没有安装好. jdk安装好后,需要在环境变量中配置. 但是jdk安装配置好后打开还是报错, ...