Java的String类的hashCode方法是在恒定时间还是线性时间内计算的?使用的算法是什么?
答案 0 :(得分:9)
文档告诉你函数:
s [0] * 31 ^(n-1)+ s [1] * 31 ^(n-2)+ ... + s [n-1]
使用线性时间传递计算一次,然后缓存,以便将来只检索O(1)。
答案 1 :(得分:1)
根据docs
public int hashCode()
返回此字符串的哈希码。 String对象的哈希码计算为
s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
如您所见,时间复杂度为O(n),其中n是字符串中的字符数。一次通过后,它被缓存,因此时间复杂度实际上是O(1)。
答案 2 :(得分:0)
Object::hashCode
方法的时间复杂度为O(1),因为它与对象数据没有任何交互。它是一种本地方法,用C语言编写。返回的整数值可能是经过一些修改(按位运算)的堆内存地址,因为内存中的每个地址都表示唯一值。
例如,将以十六进制格式表示从0x00000000
到0xffffffff
范围的4GB内存地址,并且每个值都是唯一的。因此,Java不需要额外的计算来确保这些值的唯一性。因此hashCode
给出了恒定的时间复杂度。