String 的子串函数 vs StringBuffer 的子串函数

Dee*_*ohn 1 java string substring stringbuffer

我浏览了StringStringBufferAPI,当您调用该substring方法时,两者在内部的工作方式似乎相同。两者都有对原始字符数组 ( char[] original)的引用,因此两者都使用相同的空间。那为什么是StringBuffer首选呢?那么 stringbuffer.substring(2,4) 与 string.substring(2,4) 有何不同。

StringBuffer 的子串方法:

public String substring(int start, int end) {
    return new String(value, start, end - start);  
}
Run Code Online (Sandbox Code Playgroud)

字符串的子串方法:

public String substring(int beginIndex, int endIndex) {
    return ((beginIndex == 0) && (endIndex == value.length)) ? this
       : new String(value, beginIndex, subLen);
}
Run Code Online (Sandbox Code Playgroud)

两个子字符串变体然后调用 String 构造函数:

public  String(char value[], int offset, int count) {
    this.value = Arrays.copyOfRange(value, offset, offset+count);
}
Run Code Online (Sandbox Code Playgroud)

它调用以下 Arrays 类的方法:

public static char[] copyOfRange(char[] original, int from, int to) {
    // **char[] original**
   return copy;
}
Run Code Online (Sandbox Code Playgroud)

Old*_*eon 5

仅凭一点来判断String对立的值是错误的StringBuffer。是的,它们在获取子字符串时的功能非常相似。不,这对是否使用一种或另一种的争论没有贡献。

您应该始终使用最佳结构。String是不可变的,应该在需要不变性和某些边缘情况时使用。如果您需要对 a 进行更改,CharSequence那么使用StringBuilder.

考虑删除字符串的一部分。比较使用 aString和使用 a 的方法StringBuilder- 看看它有多容易。这不仅更容易,而且效率更高。该String机制创建了两个新对象,然后将它们加在一起形成第三个。在StringBuilder一个只是删除了字符串的部分。

public void test() {
    String a = "0123456789";
    StringBuilder b = new StringBuilder(a);
    System.out.println("a=" + a + " b=" + b);
    a = a.substring(0, 2) + a.substring(5);
    b.delete(2, 5);
    System.out.println("a=" + a + " b=" + b);
}
Run Code Online (Sandbox Code Playgroud)