Java StringBuffer和StringBuilder类

2019-03-28 22:36|来源: 网络

Java StringBuffer和StringBuilder类


当对字符串进行修改的时候,需要使用StringBuffer和StringBuilder类。

和String类不同的是,StringBuffer和StringBuilder类的对象能够被多次的修改,并且不产生新的未使用对象。

StringBuilder类在Java 5中被提出,它和StringBuffer之间的最大不同在于StringBuilder的方法不是线程安全的(不能同步访问)。

由于StringBuilder相较于StringBuffer有速度优势,所以多数情况下建议使用StringBuilder类。然而在应用程序要求线程安全的情况下,则必须使用StringBuffer类。

实例

public class Test{

    public static void main(String args[]){
       StringBuffer sBuffer = new StringBuffer(" test");
       sBuffer.append(" String Buffer");
       System.ou.println(sBuffer);  
   }
}

以上实例编译运行结果如下:

test String Buffer

StringBuffer 方法

以下是StringBuffer类支持的主要方法:

序号 方法描述
1 public StringBuffer append(String s)
将指定的字符串追加到此字符序列。
2 public StringBuffer reverse()
 将此字符序列用其反转形式取代。
3 public delete(int start, int end)
移除此序列的子字符串中的字符。
4 public insert(int offset, int i)
int 参数的字符串表示形式插入此序列中。
5 replace(int start, int end, String str)
使用给定 String 中的字符替换此序列的子字符串中的字符。

下面的列表里的方法和String类的方法类似:

序号 方法描述
1 int capacity()
返回当前容量。
2 char charAt(int index)
返回此序列中指定索引处的 char 值。
3 void ensureCapacity(int minimumCapacity)
确保容量至少等于指定的最小值。
4 void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)
将字符从此序列复制到目标字符数组 dst
5 int indexOf(String str)
返回第一次出现的指定子字符串在该字符串中的索引。
6 int indexOf(String str, int fromIndex)
从指定的索引处开始,返回第一次出现的指定子字符串在该字符串中的索引。
7 int lastIndexOf(String str)
返回最右边出现的指定子字符串在此字符串中的索引。
8 int lastIndexOf(String str, int fromIndex)
返回最后一次出现的指定子字符串在此字符串中的索引。
9 int length()
 返回长度(字符数)。
10 void setCharAt(int index, char ch)
将给定索引处的字符设置为 ch
11 void setLength(int newLength)
设置字符序列的长度。
12 CharSequence subSequence(int start, int end)
返回一个新的字符序列,该字符序列是此序列的子序列。
13 String substring(int start)
返回一个新的 String,它包含此字符序列当前所包含的字符子序列。
14 String substring(int start, int end)
返回一个新的 String,它包含此序列当前所包含的字符子序列。
15 String toString()
返回此序列中数据的字符串表示形式。

相关问答

更多
  • 我没有JSR引用,但从我的exp。 以下是几个原因: 作为StringBuffer的子类的StringBuilder 对于性能原因并不是一个好主意 。 为了让StringBuffer线程安全,你必须掩盖每一个对StringBuilder调用,这是很多开销。 除了上述要点之外, 如果您可以直接访问类的内部部分 ,那么Java可以通过java.util.Collections.synchronized* apis添加java.lang.concurrent ,因此可以进一步优化 。 随着更多直接访问提供更多优化 ...
  • 在Java 1.5的新代码中通常应该使用StringBuilder - 这是非常罕见的,您真的需要以线程安全的方式构建字符串,因此为什么要支付同步成本? 我怀疑你使用StringBuffer看到的代码大部分都是以下的桶: 在Java 1.5之前编写 以保持与旧版JDK的兼容性 由不了解StringBuilder人写的 由不了解StringBuilder工具自动生成 It's obsolete in that new code on Java 1.5 should generally use StringBu ...
  • 注意这个答案最近受到一些关注。 我不是主张这个解决方案(这是我以前在STL之前看到的一个解决方案)。 这是一个有趣的方法,只能在std::string或std::stringstream如果在分析您的代码后,发现这会有所改进。 我通常使用std::string或std::stringstream 。 我从来没有遇到任何问题。 如果事先知道字符串的大小,我通常会先预留一些房间。 我已经看到其他人在遥远的过去使自己的优化字符串构建器。 class StringBuilder { private: std ...
  • StringBuilder和StringBuffer实现了CharSequence接口,并且都有一个带有CharSequence参数的构造函数。 Both StringBuilder and StringBuffer implement the CharSequence interface, and both have a constructor that takes a CharSequence parameter.
  • StringBuilder中的一些方法是同步的,而StringBuilder不是线程安全的 - 并且速度更快。 规则 - 使用StringBuilder,除非你有一个用例,其中一个StringBuilder被多个Thread使用(这将是一个非常罕见的情况)。 Some methods in StringBuffer are synchronized while StringBuilder is not thread-safe - and faster. Rule of a thumb - use Strin ...
  • 您引用的规范的措辞源于旧规范。 简单的答案是,在Java 1.5 aka Java 5之前,没有StringBuilder 。 因此,较旧的编译器不必在StringBuffer和StringBuilder之间进行选择,当时的规范只是建议使用可用的。 在Java 5中,引入了StringBuilder ,它不使用synchronized方法,这种方法非常适合String连接的用例,因为它是纯粹的本地操作。 因此,对于针对1.5或更高版本的编译器,有一个选择(仍然包含规范的单词“或类似的技术”),他们将选择St ...
  • 现在,如果我们在StringBuilder对象中有一个String,并且使用它的toString()方法,那么是否会在String池中创建另一个不可变的String 您在StringBuilder没有String 。 这些字符存储在char[] ,当您调用toString() ,会创建一个新的String : public String toString() { // Create a copy, don't share the array return new String(value, ...
  • 这样做会带来哪些优势/优化? 我认为这样做没有任何优势。 我的建议是选择比预期尺寸稍大的初始尺寸......如果你有一个适度的好估计。 如果你没有估算的话,通过提供一个初始尺寸你将不会获得太多收益。 使用明显高估的初始大小不是一个好主意。 它浪费了空间,而且JVM将不得不将所有那些在某些耗费CPU /内存周期的地方使用的字符清零。 [应该可以根据经验确定低估和高估尺寸的成本,并与使用默认初始尺寸的成本进行比较。 然而,这些数字可能取决于JIT优化器的性能如何,以及诸如内存复制速度有多快与可以将其复位速度有多 ...
  • 这是一个警告,而不是一个错误。 Sonar的工作是警告你, 因为 StringBuilder 速度更快,所以它是可取的。 如果API迫使你使用StringBuffer那么我会使用它并使警告消失。 我认为Pattern和两个缓冲区的真正潜在问题是StringBuffer和StringBuilder没有共享用于构建字符串的特定接口( Appendable是一个更通用的接口,我认为它们应该共享一个更具体的接口来构造字符串,比如StringConstructor ) ,这将允许您通过零努力切换实施(通常)。 It' ...
  • 每个类都可以选择以自己的方式计算哈希码。 散列码没有意义,而且非常简单的规则(缩写): equals()返回true的对象必须返回相同的哈希码。 equals()返回false的对象应返回不同的哈希代码,以达到类的最佳能力,以确保哈希表(如HashMap和HashSet更好性能。 由于值为"ABC"的String和值为"ABC"的StringBuilder不相等 ,因此不要求它们返回相同的哈希码。 如果从StringBuilder提取String值,那么该字符串值必须与具有相同值的另一个字符串具有相同的哈希 ...