句子的上下文: “简单地说,哈希表是一个数组的抽象,允许任何值用作索引。虽然数组要求索引是整数,但哈希表可以使用浮点值,字符串,另一个数组或者甚至是作为索引的结构。这个索引被称为键,并且该索引处的数组元素的内容被称为值。因此哈希表是存储键/值对的数据结构,可以快速搜索通过钥匙..“
句子我需要解释:
“为了达到这个魔力,哈希表使用一个辅助函数将任何对象转换为适合下标数组的整数索引。”
^这在外行人的意义上是什么意思?积分指数?下标?请解释我知道我对哈希表的工作原理没有任何了解,目前正试图理解它们。
谢谢!
答案 0 :(得分:4)
哈希表使用辅助函数
这是在谈论hashCode()
功能。 Java中的每个Object都有这个功能。
将任何对象转换为整数索引
hashCode()
函数根据对象中的值返回一个整数。例如,String
的哈希码基于String
中的字符。
适合下标数组。
然后可以将该整数用作数组的索引。
这是HashMap
或Hashtable
如何在幕后工作的基础知识。您通常不必担心这些细节,但在某些时候,大多数计算机科学专业的学生都需要阅读这些内容。
答案 1 :(得分:2)
让我们尝试用一个例子来理解它 -
假设我需要一个hashtable
,可以将<Key,Value>
对存储为<DeptName,DeptObj>
。
所以,首先我插入一对"Science"
(字符串键),Dept("Science")
(某些dept对象)。
现在要存储此dept
对象程序,必须计算index
的{{1}},以便此对象可以存储在array
。它应用了一种称为index
的方法,它将密钥(在我们的例子中为hashcode()
)转换为基于其内容的整数。假设Science
的{{1}}为1234。
因此,hashcode
将存储在索引1234的数组中。
现在,如果我想要插入另一个元素"Science"
,它将计算Dept("Science")
English,Dept("English")
(假设为2345)并将hashcode
存储在该位置(索引)。
现在,如果我们这样做,我们将需要一个巨大的阵列(这将是非常稀疏的,这在实践中是无法实现的。
因此,在实际中使用"English"
函数。
因此,当Dept("English")
解析为1234时,它除以16,导致模数为2(这是Modulus
将被存储的实际索引,同样适用于"Science"
。
因此,简而言之Dept("Science")
应用于将其转换为整数的键,然后采用模数将其滚动到所需的边界(这也会导致碰撞)。
答案 2 :(得分:0)
它表示可以将任何Object的哈希表键转换为可用作数组索引的整数。数组项是与键
关联的值示例:
Map<String, String> m = new HashMap<>();
m.put("name", "Sharon");
场景背后的做法是“name”被神奇地翻译成一个整数(例如10),而“Sharon”被放入第10个索引的String []数组中 翻译需要的另一个关键是产生不同的索引