黑马程序员技术交流社区

标题: 对String很类迷惘的一个问题 [打印本页]

作者: 吴建昆    时间: 2013-5-1 21:26
标题: 对String很类迷惘的一个问题
本帖最后由 吴建昆 于 2013-5-2 11:53 编辑

两个字符串:
String s1 = "aba";
String s2 = new String("abc");
为什么说s1在内存中有一个对象,s2在内存中有两个对象呢。那s2在内存中的两个对象分别都是啥?
毕老师的解释没听懂,有人给点拨一下么?
作者: 殇_心。    时间: 2013-5-1 21:31
首先s1是一个对象。是直接引用常量池中的"aba"
s2是2个对象。jvm先是调用常量池中"abc",然后new之后在堆内存中产生一个新对象。
作者: 403383221    时间: 2013-5-1 21:37
String s2 = new String("abc")
类加载时,"abc"就被读入并在常量池创建了,
然后调用到new String("abc")的时候,就在堆上创建new String("abc")
所以是2个对象
作者: 李志敏    时间: 2013-5-2 00:08
上面说的很详细了 再给你配个图吧

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

string.jpg

作者: 花开花落总相似    时间: 2013-5-2 07:52
String s1 = "aba";
String s2 = new String("abc");
   其中 s1为字符串常量 在date segment中  而 s2在栈空间中它指向堆内存中那个被new出来的对象     
     new 出来的对象和字符串常量不是在一个内存区域
作者: pthuakai    时间: 2013-5-2 08:08
视频中说,String类型的一旦创建就不能更改。第一个创建时有了“abc”这的个对象。s2创建后又增加一个对象。
作者: 郑雪    时间: 2013-5-2 10:58
"abc"本身是一个字符串对象,
new String()又创建了一个对象,“abc”作为参数传递给String类的构造函数来对这个对象进行初始化。
作者: 陈圳    时间: 2013-5-2 11:33
  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:56
陈圳 发表于 2013-5-2 11:33

够详细 懂了




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