本帖最后由 Mr_Free 于 2013-7-31 05:08 编辑
首先我来说一下String类的特点
1.String使用private final char value[]来实现字符串的存储,也就是说String对象创建之后,就不能再修改此对象中存储的字符串内容,就是因为如此,才说String类型是不 可变的(immutable)。
然后,你要搞清楚,什么是对象,对象,是实实在在存在的一个实体。
String str2 =new String("abc");//-------------------创建了2个对象,一个是"abc"通过""双引号创建的,他被存放在常量池里面。str2是通过new创建的对象,他被存放在堆内存中.只不过他们创建的时期不同,一个是编译期,一个是运行期!
String str1 = "abc";//---------------是先在栈中创建一个对String类的对象引用变量str,然后通过符号引用去字符串常量池里找有没有"abc",
如果没有,则将"abc"存放进字符串常量池,并令str指向”abc”,如果已经有”abc” 则直接令str指向“abc”这里面的str1是一个类类型变量,不能称为对象。
注意:str1 只是String类的引用,不能称为对象。为什么str2是对象呢,因为他被是new出来的,是在堆内存占有内存地址空间的。
然后我补充一下常量池的概念: 常量池在java用于保存在编译期已确定的,已编译的class文件中的一份数据。它包括了关于类,方法,接口等中的常量,也包括字符串常量,如String s = "java"这种申明方式;当然也可扩充,执行器产生的常量也会放入常量池,故认为常量池是JVM的一块特殊的内存空间。
|