我浏览了String
和StringBuffer
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;
}
答案 0 :(得分:4)
在一个点上判断String
对StringBuffer
的价值是错误的。是的,他们在获取子串时的功能非常相似。这不会导致关于是否使用其中一个的争论。
您应始终使用最佳结构。 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}}