关于hashCode,你⼀定听说过会重复,那么你见过2个不同的字符串hashCode值却是相同的吗
java中String.hashCode()⽅法的算法如下:str.charAt(0) * 31n-1 + str.charAt(1) * 31n-2 + ... + str.charAt(n-1)
据说算法中31这个数字是对英⽂字符进⾏优化后产⽣的⼀个最佳数字,但是碰上字母⼤⼩写或是⼀些特殊字符,再或者是中⽂字符,它就不灵了,很容易重复,举个例⼦:
String a="Aa";
String b="BB";
int aa=a.hashCode();
int bb=b.hashCode();
字符串a与b的hashCode取值是相同的,都是2112
2017-08-01更新
⼤家关注度⽐较⾼,再来⼏个中⽂例⼦,⽐如下⾯⼏组的hashCode均相等
"柳柴"与"柴柕" hashCode=851553
"志捘"与"崇 " hashCode=786017
2018-03-19更新
制作相同hashcode的代码块
System.out.println("\"柳志崇\".hashCode()="+"柳志崇".hashCode());
System.out.println("\"柳⼭ \".hashCode()="+"柳⼭ ".hashCode());
int aa= '柳'*31*31+'志'*31+'崇' ;
System.out.println("aa=" + aa);equals不等于
int ccint = (aa- ('柳'*31*31+ '⼭'*31) );
System.out.println("ccint=" + ccint);
char cc = (char)ccint;
System.out.println("cc=" + cc);
4个知识点:
1.java中所有的对象都有⼀个⽗类Object,⽽Object类都有hashCode⽅法,也就是说java中所有的类均会有hashCode⽅法;
2.Object类的hashCode⽅法是native的,即是通⽤C语⾔来写的,本⽂举例使⽤的是String类,⾃⼰重写了hashCode⽅法,算法即如下:
String.hashCode()=str.charAt(0) * 31n-1 + str.charAt(1) * 31n-2 + ... + str.charAt(n-1)
3.String类的hashCode算法是固定的,根据算法就可以看到是可能会存在相同hashCode的
4.再强调⼀点,两个String的hashCode相同并不代表着equals⽐较时会相等,他们两者之间是没有必然关系,这⼀点可以看看equals⽅法的实现
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = count;
if (n == unt) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n-- != 0) {
if (v1[i++] != v2[j++])
return false;
}
return true;
}
}
return false;
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论