1.所有语言对字符串的底层实现都是字符数组,数组最大的缺陷就是长度固定,因此字符串的常量是不可以改变的。
String str = "hello" ;
str = str + " world" ;
str += "!!!" ;
System.out.println(str); // hello world!!!
- 字符串常量是str ,字符串对象是 “hello” 这些值,以上变换的是字符串的对象,而不是字符串的常量str。
- 因此我们总结为:任何的字符串常量都是String对象,而且String的常量一旦声明不可改变,如果改变对象内容,改变的是其引用的指向而已。
2.因此Java里面为了方便字符串的修改,提供StringBuffer类
我们来看一段代码:
public class stringBufferTest {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer();
sb.append("Hello").append("World");
test(sb);
System.out.println(sb);
}
public static void test(StringBuffer temp) {
temp.append("\n").append("你好 世界");
}
}
输出:
HelloWorld
你好 世界
- 需要指出的是:在String中使用"+"来进行字符串连接,但是这个操作在StringBuffer类中需要更改为append()方法:
StringBuilder也可以进行字符串的修改,但它采用异步处理,是一个线程不安全的操作。
请看代码:
public class stringBufferTest {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer();
StringBuilder st = new StringBuilder();
st.append("Hello").append("World");
test1(st);
System.out.println(st);
sb.append("Hello").append("wang");
test(sb);
System.out.println(sb);
}
public static void test(StringBuffer temp) {
temp.append("\n").append("你好 世界");
}
public static void test1(StringBuilder temp) {
temp.append("\n").append("你好 wang");
}
}
执行结果:
HelloWorld
你好 wang
Hellowang
你好 世界
异步操作与同步操作的相比:异步操作速度快,但线程不安全。
通过以上的分析,我们可以得出String,StringBuffer和stringBuilder区别是:
- String的内容不可修改,StringBuffer与StringBuilder的内容可以修改.
- StringBuffer采用同步处理,属于线程安全操作;而StringBuilder采用异步处理,属于线程不安全操作