黑马程序员技术交流社区

标题: String赋值的问题<已解决> [打印本页]

作者: 武剑峰    时间: 2012-6-12 08:54
标题: String赋值的问题<已解决>
本帖最后由 武剑峰 于 2012-6-12 11:26 编辑

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


作者: 陈剑华    时间: 2012-6-12 09:09
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:}
作者: 武剑峰    时间: 2012-6-12 09:16
陈剑华 发表于 2012-6-12 09:09
java为了高效的使用内存,JVM会留出一块特殊的内存区域,叫做"String常量池"。当编译遇到String字面值时, ...

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

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

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

还有常量池是不是在方法区里划分出来的一块内存?
作者: 刘笑    时间: 2012-6-12 09:30
这只是对String赋值的两种方法而已。第一种是直接把字符串赋给String;第二种是先new一个String,开辟新的堆内存,然后将ab作为参数传给String。
附:String的两种赋值是不同的,String str1=“ab”,指向堆内存中的"ab",而String str2=new String("ab"),因为new开辟的新的堆内存,所以二者地址不同
作者: 庄星睿    时间: 2012-6-12 10:43
武剑峰 发表于 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 11:25
庄星睿 发表于 2012-6-12 10:43
没关系,自动装箱,就是把一个基本类型变量直接赋值给对应的包装类变量,或者赋给Object变量,自动拆箱就 ...

谢谢,学习了。




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