6

下面是String类 的构造函数

public String(String original) {
int size = original.count;
char[] originalValue = original.value;
char[] v;
if (originalValue.length > size) {
    // The array representing the String is bigger than the new
    // String itself.  Perhaps this constructor is being called
    // in order to trim the baggage, so make a copy of the array.
        int off = original.offset;
        v = Arrays.copyOfRange(originalValue, off, off+size);
} else {
    // The array representing the String is the same
    // size as the String, so no point in making a copy.
    v = originalValue;
}
this.offset = 0;
this.count = size;
this.value = v;
}

但是,我想知道怎么可能

if (originalValue.length > size)

发生?评论说'trim the bag'行李是指什么?

4

1 回答 1

4

看一下子字符串,你就会明白这是怎么发生的。

举个例子String s1 = "Abcd"; String s2 = s1.substring(3)。这里s1.size()是 1,但是s1.value.length是 4。这是因为 s1.value 与 s2.value 相同。这是出于性能原因(子字符串在 O(1) 中运行,因为它不需要复制原始字符串的内容)。

使用子字符串会导致内存泄漏。假设您有一个非常长的字符串,并且您只想保留其中的一小部分。如果只使用子字符串,实际上会将原始字符串内容保留在内存中。这样做String snippet = new String(reallyLongString.substring(x,y))可以防止您浪费内存来支持不再需要的大型 char 数组。

另请参阅Java 中表达式“new String(...)”的目的是什么?更多解释。

于 2012-10-16T05:22:25.473 回答