当前位置: 技术问答>java相关
基础的概念问题
来源: 互联网 发布时间:2017-04-28
本文导语: 我写了这样一个测试程序 public class Test { public static void main(String args[]) { String s = new String("Hello"); String s1 = new String("Hello"); String m = "hello"; String m1 = "hello"; if(s==s1){ ...
我写了这样一个测试程序
public class Test {
public static void main(String args[]) {
String s = new String("Hello");
String s1 = new String("Hello");
String m = "hello";
String m1 = "hello";
if(s==s1){
System.out.println("OK");
}
else{
System.out.println("Bad");
}
if(m==m1){
System.out.println("mOK");
}
else{
System.out.println("mBad");
}
}
}
(s==s1)打印出来的是bad,但是(m==m1)是mok,请大侠解释一下
public class Test {
public static void main(String args[]) {
String s = new String("Hello");
String s1 = new String("Hello");
String m = "hello";
String m1 = "hello";
if(s==s1){
System.out.println("OK");
}
else{
System.out.println("Bad");
}
if(m==m1){
System.out.println("mOK");
}
else{
System.out.println("mBad");
}
}
}
(s==s1)打印出来的是bad,但是(m==m1)是mok,请大侠解释一下
|
以前知道,现在记不太清楚了,好像是jvm给向String m = "hello";
这样创建的String建立了一个缓冲池(暂且这么叫),也就是你创建的m,ml都指向缓冲池里面的对象,所以==成立。
而象String s = new String("Hello");这样建立的实例是分配不同的地址的,所以==不成立。
建议你发在认证区,那里的人可能更清楚。
这样创建的String建立了一个缓冲池(暂且这么叫),也就是你创建的m,ml都指向缓冲池里面的对象,所以==成立。
而象String s = new String("Hello");这样建立的实例是分配不同的地址的,所以==不成立。
建议你发在认证区,那里的人可能更清楚。
|
String s = new String("Hello");
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
因為'=='在倆邊都是對象時,是判斷兩邊對象的引用是否一樣
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
因為'=='在倆邊都是對象時,是判斷兩邊對象的引用是否一樣
|
在定义m时,系统为m分配一个地址空间并存为hello,定义m1时由于并没有要求新空间,所以利用的还是原来的空间,说白了就是m和m1是一个"hello",而s和s1为两个不同的地址空间,所以会出现这种情况。就象两个人知道一个抽屉里有一把钥匙,和两个人知道两个抽屉里分别有一把两个一样的钥匙一样,虽然一样但还是两把钥匙。
|
字符串的比较不能用==
程序运行的时候有一个字符串缓冲池,其中保存着所有的字符串对象
对字符串进行的操作也都是从这个缓冲池中取出的。
在调用==操作的时候只是在缓冲池中寻找两个对象进行比较,
此时有可能调用字符串并不存在缓冲池中。而调用equals()方法的
时候,会先生成一个调用的字符串在缓冲池中,这样
缓冲池中就有了这两个字符串对象,就可以进行比较了
程序运行的时候有一个字符串缓冲池,其中保存着所有的字符串对象
对字符串进行的操作也都是从这个缓冲池中取出的。
在调用==操作的时候只是在缓冲池中寻找两个对象进行比较,
此时有可能调用字符串并不存在缓冲池中。而调用equals()方法的
时候,会先生成一个调用的字符串在缓冲池中,这样
缓冲池中就有了这两个字符串对象,就可以进行比较了
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。