ruby中Hash的默认值小陷阱

Java面试 - String和Integer对象 == 和 equals比较 问题汇总 == 和equals() == 它的作用是判断两个对象的地址是不是相等,即判断两个对象是不是同一个对象 基本数据类型比较的是值,引用数据类型比较的是地址 equals() 是判断两个对象是否相等,如果没有重写equals() 方法,就和两个等号的意思是一样的 为什么要有hashcode? 为了减少equals()的比较次数,只要当hashcode相同的时候才会进行equals()的比较,极大提高了效率 为什么重写了equals()后就要重写hashcode方法 如果不重写hashcode方法的话,两个 阅读详情

ruby中Hash可以提供一个默认值,我们可以使用new(object)和default=的这两种方式来设置ruby的默认值。但是有另外一种情况没有提到过,但是也能够修改默认值的方式。

代码如下:

class Kiwi
	def initialize(val)
		@val = val
	end

	def increase
		@val += 1
	end
end


hash = Hash.new(Kiwi.new(0))
hash[:x]   #=> <Kiwi:0x0000000099bfb0 @val=0>
hash[:y].increase
hash[:x]  #=> <Kiwi:0x0000000099bfb0 @val=1>

可以看出,当第一次调用hash[:x]的时候,因为:x不存在,返回的是默认值为1的Kiwi。但是当我们调用了hash[:y]的时候,因为:y也不存在,所以hash[:y]得到的也是default,但需要注意的是,default不是一个值对象,当我们调用hash[:y].increase的时候,相当于调用了deafult.increase。所以当再次调用hash[:x]的时候,得到的deafult的对象仍然是原来的对象(0x0000000099bfb0),但是@val已经由0变成1。

叫做小陷阱的原因是,如果没有对某个缺失的key赋值,那么永远得到的都是default对象,而如果对这个返回的deafult对象进行操作,将会下一次返回default对象的值的预期。



JAVA- 浅谈==与equal()的区别 目录 >基础 >基本数据类型 >引用数据类型 >Java内存 >区别==和equals() >== >equals() >总结 >基础 要想区分这两者,我们得先明白什么是基本数据类型和引用数据类型,以及Jav的内存构成 >基本数据类型 这八种数据变量中直接存储值。 >引用数据类型 引用数据类型非常多,大致包括: 类、 接口类型、 数组类型、 枚举类型、 注解类型、 字符串型 例如,String类型就是引用类. 阅读详情

相关推荐

Java中==与equals的区别及正确使用场景

在Java编程中,对象比较是基础但容易出错的操作。==操作符比较基本数据类型的值或引用类型的内存地址,而equals()方法用于比较对象的内容。理解二者的本质区别对编写健壮代码至关重要,特别是在处理字符串比较、集合操作等场景时。本文通过实际案例剖析==和equals()的底层原理,解释为何在HashMap等集合中使用时必须同时重写equals和hashCode方法,并给出枚举比较、数组比较等特殊场景的最佳实践。掌握这些知识能有效避免生产环境中的逻辑错误和安全漏洞,提升代码质量。

weixin_34405557的博客 270

[Ruby] Ruby 的hash默认值

在Ruby中的Hash是一种数据结构,具有在 key=>value 的时尚价值。key常常用 symbol来表示,这样可以加速键查找的过程。 Hash类提供了许多有用的方法,其中一些来自Enumerable module。我们不会记住这个类的所有方法,但是Hash类有一个很重要的方法 :default() Ruby 基本的Hash表示方法: people = Hash.new peo

Xunzi229的博客 2128

Java对象比较:==、equals()与hashCode()详解

在Java编程中,对象比较是基础但容易出错的操作。==操作符比较基本类型的值或引用类型的内存地址,而equals()方法用于逻辑相等性判断,需要遵循自反性、对称性等五大原则。hashCode()则为哈希表提供高效查找支持,必须与equals()保持逻辑一致。理解这些概念对正确使用HashMap、HashSet等集合类至关重要。本文通过实际代码示例,解析字符串常量池等特殊场景,并给出重写equals和hashCode的标准模板与常见陷阱,帮助开发者避免对象比较中的典型错误。

weixin_33863087的博客 365

Ruby Hash的常用函数

1、Hash表的生成 使用第一种形式时,参数的个数必须是偶数.(奇数位参数是索引,偶数位参数是元素值). 使用第二种形式(将一个哈希表对象指定给参数)时, 将生成并返回一个与指定哈希表相 同的全新的哈希表.(生成的哈希表的默认值为nil.).   a)      由[索引, 值, ...] 型的数组变为哈希表 ary = [1,"a", 2,"b",3,"c"] p Hash[*ar

dazhi_100的专栏 3970

面试官:new Integer(“127“)和Integer.valueOf(“128“)有什么区别

或自动装箱,以便在可能的情况下利用缓存优化。虽然了解这些细节很重要,但在日常编程中,我们应该专注于编写清晰、正确的代码,而不是过度依赖于这些底层优化。这个问题触及了 Java 中整数缓存机制的一个微妙之处。在实际应用中,除非特别需要新对象,否则推荐使用。或自动装箱,通常就足以编写高效且可靠的代码.在 Java 面试中,经常会遇到关于。对象创建和缓存机制的问题。进行值比较,以及优先使用。

2401_85373732的博客 1194

从零开始学Java之Integer底层原理探究

如果你可以把我总结的这4点都能回答好,就这一个问题,面试官就会对你留下深刻的影响,他就会认为你的基础知识足够扎实,因为大多数人只会回答int和Integer的基本区别,很少有人去回答底层的内容!而new Integer()生成的变量,则指向的是堆中新建的对象,两者在内存中的地址是不同的。所以,给Integer i赋值的大小不同,比较的结果也可能会不同。之前讲过的final知识点。从该实验中可以看出,==比较时,较小的两个相同的Integer会返回true,较大的两个相同的Integer会返回false。

千锋教育 962

ruby 生成哈希值_Ruby哈希值和可变的默认值

ruby 生成哈希值Ruby’s Hash object is an associative data structure used to store key-value pairs. Many languages have objects that serve a similar purpose: Python has dictionaries, JavaScript has Maps, Jav...

weixin_26711867的博客 336

Java Integer 128陷阱:==为何返回false?缓存边界与正确比较方式

在Java开发中,包装类型的比较是高频操作,但稍不注意就会踩中隐藏的坑。例如,使用==比较两个Integer对象时,结果并非总是由数值决定,而是取决于对象引用是否相同。这背后涉及自动装箱机制与IntegerCache缓存:默认缓存范围为-128到127,超出此范围的整数会创建新对象,导致128==128返回false。理解这一原理,不仅能规避线上判断逻辑失效的风险,还能在代码评审时快速识别隐患。文章从源码、字节码和实验多角度拆解,并延伸到Long、Character等包装类的同类问题,给出统一的工程规范:包

weixin_31528001的博客 234

ruby hash 默认值的问题

参考:http://stackoverflow.com/questions/16159370/ruby-hash-default-value-behavior 使用ruby hash 默认值为空数组,向key 对应的value 追加值然后去get一个不存在的key 时候发现value为 一个非空的arry,不是默认值[] 具体使用示例如下: 1 One default Arr...

~ 186

包装类Integer的equal方法与“==”运算符 比较

包装类Integer的equal方法与“==”运算符 比较 一、在讲述之前先扔出一段代码看看 public static void main(String[] args) { Integer num1=15; Integer num2=15; boolean equals = num1.equals(num2); boolean b = num1 == num2; System.out.println("使用equal方法"

weixin_43887184的博客 568

Java比较运算符核心解析:从==与equals到浮点数精度的完整避坑指南

在Java编程入门与工程实践中,比较运算符是构建程序逻辑分支的基础工具,也是许多新手频繁踩坑的难点。理解关系运算的底层执行流程、布尔条件的正确组合方式,是掌握Java核心语法的关键一步。其中,基础数据类型与引用类型在比较时的本质差异,尤其是==与equals的区别,直接影响字符串对象、包装类对象等场景下的判断结果。此外,浮点数在二进制存储中的精度损失带来了额外的比较陷阱,需借助误差范围或BigDecimal等机制保证正确性。而Integer等包装类的缓存机制进一步增加了比较的迷惑性,遵循统一的比较规范有助于

weixin_42116058的博客 300

Java equals与hashCode契约:对象身份识别的底层原理与工程实践

在Java中,equals()和hashCode()共同构成对象身份识别的核心契约,其本质是支撑哈希表结构(如HashMap、HashSet)高效运行的数学基础——前者定义业务语义上的等价关系(满足自反性、对称性、传递性),后者提供稳定、均匀分布的整型索引。该机制直接决定缓存命中率、集合去重准确性及分布式Key一致性等关键工程指标。深入理解其与JVM对象头存储、字节码虚方法调用及哈希碰撞处理的协同逻辑,能有效规避线上因重写失配导致的静默故障。本文结合OpenJDK实现、HotSpot内存布局与真实生产案例,

weixin_30521161的博客 369

Java常见面试题— equals 和 == 的区别是什么?

关于== 对于基本类型和引用类型 == 的作用效果是不同的,如下所示: 基本类型:比较的是值是否相同; 引用类型:比较的是引用是否相同; 代码示例: 代码解读:因为 x 和 y 指向的是同一个引用,所以 == 也是 true,而 new String()方法则重写开辟了内存空间,所以 == 结果为 false,而 equals 比较的一直是值,所以结果都为 true。 关于equals equals 本质上就是 ==,只不过 String 和 Integer 等重写了 equals 方法,把它变成了值比较

阿志同学 571

Integer.parseInt(String s, int radix)和Integer.valueOf(String s, int radix)对比分析

背景 之前在code review 的时候,发现有同学直接使用“==”判断两个Integer是否相等,这有问题吗?相信大家对这个都有自己对看法。另外今早上在地铁上听到有人说Integer.parseInt(String s, int radix)返回是int类型,其中radix取值范围是2~36,s长度不能超过7,这种说法对吗?故写此文章来发表自己看法 Integer.parseInt和Inte...

jerry_player的博客 1750

int与Integer的区别:从自动装箱到缓存池,拆解Java类型设计的核心逻辑

Java开发中,基本类型int与包装类型Integer的选择不仅是语法问题,更与JVM内存布局、泛型机制和代码安全密切相关。int直接存储数值,占用4字节;Integer作为对象,需要额外对象头开销并可能为null。当发生自动装箱拆箱时,Integer.valueOf会触发默认-128到127的缓存池优化,这导致“==”比较在不同范围内的结果截然不同。若忽视拆箱时的null判断,很容易在POJO映射、集合取值或三元表达式等日常场景中引发空指针异常。从类型系统设计到工程实践,深入理解两者差异,既能规避隐蔽故障

weixin_33391446的博客 336

【Java】从源码角度分析128陷阱

128 陷阱” 的原因:当整数值超过了 -128 到 127 范围时,两个不同的整数值被装箱后得到的 Integer 对象不再是同一个缓存对象,因此在使用 == 运算符比较时,会返回 false。而在范围内的整数值会从缓存池中获取,因此它们引用的是同一个缓存对象,使用 == 运算符比较时会返回 true。

TechnicalXiaobai的博客 975

Java int与Integer核心解析:自动装箱、IntegerCache缓存与面试避坑

Java中int与Integer分别代表基本类型和引用类型,是日常开发中最基础也最容易被问倒的一对概念。要理解两者的区别,核心在于自动装箱与拆箱原理:Integer i = 100 在编译期会调用 Integer.valueOf(),int n = i 则会调用 intValue()。而 valueOf() 内部存在IntegerCache缓存,-128到127之间的数值复用同一批对象,这也造成了用 == 比较Integer时“同值不同结果”的经典现象。在工程实践中,这个机制直接决定了POJO字段是选int

weixin_29560063的博客 237

2023东华大学机试OJ进阶版1-81题

先排序。每次找两个最小的数,把其中一个置为两数之和,并累加这个和值,另一个数置为-1,然后再排序,重复操作,直到只剩下一个数。105。

m0_49263811的博客 2794
上一篇: ruby中Hash的自定义key
下一篇: Silverlight中使用DomainDataSource模拟Duplex通信
kiwi小白
博客等级 码龄14年 153粉丝 154原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值