Java toString()方法和using(+;”之间的区别

Java toString()方法和using(+;”之间的区别,java,Java,如果我有几乎任何类型的数据类型(我记得),我可以执行以下操作: intx=5 用定义调用函数 function_name(String x){ //do something } 像这样的函数\u name(x+“”)//可以使用(+“”)来处理我能记住的几乎任何类型的函数 有时对某些数据类型甚至类使用.toString() 我确实理解两者的含义。但有一件事我真的很困惑 我的问题: 为什么我们要费心为任何类创建toString()方法,即使它可以使用(+)? 这只是让我们类的用户使用这

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

  • intx=5

    用定义调用函数

    function_name(String x){
        //do something
    } 
    
    像这样的函数\u name(x+“”)//可以使用(+“”)来处理我能记住的几乎任何类型的函数

  • 有时对某些数据类型甚至类使用
    .toString()
  • 我确实理解两者的含义。但有一件事我真的很困惑

    我的问题: 为什么我们要费心为任何类创建
    toString()
    方法,即使它可以使用
    (+)
    ? 这只是让我们类的用户使用这个
    toString()
    方法的一种方式,还是更快它们是替代品吗?

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

    调用
    myObject+”
    与调用
    myObject.toString()+”
    相当,因此
    +”
    只是多余的


    问题:对integer执行该操作怎么样?这不是演员吗


    回答:这是对字符串的隐式调用。valueOf()

    toString()可能并不总是打印您想要的内容。如果在未被覆盖的对象*上使用它,它将打印对象的地址。您可以覆盖toString(),使其按需运行。

    您无法避免toString(),因为java就是这样获得对象的字符串表示形式的。x+“”调用x.toString()。

    • 在对象上执行
      +“”
      操作时,实际上是在调用
      toString()
      方法
    • 如果对未覆盖
      toString()
      的对象执行
      +”
      ,则调用
      对象的
      toString()
      方法。生成类似
      MyClass@1948cc8c
      。这样您就知道,如果没有
      toString()
      ,则
      +“
      是没有用的
    是在类对象中声明的方法,所有类都隐式继承自该方法。默认情况下,那里的toString()方法返回十六进制字符串中的类名,后跟@,后跟hashCode()

    Integer类和许多其他类重写此方法以提供有用的内容

    列表类不这样做。如果你想

    System.out.println(myList + "");
    
    你会得到一根看起来很奇怪的绳子。试试看。它不像许多其他人所说的那样是任何东西的“地址”


    简而言之,如果变量+“”对您有效,.toString()已经实现。显式调用.toString()不会改变任何东西,不管怎样,它都会发生。如果它不能与var+“”一起工作,那么与.toString()一起工作也不会更好。您可以通过实现(重写)类的.toString()方法来解决这两个问题。

    它们几乎相同,只是有一个区别:
    myObject+”
    在myObject为null时不会抛出NPE,但
    myObject.toString()++
    会抛出NPE。

    调用
    myObject+”
    相当于调用
    String.valueOf(myObject)+
    。String.valueOf()反过来被重载,以根据参数类型执行各种操作,包括为空对象参数返回“null”,为非空对象参数调用argument.toString(),或为整数参数调用Integer.toString(int)


    所以你的问题没有意义。由于“+”导致调用toString(),因此它不是它的替代方法。

    我看到这种方法“+x”的唯一区别是,与仅使用toString相比,任何中间对象都不可能更有效

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

    字符串连接的结果是对字符串对象的引用 这是两个操作数字符串的串联。人物 左操作数的字符位于右操作数的字符之前 新创建的字符串中的操作数

    字符串对象是新创建的(§12.5),除非表达式是 编译时常量表达式(§15.28)

    实现可以选择执行转换和串联 在一个步骤中避免创建然后丢弃中间 字符串对象以提高重复字符串的性能 连接时,Java编译器可以使用StringBuffer类或 减少中间字符串对象数量的类似技术 通过表达式求值创建的。

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

    仅供参考,以下是基本类型的工作原理:

    任何类型都可以通过字符串转换转换为字符串类型。价值 原始类型T的x首先转换为参考值,就像 将其作为参数提供给适当的类实例创建 表达式(§15.9):如果T是布尔值,则使用新的布尔值(x)。如果T是 字符,然后使用新字符(x)。如果T是byte、short或int,则使用 新的整数(x)。如果T长,则使用新的长(x)。如果T是浮动的, 然后使用新的浮动(x)。如果T是双精度的,则使用新的双精度(x)。这 然后通过字符串转换将引用值转换为类型字符串


    在某些情况下,即使没有toString()方法,我们也可以只执行+“”操作。你能告诉我为什么要使用toString()方法吗?这是我的问题,不是它是如何运作的。这是关于速度还是其他什么?这是我的观点-它将隐式调用到strings的转换,那么对integer进行转换呢?这不是强制转换吗?这是对String的隐式调用。valueOf()@Nabin Integers是具体的例子。但是,您可以考虑其他情况,如用户定义的类。尝试打印该对象的值,您将遇到
    hashcode
    。因此,
    toString()
    被重写,
    +“
    仅用于基本数据类型@天哪,那是什么?对问题
    System.out.println(myList + "");