String的子串函数 vs StringBuffer的子串函数
String's substring function vs StringBuffer's substring function
我检查了 String
和 StringBuffer
API,当您调用 substring
方法时,它们似乎在内部工作相同。
两者都有对原始字符数组 (char[] original
) 的引用,因此两者都使用相同的 space。
那为什么偏爱StringBuffer
呢?
stringbuffer.substring(2,4) 与 string.substring(2,4) 有何不同。
StringBuffer 的子串方法:
public String substring(int start, int end) {
return new String(value, start, end - start);
}
字符串的子串方法:
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);
}
调用数组的以下方法class:
public static char[] copyOfRange(char[] original, int from, int to) {
// **char[] original**
return copy;
}
单点判断String
与StringBuffer
的值是错误的。是的,它们在获取子字符串时在功能上非常相似。不,这不会影响是否使用其中一个的争论。
您应该始终使用最好的结构。 String
是不可变的,应该在需要不可变性和某些边缘情况时使用。如果您需要对 CharSequence
进行更改,那么使用 StringBuilder
.
将是 better/safer/faster/more 内存效率
考虑删除字符串的一部分。比较使用 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);
}
我检查了 String
和 StringBuffer
API,当您调用 substring
方法时,它们似乎在内部工作相同。
两者都有对原始字符数组 (char[] original
) 的引用,因此两者都使用相同的 space。
那为什么偏爱StringBuffer
呢?
stringbuffer.substring(2,4) 与 string.substring(2,4) 有何不同。
StringBuffer 的子串方法:
public String substring(int start, int end) {
return new String(value, start, end - start);
}
字符串的子串方法:
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);
}
调用数组的以下方法class:
public static char[] copyOfRange(char[] original, int from, int to) {
// **char[] original**
return copy;
}
单点判断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);
}