字符串是java是最 常用的类也是 特殊对待的类型之一,字符串是定常的无论一个串它存储在内存中的什么位置它的内容一经创建就不可改变,平时我们感觉到串被修改了这只是一种错觉 ,实现上串的操作是 丢弃了旧串而生成了新串。
java中字面常量表达的串也就是那些用双引号括起来的内容存储在特殊的位置,>串池( java在内存中开辟了一个特殊的空间),串池的特点是不允许重复、不允许删除、不会被java垃圾回收机制回收。
例如:
String a = "abc";
首先会创建一个名字为a的小变量它是指针类型,它将指向串对象,但串在哪呢?串会在串池中,因为"adc"是字面常量。
例如:再执行一句:
String b = "abc";
因为串池中已经有为"abc"的对象,
串池的特点就是内容不会重复,一旦重复就会用先前的对象内容,已经存在"abc"因此b指针将指向原来的"abc"对象,也就是说a和b两个指针的值现在是相等的。
例如:
String c = "ab" + "c";
java将如何处理?
这里还将创建指针c,后面"ab"+"c" java一般会对这样的语句进行优化,不会等在程序运行的时候再做这个相加,因为常量加常量还是常量,所以java在
编译期间就会把"ab"+"c"直接替换为"abc",所以这句的实际操作和上一句效果是相同的也就是说c指针也是指向串池中那个"abc"的唯一对象。
例如:
String d = new String(a);
这里与前面不同没有字面常量,它需要在全局的堆空间里创建一个新的对象以a作为参数。
在堆空间中创建一个对象的内容是抄写串池中的"abc"还是其它手段处理? 一般说来会做一个指针在堆空间的对象里有一个指针指向回串池中的那个"abc"对象,
例如:
d = d + "x";
这会引起什么动作?
首先表达式中含有一个常量串"x",那必须会引起在串池中创建一个包含"x"的串对象,然后我们把"abc"和"x"进行合并,这个时候就会创建出新对象"abcx"存在堆中,然后我们让d指针指向这个新的对象,那d原来所指向的对象就被放弃了,原来那个对象现在没有任何指针指向它,那么就成了java的垃圾对象,将来java的垃圾回收机制会把它回收,但是在串池中的这个"x"对象是不会被回收的,因为串池有这样一个特点其中的对象没有任何指针指导向它,它也不会变成垃圾不会被回收。