今天在牛客网上做了这么一道题
当时没怎么思考所以做错了,然后看了大佬们的解析
于是打算翻一翻String的源码
关于String类,JDK源码当中是这样的(我这里使用的是JDK1.8):
public final class String
implements java.io.Serializable, Comparable, CharSequence {
/** The value is used for character storage. */
private final char value[];
/** Cache the hash code for the string */
private int hash; // Default to 0
/** use serialVersionUID from JDK 1.0.2 for interoperability */
private static final long serialVersionUID = -6849794470754667710L;
......
}
可以看到String类是final修饰的类。在Java中,我们知道,被final修饰的类是不允许被继承的,而且该类中的成员方法都默认为是final方法。 所以我们说String对象是不可变的,具有只读特性,也因此它是可以共享的。也正因为String对象是不可变的,我们在对String对象的进行任何操作的时候,其都会为我们生成一个新的String对象,并将原本的对象引用(或者新声明的对象引用)指向新的String对象,而原本的String对象并没有丝毫的改变。
下面来看段代码:
public class StringTest {
public static void main(String[] args) {
String nameXX = "Xiaobai";
// 新生成了对象并指向新声明的引用
String nameDX = nameXX.toLowerCase();
System.out.println(nameXX); // 结果为: Xiaobai
System.out.println(nameDX); // 结果为: xiaobai
}
}
以上代码在调用String对象toLowerCase()方法的过程中,生成了一个新的String对象,并指向了新声明的nameDX引用,并不影响原本的nameXX。