首页 新闻 会员 周边

直接toString获取的为什么是地址值而且使用Arrays.toString()获取的长度不对

0
悬赏园豆:5 [已解决问题] 解决于 2020-03-09 16:02

知者为师!
在此请教各位老师一个问题,(这个问题已经百度过,但没有找到对应的答案)如下:
今天解决力扣算法题的时候自己发现的一个从来没有仔细研究的问题
先上关键代码

char[] c = str.toCharArray();//该字符数组中有7个字符
str = c.toString();
str1 = Arrays.toString(c);

System.out.println( str.length()); //返回str的长度是11
System.out.println("str= " + str); //直接打印str输出的是地址值[C@15db9742

System.out.println( str1.length()); //返回str1的长度是18
System.out.println("str1= " + str1); //直接打印str1输出的是str1= [9, 0, 1, 0, 0, 0]

问题如下:
1.为什么直接使用str = c.toString();后打印str的值获取的是一个地址值?
2.为什么使用str1 = Arrays.toString(c);后打印str1的长度是18?这18位的长度是7个字符加11位地址值吗?
3.直接使用c.toString();和 Arrays.toString(c);有什么区别?

Minstrelxv的主页 Minstrelxv | 初学一级 | 园豆:199
提问于:2020-03-08 22:43
< >
分享
最佳答案
2

问题一:
str = c.toString() 在Java中c数组也是一个对象,该对象继承了Object,但是没有重写(override)Object类中的toString方法,所以根据对象的多态性,c.toString()调用的是Object类中的toString方法,参考源码如下:

JDK源码中的Object类的toString方法
public String toString() {
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
收获园豆:5
wengle | 小虾三级 |园豆:567 | 2020-03-09 08:41

问题二:
Java array length

根据这段话的描述,数组的长度是由[]+元素个数+逗号+空格组成,因此:"[9, 0, 0, 1, 0]"这个字符串的长度是18

wengle | 园豆:567 (小虾三级) | 2020-03-09 08:46

问题三:
Arrays.toString一般用于数组转string
c.toString()很少有这种用法

wengle | 园豆:567 (小虾三级) | 2020-03-09 08:48

如果解决了你的问题,请采纳~~~ 😄
附上问题二的链接:https://www.techiedelight.com/convert-char-array-string-java/

wengle | 园豆:567 (小虾三级) | 2020-03-09 09:02

嗯,谢谢您的回答,昨天检查代码的时候查看c.toString它直接跳转到了Object中,一直纳闷,现在看了您的回答才想起来,自定义数组没有重写toString方法时,默认情况使用继承自object的toString方法,第二个问题的解答还真是没有接触过,感谢您的耐心解答,谢谢!

Minstrelxv | 园豆:199 (初学一级) | 2020-03-09 11:22

@My-Question: 能够帮到你,我很高兴,如果解决了你的问题,请采纳~~~ 这是对我最大的鼓励,谢谢

wengle | 园豆:567 (小虾三级) | 2020-03-09 13:55
其他回答(1)
1

上面这位同学讲的已经清楚了
面向对象里几个重要特征就是抽象,封装,继承,多态,
一个方法最重要的是看 参数 和返回值类型
你之所以有这些问题 ,是因为这些概念你还不太深入理解
正题:
Java中 每个类都会继承Object,理所当然的会继承里面的方法 toString方法就是Object里面的。你把Object里面的方法都去熟悉一下,看方法着重关注的是返回值和参数,你会看到toString方法返回值类型就是String类型。Object中的toString方法是字符串的形式返回类的地址信息。很多时候 像组数这种类型(也是Object的子类)调用它的toString方法是想获取数组里的内容信息,而不是地址信息,这时就需要对继承的toString方法进行覆盖重写,很多类正是因为重写了toString方法才让你看到不同的效果。
正如Arrays类重写了toString方法

所以你第二个问题:
str1 = Arrays.toString(c);
System.out.println("str1= " + str1); //直接打印str1输出的是str1= [9, 0, 1, 0, 0, 0]
2.为什么使用str1 = Arrays.toString(c);后打印str1的长度是18?这18位的长度是7个字符加11位地址值吗?
答:Arrays.toString(c)返回的就是字符串"[9, 0, 1, 0, 0, 0]"包括逗号·中括号·空格 都算一个字符,所以它的长度是18

再回答你第一个问题:
char[] c = str.toCharArray();
1.为什么直接使用str = c.toString();后打印str的值获取的是一个地址值?
答:
数组类型应该没有重写Object方法
还有str=c.toString(); 可以等价于 c= str
system.out.println(c) 和 system.out.println(c.toString())打印的是同一个内容

最后回答你三个问题:
3.直接使用c.toString();和 Arrays.toString(c);有什么区别?
答:
c是个数组类型 第二个回答已经说明,c.toString()方法以字符串类型返回地址信息,
Arrays类重写了Object的toString方法 以字符类型返回 数组 c 的内容

如果看懂了,希望采纳😁😁😁

无尽白日梦 | 园豆:202 (菜鸟二级) | 2020-03-09 10:20

嗯,谢谢,昨天解题解懵了,连所有类全部默认继承object类这个基本知识点都忘了,看了您的解答已经明白了,感谢您的耐心解答!谢谢!

支持(0) 反对(0) Minstrelxv | 园豆:199 (初学一级) | 2020-03-09 11:30
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册