黑马程序员技术交流社区

标题: String s = new String("xyz");创建了几个String Object? [打印本页]

作者: fei_xiong    时间: 2014-4-28 17:36
标题: String s = new String("xyz");创建了几个String Object?
String s = new String("xyz");创建了几个String Object?
最后这个string Object 是什么意思,是字符串类吗?
作者: @文瑞    时间: 2014-4-28 17:54
两个,一个是"xyz",还有一个是new 出来的string object
作者: iloveyou    时间: 2014-4-28 18:15
Java内存当中有这么几个部分:
栈:存放基本类型的变量数据对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中)。
堆:存放所有new出来的对象
常量池:在堆中分配出来的一块存储区域,(1)存放储显式的String常量和基本类型常量(float、int等)。(2)可以存储不经常改变的东西(public static final)。常量池中的数据可以共享。


分析如下:
String a = "xyz";①
String b = "xyz";②
分析:
代码执行后在常量池(constant pool)中创建了一个值为xyz的String对象,②执行时,因为常量池中存在"xyz"所以就不再创建新的String对象了。

String   c   =   new   String("xyz");①
String   d   =   new   String("xyz");②
分析
①Class被加载时,"xyz"被作为常量读入,在常量池里创建了一个共享的值为"xyz"的String对象;然后当调用到new String("xyz")的时候,会在堆里创建这个new   String("xyz")对象;②由于常量池中存在"xyz"所以不再创建"xyz",然后创建新的new String("xyz")。


String   ss1   =   new   String("xyz");     //创建二个对象(常量池和堆中),一个引用
String   ss2   =   new   String("xyz");     //创建一个对象(堆中),并且以后每执行一次创建一个对象,一个引用

String   s1   =   "xyz";     //创建一个对象(常量池中),一个引用   
String   s2  =   "xyz";     //不创建对象(共享上次常量池中的数据),只是创建一个新的引用

祝学习愉快!

图像 1.jpg (117.32 KB, 下载次数: 6)

内存分析图

内存分析图





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