使用jdk1.8去除逻辑上重复的HashMap的value以及构建本地缓

Java后端面试核心:HashMap、JVM、并发、MySQL、Redis与Spring深度解析 在Java后端开发领域,深入理解核心数据结构与并发原理是构建高性能、高可用系统的基石。数据结构如HashMap,其底层通过数组、链表与红黑树的组合,高效解决了哈希冲突与动态扩容问题,是面试中考察对集合框架理解深度的经典案例。并发编程则涉及线程安全、锁机制与线程池管理,旨在解决多线程环境下的数据一致性与资源竞争挑战,其技术价值在于保障系统在高并发场景下的稳定与效率。这些基础概念广泛应用于缓存设计、数据库连接池管理等实际工程场景。本文聚焦于Java后端面试中最核心的六大模块,结合**HashMap线程安全**的 阅读详情

最近在做一个老系统,由于表的信息不明确, 在数据库拿二个表的时候产生了笛卡尔联结,由于重复数据只有三条. 而这二个表的列数据比较固定. 所以决定取出来在后端去重。 数据类型是以List<HashMap> 进行接收的。 现在我把它合并成一条HashMap(然而后来我们没有采用这种方式, 只是记录下来突如其来的想法 ~). 测试代码如下: 

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;

public class Test {
	
	 public void testMergeMap(){
	        List<Map<String, String>> list = new ArrayList<>();
	        Map<String, String> m1 = new HashMap<>();
	        m1.put("fruits", "apple");
	        m1.put("others", "hahaha");
	        list.add(m1);

	        Map<String, String> m2 = new HashMap<>();
	        m2.put("fruits", "orange");
	        list.add(m2);

	        Map<String, String> m3 = new HashMap<>();
	        m3.put("fruits", "pear");
	        list.add(m3);

	        Map<String, HashSet<String>> mergeMap = new HashMap<>();
	        for(Map<String, String> map : list){
	            if(map == null){
	                continue;
	            }
	            for(Map.Entry entry : map.entrySet()){
	                mergeMap.computeIfAbsent((String)entry.getKey(), k -> genValue(k)).add((String)entry.getValue());
	            }
	        }

	        System.out.println(mergeMap.toString());
	    }

	    static HashSet<String> genValue(String str) {
	        return new HashSet<String>();
	    }  

    public static void main(String[] args) {
		 Test test= new Test();
		 
		  test.testMergeMap();
	}	

}
这里重点记录一下computeIfAbsent, 这是1.8Map接口中新增的一个方法,作者的本意是将他作为本地缓存, 在1.8的HashMap ConcurrentHashMap中都可以看到他的身影, 方法签名如下:

           public V computeIfAbsent(K key, Function<? super K,? extends V> mappingFunction)

返回的值是你添加进去的元素的值。

此方法首先判断缓存map中是否存在指定的key值, 如果不存在会调用mappingFunction计算key的value,然后将key=value放入到缓存map中, java1.8会采用thread-safe的方式

从cache中存取记录.   1.8以前的putifAbsent也可以实现这种需求。 但是computeIfAbsent可以将一些逻辑或者限制条件写在mappingFunction里面。简单的如下:(以判断斐波那契数列为列)

import java.util.HashMap;
import java.util.Map;

public class Fibonacc {

	   static Map<Integer, Integer> cache = new HashMap<>(); 
	   
	   static int cachefibonacc(int n){
		   
		   return cache.computeIfAbsent(n, (value) -> {  
	            System.out.println("cache " + n);  
	            return cachefibonacc(n - 2) + cachefibonacc(n - 1);  
	        });  
	   }
	   
	   public static void main(String[] args) {
	        cache.put(1, 1);  
	         
		 cachefibonacc(7); 
	}
}



 





                








Java equals()与hashCode()契约原理与工程实践 在Java中,equals()和hashCode()并非普通工具方法,而是支撑哈希集合(HashMap、HashSet等)正确运行的核心契约。其原理源于JVM对象内存布局与哈希表桶定位机制:hashCode()决定对象存储位置,equals()负责桶内精确匹配;二者失配将直接导致get()失效、重复插入或缓存击穿。该契约深刻影响分布式缓存、ORM映射与序列化等关键场景。掌握其五项黄金法则与31质数哈希技巧,结合Record类或IDE智能生成,可规避90%以上线上集合类故障。本文聚焦Java开发者高频踩坑点与 阅读详情

相关推荐

JVM面试题截图及个人补充

jvm面试题

の博客 234

map去重value值

public static void removeDuplicateMap() { //给出一个value有重复元素的map Map**<String,String>** map = new HashMap<String****, String****>(); map**.put("a",** “aaa”); map**.put("b",** “aaa”); map**.put("c",** “bbb”); map**.put("d",** “ccc”); System.out.pr

m0_67401382的博客 732

【专业书1】量化交易——从入门到精通

股票季节性策略几乎失效了,但商品期货的仍有效,因为其季节性需求源于真实的经济需求而非投机。交易策略获利的前提:交易价格处于均值回归(低价时买入)或动量状态(降价时先做空后以更低价买入),否则在随机游走状态下是无法有效交易的。构建交易策略实际上是在决定:在特殊条件、特定时间尺度下价格趋势的呈现(均值回归/趋势走势),以及用什么价格作为初始判断的参考价格。如果以高夏普比率为目标,需要更高的交易频率:基于大数定律,押注越多,偏离均值收益的偏差就越小。买同比最好的股票,卖同比最差的股票。但在不同的时间尺度下可以。

weixin_44589682的博客 1552

HashMap遍历的方法,HashMap去重value的方法

文章目录 @Test public void stm(){ HashMap<Integer,String> map= new HashMap<Integer,String>(); map.put(1,"张三"); map.put(2,"李四"); map.put(3,"王五"); map.put(4,"李四"); System.out.println("去重前:"+map.

yang13676084606的博客 1461

别再傻傻分不清PBR和NPR了!从《原神》到《双城之战》,聊聊游戏里那些让你眼前一亮的渲染风格

本文深入解析了PBR(基于物理的渲染)与NPR(非真实感渲染)在游戏视觉风格中的应用差异,通过《原神》和《双城之战》的案例,展示了两种渲染技术如何创造出截然不同的艺术效果。从技术原理到实战案例,帮助读者理解如何根据项目需求选择合适的渲染风格。

weixin_30425949的博客 150

手把手式介绍 ADNI 影像数据下载

1.搜索 1.1登录 打开ADNI的官网:http://adni.loni.usc.edu/,进入下面的界面。 点击 DATA&SMPLES 下的 ACCESS DATA AND SAMPLES,如下图。 页面跳转以后点击中间的“LOGIN”,这时会跳出一个新的界面,然后在右上角输入自己的帐号、密码即可。如果没有权限可以跳转到第2部分看看如何申请权限。 登录以后选择DOWNLOAD下的 Image Collections就是搜索下载影像数据,其他还有一些学习测试数据和遗传数据。 1.2 sea

永远想不起来更新的博客 1万+

面试官:怎么删除 HashMap 中的重复元素?第 3 种实现思路,99% 的人不会

本文总结了 3 种删除 HashMap 重复元素的方法:新创建 Map 添加不重复元素添加 Set 再删除重复元素(推荐)使用 Stream 删除重复元素实际开发过程中,可能会使用不同的遍历方式,使用哪种删除方案可以根据不同的遍历方式进行选择,但推荐使用 Set 方案,可以直接删除 Map 中的重复元素,不会创建新的 HashMap。另外,遍历集合时需要重点考虑是否有多线程修改元素的场景,可能导致的并发修改异常,参考之前文章中介绍的方案,这里不再撰述了。

2301_77463738的博客 1182

头歌OpenGauss数据库-G.视图的使用

OpenGauss数据库-G.视图的使用

python一生之敌的博客 1385

hashmap 允许key重复吗_你掌握了JDK7 与 JDK8 中 HashMap 的实现吗

点击上方☝Java编程技术乐园,轻松关注!及时获取有趣有料的技术文章做一个积极的人编码、改bug、提升自己我有一个乐园,面向编程,春暖花开!来源:Hosee,my.oschina.net/hosee/blog/618953JDK7中的HashMapHashMap底层维护一个数组,数组中的每一项都是一个Entrytransient Entry[] table;我们向 HashMap 中所放...

weixin_29353431的博客 232

【Dify】PPT生成工具应用

本文介绍了一款自动化PPT生成工具,通过智能接口将文本内容高效转化为结构化演示文档。该系统采用三阶段工作流(内容输入、HTTP请求上传、文件输出),无需复杂操作即可生成专业PPT。工具适用于教学课件、产品发布、企业培训等场景,能显著提升内容表达效率,特别适合初学者快速制作演示材料。文章详细说明了核心节点、应用场景及开发资源,为文本到PPT的自动化转换提供了实用解决方案。

Mr数据杨 1221

【毕设实战】飞行器目标识别系统:基于YOLOv5的智能检测全流程教程,助你毕设脱颖而出

亲爱的同学,毕设是不是让你既期待创新又担心技术门槛?如果你的毕设方向是计算机视觉、智能检测,那这个绝对能成为你的“毕设王牌”。从数据准备到界面开发,我会把整个项目拆成“傻瓜式”步骤,让你能一步步做出属于自己的毕设成果。

know_F0727的博客 106

面试官:怎么删除 HashMap 中的重复元素?第 3 种实现思路,99% 的人不会!

新创建 Map 添加不重复元素添加 Set 再删除重复元素(推荐)使用 Stream 删除重复元素实际开发过程中,可能会使用不同的遍历方式,使用哪种删除方案可以根据不同的遍历方式进行选择,但推荐使用 Set 方案,可以直接删除 Map 中的重复元素,不会创建新的 HashMap。另外,遍历集合时需要重点考虑是否有多线程修改元素的场景,可能导致的并发修改异常,参考之前文章中介绍的方案,这里不再撰述了。欢迎 Star 学习,后面 Java 示例都会在这上面提供!

Java技术栈,分享最主流的Java技术 1775

Stanford Dogs 犬类识别实战:基于 YOLOv8 的 120 类目标检测与图形界面实现

本项目通过YOLOv8实现了Stanford Dogs数据集的目标检测功能,完整包含了数据准备、模型训练、检测推理、图形界面四大模块。初学者使用YOLOv8n(nano版)加速训练,熟悉流程后可切换到YOLOv8s/m。图像上传与检测可进一步增强,例如显示识别框、标注标签。可以添加模型选择、检测阈值调整等功能,提升实用性。通过网盘分享的文件:基于yolov8的狗类品种识别系统链接: https://pan.baidu.com/s/1UYV4h2WnK1RxWWKoPrS-RA?

FJN110的博客 86

计算机学习笔记 ArrayList、HashMap和HashSet的具体用法和代码示例

ArrayList 部分重点讲解了其基于动态数组的底层原理、自动扩容机制(1.5倍),并详细列举了增删改查、遍历等常用方法。 HashMap 部分则深入剖析了其基于哈希表(数组+链表+红黑树)的实现,解释了哈希计算、冲突解决和扩容(2倍)等核心机制,并演示了键值对操作及高效遍历方式。 HashSet

既然你都点开这里了,那可以给我点个关注吗?可以吗?可以吗? 442

华为OD机试真题 新系统【优化充电桩调度算法】

华为OD机试 新系统真题【优化充电桩调度算法】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【优化充电桩调度算法】

qq_45776114的博客 758

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Java Map笔记

Map 是 Java 集合框架中键值对(Key-Value)存储的顶层接口,与 Collection 接口并列(不属于 Collection 子体系),核心作用是通过唯一的 Key 快速查找对应的 Value。特点:Key 唯一、Value 可重复,不同实现类的有序性 / 线程安全性差异;方法:put/get/entrySet 等核心操作,JDK8+ 函数式便捷方法;实现类。

zbj74_的博客 639

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Java集合高频面试题

Fail-Fast:在遍历集合时,如果集合结构被修改(如 add/remove),会抛出 ConcurrentModificationException。ArrayList、HashMap 均属于此类。Fail-Safe:遍历时基于集合的快照,不会抛出异常。ConcurrentHashMap、CopyOnWriteArrayList 属于此类。怎么避免Fail-Fast:使用迭代器的 remove 方法,或使用removeIf。

m0_47691180的博客 317

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Java集合框架深度解析:从数据结构到并发实战

数据结构是计算机科学的核心基础,它定义了数据的组织、存储和访问方式,直接影响程序的性能和资源消耗。在Java生态中,集合框架是对常用数据结构(如数组、链表、树、哈希表)的标准化实现,其设计原理深刻体现了数据结构与算法的权衡。理解集合的底层实现,例如ArrayList的动态数组扩容、HashMap的哈希冲突解决与红黑树优化,不仅能提升代码效率,更是排查性能瓶颈和并发问题的关键。这些技术价值在高并发、大数据处理等应用场景中尤为突出。本文聚焦Java面试中的高频考点,深入剖析ArrayList与LinkedLis

weixin_33720956的博客 364

Java集合框架深度解析:从底层原理到实战选型指南

在Java编程中,数据结构是构建高效应用的核心基础。集合框架通过提供标准化的接口与实现分离设计,将算法与数据结构解耦,实现了代码的高复用性与可维护性。其核心价值在于为动态数据管理提供了高性能、类型安全的解决方案,广泛应用于数据处理、缓存系统和业务逻辑编排等场景。本文聚焦ArrayList与HashMap这两个高频使用的实现类,深入剖析其动态数组扩容与哈希表冲突解决机制,并结合线程安全、迭代器快速失败等工程实践要点,为开发者提供从原理到选型的完整知识图谱。

weixin_30376083的博客 409

Java集合框架深度解析:从底层原理到高并发实战优化

在Java开发中,集合框架是处理数据存储与操作的核心组件,其底层基于数组、链表和红黑树等数据结构实现高效的元素管理。理解集合的设计原理对于编写高性能代码至关重要,例如通过合理的初始容量设置可以避免频繁扩容带来的性能损耗。在并发编程场景下,线程安全集合如ConcurrentHashMap采用分段锁和CAS机制,能够显著提升多线程环境下的吞吐量。本文聚焦于HashMap的扩容机制与ConcurrentHashMap的并发优化,探讨如何根据实际业务需求选择合适的集合类型,从而优化系统性能并规避常见的内存泄漏与死循

weixin_33722405的博客 359

深入解析Java集合框架:HashMap、TreeMap、HashSet、TreeSet底层原理与实战选型

在Java编程中,集合框架是存储和操作数据对象的核心容器库,其设计体现了性能与秩序的权衡。理解集合的底层实现原理,如哈希表与红黑树,是优化程序性能、避免内存泄漏和并发问题的关键。哈希表通过数组与链表/红黑树的组合实现O(1)平均时间复杂度的快速存取,而红黑树则提供了有序的O(log n)操作,支持范围查询。在实际工程中,集合的选择直接影响系统效率与稳定性。例如,HashMap的负载因子与扩容机制涉及空间与时间的平衡,不当使用可能导致内存溢出或性能退化;而TreeMap则适用于需要排序或范围查找的场景。本文聚

weixin_42527160的博客 222

Java基础面试题总结《三》

SPI全称是(服务提供者接口)。它是一种基于接口的动态扩展机制。简单来说,就是 Java 定义了一套标准接口,但具体的实现交给第三方(开发者或厂商)去完成。系统运行时,会自动发现并加载这些实现类,而不需要硬编码在代码里。目的:确保逻辑相等的对象拥有相同的哈希码,从而能被正确地存入和取出哈希集合。原则只要参与了哈希运算(作为 Key 或集合元素),就必须同时重写这两个方法。策略模式和观察者模式都属于行为型设计模式。

qq_55862497的博客 259

Java编程基础二

①SpringMVC是如何工作的。 Tomcat是一个servlet容器。我们在没有使用spring-mvc之前,就是使用servlet+jsp来开发web应用。由于Tomcat是一个web容器,每一个发送给Tomcat服务器的HTTP请求自然会被一个Java Servlet处理。所以,SpringMvc 必定有一个servlet,SpringWeb应用的入口必定是一个Servlet。spri...

lbh19630726的博客 266

Java面试高效通关:从八股文到场景题的实战体系构建

在软件工程领域,掌握核心原理与解决实际问题的能力是技术面试的关键考察点。理解Java内存模型、并发编程、JVM垃圾回收机制以及数据库索引与事务原理,是构建高性能、高可用系统的基础。这些技术通过保障数据一致性、提升系统吞吐量和降低响应延迟,在现代分布式架构中发挥着核心价值。无论是电商秒杀、实时通信还是大数据处理场景,扎实的原理知识都能帮助开发者进行有效的技术选型与架构设计。本文聚焦Java面试中的高频热词如ConcurrentHashMap和缓存穿透,通过剖析其底层机制与实战应用,帮助求职者建立从知识到能力的

dengkuituo0680的博客 436

Java核心知识体系全解析:从面向对象到JVM调优实战指南

面向对象编程是现代软件开发的基石,其核心思想通过封装、继承和多态等特性构建出模块化、可复用的代码结构。在Java语言中,这些特性通过JVM的底层机制得以实现,例如方法调用绑定与动态分派,为构建高内聚、低耦合的系统提供了技术支撑。理解这些原理对于编写高效、健壮的应用程序至关重要,尤其在处理复杂业务逻辑和设计模式时。在实际开发中,集合框架的选择与并发编程是决定系统性能的关键。例如,HashMap的扩容机制与ConcurrentHashMap的锁优化直接影响高并发场景下的吞吐量,而JVM的内存模型与垃圾回收策略则

weixin_30915951的博客 369

集合(2)

1、Set Set是不能包含相同元素的集合接口,向Set添加相同元素会失败,HashSet、TreeSet、EnumSet是Set接口的实现类。 HashSet根据元素的hash值来决定元素的存储位置,其元素类型可以不同,元素值也可以是null,它判断元素是否相等的依据是根据equals()和hashCode()都返回相等。 如果需要重写HashSet元素的equal...

milanleon的专栏 532
上一篇: Java深入理解 - 迭代器 Iterator 总结
下一篇: Oracle树形表和递归查询
zh_coder
博客等级 码龄12年 31粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值