黑马程序员技术交流社区
标题:
字符串的==问题一枚
[打印本页]
作者:
-律-
时间:
2014-12-20 02:42
标题:
字符串的==问题一枚
public class Demo {
public static void main(String[] args) {
// TODO Auto-generated method stub
String s1 = "nba";
String s2 = new String("nba");
System.out.println(s1==s2);
String s3 = "你大爷";
String s4 ="你";
String s5 ="大爷";
System.out.println(s3==(s4+s5));
}
}
我的理解==是比较地址值的,
equals比较内容,
这段代码如果用equals返回的肯定是true
用==返回的2次都是false
这个我就不明白了,字符串的变量不都呆在字符常量池中吗,栈内存的变量的引用都指向此处,为什么说地址值不一样,为什么==返回false,不都在此取值么?地址为什么不一样呢,请用简单明了的句子,或者画图给我解个惑,谢谢
作者:
后悔药
时间:
2014-12-20 13:18
String s2 = new String("nba")这句话使用了new关键字,就是明确地告诉程序要创建一个新的对象,如果我没有理解错,s2中的nba是存在栈中而不是在字符串缓冲池中,所以s1和s2的地址不同。可以使用intern()将nba放入字符串缓冲池中,程序如果发现池中已经有nba则直接调用。以后在使用这种方法String s2 = new String("nba")创建字符串的时候最好这样用String s2 = new String("nba").intern(),这样可以避免内存浪费。希望可以帮到楼主
作者:
没伞的孩子
时间:
2014-12-20 16:26
字符串的变量是都呆在字符常量池中,栈内存的变量的引用是都指向此处
但是,比如说,字符常量池中有两间房子,里面住的都是“abc”,一个地址是1001 一个是1002
s1=abc
s2=abc
但是 1001!=1002
上面就是equals比较
下面就是==的比较
作者:
-律-
时间:
2014-12-22 21:49
我可不可以这样理解,
String s1 = "nba";的操作是直接在常量池new了个n,b,a;
所以s1直接指向常量池的对象
而String s2 = new String("nba");的操作是先在堆内存new一个String的对象,然后这个堆里的对象是指向在常量池里a,b,c对象的引用地址
所以s2是指向堆内存对象,再指向常量池的对象
所以s1 是拥有一个指向常量池的引用地址;
而s2 是拥有一个指向堆内存对象的引用地址.所以不一样(虽然堆内存对象也有个地址指向常量池)
s1→常量池;
s2→堆内存→常量池
而s1 == s2的操作是:
s1→常量池;
s2→堆内存(→常量池);-----------括号内这部分在 == 的操作中被胜率,所以指向的引用地址是不同的
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2