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的二叉树的三种遍历方式的递归与非递归实现
二叉树的遍历方式包括前序遍历.中序遍历和后序遍历,其实现方式包括递归实现和非递归实现. 前序遍历:根节点 | 左子树 | 右子树 中序遍历:左子树 | 根节点 | 右子树 后序遍历:左子树 | 右子树 ...
随机推荐
- 【由技及道】CI/CD的量子纠缠术:Jenkins与Gitea的自动化交响曲【人工智障AI2077的开发日志】
摘要:当代码提交触发量子涟漪,当构建流水线穿越时空维度--欢迎来到自动化构建的十一维世界.本文记录一个未来AI如何用Jenkins和Gitea搭建量子纠缠式CI/CD管道,让每次代码提交都成为时空交响 ...
- sql server 2017 STRING_AGG() 替代方案
SELECT @StuId='"'+STRING_AGG(Id,'","')+'"'FROM( SELECT 'a'+cast(Id as varchar) I ...
- 归并排序(递归)(NB)
博客地址:https://www.cnblogs.com/zylyehuo/ 递归思路 # _*_coding:utf-8_*_ import random def merge(li, low, mi ...
- 从零开始:基于 PyTorch 的图像分类模型
摘要:本文详细记录了使用 PyTorch 从零搭建一个图像分类模型的过程,涵盖卷积神经网络(CNN).数据预处理.模型设计.训练调试与优化.通过对 CIFAR-10 数据集的处理实践,结合经典文献和 ...
- Linux脚本-使用jar自动替换配置文件
背景 最近公司需要在生产服务器上测试字库,需要非常频繁修改配置文件中的字体相关属性,然后实时调试,所以需要频繁的修改配置文件并手动发布出去.之前需要修改配置文件时,我们需要: 把jar包通过FTP传回 ...
- StringBuilder原理及StringBuffer
1.StringBuilder的原理 StringBuilder是用来干什么的?为什么我们要学习StringBuilder?字符串拼接明明String也可以实现 答:StringBuilder可以大幅 ...
- 【Maven】在 Idea 中使用 Maven
在 Idea 中使用 Maven 1 在 Idea 中配置 Maven Idea 中也自带 Maven 插件,而且我们也可以给自带的 Maven 插件进行配置,所以我们可以使用自带的 Maven,也可 ...
- Javascript 对象(object)合并
转
转载了一篇介绍的比较直观的博文.
- ASP.NET Core 项目归档
把一些基于 ASP.NET Core 的实用项目找个地方记录下... 项目列表: IdentityServer
- wpf关于设备无关性的理解
wpf的像素单位是1/96*系统dpi.当前系统dpi是96,那么wpf的一个单位长就是1px像素.这个系统dpi的意思就是物理单位一英寸里有多少个像素点,比如windows标准的96dpi,意味着一 ...