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)给一个字符串赋值,此时的字符串值声明在字符串常量池中。Java库中提供string类 java有没有string_赋值
  • String的String pool是一个固定大小的Hashrable,jdk7默认值是60013,可使用-XX:StringTableSize设置大小。
  • 字符串拼接操作
    1.常量与常量的拼接结果是放在常量池,原理是编译期优化。
    2.只要其中一个是变量,结果是放在堆中,拼接原理是StringBuider。
    3.如果拼接的结果调用了intern()方法,会先查询字符串常量池中是否存在该字符串,若不存在,则将当前字符串放入常量池中,并返回此对象的地址,若存在,则直接返回此对象地址,以节约内存。
String s = new String("1") + new String("1");//s变量记录的地址为new String(“11”)
s.intern();// 在常量池中生成 “11”.jdk6创建一个新的对象 “11” 也就是新的地址;
           // jdk7以后 此时常量中并没有创建“11” 而是创建一个指向堆空间中new String(11)的地址。
String ss = "11"; 
System.out.println(s==ss); //true();
  • new String(“ab”)会创建几个对象?
    两个对象:一个对象是 new关键字在堆空间创建;另一个对象是 字符串常量池中的对象。通过查看字节码指令可证明。
  • G1的String去重操作
    开启指令:UseStringDeduplication(pool);