以前知道,现在记不太清楚了,好像是jvm给向String m = "hello";
这样创建的String建立了一个缓冲池(暂且这么叫),也就是你创建的m,ml都指向缓冲池里面的对象,所以==成立。
而象String s = new String("Hello");这样建立的实例是分配不同的地址的,所以==不成立。
建议你发在认证区,那里的人可能更清楚。
这样创建的String建立了一个缓冲池(暂且这么叫),也就是你创建的m,ml都指向缓冲池里面的对象,所以==成立。
而象String s = new String("Hello");这样建立的实例是分配不同的地址的,所以==不成立。
建议你发在认证区,那里的人可能更清楚。
分配一个新的地址(正如s和s1),在用'=='符号做比较时,程序判断符号两边的地址,如果相同则为true,不相同则为false,因而(s==s1)打印出来的是bad,但是(m==m1)是mok.
String s1 = new String("Hello");
new String("Hello");被看成是不同的對象
而
String m = "hello";
String m1 = "hello";
在String m = "hello";時,會在heap里為"hello"分配一個空間,
當String m1 = "hello";時,系統會先去收索heap里有沒有"hello",如果有的話就把"hello"的地址福給m1
因為'=='在倆邊都是對象時,是判斷兩邊對象的引用是否一樣
我比较赞同 lanmarco() 的说法
也想知道确切的答案奥按理说,java编译器碰到常量字符串会创建一个新的String,只是不知道连续碰到相同的字符串,如何处理关注
String s1 = new String("Hello");
String m = "hello";
String m1 = "hello";
s,s1为不同的实例
m,m1为同一对象的不同句柄。
从理论上说结果也应该是Bad(好多书上也说是Bad),但遗憾的是我刚才试了一下,竟然是OK,为什么会这样,也请别的大虾指点一下。
(还有大虾告诉我,用==比较对象,结果是不可预测的,也许OK,是因为不可预测而来的,但我希望这不是真正的原因)
== 比较的一定是句柄(地址)
equals缺省比较的是地址,除非对其进行重载,才会比较内容(搂主可以自己生成类来试验,比较重载equals前后的情况)因此,搂主的问题归结为
“编译器连续出现的常量字符串的处理是什么样的”
大多数Java类库都实现了equals(),所以它实际比较的是对象的内容,而非它们的句柄。
Thinking In Java
对字符串进行的操作也都是从这个缓冲池中取出的。
在调用==操作的时候只是在缓冲池中寻找两个对象进行比较,
此时有可能调用字符串并不存在缓冲池中。而调用equals()方法的
时候,会先生成一个调用的字符串在缓冲池中,这样
缓冲池中就有了这两个字符串对象,就可以进行比较了
{
public static void main(String[] args)
{
String t1 = new String("Hello");
String t2 = "Hello";
System.out.println("t1 == t2"+ (t1 == t2));
}
}====================================================================
---------- java ----------
t1 == t2false
Normal Termination
Output completed (1 sec consumed).