佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

查看: 1390|回复: 10

Java String Object

[复制链接]
发表于 5-12-2010 11:57 AM | 显示全部楼层 |阅读模式
for any reference values x and y, this method returns true if and only if x and y refer to the same object (x==y has the value true).

这是从java.lang.Object里头的API拿出来的,
就是说x==y is true if and only if they point to the same location of an object, but not values.

String class应该也一样(我没记错的话)
但,最近我试验给朋友看的时候却不行了。。
例如:
  1. public static void main(String args[])
  2. {
  3.   String a="Hello"l
  4.   String b=a;  //b and a now point to the same location of an object.

  5. System.out.println(a);
  6. System.out.println(b);
  7. //2 Hello now

  8. a="Change value";
  9. System.out.println(b);

  10. }
复制代码
为什么最后一行code print b value竟然还是hello的呢?
b不是应该point去a的address, a换value了,bpoint to a , print b为何不是"change value"呢?
是java API改了,还是我搞错了?@
回复

使用道具 举报


ADVERTISEMENT

 楼主| 发表于 5-12-2010 11:59 AM | 显示全部楼层
还有我竟然发现
  1. String s1="Hello";
  2. String s2="Hello"
  3. System.out.print(s1==s2);

复制代码
竟然是true@@
2个不同的location,==应该是false的,
应为.equals才会compare value..
请问到底发生了什么事?@@
回复

使用道具 举报

发表于 5-12-2010 03:42 PM | 显示全部楼层
回复

使用道具 举报

发表于 6-12-2010 01:40 AM | 显示全部楼层
根據我所知 其實java 開拓時已經去掉了pointer 這東西
當你用的" = " 時只是起到copy constructor 的作用
回复

使用道具 举报

发表于 6-12-2010 03:10 PM | 显示全部楼层
要用*S1==*S2?
我是C++的...
回复

使用道具 举报

发表于 7-12-2010 11:13 AM | 显示全部楼层

RE: Java String Object

本帖最后由 steven_chua33 于 7-12-2010 11:14 AM 编辑
  1. // b = a 之后的情况,a point to "Hello", b also point to the same object
  2. ┌─┐                         ┌─┐
  3. │a│--------> "Hello" <------│b│
  4. └─┘                         └─┘

  5. // a = "Change value" 之后
  6. // a 将不会再 point to "Hello", b 保持不变
  7. ┌─┐                         ┌─┐
  8. │a│--xxxx--> "Hello" <------│b│
  9. └─┘                         └─┘

  10. └──────────> "Change value"
复制代码
虽然 b = a 之后,b 和 a 将会store着同一个address,
但是当你a = "new value"的时候,只有a会update它的address
因为那样b还是保持不变的point to "Hello"
回复

使用道具 举报

Follow Us
 楼主| 发表于 7-12-2010 12:56 PM | 显示全部楼层
虽然 b = a 之后,b 和 a 将会store着同一个address,
但是当你a = "new value"的时候,只有a会update它的 ...
steven_chua33 发表于 7-12-2010 11:13 AM



    我试了,可是b也变成新的value了。。@@
可能是2楼所说的String PooL?@@
回复

使用道具 举报

 楼主| 发表于 7-12-2010 12:57 PM | 显示全部楼层
要用*S1==*S2?
我是C++的...
aquamax 发表于 6-12-2010 03:10 PM



    C是放*a;
可是java不是的
回复

使用道具 举报


ADVERTISEMENT

 楼主| 发表于 7-12-2010 12:58 PM | 显示全部楼层
Java裡有種東西叫String pool
MaokeJackson 发表于 5-12-2010 03:42 PM



    我有时间时慢慢研究下@@
如果你不介意解释的话,我愿意听xD
回复

使用道具 举报

发表于 7-12-2010 01:08 PM | 显示全部楼层
我试了,可是b也变成新的value了。。@@
可能是2楼所说的String PooL?@@
1234_4321 发表于 7-12-2010 12:56 PM

呵呵 那么看看这个吧,在这chapter里有解释
http://books.google.com/books?id=wJuccs9jqBcC&lpg=PA923&dq=google%20book%20introduction%20to%20java%20programming&pg=PA301#v=onepage&q&f=false
回复

使用道具 举报

发表于 20-12-2010 12:50 PM | 显示全部楼层
我试了,可是b也变成新的value了。。@@
可能是2楼所说的String PooL?@@
1234_4321 发表于 7-12-2010 12:56 PM

你怎样试的?我试了两种construction method,b都不会变哦。

  1. String b = new String("abc");
  2.                 String c = b;
  3.                 b = new String("cde");
  4.                 System.out.println("b="+b); // b=cde
  5.                 System.out.println("c="+c); // c=abc
复制代码





  1. String b = "abc";
  2.                 String c = b;
  3.                 b = "cde";
  4.                 System.out.println("b="+b); // b=cde
  5.                 System.out.println("c="+c); // c=abc
复制代码


我读了楼上给的那个link,结论就是interned string vs string object, 因为string是immutable,
jvm为了让memory用到更加efficient,所以把interned string都assign去楼上所谓的string pool(为了避免一直create新的string object),这就是为什么
  1. System.out.println("abc"=="abc");
复制代码

会是true.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

 

ADVERTISEMENT



ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


版权所有 © 1996-2023 Cari Internet Sdn Bhd (483575-W)|IPSERVERONE 提供云主机|广告刊登|关于我们|私隐权|免控|投诉|联络|脸书|佳礼资讯网

GMT+8, 17-11-2025 04:02 AM , Processed in 0.261548 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表