String类需要注意的几个点

首先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”

猜你喜欢

转载自blog.csdn.net/wqsbenren/article/details/88775832