使用String s1 = "hello";
和String s2 = new String("hello");
有细微差别。
public static void main(String[] arg ) {
String s1 = "Java";
String s2 = "Java";
String s3 = new String("Java");
System.out.println(s1==s2); //true
System.out.println(s1==s3); //false
StringBuilder sb = new StringBuilder(25); //initial capacikacity
sb = new StringBuilder(10);
sb.append(s1).append(" uses immutable strings.");
sb.setCharAt(20, 'S');
System.out.println(sb);
}
在上面的代码中,“Java”被称为字符串文字。为了节省内存,这两次出现在代码中,都是同一个String字面量,所以s1和s2实际上指的是内存中的同一个对象。虽然s1.equals(s3)
是真的,但它们不会引用内存中的相同对象,如上所示。
在实践中,我们总是.equals
用来比较字符串,它们是不可变的,所以我们不能改变 s1 引用的数据(至少不容易)。但是如果我们能够改变 s1 引用的数据,那么 s2 也会随之改变。
StringBuilder 确实允许您修改底层数据:我们经常使用它来将一个字符串附加到另一个字符串,如上图所示。我们很高兴这StringBuilder sb2 = "what?"
是非法的,因为在 StringBuilders 的情况下,让它们中的两个引用相同的数据(意味着 sb1==sb2)更有可能导致 sb1 的更改导致 sb2 的意外更改的问题。