我使用Ruby 2.2.2。
irb(main):002:0> str = "abc"
=> "abc"
irb(main):003:0> str2 = "abc"
=> "abc"
irb(main):004:0> str.hash
=> -340360941
irb(main):005:0> str2.hash
=> -340360941
irb(main):006:0> str.object_id
=> 3702564
irb(main):007:0> str2.object_id
=> 24864312
irb(main):009:0> str == str2
=> true
irb(main):010:0> str.eql? str2
=> true
为什么str
和str2
具有相同的哈希值,但object_id
不同?根据文档hash和object_id,没有两个活动对象会共享ID,因此str
和str2
具有不同的object_id
,但如何理解他们的{ {1}}是一样的吗?
有人能说些什么吗?我的猜测是hash
只占用一个内存空间,而"abc"
和str
都引用了相同的内存空间。
如果有人能够解释内存的分配方式,那就太棒了。
答案 0 :(得分:2)
我的猜测是“abc”只占用一个内存空间,而
str
和str2
都引用了相同的内存空间。
这是否属实,他们的object_id
是一样的。该字符串创建两次,str
实例与str2
实例无关。否则,str[1] = "A"
导致两个变量都发生变化,将str2
的值转换为aAc
。
当对象的值相等时,它们的哈希值应相等,以便快速查找/搜索等。
E.g。来自俄亥俄州的约翰史密斯和来自俄克拉荷马州的约翰史密斯有着相同的名字,是什么让他们的hash
相等,但由于他们肯定不是同一个人,他们的object_id
不同。