隐式转换为字符串 - toString 和 int + ""

8

为什么当我使用这个时:

int a = 1;
methodWithParamString(a + "");

我将a转换为字符串,但是我不能在整数上使用toString()方法吗?

int a = 1;
methodWithParamString(a.toString());

这样写:a+""a.toString() + ""的作用不一样吗?
7个回答

15
不,它的工作方式类似于String.valueOf( a ) + "",进而表现为new StringBuilder( String.valueOf( a ) ).append( "" ).toString()
重要的是要知道这一切都是由编译器完成的,换句话说,这只是语法糖。这就是为什么在循环中将字符串相加不是一个好主意的原因(虽然现代VM可能有一些机制来减少性能开销)。

谢谢,这就是我想要的 :) 你能给一些关于这个的文档链接吗? - MicNeo
1
在这里:http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.18.1 中,第15.18.1.2节中说的内容与此答案类似。 - Harry Joy
2
顺便提一下:String.valueOf(a) 只是调用了 Integer.toString(a) - Peter Lawrey
1
这是上面评论在Java 7中的证明:http://hg.openjdk.java.net/jdk7u/jdk7u6/jdk/file/8c2c5d63a17e/src/share/classes/java/lang/String.java#l2948 - Steve Chambers

6

a 转换为 String 类型

不是。它被转换为 String 类型。(你无法将原始类型隐式或显式地转换为 String 类型。)

这种转换的详细信息在 JLS 中指定 - 15.18.1.1。规范说明,对于原始类型,转换是通过“仿佛”创建适当包装类型的实例然后调用其 toString() 方法来进行的。这使得 Java 编译器可以选择使用其他方法,只要最终结果相同即可。(对于参考类型,转换将把 null 转换为 "null",并通过调用 toString() 把其他非 String 类型转换为 String。)

JLS指出,连接操作会被“仿佛”通过调用String.concat(...)方法执行,并且JLS明确允许对连接序列进行优化。(JLS 15.18.1.2)

2
这个表达式:a+"" 能否像这样工作:a.toString() + ""?
真的不行。
“+”在内部被重载了,而Java不支持原始类型的方法调用。

1
在Java中实现这一点比其他答案所暗示的要简单一些。使用字符串连接运算符与String和对象一起使用会导致调用该对象的toString()方法,然后执行字符串连接。请记住,每当原始类型传递到可以接受对象的上下文中时,Java都会执行“自动装箱”,将int转换为Integer,double转换为Double等。因此,您可以将其视为自动装箱后跟toString()再跟字符串连接。同时,您应该意识到JLS字符串连接规范允许JVM实现优化掉自动装箱,前提是结果相同,因此您的JVM可能会使用StringBuilder,或使用任何其他有效的JVM字节码来创建结果字符串,因此字符串连接运算符的性能通常比自己执行装箱要好。

0

因为int a不是一个对象,而是原始类型。 所以它没有任何方法。 你应该使用装箱:

Integer objectA = new Integer(a);
objectA.toString();

除非你被困在一个过时的Java版本中,否则不要使用new Integer(a),其中a是int类型。你应该依赖于自动装箱或使用Integer.valueOf(a),因为Java内部缓存原始类型(如Integer)的实例化,从而避免创建不必要的实例。 - Axel

0

不行。int是一种基本类型,因此它不是对象,不能有任何方法。
阅读this我认为它会很有帮助。有包装类用于基本类型,例如Integer用于int。您可以调用其toString()方法。
实际上String是Java中的一个特殊类。您可以使用+操作符(不仅仅是)用于字符串和基本类型。我认为您可以在here找到完整的答案。


好的,我明白了。但是这个怎么用呢:a + ""?隐式使用了类似于String.valueof(a)的东西吗? - MicNeo

0

toString()Object 类中的一个方法,任何继承自它的类都将拥有该方法,例如 IntegerString。但是,int 是原始类型而不是对象,因此该方法不存在。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接