toString()方法与使用之间的区别(+"")

时间:2014-08-10 05:49:03

标签: java

如果我有几乎任何类型的数据类型(我记得),我可以执行以下操作:

  1. int x = 5;

    带定义的呼叫功能

    function_name(String x){
        //do something
    } 
    

    像这样 function_name(x +“”) //可以使用(+“”)几乎任何我记得的类型

  2. 有时会将.toString()用于某些数据类型甚至是类。
  3. 我确实理解两者的含义。但我真的很困惑。

    我的问题: 即使使用toString()工作正常,我们为什么还要为任何类创建(+"")方法呢? 它只是一种为我们班级的用户提供这种toString()方法的方法,还是更快? 他们是替代品吗?

    希望我能澄清我的问题。谢谢。

8 个答案:

答案 0 :(得分:4)

调用myObject + ""等同于调用myObject.toString() + "",因此+ ""只是多余的。

问题:如何对整数进行操作?不是在铸造吗?

答案:这是对String.valueOf()的隐式调用

答案 1 :(得分:2)

  • 当您对某个对象执行+""时,您实际上正在调用toString()方法。
  • 如果对未覆盖+""的对象执行toString(),则会调用toString()类的Object方法。制作类似MyClass@1948cc8c的内容。这样您就知道+""没有toString()没有用。

答案 2 :(得分:1)

toString()

是在Object类中声明的方法,所有类都隐式继承。默认情况下,toString()方法返回类名,后跟@后跟hashCode()的十六进制字符串。

Integer类和许多其他类重写此方法以提供有用的东西。

List类不会这样做。如果你试图

System.out.println(myList + "");

你会看到一个奇怪的字符串。试试吧。它不是"地址"像许多其他人所说的那样。

简而言之,如果变量+""适合您,.toString()已经实现。显式调用.toString()不会改变任何东西,无论如何都会发生什么。如果它不适用于var +""使用.toString()并没有更好的效果。您可以通过实现(重写)类的.toString()方法来解决这两个问题。

答案 3 :(得分:1)

除了一个区别之外,它们几乎相同: 当myObject为null时,myObject+""不会抛出NPE,但myObject.toString()+""将会抛出。

答案 4 :(得分:1)

致电myObject + ""相当于致电String.valueOf(myObject) + ""。反过来,String.valueOf()被重载以执行依赖于参数类型的各种事情,包括返回" null"对于null对象参数,为非空对象参数调用argument.toString(),或为整数参数调用Integer.toString(int)。

所以你的问题没有意义。作为+""导致调用toString(),它不是它的替代品。

答案 5 :(得分:1)

我用这种方法看到的唯一区别是“”+ x是没有任何中间对象可以与使用toString进行比较。

然而,这可能并不总是正确的,因为jvm可能会执行一些优化以避免创建多个对象。请在下面以粗体显示文本:

来自jls-15.18.1

  

字符串连接的结果是对String对象的引用   这是两个操作数字符串的串联。那些角色   左手操作数的前面是右手的字符   新创建的字符串中的操作数。

     

除非表达式是a,否则新创建String对象(第12.5节)   编译时常量表达式(§15.28)。

     

实现可以选择执行转换和连接   在一步中避免创建然后丢弃中间体   字符串对象。 增加重复字符串的性能   连接,Java编译器可以使用StringBuffer类或a   类似的技术减少了中间String对象的数量   通过评估表达式创建的。

     

对于原始类型,实现也可以优化掉   通过直接从基元转换来创建包装器对象   键入字符串。

仅供参考,这是原始类型的工作原理,来自docs

  

任何类型都可以通过字符串转换转换为String类型。一个值   原始类型T的x首先被转换为参考值,如同   将它作为适当的类实例创建的参数   表达式(第15.9节):如果T是布尔值,则使用new Boolean(x)。如果T是   char,然后使用new Character(x)。如果T是byte,short或int,那么使用   new Integer(x)。如果T很长,则使用新的Long(x)。如果T是浮动的,   然后使用新的Float(x)。如果T为double,则使用new Double(x)。这个   然后通过字符串转换将引用值转换为String类型。

答案 6 :(得分:0)

toString()可能无法始终打印出您想要的内容。如果在未被覆盖的对象*上使用它,它将打印对象的地址。您可以覆盖toString()以根据需要进行操作。

答案 7 :(得分:0)

你不能避免toString(),因为这就是java获取对象的字符串表示的方式。 X +""调用x.toString()。