黑马程序员技术交流社区
标题: 求答案 [打印本页]
作者: 董将 时间: 2012-12-21 00:07
标题: 求答案
本帖最后由 董将 于 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
为什么是这个结果?
作者: 孙辉辉 时间: 2012-12-21 00:19
首先,
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是对象的方法,基本上实现来比较对象自己的内容,字符串对象就是字符串值,你自己的对象就是你自己定义的规则
作者: 肖志锋 时间: 2012-12-21 01:32
楼上说的对,不过我记得不是在栈中找,而是在方法区的字符串常量池中找。
简单一点,就是构造器的有2个对象,直接的只有一个对象。
作者: 王进亮 时间: 2012-12-21 22:12
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, 下载次数: 20)
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |