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

时间:2015-02-03 12:13:14

标签: java string substring stringbuffer

我浏览了StringStringBuffer API,当您调用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);  
}

String的字符串metohd:

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

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

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

调用以下Arrays类的方法:

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

1 个答案:

答案 0 :(得分:4)

在一个点上判断StringStringBuffer的价值是错误的。是的,他们在获取子串时的功能非常相似。这不会导致关于是否使用其中一个的争论。

您应始终使用最佳结构。 String是不可变的,应该在需要不变性时使用,并且在某些边缘情况下应该使用CharSequence。如果您需要对StringBuilder进行更改,那么使用String会更好/更安全/更快/更节省内存。

考虑删除字符串的一部分。比较使用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); } 只删除字符串的部分。

{{1}}