Java 隐式转换为字符串-toString和int+&引用&引用;
为什么我使用这个:Java 隐式转换为字符串-toString和int+&引用&引用;,java,casting,implicit,Java,Casting,Implicit,为什么我使用这个: int a = 1; methodWithParamString(a + ""); a被强制转换为字符串,但我不能对整数使用toString() int a = 1; methodWithParamString(a.toString()); 这是不是:a+“”的工作原理类似于:a.toString()+“” 否。int是一种基本类型,因此它不是对象,不能有任何方法。 我想这会有帮助的。有一些用于原语的包装类,例如Integer用于int。您可以为它们调用toString(
int a = 1;
methodWithParamString(a + "");
a被强制转换为字符串,但我不能对整数使用toString()
int a = 1;
methodWithParamString(a.toString());
这是不是:
a+“”
的工作原理类似于:a.toString()+“”
否。int
是一种基本类型,因此它不是对象,不能有任何方法。我想这会有帮助的。有一些用于原语的包装类,例如
Integer
用于int
。您可以为它们调用toString()
方法。实际上,
String
在java中是一个特殊的类。您可以对字符串和原语使用+(而不仅仅是)运算符。我想你会找到你问题的完整答案 因为int a-不是对象,所以它是基元类型。
所以它没有任何方法。
你应该使用拳击:
Integer objectA = new Integer(a);
objectA.toString();
toString()
是Object
类中的一个方法,从它继承的任何类都将具有该方法,如Integer
或String
。但是int
是一种基本类型而不是对象,因此该方法不存在。否,它的工作原理类似于String.valueOf(a)+“
,其行为又类似于新的StringBuilder(String.valueOf(a)).append(”).toString()
需要知道的重要一点是,这一切都是由编译器完成的,换句话说,这是语法上的糖分。例如,这就是为什么在循环中添加字符串不是一个好主意。(尽管现代虚拟机可能有一些机制来减少性能开销。)
这个:a+“”的工作原理是否类似于:a.toString()+“”
对。没有
+
在内部重载。Java不支持对原语的方法调用
一根弦被抛到弦上
否。它已转换为字符串。(不能隐式或显式地将基元类型强制转换为字符串。)
JLS-中规定了此转换的详细信息。该规范规定,对于基元类型,转换是“好像”创建了相应包装类型的实例,然后在其上调用toString()
。这使得Java编译器可以选择使用其他方法,只要最终结果相同。(对于引用类型,通过调用toString()
,将null
转换为“null”
,并将其他非字符串类型转换为字符串)
JLS声明,然后通过调用
String.concat(…)
“仿佛”执行连接,注意JLS明确允许优化连接序列。(JLS)在Java中实现这一点的方法实际上比其他答案所建议的要简单一些
对字符串和对象使用字符串连接运算符会导致调用该对象的toString()
方法,然后执行字符串连接
请记住,每当一个原语被传递到一个对象有效的上下文时,Java就会执行“自动装箱”,将int
转换为Integer
,将double
转换为double
,等等
因此,您可以将其视为自动装箱,然后是toString(),然后是字符串连接
同时,您应该认识到,如果结果相同,则允许JVM实现优化自动装箱,因此您的JVM可以使用StringBuilder,或者使用任何其他有效的JVM字节码来创建生成的字符串,因此,字符串连接运算符的性能通常比自己装箱要好。好的,我知道。但是这个:a+“”是如何工作的呢?隐式使用的是类似于:String.valueof(a)的东西吗?谢谢,这就是我想要的:)你能提供一些关于这个的文档链接吗?这里:在15.18.1.2中,它说的与这个答案类似。顺便说一句:
String.valueof(a)
只是调用Integer.toString(a)
以下是Java 7中上述评论的证明:除非您没有使用过时的Java版本,否则不要使用新整数(a)
其中a是整数。您应该依赖自动装箱或使用Integer.valueOf(a)
因为Java在内部缓存Integer等基本体的实例化,从而避免创建不必要的实例。