String类中equals与hashCode

WangxudongVsJava 2010-12-09 11:27:36
public static void main(String args[]) {
String str1 = new String("王旭东");
String str2 = new String("王旭东");
StringDemo sd = new StringDemo();

System.out.println(str1.equals(str2));
System.out.println(str1 == str2);

System.out.println(sd.hashCode());
System.out.println(str1.hashCode());
System.out.println(str2.hashCode());
}
为什么上面的str1与str2的hashCode值相等????
...全文
106 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
nazhawenxi 2010-12-10
  • 打赏
  • 举报
回复
解释够多了
WangxudongVsJava 2010-12-10
  • 打赏
  • 举报
回复
谢谢各位大牛了!!!!
WangxudongVsJava 2010-12-09
  • 打赏
  • 举报
回复
ok,请问:
不同对象它有不同的hashCode值,那上面的str1和str2都分别通过new关键来声明了,说明str1和str2是不同的对象了,为什么它们的hashCode值还是一样的,如果照您所说的那个公式的话,下面的代码和开始的还有什么区别了呢????
public static void main(String args[]) {
String str2 = new String("王旭东");
String str3 = "王旭东";
System.out.println(str2.hashCode());
System.out.println(str3.hashCode());
}

茫茫大海 2010-12-09
  • 打赏
  • 举报
回复
看看那个公式,就知道该怎么算了!知道该怎么算了,就知道为什么相同了!
建议楼主平时多看看API文档,虽然这个问题开始我也不清楚,但是我看了API文档后,我一下子就清楚了!
茫茫大海 2010-12-09
  • 打赏
  • 举报
回复
hashCode
public int hashCode()返回此字符串的哈希码。String 对象的哈希码根据以下公式计算:
s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
使用 int 算法,这里 s[i] 是字符串的第 i 个字符,n 是字符串的长度,^ 表示求幂。(空字符串的哈希值为 0。)

覆盖:
类 Object 中的 hashCode
返回:
此对象的哈希码值。
另请参见:
Object.equals(java.lang.Object), Hashtable
这是API文档中的关于hashCode方法的说明,楼主看看就明白了!
x449259094 2010-12-09
  • 打赏
  • 举报
回复
String str1 = new String("王旭东");
String str2 = new String("王旭东");
String这个类很特殊,如果想上面这样的是直接赋值,str1 放在的是常量池里面,str2 在池里找有没有"王旭东",有的话就把str2 也指向str1 指向的的那块地址(这地址在常量池中),如果没有的话,则自己创建一个地址,然后str2 指向它,那样的话就不同
ashutc 2010-12-09
  • 打赏
  • 举报
回复
常量池机制仅仅对String,Integer等有限的几个类别有效。并不代表所有的对象都有效。
茫茫大海 2010-12-09
  • 打赏
  • 举报
回复
判断对象是否相同用==就行了啊!
WangxudongVsJava 2010-12-09
  • 打赏
  • 举报
回复
那各位高手,你们所说的我也都理解,但现在我想说的是,开始我对hashCode的理解是hashCode可以判断对象是否相同,但通过Stirng类这个特例,不就说明hashCode不能判断对象是否为同一个对象!!这样对吗????
yige_bendan 2010-12-09
  • 打赏
  • 举报
回复
str1与str2虽然是不同对象,但是string的hashCode()计算方法如1楼所说,结果是相同的

String str2 = new String("王旭东");
String str3 = "王旭东";
这个声明,第一个是直接在堆区创建对象(而不在池中查找及创建),第二个是先在对象池中查找是否有 "王旭东",如果池存在,则引用指向池中的"王旭东",如果池中不存在,则先池中创建"王旭东",再指向。
kai27ks 2010-12-09
  • 打赏
  • 举报
回复
没有区别。JAVA会先去找常量池里是否已经有那个相同内容的string对象。有就直接调用。所以没有区别。
yangxiao_jiang 2010-12-09
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 wangxudongvsjava 的回复:]

ok,请问:
不同对象它有不同的hashCode值,那上面的str1和str2都分别通过new关键来声明了,说明str1和str2是不同的对象了,为什么它们的hashCode值还是一样的,如果照您所说的那个公式的话,下面的代码和开始的还有什么区别了呢????
public static void main(String args[]) {
……
[/Quote]
java使用常量池的。

62,616

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧