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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 123_yaya 中级黑马   /  2014-6-8 14:24  /  1126 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 123_yaya 于 2014-6-8 16:41 编辑

这样分析对不对:
还是因为常量池的原因:
public static void main(String[] args) {
        String str="abc";
        String str1=new String("abc");
        String str2="abc";
        System.out.println(str==str1);//结果为false
        System.out.println(str2==str);//结果为true
}

分析:第一个 str在栈中创建了一个引用,指向堆,堆里面存放了"abc".

             str1因为是new String(),所以,在堆中新创建一块空间存放"abc",然后栈中的引用指向堆中的“abc",注意,这个"abc"和上面的”abc"是不一样的,str不等于str1的。

             第三个str2发现了堆中已经存在了“abc",所以,栈中的引用直接指向第一个堆中的”abc",所以str2==str3。

评分

参与人数 1技术分 +1 收起 理由
轻语。 + 1

查看全部评分

5 个回复

倒序浏览
恩啊,是的

点评

好,谢谢。  发表于 2014-6-8 16:41
回复 使用道具 举报
第一个:一个在栈区 一个在堆区
回复 使用道具 举报
对的,比相同要比内容和地址,str和str2都在栈里面,str1在堆里面
str和str1的地址不相同
回复 使用道具 举报
     String str="abc"; 栈中创建一个str的引用类型变量,指向常量字符串池中,
    String str2 = new String("abc");new出来的都是新的对象,在"abc"中堆中。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马