一般来说,int 值通过调用以下两种方法之一转换为String:
对于其他原始值,使用这些方法的相应重载。
StringBuilder.append()
表达式"" + x被编译器实现为:
new StringBuilder().append("").append(x).toString()
将x 声明为int,这意味着将调用采用int 参数的append() 的重载。
append(int) 的源代码 (Java 1.8.0_65) 是:
@Override
public StringBuilder append(int i) {
super.append(i);
return this;
}
super 调用导致:
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;
}
String.valueOf()
在不使用字符串连接的情况下将值转换为字符串时,通常通过调用String.valueOf() 来完成。对于 int 值,这意味着 valueOf(int):
public static String valueOf(int i) {
return Integer.toString(i);
}
Integer.toString() 调用是:
public static String toString(int i) {
if (i == Integer.MIN_VALUE)
return "-2147483648";
int size = (i < 0) ? stringSize(-i) + 1 : stringSize(i);
char[] buf = new char[size];
getChars(i, size, buf);
return new String(buf, true);
}
Integer.getChars()
如您所见,两者都是通过实际调用包私有方法 Integer.getChars(int i, int index, char[] buf) 来实现的。
它们实际上都没有创建Integer 的实例,尽管 JLS 暗示它会这样做。