一小段经典代码的疑问

blackpark 2004-08-13 10:43:35

下面是代码和输出:
public class Test
{
public static void main(String[] args) {
String a = new String("Heipark");
String b = new String("Heipark");

String c = "Heipark";
String d = "Heipark";

// "==" 比较的是两个变量是否引用同一个对象
// "equals" 比较的是两个字符串的内容
System.out.println("a == b ->" + (a == b));
System.out.println("a.equals(b) ->" + a.equals(b));

System.out.println("c == d ->" + (c == d));
System.out.println("c.equal(d) ->" + c.equals(d));

System.out.println("a == c -> " + (a ==c));
System.out.print("a.equals(c) ->" + a.equals(c));
}
}

输出:
a == b ->false
a.equals(b) ->true
c == d ->true
c.equal(d) ->true
a == c -> false
a.equals(c) ->true

1.为什么"c == d"返回的值是true呢???
2.c,d是同一个对象
3.String a = new String("123"); 和String a = "123";不一样吗?
...全文
283 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
dcren521 2004-08-16
  • 打赏
  • 举报
回复
up
zyw118a 2004-08-16
  • 打赏
  • 举报
回复
参考资料:
张孝祥:java就业培训教程!!!
面向对象上,82页```
zyw118a 2004-08-16
  • 打赏
  • 举报
回复
关于"=="和"equals"我是这样看的!!!
a==b 就像是一对双胞胎,虽然它们表面上看上去很像,但是毕竟是兄弟,而不是一个人.!
而c==d 就好比是c为d取的一个别名,c和d代表的是同一个人,所以它们就相等喽!~~~
zzzle 2004-08-15
  • 打赏
  • 举报
回复
关于问题的解答:
1、关于==测试相等,它只能判别两个串是否存储在同一个位置。
String a = new String("Heipark");
String b = new String("Heipark");
由于String a , b 都是由String生成了一个新的对象,那么虽然对象的值相等,
但是不再同一个内存区域,所以
System.out.println("a == b ->" + (a == b));
的结果是a == b ->false

2、关于.equals测试相等,这个书上提到是可以用来测试两个串的正确用法。
System.out.println("a.equals(b) ->" + a.equals(b));
所以a.equals(b) ->true

3、关于String a = "b";和String a = new String("b");的问题
Because String objects are immutable they can be shared. For example:
String str = "abc";
is equivalent to:
char data[] = {'a', 'b', 'c'};
String str = new String(data);
大意就是字符串是可以共享的,就是当你
String c = "Heipark";
String d = "Heipark";
其实只有一个对象(可能是匿名的),c,d共同指向那个对象。

String a = new String("Heipark");
String b = new String("Heipark");
是先创建对象在赋值,所以虽然值相同但是不是同一个对象。
我想这样解释的话,后面的答案就显而易见了。
>-----------------------------<

参考资料:
Java核心技术卷一:String部分48-49页
Java API (Sun WebSite) java.lang.String
limd 2004-08-14
  • 打赏
  • 举报
回复
一二楼正确
aoaoJava 2004-08-14
  • 打赏
  • 举报
回复
blackpark(暖咖啡) ,
1 - Heipark因为new操作分配了一段新的内存空间,而a“指向”了这段空间
2 - 这里的mary是一个引用,而不是对象,这里真正的对象是new Person()所分配的空间
vongood 2004-08-14
  • 打赏
  • 举报
回复
那用分得这么清,引用跟对象都是一样。
blackpark 2004-08-14
  • 打赏
  • 举报
回复
up!!!
ccanimal 2004-08-13
  • 打赏
  • 举报
回复
String a = new String("123"); 和String a = "123";不一样。前面new了一个,说明给“123”开辟了自己的一段新的内存空间。这些在张孝祥的教程里讲的很清楚。在www.manfen.net里有视频教学,可以用bt下载。
旧石人 2004-08-13
  • 打赏
  • 举报
回复
wangcx(我侵蚀着孤独)
说的有道理
minghuitian 2004-08-13
  • 打赏
  • 举报
回复
上面的仁兄们说的很好了。
wangcx 2004-08-13
  • 打赏
  • 举报
回复
1 c == d:这个应该是编译器做的优化,因为你用的是"Heipark",在编译器分配给他空间后,下一次在有这个对象的时候编译器引用了同一个地址,所以为true.
2 String a = new String("123"); 和String a = "123"
这个区别是String a = new String("123"); 当你用这个语法的时候编译器所做的是:先有一个string的变量引用到“123”,然后在用这个引用new一个对象出来,然后在把这个对象的引用赋值给a。就好像是这样的代码: String temp = "123";
String a = new String(temp);
当然与string a = “123”不一样啦。
danceflash 2004-08-13
  • 打赏
  • 举报
回复
1、这个问题涉及到Java的字符串常量池,找到String.intern()方法的帮助看看,我记得上面有该问题链接,手头没有Java API,抱歉
2、是同一个对象
3、不一样,这个问题已经问过很多遍了,在本版搜索一下就可以 ^_^
blackpark 2004-08-13
  • 打赏
  • 举报
回复
小弟愚笨,恕小弟多问几句
1.
String a = new String("Heipark");
这句话的意思是声明了一个指向字符串对象"Heipark"的引用s, s的意义类似其他语言的指针。
a是引用, 字符串"Heipark"是对象
我说的对吗??
2.
有个Person类
Person mary = new Person();
这句话的建立的mary是对象吗?这句话的解释方法和上面的一样吗??

62,622

社区成员

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

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