免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 大马虎
打印 上一主题 下一主题

java的判断对象相等的两个问题 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2006-04-05 15:44 |只看该作者
原帖由 艾斯尼勒 于 2006-4-5 15:40 发表



情看搂上我的解释,都应该是返回true的,您可以写个程序实验一下

还是作个试验好 不过我感觉第一种情况是true 第二种是false

论坛徽章:
0
12 [报告]
发表于 2006-04-05 16:03 |只看该作者
。。你们回帖子。都不先自己试一下的么?

总之每次我都自己先试一下。确保没有错误才回复。。。


  1. package source;

  2. public class TestString {

  3.         /**
  4.          * @param args
  5.          */
  6.         public static void main(String[] args) {
  7.                 // TODO 自动生成方法存根
  8.                
  9.                 String a = new String("Hello World");
  10.                 String b = "Hello World";
  11.                 String c ="Hello World";
  12.                
  13.                 //*
  14.                 if(a.equals(b)){
  15.                         System.out.println("a equals b");
  16.                 }else{
  17.                         System.out.println("a no equals b");
  18.                 }
  19.                 if(a==b){
  20.                         System.out.println("a == b");
  21.                 }else{
  22.                         System.out.println("a != b");
  23.                 }
  24.                 if(c.equals(b)){
  25.                         System.out.println("c equals b");
  26.                 }else{
  27.                         System.out.println("c no equals b");
  28.                 }
  29.                 if(c==b){
  30.                         System.out.println("c == b");
  31.                 }else{
  32.                         System.out.println("c != b");
  33.                 }
  34.         }
复制代码


输出

a equals b
a != b
c equals b
c == b

论坛徽章:
0
13 [报告]
发表于 2006-04-05 16:04 |只看该作者
楼上的好同志

论坛徽章:
0
14 [报告]
发表于 2006-04-05 16:08 |只看该作者
原帖由 tong0245 于 2006-4-5 15:44 发表

还是作个试验好 不过我感觉第一种情况是true 第二种是false


嗯,第二种的确是false,不过hashCode是一样的。奇怪阿奇怪

论坛徽章:
0
15 [报告]
发表于 2006-04-05 16:12 |只看该作者
我也是通过程序验证才知道结果的,不过不太清楚原因,我想通过String a="Hello world !"; 方式声明的变量在栈上分配的,String a="Hello World !" ; String b ="Hello World !"; 其实都是指向了栈里相同的一个地址即在栈里的"Hello World !" ,而String c =new String("Hello World !");是在堆里分配的所以c !=b 不知道是不是这个原因。

论坛徽章:
0
16 [报告]
发表于 2006-04-05 16:14 |只看该作者


不讨论了。这个属于JVM的范畴。有兴趣可以找点资料看看。忘记那有中文的了。讲的还不错。

[ 本帖最后由 carset 于 2006-4-5 16:17 编辑 ]

论坛徽章:
0
17 [报告]
发表于 2006-04-05 16:16 |只看该作者
原帖由 carset 于 2006-4-5 16:03 发表
。。你们回帖子。都不先自己试一下的么?

总之每次我都自己先试一下。确保没有错误才回复。。。



呵呵。我以前试过的,不过还是把结果记错了。


  1. public class Equal
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 String a = new String("ABC");
  6.                 String b = "ABC";
  7.                 System.out.println(a.hashCode());
  8.                 System.out.println(b.hashCode());
  9.                 System.out.println(a==b);
  10.         }
  11. }
复制代码

返回结果是false,但hashcode是相同的,应该是同一个地址吧。String重写了hashCode()?

[ 本帖最后由 艾斯尼勒 于 2006-4-5 16:19 编辑 ]

论坛徽章:
0
18 [报告]
发表于 2006-04-05 16:18 |只看该作者
String.hashcode();


  1.   public int hashCode() {
  2.         int h = hash;
  3.         if (h == 0) {
  4.             int off = offset;
  5.             char val[] = value;
  6.             int len = count;

  7.             for (int i = 0; i < len; i++) {
  8.                 h = 31*h + val[off++];
  9.             }
  10.             hash = h;
  11.         }
  12.         return h;
  13.     }

复制代码

论坛徽章:
0
19 [报告]
发表于 2006-04-05 16:24 |只看该作者
因为Java的hashCode()有要求,当equals()调用返回true时,两者
的hashCode()必须相同^_^

论坛徽章:
0
20 [报告]
发表于 2006-04-05 16:26 |只看该作者
原帖由 carset 于 2006-4-5 16:18 发表
String.hashcode();



嗯,的确是重写了,为内容相同的对象返回相同的值,为了equals方法能返回想要的结果
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP