A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© -律- 中级黑马   /  2014-12-20 02:42  /  1027 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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,不都在此取值么?地址为什么不一样呢,请用简单明了的句子,或者画图给我解个惑,谢谢



5 个回复

倒序浏览
String s2 = new String("nba")这句话使用了new关键字,就是明确地告诉程序要创建一个新的对象,如果我没有理解错,s2中的nba是存在栈中而不是在字符串缓冲池中,所以s1和s2的地址不同。可以使用intern()将nba放入字符串缓冲池中,程序如果发现池中已经有nba则直接调用。以后在使用这种方法String s2 = new String("nba")创建字符串的时候最好这样用String s2 = new String("nba").intern(),这样可以避免内存浪费。希望可以帮到楼主
回复 使用道具 举报
字符串的变量是都呆在字符常量池中,栈内存的变量的引用是都指向此处
但是,比如说,字符常量池中有两间房子,里面住的都是“abc”,一个地址是1001 一个是1002
s1=abc
s2=abc
但是 1001!=1002

上面就是equals比较
下面就是==的比较

点评

http://bbs.itheima.com/forum.php?mod=viewthread&tid=156962  发表于 2014-12-20 22:40
这个...你理解错了呐  发表于 2014-12-20 22:40
回复 使用道具 举报
我可不可以这样理解,

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→堆内存(→常量池);-----------括号内这部分在 == 的操作中被胜率,所以指向的引用地址是不同的
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马