项目里一堆if ContainsKey,这不是经典面试题吗

Java中Map接口containsKey方法详解与实战 Java集合框架中的Map接口提供了方法,用于判断指定的键是否存在于当前的Map对象中。其方法原型如下:参数说明key:要检查是否存在的键对象。该参数可以为null,具体是否允许null键取决于具体的Map实现类(如HashMap允许null键,而TreeMap不允许null键)。该方法的作用是通过比较传入的键对象与Map中已有的键对象是否相等,来判断目标键是否存在。其内部机制依赖于键对象的equals()方法和hashCode() 阅读详情

虽然大部分情况下这不会成为性能瓶颈,但是无论性能还是可读性,TryGetValue都比ContainsKey+dic[key]要更好,最近在项目里发现了一堆ContainsKey+dic[key]。但2026年了,这应该成为肌肉记忆了。于是写了一篇性能测试加强一下记忆。

Unity测试代码

    public class DictionaryPerformanceTests
    {
        private const int DictionarySize = 1000;
        private const int IterationsPerMeasurement = 1000;

        private Dictionary<int, int> _dictionary;

        [SetUp]
        public void Setup()
        {
            _dictionary = new Dictionary<int, int>(DictionarySize);
            for (var i = 0; i < DictionarySize; i++)
            {
                _dictionary.Add(i, i);
            }
        }

        // 用成员变量做"黑洞",防止编译器/JIT 把读取优化掉导致测量失真
        private int _blackhole;

        [Test, Performance]
        public void Dictionary_TryGetValue()
        {
            Measure.Method(() =>
            {
                for (var i = 0; i < DictionarySize; i++)
                {
                    if (_dictionary.TryGetValue(i, out var value))
                        _blackhole = value;
                }
            })
            .SampleGroup("TryGetValue")
            .WarmupCount(10)
            .MeasurementCount(100)
            .IterationsPerMeasurement(IterationsPerMeasurement)
            .GC()
            .Run();
        }

        [Test, Performance]
        public void Dictionary_ContainsKey_GetItem()
        {
            Measure.Method(() =>
            {
                for (var i = 0; i < DictionarySize; i++)
                {
                    if (_dictionary.ContainsKey(i))
                        _blackhole = _dictionary[i];
                }
            })
            .SampleGroup("ContainsKey + this[key]")
            .WarmupCount(10)
            .MeasurementCount(100)
            .IterationsPerMeasurement(IterationsPerMeasurement)
            .GC()
            .Run();
        }
    }

Unity测结果

TryGetValue in Milliseconds
Min: 45.14 ms
Median: 46.94 ms
Max: 63.18 ms
Avg: 47.64 ms
StdDev: 2.64 ms
SampleCount: 100
Sum: 4763.97 ms

ContainsKey + this[key] in Milliseconds
Min: 84.95 ms
Median: 86.77 ms
Max: 97.57 ms
Avg: 87.75 ms
StdDev: 2.85 ms
SampleCount: 100
Sum: 8774.52 ms

.Net测试代码

    public class TryGetValueContext
    {
        private Dictionary<int, int> _dictionary = null!;
        private readonly Consumer _consumer = new Consumer(); // 防优化"黑洞"

        [Params(1000)]
        public int Size;

        [GlobalSetup]
        public void Setup()
        {
            _dictionary = new Dictionary<int, int>(Size);
            for (var i = 0; i < Size; i++)
                _dictionary.Add(i, i);
        }

        // 方式1:TryGetValue —— 一次哈希查找
        [Benchmark(Baseline = true)]
        public void TryGetValue_Hit()
        {
            var consumer = _consumer;
            var dict = _dictionary;
            for (var i = 0; i < Size; i++)
            {
                if (dict.TryGetValue(i, out var value))
                    consumer.Consume(value);
            }
        }

        // 方式2:ContainsKey + 索引器 —— 两次哈希查找
        [Benchmark]
        public void ContainsKey_Indexer_Hit()
        {
            var consumer = _consumer;
            var dict = _dictionary;
            for (var i = 0; i < Size; i++)
            {
                if (dict.ContainsKey(i))
                {
                    var value = dict[i];
                    consumer.Consume(value);
                }
            }
        }

        // 方式3:直接索引器(key 必然存在,不判断)
        [Benchmark]
        public void Indexer_Direct()
        {
            var consumer = _consumer;
            var dict = _dictionary;
            for (var i = 0; i < Size; i++)
                consumer.Consume(dict[i]);
        }

        // 方式4:TryGetValue miss(key 不存在)—— 对照组
        [Benchmark]
        public void TryGetValue_Miss()
        {
            var consumer = _consumer;
            var dict = _dictionary;
            for (var i = 0; i < Size; i++)
            {
                if (dict.TryGetValue(i + Size, out var value)) // 全部 miss
                    consumer.Consume(value);
            }
        }

        // 方式5:ContainsKey + Indexer miss —— 说明 miss 时两者差别不大
        [Benchmark]
        public void ContainsKey_Indexer_Miss()
        {
            var dict = _dictionary;
            var count = 0;
            for (var i = 0; i < Size; i++)
            {
                if (dict.ContainsKey(i + Size))
                    count += dict[i + Size];
            }
            _consumer.Consume(count);
        }
    }

.NET测试结果

MethodSizeMeanErrorStdDevRatioRatioSD
TryGetValue_Hit10004.350 us0.0519 us0.0486 us1.000.00
ContainsKey_Indexer_Hit10008.103 us0.0715 us0.0669 us1.860.03
Indexer_Direct10003.838 us0.0283 us0.0264 us0.880.01
TryGetValue_Miss10003.347 us0.0267 us0.0250 us0.770.01
ContainsKey_Indexer_Miss10003.327 us0.0203 us0.0190 us0.760.01

结论

和理论一样, 无论是Unity还是.Net都几乎是翻倍的差距

NumPy包(下) python笔记扩展 nditer 是 NumPy 中的一个强大的迭代器对象,用于高效地遍历多维数组。nditer 提供了多种选项和控制参数,使得数组的迭代更加灵活和高效。nditer 提供了多种控制参数,用于控制迭代的行为。1.order 参数order 参数用于指定数组的遍历顺序。默认情况下,nditer 按照 C 风格(行优先)遍历数组。# 创建一个二维数组​# 使用 C 风格遍历数组print(x)# 输出:# 1# 2# 3# 4# 5# 6​# 使用 Fortran 风格遍历数组。 阅读详情

相关推荐

LIS3DHTR三轴加速度计Arduino驱动与嵌入式集成指南

加速度计是嵌入式系统中实现运动感知、姿态解算和振动分析的核心传感器。其工作原理基于MEMS微机械结构在惯性力作用下的电容变化,经片内ADC转换为数字信号;I²C接口因其硬件资源占用少、布线简洁,成为低功耗物联网节点的主流通信方式。技术价值体现在高分辨率(12位)、多量程(±2g~±16g)与低功耗(待机电流仅2µA)的平衡,支撑电池供电设备长期运行。典型应用场景包括可穿戴设备的姿态识别、工业预测性维护中的振动监测,以及智能硬件的敲击/跌落检测。本文围绕LIS3DHTR芯片及其Grove模块,详解Arduin

weixin_42584758的博客 594

HashMap的containsKey方法底层详解

containsKey方法简介 用 containsKey(key) 方法来检查 key 是否存在, 源码分析 /** * 检查是否包含key * 如果key有对应的节点对象,则返回ture,不关心节点对象的值是否为空 */ public boolean containsKey(Object key) { // 调用getNode方法来获取键值对,如果没有找到返回fals...

Future_LL的博客 1万+

内存优化--LOGBACK导致内存告警

一.故事背景 由于开辟新市场需要,开发了新的项部署在海外平台,其中最消耗内存的功能是消费kafka消息(最开始预计一天有1千万的量),部署完之后运行一段时间发现出现内存告警问题。 二.分析问题 出现内存告警,(新项目是低配置机器 2C4G * 2台)第一个念头是去查看堆空间设置的情况,看到jvm启动命令中堆空间都是直接指定大小,说明问题不是出在堆空间 -Xmx3g -Xms3g 先不管这些,去查看总的内存使用情况,发现总的内存空间使用将近有92% = 3.68G,那么这多出来使用的0.6

qq_33199919的博客 6051

map的containsKey方法

map是一个key和value的键值对集合。 map中的containKey(key)方法是判断该key在map中是否有key存在。如果存在则返回true,反之,返回false。 程序实例: 判断数组中是否有1,有的话就返回1和1所在的位置。 我采用的是hashmap,在哈希表中进行添加,删除,查找等操作,性能十分之高,不考虑哈希冲突的情况下,仅需一次定位即可完成,时间复杂度为O(1),时间消耗是很少的。 package TT04; import java.util.Has...

qq_43238335的博客 1万+

虚幻引擎5 AR开发教程02:构建和测试AR Android App

在本教程中,我们将学习如何在虚幻引擎 5 上构建和测试 AR 安卓应用。

mopanchun的博客 2650

KEGG两类报错--①No gene can be mapped--②URL ‘https://rest.kegg.jp/link/hsa/pathway‘…

版本问题,重新安装一下clusterProfiler包。网络问题,可以等待之后再试一下(试过不是)(以上可以排除基因不存在的错误因素)

weixin_57699783的博客 2万+

json之containsKey

1 json中有一个函数是用于判断属性是否存在的。如果存在则返回true,如果不存在则返回false。该方法就是containsKey方法 如:JSONObject json=new JSONObject(); json.element("name",name); json.element("password",password); String name_=""; String

xclsky的博客 2万+

Qt5.12.12安卓开发环境搭建:Windows下避开SDK版本坑的保姆级教程

本文提供Qt5.12.12在Windows下搭建Android开发环境的详细教程,重点解决SDK版本兼容性问题,特别是cmdline-tools与JDK8的匹配陷阱。通过精准选择组件版本、手动配置路径和修复常见错误,帮助开发者高效完成环境配置,适用于Qt跨平台移动开发。

weixin_33737774的博客 542

HashMap之containsKey

HashMap之containsKey 前提: jdk1.8之前HashMap的存储方式:链表+hash jdk1.8以后中HashMap的存储方式:链表+hash+红黑树算法 业务逻辑整理 1,map不能为空,且hash对应的下标要存在。否则返回null 2,取下标对应的对象,如果该对象的key与入参key一致,则返回该对象 3,否则,获取下一个对象,如果该对象为空,返回null 4,如果当前对象是树结构,则调用getTreeNode,获取是否存在 5,如果不是树结构,循环对象,如果存在对象的key

Frank-Fu 2811

Power Automate实战:用SharePoint REST API批量处理列表数据(附JSON解析技巧)

本文深入探讨了如何利用Power Automate调用SharePoint REST API实现列表数据的批量自动化处理。文章详细解析了API的协同工作原理、高效的数据获取与筛选技巧,并重点分享了JSON数据解析的核心难点与实战解决方案,旨在帮助企业用户构建稳定可靠的数据处理流程,提升运营效率。

coffee的博客 769

01、【solidworks】windosws正在配置solidworks问题及注册表未卸载干净问题解决

windosws正在配置solidworks问题及注册表未卸载干净问题解决

qq_740388770的博客 2万+

Java中containsKey()方法

containsKey方法——判断是否包含指定的键名 在HashMap中经常用到containsKey()来判断键(key)是否存在。 HashMap中允许值对象(value)为null,并且没有个数限制,所以当get()方法的返回值为null时,可能有两种情况:一种是在HashMap中没有该键对象,另一种是该键对象没有映射任何值对象,即值对象为null。因此,在HashMap中不应该利用get()方法来判断是否存在某个键,而应该利用containsKey()方法来判断。 例如: HashMap&l

柠檬鱼的博客 2万+

一文让你轻松理解802.11ax RU的概念

RU

1042484520@qq.com(邮箱) 3365

Java Hashtable containsKey()方法与示例

哈希表类containsKey()方法 (Hashtable Class containsKey() method) containsKey() method is available in java.util package. containsKey()方法在java.util包中可用。 containsKey() method is used to check whether the giv...

cumtv80668的专栏 4208

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Oracle里面containskey,containskey(containskey方法)

这个方法是描述得到的字符串是否包含某个字符串,例a.contains("123"),就是a里面是否包含123,包含为true,否则为false直接上API containsKeyboolean containsKey(Object key)如果此映射包含指定键的映射关系,则返回 true。更正式地说,当且仅当此映射包含键 k 的以下映射关系时才返回 .hashmap得containskey相比而言...

weixin_39607240的博客 718

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

C#基础 Dictionary ContainsKey 指定键是否已经存在

 .NET Framework : 4.7.2        IDE : Visual Studio Community 2019         OS : Windows 10 x64     typesetting : Markdown         blog : blog.youkuaiyun.com/yushaopu        gi...

心少朴 1万+

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

对账差了 2000 条:ConcurrentHashMap 的 containsKey+put 不是原子操作

title: 对账差了 2000 条:ConcurrentHashMap 的 containsKey+put 不是原子操作 tags: Java, 并发编程, 源码分析, 后端 引子 ConcurrentHashMap(CHM)是并发场景的标配,几乎人人都知道「它线程安全,可以随便并发读写」。但「线程安全」指的是单个方法的原子性,不是「多个方法组合」的原子性。把 containsKey 和 put 拼在一起当「不存在才写入」用,等于亲手造了一个竞态——而且它不会抛异常,只是让你的数据悄悄少了一截。 我们一

weixin_39042870的博客 154

map containsKey与get方法区别

get(Object key) 返回与指定键关联的值; containsKey(Object key) 如果Map包含指定键的隐射,则返回true;

Developer of XingKong22star 1万+

containsKey方法

之前一直在用 Set&lt;String&gt; names=map.keySet(); 去查找name 去循环HashMap 里面的set 很麻烦 containsKey去判断你的值是否存在就好Map集合允许值对象为null,并且没有个数限制,所以当get()方法的返回值为null时,可能有两种情况,一种是在集合中没有该键对象,另一种是该键对象没有映射任何值对象,即值对象为null。因此,在Ma...

LiuY521的博客 4万+

map之containsKey方法

1 map是一个key和value的键值对的集合。有key和value键值对,就会有判断是否有key。这方法就是containsKey方法。 如:if(map.containsKey("name")){ value=map.get("name").toString(); System.out.println("找到了name的值:"+value); } map中的contains

xclsky的博客 7万+

Java集合Map之containsKey方法

参数key: 需要检查是否存在于Map中的键。返回值如果Map包含指定的键,则返回true。否则,返回false。示例// 创建一个HashMap// 向map中添加一些键值对// 检查是否包含某个键} else {// 检查另一个键} else {在这个例子中,我们首先创建了一个HashMap的实例ageOfFriends,并向其中添加了一些朋友的姓名和年龄。

weixin_43347149的博客 1222

java中Contain和Containskey两个方法的区别及作用

**### Contains()和ContainsKey()使用及区别 Contains() 用法:一个字符串中是否包含另外一个字符串 public static void main(String[] args) { String str1="abcdefg"; String str2="def"; boolean res = str1.contains(str2); if (res){ System.out.println("包括"); }else

Mis_wyl的博客 5376

contains与containsKey

contains为判断String类型是否包含字符串 /** * Returns true if and only if this string contains the specified * sequence of char values. * * @param s the sequence to search for * @return true if this strin...

疯批美人 1279

java中containsKey方法

containsKey方法 下面展示一些 内联代码片。 // 判断map中是否有key if(!map.containKey(key)){ map.put(key,1)//没有则把key存入map中 }; map中的containsKey(Key)方法是判断该key在map中是否有key存在。

qq_36839438的博客 8368

原码 containsKey()方法学习

查看IDEA中的原码 读源码 学习containsKey() 方法原码: //map.containsKey(Object key) 方法判断一个map中是否存在与key 相等的值如果存在返回true, public boolean containsKey(Object key) { //布尔类型, return getNode(hash(key), key) != null;...

560

C# Dictionary, ContainsKey

C#中Dictionary的用法及用途 https://www.cnblogs.com/fire909090/p/8207239.html 怎么判断Dictionary中,指定的Key已存在 if(dict.ContainsKey(T key)) { //已存在key }

Angel Devil 5206
上一篇: Unity Editor实现一个比AssetDatabase.FindAssets内存和CPU都更友好的替代方案
下一篇: 用struct替代class后,内存占用竟然更大了
ZZHSourceCode
博客等级 码龄9年 8粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值