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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 武剑峰 中级黑马   /  2012-6-12 08:54  /  3582 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 武剑峰 于 2012-6-12 11:26 编辑

  在论坛里面看到如下语句,突然发现其实自己对第二句,产生两个对象,不清楚是那两个对象,是否也包含"ab"
   String sr1 = "ab";    //这句运行完后,在内存中产生一个对象
   String sr2 = new String("ab");   //这句话运行完成后,在内存中产生两个对象

评分

参与人数 1技术分 +1 收起 理由
赵志勇 + 1

查看全部评分

6 个回复

倒序浏览
java为了高效的使用内存,JVM会留出一块特殊的内存区域,叫做"String常量池"。当编译遇到String字面值时,它会先检查一下池内是否有一样的字面值,如果有的话,那就会把新的字面值引用指向现有的String,而不创建新的String字面值对象(现有的String只是具有一个额外的引用)
  1. String s = "abc"; //这种简单的情况下会把"abc"放入池中,s引用它;

  2. String s = new String(“abc”); //这种情况下,因为使用了new关键字,所以java将在常规内存(非String常量池区域)中创建一个新的String对象(第一个对象),并且s将引用它。除此之外,字面值"abc"(第二个对象)将会被放入到常量池中!
复制代码
希望能解答你疑问{:soso_e100:}

评分

参与人数 1技术分 +1 收起 理由
赵志勇 + 1

查看全部评分

回复 使用道具 举报
陈剑华 发表于 2012-6-12 09:09
java为了高效的使用内存,JVM会留出一块特殊的内存区域,叫做"String常量池"。当编译遇到String字面值时, ...

你解释的很详细了,顺便问一下,它和自动拆装箱有关系吗
回复 使用道具 举报
陈剑华 发表于 2012-6-12 09:09
java为了高效的使用内存,JVM会留出一块特殊的内存区域,叫做"String常量池"。当编译遇到String字面值时, ...

"常规内存",应该就是堆内存吧

第一个对象和第二个对象是怎样联系起来的呢?

还有常量池是不是在方法区里划分出来的一块内存?
回复 使用道具 举报
这只是对String赋值的两种方法而已。第一种是直接把字符串赋给String;第二种是先new一个String,开辟新的堆内存,然后将ab作为参数传给String。
附:String的两种赋值是不同的,String str1=“ab”,指向堆内存中的"ab",而String str2=new String("ab"),因为new开辟的新的堆内存,所以二者地址不同
回复 使用道具 举报
武剑峰 发表于 2012-6-12 09:16
你解释的很详细了,顺便问一下,它和自动拆装箱有关系吗

没关系,自动装箱,就是把一个基本类型变量直接赋值给对应的包装类变量,或者赋给Object变量,自动拆箱就是直接把包装类对象直接赋给一个对应的基本类型变量,基本数据类型只有数值类型和布尔类型的,数值类型的:byte short int long  float doube char,而String本身就是引用类型的,拆箱装箱要注意类型的匹配
Long lobj=new Long("dddd");//这样肯定会出现 java.lang.NUmberFormatException异常,不是一类的人家不给你装
回复 使用道具 举报
庄星睿 发表于 2012-6-12 10:43
没关系,自动装箱,就是把一个基本类型变量直接赋值给对应的包装类变量,或者赋给Object变量,自动拆箱就 ...

谢谢,学习了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马