关于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{
}
请解答以上六个问题。 展开
{
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{
}
请解答以上六个问题。 展开
4个回答
展开全部
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()方法,那就要看方法是怎么实现的了。
亲:希望对你有所帮助,如果觉得还不错,请采纳!
问题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()方法,那就要看方法是怎么实现的了。
亲:希望对你有所帮助,如果觉得还不错,请采纳!
展开全部
首先,java里是没有明确的地址的,变量里存的是引用,这两个概念上基本可以等同,但java里没有地址的说法。
是的,就是这样。a里只是一个引用。
对象没有实现toString方法的时候,就会打印hashcode的值,默认的hashcode的值就是底层的地址,也只有在这种情况下才能看到地址。
因为string类有tostring方法
同上
重定义了hashcode函数就不会打印地址了。
比的是引用,是的,比的是地址
追问
a和b的hashcde我打印出来看了一下是一样的,根据您对问题2的回答就是说他们地址一样吗?如果一样为什么 System.out.println(a==b);的比较结果是false呢?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
问题1 就是在常量池里的
问题2,是地址值
问题3,String类继承了Object,但是String类重写了Object的toString()方法,返回的是string类型的内容;
问题4,同上
a.hashCode()返回的是哈希值(一个int类型的数),System.out.println(int类型)的时候打印的也是int值本身
问题5,比较的是地址值。
问题2,是地址值
问题3,String类继承了Object,但是String类重写了Object的toString()方法,返回的是string类型的内容;
问题4,同上
a.hashCode()返回的是哈希值(一个int类型的数),System.out.println(int类型)的时候打印的也是int值本身
问题5,比较的是地址值。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
首先应该理解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引用的是不同的对象了。
最后,建议多去看一下源码,你就明白了。
方法确实会针对不同的对象返回不同的整数。(这一般是通过将该对象的内部地址转换成一个整数来实现的,但是 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引用的是不同的对象了。
最后,建议多去看一下源码,你就明白了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询