String在Java中是我们用到频率很高的一个类,但也会有很多疑惑的地方,最近看了一些资料,以及jdk的源码,对String的实现有了初步的了解。
①String是一个final类,是不允许继承,不可改变的类。
String是个不可改变类,因此,String类的修改方法,都会生成一个新的String对象。
例如:
String s = "abc";
String x = s.concat("ss");
s仍然是“abc”,x是一个新的对象,值为abcss。
具体创建对象个数学习可参考,http://www.iteye.com/topic/209904
同样原理,String 的+,+=操作也会产生新的对象。
如下:
String s = "abc" + "cd"+"ef";
abccd,abccdef都会存在字符串池中,(abc,cd,ef在编译期就存在字符串池中)
②String 创建的两种基本方法。
我们在创建String时主要有两种基本方法:
一,字符串常量的赋值,String s = "abc"。abc存在栈内存的字符串常量池中。
二,new String()赋值,将创建一个String对象存在,在堆中。
③字符串池
字符串池其实就是常量池中存取String,虚拟机必须为每个被装载的类型维护一个常量池。常量池就是该类型所用到常量的一个有序集和,包括直接常量(string,integer和floating point常量)和对其他类型,字段和方法的符号引用。对于String常量,它的值是在常量池中的。而JVM中的常量池在内存当中是以表的形式存在的,对于String类型,有一张固定长度的CONSTANT_String_info表用来存储文字字符串值,注意:该表只存储文字字符串值,不存储符号引用。