String
String的基本特性
- String:字符串,使用一对“”引起来表示
String str = “Hello”; //字面量的形式。
String str = new String(“Hello”); - String声明为final的不能被继承,实现了Serializable接口,表示字符串是支持序列化的,实现了Comparable接口,表示String可以比较大小。
- String在jdk8以前内部定义了final char[ ] value用于存储字符串,在jdk9时改为btye [ ]加上编码标记,节约了一些空间(原因:char占两个字节,而大部字符是拉丁文一个字节就可以存入,对于需要两个字节存放的,可根据编码标记判断)。
- String 代表不可变的字符序列。
①当字符串重新赋值,②对现有字符串进行连接操作,③使用replace()方法修改指定字符串,都需要重写指定内存区域赋值,不能使用原有的value赋值。 - 通过字面量的方式(区别与new)给一个字符串赋值,此时的字符串值声明在字符串常量池中。
字
符
串
常
量
池
中
是
不
会
存
储
相
同
内
容
的
字
符
串
的
。
\color{red}{字符串常量池中是不会存储相同内容的字符串的}。
字符串常量池中是不会存储相同内容的字符串的。
- String的String pool是一个固定大小的Hashrable,jdk7默认值是60013,可使用-XX:StringTableSize设置大小。
- 字符串拼接操作
1.常量与常量的拼接结果是放在常量池,原理是编译期优化。
2.只要其中一个是变量,结果是放在堆中,拼接原理是StringBuider。
3.如果拼接的结果调用了intern()方法,会先查询字符串常量池中是否存在该字符串,若不存在,则将当前字符串放入常量池中,并返回此对象的地址,若存在,则直接返回此对象地址,以节约内存。
String s = new String("1") + new String("1");
s.intern();
String ss = "11";
System.out.println(s==ss);
- new String(“ab”)会创建几个对象?
两个对象:一个对象是 new关键字在堆空间创建;另一个对象是 字符串常量池中的对象。通过查看字节码指令可证明。 - G1的String去重操作
开启指令:UseStringDeduplication(pool);