为什么这段代码会给出负代码?
import java.util.HashSet;
import java.util.Set;
public class Ab {
/**
* @param args
*/
public static void main(String[] args) {
String s1="Operations on a dynamic set can be grouped into two categories queries, which simply return information about the set, and modifying operations, which change the set. Here is a list of typical operations. Any specific application will usually require only a few of these to be implemented Some dynamic sets presuppose that the keys are drawn from a totally ordere, such as the real numbers, or the set of all words under the usual alphabetic ordering. A total ordering allows us to define the minimum element of the set, for example, or to speak of the next element larger than a given element in a set.Operations on dynamic sets Operations on a dynamic set can be grouped into two categories: q";
System.out.println(s1.hashCode());
String s2="abc";
System.out.println(s2.hashCode());
}
}
答案 0 :(得分:3)
String类重写hashCode()
以产生确定性结果。结果与内存地址无关。 String.hashCode() Javadoc显示用于计算它的公式:
String对象的哈希码计算为 s [0] * 31 ^(n-1)+ s 1 * 31 ^(n-2)+ ... + s [n-1]
使用int算术,其中s [i]是字符串的第i个字符,n是字符串的长度,^表示取幂。 (空字符串的哈希值为零。)
请注意,即使是相对较短的字符串,对于整数,该值也可能过大。在计算期间,每当发生溢出时,仅保留最低有效32位。 在计算结束时,如果设置了结果整数的最高有效位,则整数为负,如果不是则为正。
答案 1 :(得分:0)
简单地说,hashcode是一个用于将可变长度数据映射到固定长度的哈希函数返回的数字。
您可以在此处找到有关哈希码的详细信息 http://www.thejavageek.com/2013/06/27/what-are-hashcodes/
并且对于java编程中的hashcode,请参阅以下链接
http://www.thejavageek.com/2013/06/28/significance-of-equals-and-hashcode/
答案 2 :(得分:0)
我已经多次搜索并且对这个问题感到困惑,哈希码是内存表示的十六进制代码,我知道内存地址总是正数然后它意味着哈希码只是对象内容的代码然后jvm存储?? < / p>
那不是完全正确。情况是Object.hashCode
的默认实现返回接收对象的内存地址的表示。但是,许多类都会覆盖默认实现,String
就是其中之一。 Object.hashCode
的{{1}}覆盖不是身份哈希码,而是值哈希码。因此,不表示接收对象的内存地址,而是String
的值的表示。
当然,即使将内存地址转换为哈希代码(对于String
的默认实现)也可能产生负哈希码,显然的情况是覆盖Object.hashCode
的定义可能会产生负哈希码。
事实上,这个简单的哈希码很糟糕,但是100%合法:
Object.hashCode
也就是说,它与@Override
public int hashCode() { return -42; }
的“合约”一致。