关于Java的字符串
我将总结一下Java中的String。
String的意思是
这是一个处理字符串的类。它可以像加法一样进行字符串的拼接操作,可能会让C语言转战而来的人感到惊喜。
public class Test {
public static void main(String[] args) {
String a = "aaa";
a += "bbb";
a += "ccc";
System.out.println(a);
}
}
String是一个不可变对象。
表面上看,它看起来像是可以像加法一样连接的String,但实际上它在内部进行了重新创建对象的处理。这是因为String是一种不可修改的不可变对象(Immutable Object)。以前的例子中,它实际上执行了以下操作。
public class Test {
public static void main(String[] args) {
String a = "aaa";
a += "bbb"; // 『aaa』と『bbb』を結合させた文字列『aaabbb』を格納したStringを生成し、その参照をaに代入
a += "ccc"; // 『aaabbb』と『ccc』を結合させた文字列『aaabbbccc』を格納したStringを生成し、その参照をaに代入
System.out.println(a);
}
}
字符串的复制
在Java中有浅拷贝和深拷贝的概念(详细信息请参考Java的clone方法正确的实现方法-Qiita),但是对于String来说,浅拷贝就足够了。这是因为String是不可变对象,即使引用了相同的对象,也不必担心改变其内容。
字符串的连接 (String concatenation)
字符串构建器
字符串生成器
StringBuilder是一种用于连接字符串的对象,它通过append方法将字符串存储在内部的char数组中,并通过toString方法将它们合并成一个String。我之前写的是在连接字符串时会重新创建String,但实际上是使用了这个StringBuilder。例如,上述代码实际上执行了以下操作。
public class Test {
public static void main(String[] args) {
String a = "aaa";
a = (new StringBuilder(String.valueOf(a))).append("bbb").toString(); // 『aaa』と『bbb』を結合させた文字列『aaabbb』を格納したStringを生成し、その参照をaに代入
a = (new StringBuilder(String.valueOf(a))).append("ccc").toString(); // 『aaabbb』と『ccc』を結合させた文字列『aaabbbccc』を格納したStringを生成し、その参照をaに代入
System.out.println(a);
}
}
根据查看此代码,我们可以发现每次连接都会生成一个StringBuilder。然而,考虑到累积后再连接的用法,我们可以发现以下形式更加有效。
public class Test {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
sb.append("aaa");
sb.append("bbb");
sb.append("ccc");
String a = sb.toString();
System.out.println(a);
}
}
字符串缓冲器
StringBuilder的线程安全版本是StringBuffer。用法与StringBuilder相同。
public class Test {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer();
sb.append("aaa");
sb.append("bbb");
sb.append("ccc");
String a = sb.toString();
System.out.println(a);
}
}
concat 方法
String中有一个名为concat的方法,可以将2个String连接在一起,用法如下。
public class Test {
public static void main(String[] args) {
String a = "aaa";
a = a.concat("bbb"); // 『aaa』と『bbb』を結合させた文字列『aaabbb』を格納したStringを生成し、その参照をaに代入
a = a.concat("ccc"); // 『aaabbb』と『ccc』を結合させた文字列『aaabbbccc』を格納したStringを生成し、その参照をaに代入
System.out.println(a);
}
}
在内部,执行了将两个字符串连接成一个String的操作。
灵活运用
如果需要合并多个字符串,使用StringBuilder(或StringBuffer)是更好的选择;如果只需要合并一次字符串,使用concat方法即可。
文献引用
-
- スッキリわかるJava入門 実践編 第2版(中山 清喬・著)
-
- Javaにおけるオブジェクトの複製(clone) – 浅いコピーと深いコピー
-
- 参照についてもう少し詳しく ~PythonとJavaを例に~ – Qiita
- Stringの連結はそう簡単なものではない – じゅんいち☆かとうの技術日誌