东营可以做网站的公司在哪建个商场网站

diannao/2025/10/22 13:43:34/文章来源:
东营可以做网站的公司在哪,建个商场网站,万网上传网站,中山市城乡建设局网站这是我的第 56 篇原创文章随着 JDK 1.8 Streams API 的发布#xff0c;使得 HashMap 拥有了更多的遍历的方式#xff0c;但应该选择那种遍历方式#xff1f;反而成了一个问题。本文先从 HashMap 的遍历方法讲起#xff0c;然后再从性能、原理以及安全性等方面#xff0c;来… 这是我的第 56 篇原创文章随着 JDK 1.8 Streams API 的发布使得 HashMap 拥有了更多的遍历的方式但应该选择那种遍历方式反而成了一个问题。本文先从 HashMap 的遍历方法讲起然后再从性能、原理以及安全性等方面来分析 HashMap 各种遍历方式的优势与不足本文主要内容如下图所示HashMap 遍历 HashMap 遍历从大的方向来说可分为以下 4 类迭代器Iterator方式遍历For Each 方式遍历Lambda 表达式遍历JDK 1.8;Streams API 遍历JDK 1.8。但每种类型下又有不同的实现方式因此具体的遍历方式又可以分为以下 7 种使用迭代器IteratorEntrySet 的方式进行遍历使用迭代器IteratorKeySet 的方式进行遍历使用 For Each EntrySet 的方式进行遍历使用 For Each KeySet 的方式进行遍历使用 Lambda 表达式的方式进行遍历使用 Streams API 单线程的方式进行遍历使用 Streams API 多线程的方式进行遍历。接下来我们来看每种遍历方式的具体实现代码。1.迭代器 EntrySetpublic class HashMapTest {public static void main(String[] args) {// 创建并赋值 HashMapMapInteger, String map  new HashMap();map.put(1, Java);map.put(2, JDK);map.put(3, Spring Framework);map.put(4, MyBatis framework);map.put(5, Java中文社群);// 遍历IteratorMap.EntryInteger, String iterator  map.entrySet().iterator();while (iterator.hasNext()) {Map.EntryInteger, String entry  iterator.next();System.out.print(entry.getKey());System.out.print(entry.getValue());}} } 以上程序的执行结果为1 Java 2 JDK 3 Spring Framework 4 MyBatis framework 5 Java中文社群2.迭代器 KeySetpublic class HashMapTest {public static void main(String[] args) {// 创建并赋值 HashMapMapInteger, String map  new HashMap();map.put(1, Java);map.put(2, JDK);map.put(3, Spring Framework);map.put(4, MyBatis framework);map.put(5, Java中文社群);// 遍历IteratorInteger iterator  map.keySet().iterator();while (iterator.hasNext()) {Integer key  iterator.next();System.out.print(key);System.out.print(map.get(key));}} } 以上程序的执行结果为1 Java 2 JDK 3 Spring Framework 4 MyBatis framework 5 Java中文社群3.ForEach EntrySetpublic class HashMapTest {public static void main(String[] args) {// 创建并赋值 HashMapMapInteger, String map  new HashMap();map.put(1, Java);map.put(2, JDK);map.put(3, Spring Framework);map.put(4, MyBatis framework);map.put(5, Java中文社群);// 遍历for (Map.EntryInteger, String entry : map.entrySet()) {System.out.print(entry.getKey());System.out.print(entry.getValue());}} } 以上程序的执行结果为1 Java 2 JDK 3 Spring Framework 4 MyBatis framework 5 Java中文社群4.ForEach KeySetpublic class HashMapTest {public static void main(String[] args) {// 创建并赋值 HashMapMapInteger, String map  new HashMap();map.put(1, Java);map.put(2, JDK);map.put(3, Spring Framework);map.put(4, MyBatis framework);map.put(5, Java中文社群);// 遍历for (Integer key : map.keySet()) {System.out.print(key);System.out.print(map.get(key));}} } 以上程序的执行结果为1 Java 2 JDK 3 Spring Framework 4 MyBatis framework 5 Java中文社群5.Lambdapublic class HashMapTest {public static void main(String[] args) {// 创建并赋值 HashMapMapInteger, String map  new HashMap();map.put(1, Java);map.put(2, JDK);map.put(3, Spring Framework);map.put(4, MyBatis framework);map.put(5, Java中文社群);// 遍历map.forEach((key, value) - {System.out.print(key);System.out.print(value);});} } 以上程序的执行结果为1 Java 2 JDK 3 Spring Framework 4 MyBatis framework 5 Java中文社群6.Streams API 单线程public class HashMapTest {public static void main(String[] args) {// 创建并赋值 HashMapMapInteger, String map  new HashMap();map.put(1, Java);map.put(2, JDK);map.put(3, Spring Framework);map.put(4, MyBatis framework);map.put(5, Java中文社群);// 遍历map.entrySet().stream().forEach((entry) - {System.out.print(entry.getKey());System.out.print(entry.getValue());});} } 以上程序的执行结果为1 Java 2 JDK 3 Spring Framework 4 MyBatis framework 5 Java中文社群7.Streams API 多线程public class HashMapTest {public static void main(String[] args) {// 创建并赋值 HashMapMapInteger, String map  new HashMap();map.put(1, Java);map.put(2, JDK);map.put(3, Spring Framework);map.put(4, MyBatis framework);map.put(5, Java中文社群);// 遍历map.entrySet().parallelStream().forEach((entry) - {System.out.print(entry.getKey());System.out.print(entry.getValue());});} } 以上程序的执行结果为4 MyBatis framework 5 Java中文社群 1 Java 2 JDK 3 Spring Framework性能测试 接下来我们使用 Oracle 官方提供的性能测试工具 JMHJava Microbenchmark HarnessJAVA 微基准测试套件来测试一下这 7 种循环的性能。首先我们先要引入 JMH 框架在 pom.xml 文件中添加如下配置!-- https://mvnrepository.com/artifact/org.openjdk.jmh/jmh-core -- dependencygroupIdorg.openjdk.jmh/groupIdartifactIdjmh-core/artifactIdversion1.23/version /dependency 然后编写测试代码如下所示import org.openjdk.jmh.annotations.*; import org.openjdk.jmh.runner.Runner; import org.openjdk.jmh.runner.RunnerException; import org.openjdk.jmh.runner.options.Options; import org.openjdk.jmh.runner.options.OptionsBuilder;import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.concurrent.TimeUnit;BenchmarkMode(Mode.Throughput) // 测试类型吞吐量 OutputTimeUnit(TimeUnit.MILLISECONDS) Warmup(iterations  2, time  1, timeUnit  TimeUnit.SECONDS) // 预热 2 轮每次 1s Measurement(iterations  5, time  3, timeUnit  TimeUnit.SECONDS) // 测试 5 轮每次 3s Fork(1) // fork 1 个线程 State(Scope.Thread) // 每个测试线程一个实例 public class HashMapCycle {static MapInteger, String map  new HashMap() {{// 添加数据for (int i  0; i  10; i) {put(i, val:  i);}}};public static void main(String[] args) throws RunnerException {// 启动基准测试Options opt  new OptionsBuilder().include(HashMapCycle.class.getSimpleName()) // 要导入的测试类.output(/Users/admin/Desktop/jmh-map.log) // 输出测试结果的文件.build();new Runner(opt).run(); // 执行测试}Benchmarkpublic void entrySet() {// 遍历IteratorMap.EntryInteger, String iterator  map.entrySet().iterator();while (iterator.hasNext()) {Map.EntryInteger, String entry  iterator.next();System.out.println(entry.getKey());System.out.println(entry.getValue());}}Benchmarkpublic void keySet() {// 遍历IteratorInteger iterator  map.keySet().iterator();while (iterator.hasNext()) {Integer key  iterator.next();System.out.println(key);System.out.println(map.get(key));}}Benchmarkpublic void forEachEntrySet() {// 遍历for (Map.EntryInteger, String entry : map.entrySet()) {System.out.println(entry.getKey());System.out.println(entry.getValue());}}Benchmarkpublic void forEachKeySet() {// 遍历for (Integer key : map.keySet()) {System.out.println(key);System.out.println(map.get(key));}}Benchmarkpublic void lambda() {// 遍历map.forEach((key, value) - {System.out.println(key);System.out.println(value);});}Benchmarkpublic void streamApi() {// 单线程遍历map.entrySet().stream().forEach((entry) - {System.out.println(entry.getKey());System.out.println(entry.getValue());});}Benchmarkpublic void parallelStreamApi() {// 多线程遍历map.entrySet().parallelStream().forEach((entry) - {System.out.println(entry.getKey());System.out.println(entry.getValue());});} } 所有被添加了 Benchmark 注解的方法都会被测试测试结果如下其中 Score 列表示平均执行时间 ± 符号表示误差。从以上结果可以看出如果加上后面的误差值的话可以得出的结论是除了并行循环的 parallelStream 性能比极高之外多线程方式性能肯定比较高其他方式的遍历方法在性能方面几乎没有任何差别。注以上结果基于测试环境JDK 1.8 / Mac mini (2018) / Idea 2020.1性能原理分析 要理解性能测试的结果我们需要把所有遍历代码通过 javac编译成字节码来看具体的原因编译之后我们使用 Idea 打开字节码信息内容如下// // Source code recreated from a .class file by IntelliJ IDEA // (powered by Fernflower decompiler) //package com.example;import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry;public class HashMapTest {static MapInteger, String map  new HashMap() {{for(int var1  0; var1  2; var1) {this.put(var1, val:  var1);}}};public HashMapTest() {}public static void main(String[] var0) {entrySet();keySet();forEachEntrySet();forEachKeySet();lambda();streamApi();parallelStreamApi();}public static void entrySet() {Iterator var0  map.entrySet().iterator();while(var0.hasNext()) {Entry var1  (Entry)var0.next();System.out.println(var1.getKey());System.out.println((String)var1.getValue());}}public static void keySet() {Iterator var0  map.keySet().iterator();while(var0.hasNext()) {Integer var1  (Integer)var0.next();System.out.println(var1);System.out.println((String)map.get(var1));}}public static void forEachEntrySet() {Iterator var0  map.entrySet().iterator();while(var0.hasNext()) {Entry var1  (Entry)var0.next();System.out.println(var1.getKey());System.out.println((String)var1.getValue());}}public static void forEachKeySet() {Iterator var0  map.keySet().iterator();while(var0.hasNext()) {Integer var1  (Integer)var0.next();System.out.println(var1);System.out.println((String)map.get(var1));}}public static void lambda() {map.forEach((var0, var1) - {System.out.println(var0);System.out.println(var1);});}public static void streamApi() {map.entrySet().stream().forEach((var0) - {System.out.println(var0.getKey());System.out.println((String)var0.getValue());});}public static void parallelStreamApi() {map.entrySet().parallelStream().forEach((var0) - {System.out.println(var0.getKey());System.out.println((String)var0.getValue());});} }从结果可以看出除了 Lambda 和 Streams API 之外通过迭代器循环和 for 循环的遍历的 EntrySet 最终生成的代码是一样的他们都是在循环中创建了一个遍历对象 Entry 如下所示public static void entrySet() {Iterator var0  map.entrySet().iterator();while(var0.hasNext()) {Entry var1  (Entry)var0.next();System.out.println(var1.getKey());System.out.println((String)var1.getValue());} } public static void forEachEntrySet() {Iterator var0  map.entrySet().iterator();while(var0.hasNext()) {Entry var1  (Entry)var0.next();System.out.println(var1.getKey());System.out.println((String)var1.getValue());} } 而通过迭代器和 for 循环遍历的 KeySet 代码也是一样的如下所示public static void keySet() {Iterator var0  map.keySet().iterator();while(var0.hasNext()) {Integer var1  (Integer)var0.next();System.out.println(var1);System.out.println((String)map.get(var1));} }  public static void forEachKeySet() {Iterator var0  map.keySet().iterator();while(var0.hasNext()) {Integer var1  (Integer)var0.next();System.out.println(var1);System.out.println((String)map.get(var1));} } 可以看出 KeySet 在循环中创建了一个 Integer 的局部变量并且值是从 map 对象中直接获取的。所以通过字节码来看使用 EntrySet 和 KeySet 代码差别不是很大并不像网上说的那样 KeySet 的性能远不如 EntrySet因此从性能的角度来说 EntrySet 和 KeySet 几乎是相近的但从代码的优雅型和可读性来说还是推荐使用  EntrySet。安全性测试 从上面的性能测试结果和原理分析我想大家应该选用那种遍历方式已经心中有数的而接下来我们就从「安全」的角度入手来分析那种遍历方式更安全。我们把以上遍历划分为四类进行测试迭代器方式、For 循环方式、Lambda 方式和 Stream 方式测试代码如下。1.迭代器方式IteratorMap.EntryInteger, String iterator  map.entrySet().iterator(); while (iterator.hasNext()) {Map.EntryInteger, String entry  iterator.next();if (entry.getKey()  1) {// 删除System.out.println(del:  entry.getKey());iterator.remove();} else {System.out.println(show:  entry.getKey());} } 以上程序的执行结果show:0del:1show:2测试结果迭代器中循环删除数据安全。2.For 循环方式for (Map.EntryInteger, String entry : map.entrySet()) {if (entry.getKey()  1) {// 删除System.out.println(del:  entry.getKey());map.remove(entry.getKey());} else {System.out.println(show:  entry.getKey());} } 以上程序的执行结果测试结果For 循环中删除数据非安全。3.Lambda 方式map.forEach((key, value) - {if (key  1) {System.out.println(del:  key);map.remove(key);} else {System.out.println(show:  key);} }); 以上程序的执行结果测试结果Lambda 循环中删除数据非安全。Lambda 删除的正确方式// 根据 map 中的 key 去判断删除 map.keySet().removeIf(key - key  1); map.forEach((key, value) - {System.out.println(show:  key); }); 以上程序的执行结果show:0show:2从上面的代码可以看出可以先使用 Lambda 的 removeIf 删除多余的数据再进行循环是一种正确操作集合的方式。4.Stream 方式map.entrySet().stream().forEach((entry) - {if (entry.getKey()  1) {System.out.println(del:  entry.getKey());map.remove(entry.getKey());} else {System.out.println(show:  entry.getKey());} }); 以上程序的执行结果测试结果Stream 循环中删除数据非安全。Stream 循环的正确方式map.entrySet().stream().filter(m - 1 ! m.getKey()).forEach((entry) - {if (entry.getKey()  1) {System.out.println(del:  entry.getKey());} else {System.out.println(show:  entry.getKey());} }); 以上程序的执行结果show:0show:2从上面的代码可以看出可以使用 Stream 中的 filter 过滤掉无用的数据再进行遍历也是一种安全的操作集合的方式。小结我们不能在遍历中使用集合 map.remove() 来删除数据这是非安全的操作方式但我们可以使用迭代器的 iterator.remove() 的方法来删除数据这是安全的删除集合的方式。同样的我们也可以使用 Lambda 中的 removeIf 来提前删除数据或者是使用 Stream 中的 filter 过滤掉要删除的数据进行循环这样都是安全的当然我们也可以在 for 循环前删除数据在遍历也是线程安全的。总结 本文我们讲了 HashMap 4 大类迭代器、for、lambda、stream遍历方式以及具体的 7 种遍历方法除了 Stream 的并行循环其他几种遍历方法的性能差别不大但从简洁性和优雅性上来看Lambda 和 Stream 无疑是最适合的遍历方式。除此之外我们还从「安全性」方面测试了 4 大类遍历结果从安全性来讲我们应该使用迭代器提供的 iterator.remove() 方法来进行删除这种方式是安全的在遍历中删除集合的方式或者使用 Stream 中的 filter 过滤掉要删除的数据再进行循环也是安全的操作方式。总体来说本文提供了 7 种方式肯定也不是最全的我是想给读者在使用 HashMap 时多一种选择然而选择那一种形式的写法要综合性能、安全性、使用环境的 JDK 版本以及优雅性和可读性等方面来综合考虑。最后欢迎各位在评论区补充并留言写出你们的想法。最后的话原创不易如果觉得本文对你有用请随手点击一个「在看」这是对作者最大的支持与鼓励谢谢你。参考 鸣谢https://www.javaguides.net/2020/03/5-best-ways-to-iterate-over-hashmap-in-java.htmlString性能提升10倍的几个方法(源码原理分析)9个小技巧让你的 if else看起来更优雅关注公众号发送”进群“老王拉你进读者群。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/91968.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网站建设明细价格表营销推广方式有哪些

问题引入 前一篇文章,菜鸟找到了SQL on Linux Docker容器销毁后,容器中的数据库文件可以得以保留的方法,老鸟非常开心。所以,今天又提出了新的问题:“鸟儿,如果我想把我的数据库从SQL on Windows迁移到SQL …

团购网站管理系统求个网站好人有好报2023

大家好,我是木易,一个持续关注AI领域的互联网技术产品经理,国内Top2本科,美国Top10 CS研究生,MBA。我坚信AI是普通人变强的“外挂”,所以创建了“AI信息Gap”这个公众号,专注于分享AI全维度知识…

城市建设模拟游戏网站360优化大师官方下载最新版

正题 题目链接:https://uoj.ac/problem/84 题目大意 有nnn个点的一棵树,111为根,两个人从根节点往下走(只能从深度小的点走到深度大的点)。 两个人每一秒都可以一条边(也可以不移动),或者不消…

怎么查一个网站有没有做301门户做网站

中国人民银行授权全国银行间同业拆借中心公布,2024年2月20日贷款市场报价利率(LPR)为:1年期LPR为3.45%,5年期以上LPR为3.95%。以上LPR在下一次发布LPR之前有效。 2024年1月22日贷款市场报价利率(LPR&#…

乡镇信息公开网站建设制度网站开发相关专业

最近在做python的web开发(原谅我的多变,好东西总想都学着。。。node.js也是),不过过程中总遇到些问题,不管是web.py还是django,开发起来确实没用php方便,毕竟存在的时间比较短,很多不完善的地方。比如我在调…

asp网站怎么改成中英双语温州网站推广优化公司

文档介绍:节以下不属于计算机外部设备的是。蕿A.输入设备羇B.中央处理器和主存储器袅C.输出设备蝿D.外存储器芈答案关键:B肇题目2of100肁计算机系统中运行的程序、数据及相应的文档的集合称为。蒁A.主机肆B.软件系统***C.系统软件蒂D.应用软件衿答案关键:B腿题目3of…

纺织品公司网站建设成都金牛区建设局网站

一、安装Android Studio 官网地址: https://developer.android.google.cn/ 历史版本下载地址: https://developer.android.com/studio/archive?hlzh-cn 二、安装Xcode 到App Store下载安装最新版本,如果MacOS更新不到13.0以上就无法安装…

住建城乡建设网站博客园 wordpress.net

1.NameValueCollection类集合是基于 NameObjectCollectionBase 类。 但与 NameObjectCollectionBase 不同,该类在一个键下存储多个字符串值(就是键相同,值就连接起来如下例子)。该类可用于标头、查询字符串和窗体数据。每个元素都…

公司建立网站的费用如何做帐网站建设视频教程php

塑料检查井作为一种新型的检查井材料,其产品设计合理、座盖联合周密,为安装维护带来了极大的方便。 首先,塑料检查井的设计合理,能够满足各种工程需求。其结构紧凑、尺寸精确,可以方便地与管道和其他设施进行连接和安…

在线解压rar网站建网站软件 优帮云

👾 MaxPatrol VM 2.1 是俄罗斯唯一一款可以安装在 Linux 上并以审计和五重测试模式扫描 Windows 主机(甚至是旧版本)的漏洞管理产品。 让我们告诉你更新后的 MaxPatrol VM 还有哪些有用的功能: 1. 由于采用了新的数据存储模式&a…

建网页和建网站教做3d的网站

近期开发上线一个常驻app,项目已上线,今天随笔记录一下静默安装相关内容。我分三篇静默安装(root版)、静默安装(无障碍版)、监听系统更新、卸载、安装。 先说说我的项目需求:要求app一直运行&am…

个人网站有哪些板块创世网站建设

文章目录 父子组件的渲染机制优化手段与实践写法父组件:下发stateprops.children 传递无状态组件props传递组件 React.memo缓存子组件与useCallback结合 父子组件的渲染机制 渲染分初次渲染和重新渲染 React组件会在两种情况下发生重新渲染 当组件自身的state发生…

做网络推网站推广的目的黑户可做网站

本地TS播放过程 本地M3U8播放过程 http工作流程 http分两个步骤 1、获取m3u8文件,这个是在哪里开始读的? 2、获取data数据,这个是从http_read开始读,可以通过修改这里实现buffer数据和引擎对接 3、s->user_agent,s->off,…

房产网站方案扫描网站漏洞的软件

题目: 编写一个名为 collatz()的函数,它有一个名为 number 的参数。如果参数是偶数,那么 collatz()就打印出 number // 2,并返回该值。 如果 number 是奇数,collatz()就打印并返回 3 * number 1。 然后编写一个程序&a…

公司网站改版方案网站开发薪资

**单片机设计介绍,基于单片机干湿垃圾自动分类系统 文章目录 一 概要二、功能设计三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的干湿垃圾自动分类系统是一个集成传感器技术、机械控制和单片机编程于一体的自动化解决方案。该系统的主要目标是实…

培训网站免费在线做ppt

文章目录一、创建SpringBoot项目二、添加Mybatis相关依赖三、数据源配置四、创建事务的模型实体类五、创建和数据库交互联系的映射关系类六、创建业务接口和实现类七、创建控制器类八、请求验证一、创建SpringBoot项目 如何创建详见:IDEA 创建 SpringBoot 项目 二、…

网站如何做软文推广wordpress xiu主题

我正在尝试创建一个动态数据库创建脚本.有很多步骤,我们经常创建这个数据库,所以脚本看起来像这样.DECLARE databaseName nvarchar(100) DatabaseNameEXEC(/*A lot of database creation code built off of databaseName*/)除了我们在此数据库中创建的一个视图外,这一切都很好…

网站维护进不去怎么办网站服务器ip

客户端缓存是万维网的基础之一。 服务器应告知客户端资源的有效性,客户端应尽可能快地对其进行缓存。 如我们所见,如果不缓存Web,将会非常慢。 只需在任何网站上Ctrl F5并将其与普通F5进行比较-后者就会更快,因为它使用了已缓存的…

广州企业网站建设开发创意交易平台官网

解题思路: 输入n3 n 0 1个 n 1 1个 n 2 2个 头1头2头3 头1 左子树0节点(个数)x右子树2个节点(个数) 头2 左子树1节点(个数)x右子树1个节点(个数) 头3 左子…

国内很多网站不是响应式宁波北京网站建设

过期策略 我们set key的时候,都可以给一个expire time,就是过期时间,指定这个key比如说只能存活1个小时,我们自己可以指定缓存到期就失效。 如果假设你设置一个一批key只能存活1个小时,那么接下来1小时后,r…