前面的是分析字符串可变和不可变的具体示例,区别总结可以直接划到最后看。
- String:
String
类是不可变的,也就是说,一旦一个String
对象被创建,它的内容就不能改变。如果你对一个String
对象进行操作,例如拼接,那么实际上会创建一个新的String
对象。由于String
对象不可变,所以它是线程安全的,可以在多线程环境中安全使用。
String s1 = "Hello";
String s2 = s1;
s1 = s1 + " World";
// s1 现在是 "Hello World"
// s2 还是 "Hello",因为 String 是不可变的,s1 的改变不影响 s2
- StringBuffer:
StringBuffer
类是可变的。它提供了一系列方法(如append
,insert
,delete
等)来修改字符串。StringBuffer
内部使用同步(synchronization)来实现线程安全,所以你可以在多线程环境中安全地使用StringBuffer
。但是,这种线程安全是有代价的,如果你的应用不需要线程安全,那么使用StringBuffer
可能会比使用StringBuilder
慢。
StringBuffer sb1 = new StringBuffer("Hello");
StringBuffer sb2 = sb1;
sb1.append(" World");
// sb1 现在是 "Hello World"
// sb2 也是 "Hello World",因为 StringBuffer 是可变的,sb1 的改变也影响了 sb2
- StringBuilder:
StringBuilder
类和StringBuffer
类非常相似,它们都是可变的,都提供了修改字符串的方法。然而,StringBuilder
并没有实现线程安全,所以它通常比StringBuffer
快。如果你的应用不需要线程安全,那么通常推荐使用StringBuilder
。
StringBuilder sb1 = new StringBuilder("Hello");
StringBuilder sb2 = sb1;
sb1.append(" World");
// sb1 现在是 "Hello World"
// sb2 也是 "Hello World",因为 StringBuilder 是可变的,sb1 的改变也影响了 sb2
总结:在选择使用String
,StringBuffer
还是StringBuilder
时,主要需要考虑字符串是否需要被修改,以及是否需要线程安全。如果字符串不需要修改,或者你需要线程安全,那么应该使用String
或StringBuffer
。如果字符串需要被频繁修改,而且不需要线程安全,那么应该使用StringBuilder
。
-
String:
- 不可变类:String 类是不可变的,即一旦创建,其值就不能被修改。
- 线程安全:由于字符串不可变,String 类是线程安全的,多个线程可以共享同一个 String 对象而无需担心数据的修改。
- 操作效率较低:由于不可变性质,对 String 进行连接、替换等操作时,会创建新的 String 对象,导致不断的内存分配和复制操作,效率较低。
- 适用于不需要频繁修改字符串内容的情况,如字符串常量、方法参数传递等。
-
StringBuffer:
- 可变类:StringBuffer 类是可变的,可以在现有对象的基础上进行修改,而不需要创建新的对象。
- 线程安全:StringBuffer 类的方法是线程安全的,适用于多线程环境。
- 操作效率较低:由于线程安全的需要,StringBuffer 的方法使用了同步机制,导致性能较低。
- 适用于多线程环境或需要频繁修改字符串内容的情况,如字符串拼接、循环追加等。
-
StringBuilder:
- 可变类:StringBuilder 类也是可变的,可以在现有对象的基础上进行修改。
- 非线程安全:StringBuilder 类的方法不是线程安全的,不适用于多线程环境。
- 操作效率较高:由于不需要考虑线程安全的同步机制,StringBuilder 的方法执行效率较高。
- 适用于单线程环境且需要频繁修改字符串内容的情况,如字符串拼接、循环追加等。