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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 吴建昆 中级黑马   /  2013-5-1 21:26  /  1588 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 吴建昆 于 2013-5-2 11:53 编辑

两个字符串:
String s1 = "aba";
String s2 = new String("abc");
为什么说s1在内存中有一个对象,s2在内存中有两个对象呢。那s2在内存中的两个对象分别都是啥?
毕老师的解释没听懂,有人给点拨一下么?

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

9 个回复

倒序浏览
首先s1是一个对象。是直接引用常量池中的"aba"
s2是2个对象。jvm先是调用常量池中"abc",然后new之后在堆内存中产生一个新对象。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
String s2 = new String("abc")
类加载时,"abc"就被读入并在常量池创建了,
然后调用到new String("abc")的时候,就在堆上创建new String("abc")
所以是2个对象

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
上面说的很详细了 再给你配个图吧

string.jpg (18.08 KB, 下载次数: 0)

string.jpg
回复 使用道具 举报
String s1 = "aba";
String s2 = new String("abc");
   其中 s1为字符串常量 在date segment中  而 s2在栈空间中它指向堆内存中那个被new出来的对象     
     new 出来的对象和字符串常量不是在一个内存区域
回复 使用道具 举报
视频中说,String类型的一旦创建就不能更改。第一个创建时有了“abc”这的个对象。s2创建后又增加一个对象。
回复 使用道具 举报
"abc"本身是一个字符串对象,
new String()又创建了一个对象,“abc”作为参数传递给String类的构造函数来对这个对象进行初始化。
回复 使用道具 举报
  1. String类内部会维护一个String pool的字符串池.这个池存在于栈内存中
  2. 为什么要设计这样一个String pool池呢?有两个原因:
  3.         1:String是一个常量
  4.         2:String使用很频繁.所以为效率设计
  5.         String a=new String("abc");
  6.         这一句话代表虚拟机会查找字符串池里有没有"abc"这个对象,没有就创建一个.然后在
  7.                 堆内存中再创建一个,将堆内存中的地址值返回,如果有的话,就不创建,但是仍然会在堆内存中创建一个"abc"的对象
  8.         String a="abc";
  9.         代表虚拟机直接在字符串池中查找有没有这个对象,有的话就返回,没有就创建一个
复制代码
回复 使用道具 举报
陈圳 发表于 2013-5-2 11:33

够详细 懂了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马