黑马程序员技术交流社区

标题: 新建String类对象的疑问 [打印本页]

作者: 耿渊博    时间: 2014-3-26 17:48
标题: 新建String类对象的疑问
  1. String s1 = "abc";
  2. String s2 = new String("abc");
复制代码
对于这两句代码,不都是建立了String对象,指向“abc”吗?有什么区别吗?

作者: tcny    时间: 2014-3-26 17:59
你这种情况在堆内存中有两个"abc",因为只要出现new就是一个全新的对象产生了。如果你调用s1==s2,那么返回false,如果调用s1.equals(s2)返回true。由此可见s1和s2的内存地址不一样。
作者: caijunsong    时间: 2014-3-26 18:06
String s1="abc";
String s2=new String("abc")
String 变量和其他变量不同 他不是在堆,栈之中分配内存的  他是在一个常量池的内存中分配
首先String s1="abc"; jvm会去查看在常量池中是否存在一个为“abc”的字符串,有的话,直接把“abc”的地址返回给s1引用,
而  String s2=new String("abc");
首先在堆内存中 分配了一块内存  然后内存存放的是  在常量池中“abc”的地址
毕老师的视频说两者的区别就是前者指创建一个对象,后者创建了两个对象
如果我们System.out.println(s1==s2); 返回值是false
因为一个指向堆内存地址 一个指向常量池中存放字符串的地址
但如果s1.equals(s2);那么返回就是true
这就是毕老师所说的s1值创建了一个对象,而s2创建了两个对象

作者: awkflf11    时间: 2014-3-26 18:07
这个是表示已经在堆内存中开辟了空间,,,s1指向了这个地址,,,



作者: Mr.__ㄨīn    时间: 2014-3-26 22:34
String s = "abc"
在栈中创建一个对String类的对象引用变量s,然后在栈中查找是否有"abc",如果没有,将"abc"存放进栈,并指向"abc",如果已经有"abc",则直接指向"abc"。
String s1 = "abc";
String s2 = "abc";
System.out.println(s1==s2); //true
说明s1和s2指向同一个对象
String s = new String("abc") :
创建一个字符串"abc",然后将其赋给s。
String s1 =new String ("abc");
String s2 =new String ("abc");
System.out.println(s1==s2); // false
说明s1和s2是不指向同一个对象

作者: shi0000    时间: 2014-3-26 22:48
String s1 = "abc"是一个对象,String s2 = new String("abc")是两个对象
作者: 2528870651    时间: 2014-4-8 17:02
再去认真看看视频吧




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2