为什么数组没有实现为具有数字键的哈希?

时间:2014-02-20 19:24:51

标签: ruby-on-rails arrays hash

在缺席十多年后重新回到开发阶段,我正在快速掌握最新的Web开发技术。阅读this帖子我看到我已经理解了哈希和数组之间的区别。

但是,这是不是意味着数组只是一种使用数字键的哈希?由于没有理由相信数组的实现会自动维护数组索引的顺序性(例如,当您删除或插入项时),是否与数组的固有排序有更大的区别?

我的意思是,要遍历一个数组,你需要设置一个循环遍历索引,就像循环哈希键的循环一样,然后你可以命令数字哈希键集行为相同(即访问项目从1到最后一个数字,该数字是数字序列中散列的关键字)。要访问数组元素,请使用所需值的索引,与从散列中提供数字键相同。

我在学习Ruby on Rails中的数组和哈希时遇到了这个问题,但这是一个普遍的问题。

2 个答案:

答案 0 :(得分:0)

Hash本质上是一个数组。散列键具有某种类型的转换函数,用于将另一种类型的对象(或一组其他值)转换为数组的整数索引。相反,数组是一种哈希,它不会将键转换为单独的索引类型或值。但是,将数组调用为Hash意味着不存在额外的功能层,因为没有密钥转换。

根据定义,数组的对象存储在内存中的连续位置,可通过索引访问。

即使可以使用任何类型的数据结构,使用带有整数键的散列的一个好处是可以将较大的整数扩展存储在较少数量的桶中。例如,如果您的数字键是1,10,100,1000和10000附近的5个整数,则不需要10K桶来获得这5个元素的哈希,但如果使用直接数组,则需要很多。随着哈希的增长,散列函数往往会被重新计算并重新分配更多的内存,使用数组的好处是它的大小可以更容易控制并且可以保持固定。

答案 1 :(得分:0)

这是声明性编程如何定义它。
Difference between Declarative and Procedural Programming?
http://en.wikipedia.org/wiki/Procedural_programming
http://en.wikipedia.org/wiki/Declarative_programming

有原始,复合和抽象的数据结构。
  - 数组是复合的。
  - 哈希是抽象的。

我们两者都有,因为它们根本不同。 例如,你不能像使用数组一样将原语弹出/推送到哈希,因为哈希使用无序键值而数组有索引。

http://en.m.wikipedia.org/wiki/List_of_data_structures