Nat*_*rad 4 java string int tostring
首先,我的问题是如何将原始类型int转换为a String而不是Object,因此没有toString()获取String值的方法.
我很清楚,你怎么现在能够看似原始类型的变量"转换" int到StringJava中.我使用的最简单的方法是:
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,short或int,则使用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中添加的.
通常,通过调用以下两种方法之一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 暗示它会创建。
| 归档时间: |
|
| 查看次数: |
462 次 |
| 最近记录: |