首先String这个类被final关键字修饰
所以String是个常量,在它被创建的那一刻起它的值就不会改变了
关于String的一道经典面试题:
public class demo {
public static void main(String[] args) {
String a = "abc";
String b = "abc";
String c = new String("abc");
System.out.println(a==b); //true
System.out.println(a.equals(b)); //true
System.out.println(a==c); //false
System.out.println(a.equals(c)); //true
}
}
其中涉及到String的两种构造方法:
1.String a = "abc";
直接赋值方式创建对象(在方法区的常量池)
2.String c = new String("abc");
通过构造方法创建对象(在堆内存)
关于题目的图解:
分析:因为String太过常用,JAVA类库的设计者在实现时做了个小小的变化,即采用了享元模式(后面会介绍),每当生成一个新内容的字符串时,他们都被添加到一个共享池中,当第二次再次生成同样内容的字符串实例时,就共享此对象,而不是创建一个新对象,但是这样的做法仅仅适合于通过=符号进行的初始化。
需要说明一点的是,在object中,equals()是用来比较内存地址的,但是String重写了equals()方法,用来比较内容的,即使是不同地址,只要内容一致,也会返回true,这也就是为什么a.equals(c )返回true的原因了。
亨元模式
其实字符串常量池这个问题涉及到一个设计模式,叫“享元模式”,顾名思义 - - - > 共享元素模式
也就是说:一个系统中如果有多处用到了相同的一个元素,那么我们应该只存储一份此元素,而让所有地方都引用这一个元素
Java中String部分就是根据享元模式设计的,而那个存储元素的地方就叫做“字符串常量池 - String Pool”
想了解更多String类的知识请阅读
https://www.cnblogs.com/zhangyinhua/p/7689974.html#_label3