注意点:
①String被final修饰,不可被继承,是不可变的字符序列
②String在jdk8及以前内部定义了final char value[]
用于存储字符串数据。JDK9时改为byte[]
③字符串常量池是不会存储相同内容的字符串的
④jdk7前在永久代的运行时常量池中,jdk7及之后在堆中
字符串的拼接:
1、常量与常量的拼接结果在常量池,原理是编译期优化
“a” + “b” + “c” 优化成了 “abc”
2、拼接前后,只要其中有一个是变量,结果就在堆中
调用 intern() 方法,则主动将字符串对象存入字符串常量池中,并将其地址返回
intern() 方法:是一个本地方法,在调用intern方法时,如果池中已经包含了由equals(object)方法确定的与该字符串内容相等的字符串,则返回池中的字符串地址。否则,该字符串对象将被添加到池中,并返回对该字符串对象的地址。
---》示例: String s3 = new String("1") + new String("2");
堆上:new String("1")、new String("2")、 new String("12")
字符串常量池:"1"、"2"
StringBuilder的toString():toString()的调用,在字符串常量池中,没有生成"12"
jdk6中:在字符串常量池(此时在永久代)中创建一个字符串"ab"
jdk8中:字符串常量池(此时在堆中)中没有创建字符串"ab",而是创建一个引用,指向new String("ab"),将此引用返回