为什么AbstractStringBuilder.append对MIN_VALUE的行为有所不同?

时间:2015-04-01 16:49:27

标签: java

请考虑java.lang.AbstractStringBuilder

中的以下方法

public AbstractStringBuilder append(long l) {
    if (l == Long.MIN_VALUE) {
        append("-9223372036854775808");
        return this;
    }
    int appendedLength = (l < 0) ? Long.stringSize(-l) + 1
                                 : Long.stringSize(l);
    int spaceNeeded = count + appendedLength;
    ensureCapacityInternal(spaceNeeded);
    Long.getChars(l, spaceNeeded, value);
    count = spaceNeeded;
    return this;
}

整数

public AbstractStringBuilder append(int i) {
    if (i == Integer.MIN_VALUE) {
        append("-2147483648");
        return this;
    }
    int appendedLength = (i < 0) ? Integer.stringSize(-i) + 1
                                 : Integer.stringSize(i);
    int spaceNeeded = count + appendedLength;
    ensureCapacityInternal(spaceNeeded);
    Integer.getChars(i, spaceNeeded, value);
    count = spaceNeeded;
    return this;
}

为什么AbstractStringBuilder#append使用其他算法附加MIN_VALUE

2 个答案:

答案 0 :(得分:3)

因为stringSize算法根据其输入的绝对值估算所需的字符数,但MIN_VALUE没有可表示的绝对值:-Integer.MIN_VALUE == Integer.MIN_VALUE

答案 1 :(得分:1)

因为Integer.stringSize需要非负参数。代码如下所示:

final static int [] sizeTable = { 9, 99, 999, 9999, 99999, 999999, 9999999,
                                  99999999, 999999999, Integer.MAX_VALUE };

// Requires positive x
static int stringSize(int x) {
    for (int i=0; ; i++)
        if (x <= sizeTable[i])
            return i+1;
}