51.String的基本特性
1.String
的基本特性
1.String
是使用一对""
引起来的字符串。可以通过new
或者字面量的方式创建String
2.String
声明为final
的,不可被继承。
3.String
实现了Serializable
接口。表示字符串是支持序列化的。
实现了Comparable
接口,表示String
可以比较大小。
4.JDK8
及以前,内部使用final char[] value
存储字符串数据,JDK9
时改为byte[]
将char
数组换成byte
数组的原因:大多数的String
字符串只包含拉丁文字符,这些字符只需要一个byte
的空间进行存储,如果用一个char
来存储一个拉丁字符,由于一个char
占了两个空间,那么就会有一半的空间被浪费。
5.String
改为用byte[]
加上编码标记(在自己数组的最后是编码标记)进行存储,节约了一些空间。StringBuilder
和StringBuffer
也做了同样的改动。
6.String
具有不可变性。通过字面量的方式(区别于new
)给一个字符串赋值,此时的字符串声明在字符串常量池中。a)
创建新的字符串常量时,会先检查字符串常量池中是不是已经存在了要创建的字符串,如果已经存在了,则不会重新创建,会直接指向已经存在的字符串。b)
对字符串进行连接操作,会重新创建一个新的字符串,不会改变原先的字符串c)
使用replace方法修改字符串时,会重新创建一个新的字符串,不会改变原先的字符串
例子:
/** * String的基本使用:体现String的不可变性 */ public class StringTest1 { @Test public void test1() { String s1 = "abc";//字面量定义的方式,"abc"存储在字符串常量池中 String s2 = "abc";// 如果字符串常量池中存在了“abc”,则不会重新创建,s2会直接指向已经存在的“abc” s1 = "hello"; System.out.println(s1 == s2);// false System.out.println(s1);//abc System.out.println(s2);//abc } @Test public void test2() { String s1 = "abc"; String s2 = "abc"; s2 += "def"; // 对字符串进行连接操作,会重新创建一个新的字符串,不会改变原先的字符串 System.out.println(s2);//abcdef System.out.println(s1);//abc } @Test public void test3() { String s1 = "abc"; String s2 = s1.replace('a', 'm'); // 使用replace方法修改字符串时,会重新创建一个新的字符串,不会改变原先的字符串 System.out.println(s1);//abc System.out.println(s2);//mbc } }
7.字符串常量池中是不会存储相同内容的字符串的。字符串常量池是一个固定大小的HashTable
。
可以使用-XX:StringTableSize
设置StringTable
的长度。JDK6
中,StringTable
的默认长度是1009
;JDK7
及以后中,StringTable
的默认长度是60013
,1009
是可设置的最小值。