原始类型int如何实际转换为String?

Nat*_*rad 4 java string int tostring

首先,我的问题是如何将原始类型int转换为a String而不是Object,因此没有toString()获取String值的方法.

我很清楚,你怎么现在能够看似原始类型的变量"转换" intStringJava中.我使用的最简单的方法是:

int x = 5;
String y = "" + x;
Run Code Online (Sandbox Code Playgroud)

这非常有效,但我的问题如下:

由于原始类型int不是Object,因此没有任何方法,例如toString()我需要的方法,以获取String变量的值...如何是没有这种基本方法的变量值?

rge*_*man 11

这称为字符串转换.在JLS,第5.1.11规定:

任何类型都可以String通过字符串转换转换为类型.

首先将基本类型T的值x转换为引用值,就好像将它作为参数提供给适当的类实例创建表达式(第15.9节):

(其他类型)

  • 如果T是byte,shortint,则使用new Integer(x).

然后通过字符串转换将此引用值转换为String类型.

现在只需要考虑参考值:

  • 如果引用null,它被转换成字符串"null"(4个ASCII字符n,u,l,l).

  • 否则,执行转换就好像通过调用toString没有参数的引用对象的方法一样; 但是如果调用toString方法的结果是null,则使用字符串"null".

所以,它int被转换为a Integer,而不是通过拳击转换,而是通过new Integer(x),然后toString()调用它.

从技术上讲,它不是拳击转换; 自Java开始以来,字符串转换一直使用该语言,其中装箱转换是在Java 1.5中添加的.


And*_*eas 4

通常,通过调用以下两种方法之一int将值转换为:String

对于其他原始值,使用这些方法中任一方法的相应重载。

StringBuilder.append()

该表达式"" + x由编译器实现为:

new StringBuilder().append("").append(x).toString()
Run Code Online (Sandbox Code Playgroud)

x声明为,这意味着将调用带有参数int的重载。append()int

其来源(Java 1.8.0_65)是append(int)

@Override
public StringBuilder append(int i) {
    super.append(i);
    return this;
}
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

String.valueOf()

当不使用字符串连接将值转换为字符串时,通常通过调用String.valueOf(). 对于一个int值意味着valueOf(int)

public static String valueOf(int i) {
    return Integer.toString(i);
}
Run Code Online (Sandbox Code Playgroud)

通话内容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);
}
Run Code Online (Sandbox Code Playgroud)

整数.getChars()

正如您所看到的,两者都是通过实际调用 package-private 方法来实现的Integer.getChars(int i, int index, char[] buf)

它们实际上都没有创建 的实例Integer,尽管 JLS 暗示它会创建。