关于java中String的地址和值的问题25
发布网友
发布时间:2023-10-11 16:58
我来回答
共4个回答
热心网友
时间:2024-11-19 20:16
System.out.pringln(Object); 首先它打印的是Object的toString()方法的返回值。
问题1如你所说的那样。
问题2,打印出来 什么 那要看你tt的toString() 方法是怎么实现的,如果没有toString()方法,那tt会默认继承Object的toString()方法,而Object的toString()方法的实现就是返回对象的地址值。
问题3,String类同样也继承了Object,但是String类重写了Object的toString()方法,重写的目的就是返回字符串值本身,而非地址值。
问题4,同问题3.
a.hashCode()返回的是哈希值(一个int类型的数),System.out.println(int类型)的时候打印的也是int值本身
问题5,比较的是地址值。
总结: 打印出来什么是看对象类有没有实现toString()方法,如果没有那就打印对象的地址值,如果对象类重写了toString()方法,那就要看方法是怎么实现的了。
亲:希望对你有所帮助,如果觉得还不错,请采纳!
热心网友
时间:2024-11-19 20:17
首先,java里是没有明确的地址的,变量里存的是引用,这两个概念上基本可以等同,但java里没有地址的说法。
是的,就是这样。a里只是一个引用。
对象没有实现toString方法的时候,就会打印hashcode的值,默认的hashcode的值就是底层的地址,也只有在这种情况下才能看到地址。
因为string类有tostring方法
同上
重定义了hashcode函数就不会打印地址了。
比的是引用,是的,比的是地址
追问a和b的hashcde我打印出来看了一下是一样的,根据您对问题2的回答就是说他们地址一样吗?如果一样为什么 System.out.println(a==b);的比较结果是false呢?
热心网友
时间:2024-11-19 20:17
问题1 就是在常量池里的
问题2,是地址值
问题3,String类继承了Object,但是String类重写了Object的toString()方法,返回的是string类型的内容;
问题4,同上
a.hashCode()返回的是哈希值(一个int类型的数),System.out.println(int类型)的时候打印的也是int值本身
问题5,比较的是地址值。
热心网友
时间:2024-11-19 20:18
首先应该理解Object的hashCode()方法,API上是这样说的:实际上,由 Object 类定义的 hashCode
方法确实会针对不同的对象返回不同的整数。(这一般是通过将该对象的内部地址转换成一个整数来实现的,但是 JavaTM 编程语言不需要这种实现技巧。)
然后,在你打印的时候会去调用该对象的toString()方法。由于tt类默认继承Object类,所以调用基于Object的toString()方法,也就是“类名@hashCode”这种形式的内容。由于你的a,b是String类型的引用,就会调用String类的toString()方法,也就是"abc"自身了。同样由于String类的hashCode()方法是这样计算的:s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]。如果你想计算a基于Object的hashCode,那么就要用System.identityHashCode(a),这样你就可以看出a,b引用的是不同的对象了。
最后,建议多去看一下源码,你就明白了。