黑马程序员技术交流社区

标题: 字符串的==问题一枚 [打印本页]

作者: -律-    时间: 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