|
查看: 1390|回复: 10
|
Java String Object
[复制链接]
|
|
|
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应该也一样(我没记错的话)
但,最近我试验给朋友看的时候却不行了。。
例如:- public static void main(String args[])
- {
- String a="Hello"l
- String b=a; //b and a now point to the same location of an object.
- System.out.println(a);
- System.out.println(b);
- //2 Hello now
- a="Change value";
- System.out.println(b);
- }
复制代码 为什么最后一行code print b value竟然还是hello的呢?
b不是应该point去a的address, a换value了,bpoint to a , print b为何不是"change value"呢?
是java API改了,还是我搞错了?@ |
|
|
|
|
|
|
|
|
|
|

楼主 |
发表于 5-12-2010 11:59 AM
|
显示全部楼层
还有我竟然发现- String s1="Hello";
- String s2="Hello"
- 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
|
显示全部楼层
|
|
|
|
|
|
|
|
|
|
发表于 7-12-2010 11:13 AM
|
显示全部楼层
RE: Java String Object
本帖最后由 steven_chua33 于 7-12-2010 11:14 AM 编辑
- // b = a 之后的情况,a point to "Hello", b also point to the same object
- ┌─┐ ┌─┐
- │a│--------> "Hello" <------│b│
- └─┘ └─┘
- // a = "Change value" 之后
- // a 将不会再 point to "Hello", b 保持不变
- ┌─┐ ┌─┐
- │a│--xxxx--> "Hello" <------│b│
- └─┘ └─┘
- │
- └──────────> "Change value"
复制代码 虽然 b = a 之后,b 和 a 将会store着同一个address,
但是当你a = "new value"的时候,只有a会update它的address
因为那样b还是保持不变的point to "Hello" |
|
|
|
|
|
|
|
|
|
|

楼主 |
发表于 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不是的 |
|
|
|
|
|
|
|
|
|
|

楼主 |
发表于 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都不会变哦。
- String b = new String("abc");
- String c = b;
- b = new String("cde");
- System.out.println("b="+b); // b=cde
- System.out.println("c="+c); // c=abc
复制代码
和
- String b = "abc";
- String c = b;
- b = "cde";
- System.out.println("b="+b); // b=cde
- 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),这就是为什么
- System.out.println("abc"=="abc");
复制代码
会是true. |
|
|
|
|
|
|
|
|
| |
本周最热论坛帖子
|