1、String类不可被继承,因为String类是final类。
源代码:public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {...}
2、String str = "hello";
str = str + "world";原始的String对象内容到底改变了没有?
没有改变,这是str不在指向原来的对象,而是指向另外一个对象。StringBuffer没有改变。
3、 String类型有两种内存方式:
(1) String str = "string"; //是将变量值存放到常量池
(2) String str2 = new String("string");//是在堆内存中
如果再创建String str3 = "string";//这时常量池中存在变量值"string"
将直接把"string"的引用值传给str3
4、String.intern()方法的理解
public class StringEqualsTest {
public static void main(String[] args) {
/*
* intern()遵循以下规则:对于任意两个字符串 s 和 t,
* 当且仅当 s.equals(t) 为 true 时,s.intern() == t.intern() 才为 true。
*
* 1、new String()都是在堆内存中创建对象的,当调用intern()方法时,编译器会将字符串添加到常量池中,
* 并返回该常量的引用
* 2、通过字面量赋值创建字符串(String str=""abc)时,会先在常量池中查找是否存在相同的字符串,
* 如果存在,将会把栈中的引用直接指向该字符串;若不存在,则在常量池中生成一个字符串,再将栈中的引用指向该字符串
* JDK1.7之后,intern()方法还是会先去查询常量池中是否已经存在,
* 如果存在,则返回常量池的引用;
* 如果不存在,则不再是复制一个副本放到常量池,而是将堆上的地址引用复制到常量池
*/
String s1 = "programming";
String s2 = new String("programming");
String s3 = "program";
String s4 = "ming";
String s5 = "program" + "ming";
String s6 = s3 + s4;
String intern = s6.intern();
String intern2 = s2.intern();
System.out.println(s1 == s2);//false
System.out.println(s1 == s5);//true
System.out.println(s1 == s6);//false
System.out.println(s1.equals(s6));//true
System.out.println(s1 == s6.intern());//true
System.out.println(s1.intern() == s1);//true
System.out.println(s2 == s2.intern());//false
System.out.println(s1 == intern);//true
System.out.println(intern == intern2);//true
}
}
//可以看收藏里面的 文章https://blog.csdn.net/soonfly/article/details/70147205
5、String中“+”的重载底层原理
public class TestSimplePlus {
public static void main(String[] args) {
String s = "abc";
String ss = "ok" + s +"xyz" + 5;
System.out.println(ss);
}
}