关于java中String的地址和值的问题

classTest1{publicstaticvoidmain(String[]args){Stringa="abc";//问题1,是不是在堆内存的常量池里放了“abc”... class Test1
{
publicstaticvoid main(String[] args){
String a = "abc";//问题1,是不是在堆内存的常量池里放了“abc”然后在栈内存里放了a,a中存的是常量池里abc的地址?
String b = new String("abc");
tt tt1 = new tt();
System.out.println(tt1);//问题2,这个地方打出来的是什么东西,是地址吗?
System.out.println(a);//问题3,这个地方打出来的为什么是a的值得,而不是问题2那样的东西?
System.out.println(b);//问题4,既然是对象,为什么也会打出来值?而不是问题2那样的东西。
System.out.println(a.hashCode());//可选题,hashCode不是打印地址吗?(该题值20分)
System.out.println(b.hashCode());
System.out.println(a==b);//问题5,这里比的是地址吗?
}
}
class tt{
}

请解答以上六个问题。
展开
 我来答
zsc我行我素
2013-11-04 · TA获得超过241个赞
知道小有建树答主
回答量:142
采纳率:0%
帮助的人:92.7万
展开全部
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()方法,那就要看方法是怎么实现的了。

亲:希望对你有所帮助,如果觉得还不错,请采纳!
jackwind1987
2013-11-04 · TA获得超过2738个赞
知道大有可为答主
回答量:1268
采纳率:50%
帮助的人:496万
展开全部

首先,java里是没有明确的地址的,变量里存的是引用,这两个概念上基本可以等同,但java里没有地址的说法。

  1. 是的,就是这样。a里只是一个引用。

  2. 对象没有实现toString方法的时候,就会打印hashcode的值,默认的hashcode的值就是底层的地址,也只有在这种情况下才能看到地址。

  3. 因为string类有tostring方法

  4. 同上

  5. 重定义了hashcode函数就不会打印地址了。

  6. 比的是引用,是的,比的是地址

追问
a和b的hashcde我打印出来看了一下是一样的,根据您对问题2的回答就是说他们地址一样吗?如果一样为什么 System.out.println(a==b);的比较结果是false呢?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
壁纸汇集站
2013-11-04 · TA获得超过155个赞
知道小有建树答主
回答量:252
采纳率:0%
帮助的人:64万
展开全部
问题1 就是在常量池里的
问题2,是地址值
问题3,String类继承了Object,但是String类重写了Object的toString()方法,返回的是string类型的内容;
问题4,同上
a.hashCode()返回的是哈希值(一个int类型的数),System.out.println(int类型)的时候打印的也是int值本身
问题5,比较的是地址值。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
L93_01
2018-02-09
知道答主
回答量:9
采纳率:50%
帮助的人:2.8万
展开全部
首先应该理解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引用的是不同的对象了。
最后,建议多去看一下源码,你就明白了。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式