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

© 耿渊博 中级黑马   /  2014-3-26 17:48  /  1027 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. String s1 = "abc";
  2. String s2 = new String("abc");
复制代码
对于这两句代码,不都是建立了String对象,指向“abc”吗?有什么区别吗?

评分

参与人数 2技术分 +1 黑马币 +1 收起 理由
zzkang0206 + 1 好好看毕老师的string视频
黑妞~ + 1

查看全部评分

6 个回复

倒序浏览
你这种情况在堆内存中有两个"abc",因为只要出现new就是一个全新的对象产生了。如果你调用s1==s2,那么返回false,如果调用s1.equals(s2)返回true。由此可见s1和s2的内存地址不一样。
回复 使用道具 举报
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创建了两个对象

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
  • String s1 = "abc";
这个是表示已经在堆内存中开辟了空间,,,s1指向了这个地址,,,

  • String s2 = new String("abc");
  • 表示你又new 对象了,,,又在堆内存 开辟了一个新的空间  ,,,和原先的地址不同了

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
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是不指向同一个对象

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
String s1 = "abc"是一个对象,String s2 = new String("abc")是两个对象
回复 使用道具 举报
再去认真看看视频吧
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马