[英]Explanation of toString method output and difference between toString out and hashCode output
[英]Difference between toString() method and using (+“”)
如果我有几乎任何类型的数据类型(我记得),我可以执行以下操作:
int x = 5;
调用函数定义
function_name(String x){ //do something }
像这个function_name(x +“”) //可以使用(+“”)几乎任何我能记住的类型
.toString()
来处理某些数据类型甚至是类。 我理解两者的含义。 但我真的很困惑一件事。
我的问题:为什么我们懒得将toString()
方法用于任何类,即使它使用(+"")
工作正常? 它只是一种为我们类的用户提供使用这个toString()
方法的方法还是更快? 他们是替代品吗?
希望我能澄清我的问题。 谢谢。
调用myObject + ""
等同于调用myObject.toString() + ""
,因此+ ""
只是多余的。
问题:怎么做整数呢? 不是在铸造吗?
答:这是对String.valueOf()的隐式调用
+""
时,你实际上正在调用toString()
方法。 toString()
的对象执行+""
,则调用Object
类的toString()
方法。 制作像MyClass@1948cc8c
这样的东西。 这样你就知道没有toString()
就没有用+""
。 toString()
是在类Object中声明的方法,所有类都隐式继承。 默认情况下,toString()方法返回类名,后跟@后跟hashCode()的十六进制字符串。
Integer类和许多其他类重写此方法以提供有用的东西。
List类不会这样做。 如果你试着
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(),它不是它的替代品。
我用这种方法“+ + +看到的唯一区别是,没有任何中间对象可以与使用toString进行比较。
但是,这可能并不总是正确的,因为jvm可能会执行一些优化以避免创建多个对象。请在下面以粗体显示文本:
字符串连接的结果是对String对象的引用,该对象是两个操作数字符串的串联。 左侧操作数的字符位于新创建的字符串中右侧操作数的字符之前。
除非表达式是编译时常量表达式(第15.28节),否则将新创建String对象(第12.5节)。
实现可以选择在一个步骤中执行转换和连接,以避免创建然后丢弃中间String对象。 为了提高重复字符串连接的性能,Java编译器可以使用StringBuffer类或类似技术来减少通过表达式求值创建的中间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,则使用new Float(x)。 如果T为double,则使用new Double(x)。 然后通过字符串转换将此引用值转换为String类型。
toString()可能无法始终打印出您想要的内容。 如果在未被覆盖的对象*上使用它,它将打印对象的地址。 您可以覆盖toString()以根据需要进行操作。
您无法避免使用toString(),因为这就是java获取对象的字符串表示形式的方式。 x +“”调用x.toString()。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.