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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 董将 中级黑马   /  2012-12-21 00:07  /  1341 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 董将 于 2012-12-22 19:43 编辑

String s1 = "abc";    s1代表一个对象
String s2 = new String("abc")        s2为什么代表两个对象,abc是存放在哪的?
String s3 = "abc";

s1==s2;   false
s1==s3;          true
s1.equals(s2);        true

为什么是这个结果?

3 个回复

倒序浏览
首先,
String s = "abc" :s是存储在栈里。
    先在栈中创建一个对String类的对象引用变量s,然后查找栈中有没有存放"abc",如果没有,则将"abc"存放进栈,并令s指向”abc”,如果已经有”abc” 则直接令s指向“abc”。例子如下:
String s1 = "abc";
String s2 = "abc";
System.out.println(s1==s2); //true
说明s1和s2指向同一个对象


String s = new String("abc") : s是存储在堆里。
    每调用一次就会创建一个新的对象。 例子如下:
String s1 =new String ("abc");
String s2 =new String ("abc");
System.out.println(s1==s2); // false
说明s1和s2是不指向同一个对象的

另外
== 比较对象的引用是否相同,引用就是对象地址

equals是对象的方法,基本上实现来比较对象自己的内容,字符串对象就是字符串值,你自己的对象就是你自己定义的规则

评分

参与人数 1技术分 +1 收起 理由
奋斗的青春 + 1 赞一个!

查看全部评分

回复 使用道具 举报
楼上说的对,不过我记得不是在栈中找,而是在方法区的字符串常量池中找。
简单一点,就是构造器的有2个对象,直接的只有一个对象。
回复 使用道具 举报
String问题:
     String s1=new String("hello");//执行到这里 内存中有几个String对象  2
String s2="hello";  //执行到这里 内存中有几个String对象  2
String s3=new String("hello"); //执行到这里 内存中有几个String对象  3
System.out.println(s1==s2);//结果  false
System.out.println(s1==s3);//false
System.out.println(s2==s3);//false
System.out.println(s1==s1.intern()); //false   intern()返回字符串池的的String对象
System.out.println(s2==s2.intern()); //true
System.out.println(s1.intern()==s3.intern()); //true

s.PNG (19.69 KB, 下载次数: 22)

s.PNG
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马