为什么ArrayList直接输出不是一个内存地址,而是数组元素(toString输出)

Matt丶 2019-04-12 12:05:29
...全文
2295 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
=PNZ=BeijingL 2021-05-18
  • 打赏
  • 举报
回复 1
引用 4 楼 Matt丶 的回复:
引用 3 楼 nayi_224 的回复:
为什么字符串转字符数组,直接输出也是toString,字符串转字节数组就是内存地址……,这几个搞得我好乱……


---------------------------------------------------------------------

System.out.println(xx); 参数接收object对象及其子类,实现的时候输出的是对象的 toString 方法
System.out.println(list);  因为list重写了toString方法,拼接成[xx,xx,xx] 的格式,
如果输出的是字符串的字节数组,那么输出的是 Object.toString 方法的值,你看下源码就能知道,输出的是 hashCode, 等信息   而hashcode是根据对象存储地址等信息按照一定规则生成的散列值



public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
沐阳0909 2021-05-18
  • 打赏
  • 举报
回复 2
引用 7 楼 Ansel_TbN1 的回复:
1、对于这段代码:
System.out.println(list);
想看他是怎么输出的,点击println看它的源码:
public void print(Object obj) {
        write(String.valueOf(obj));
    }
发现是按String.valueOf(obj)输出的,继续点进去:
    public static String valueOf(Object obj) {
        return (obj == null) ? "null" : obj.toString();
    }
发现sout是按对象的toString方法输出的,那再去看ArrayList的toString是怎么重写的就好了。 2、ArrayList的toString方法源码: ①找到ArrayList发现它自身没有重写toString方法,而是用的父类AbstractList的父类AbstractCollection的方法 ②源码如下:
   public String toString() {
        Iterator<E> it = iterator();
        if (! it.hasNext())
            return "[]";

        StringBuilder sb = new StringBuilder();
        sb.append('[');
        for (;;) {
            E e = it.next();
            sb.append(e == this ? "(this Collection)" : e);
            if (! it.hasNext())
                return sb.append(']').toString();
            sb.append(',').append(' ');
        }
    }
对大佬的敬仰犹如滔滔江水... 做一点补充
kk1924 2020-12-23
  • 打赏
  • 举报
回复
这个要具体的toString实现
qq_45999616 2020-12-17
  • 打赏
  • 举报
回复
上面说错了 不是ArrayList重新了toString方法 ArrayList继承了AbstractList,AbstractList又继承了AbstractCollection 是AbstractCollection抽象类重写了toString方法
  • 打赏
  • 举报
回复
ArrayList继承了AbstractList , AbstractList类里重写了toString()方法,所以会打印值,不是地址值
z_yemu 2019-04-20
  • 打赏
  • 举报
回复
因为 String 类型重写了 toString 方法,所以打印出来的时候是字符,而不是一个地址
Evito 2019-04-20
  • 打赏
  • 举报
回复
重写tostring了呗
哦呼 2019-04-19
  • 打赏
  • 举报
回复
我感觉他想说的应该 是直接打印数组 输出的为什么是内存地址
你要直接打印数组的话直接用Arrays.toString(arr)这个方法

qq_39936465 2019-04-19
  • 打赏
  • 举报
回复
引用 楼主 weixin_44455902 的回复:


打印对象就是调用对象本身tostring方法,默认tostring方式是输出地址。某些类重写tostring方法用来输出内容。Arraylist就是重写了tostring方法,所以输出的是Arraylist的内容
Ansel_TbN1 2019-04-19
  • 打赏
  • 举报
回复
看你在4#这么说:“为什么字符串转字符数组,直接输出也是toString,字符串转字节数组就是内存地址……,这几个搞得我好乱……” 你怎么转的,可以把代码粘出来看下。
Ansel_TbN1 2019-04-19
  • 打赏
  • 举报
回复 1
1、对于这段代码:
System.out.println(list);
想看他是怎么输出的,点击println看它的源码:
public void print(Object obj) {
        write(String.valueOf(obj));
    }
发现是按String.valueOf(obj)输出的,继续点进去:
    public static String valueOf(Object obj) {
        return (obj == null) ? "null" : obj.toString();
    }
发现sout是按对象的toString方法输出的,那再去看ArrayList的toString是怎么重写的就好了。 2、ArrayList的toString方法源码: ①找到ArrayList发现它自身没有重写toString方法,而是用的父类AbstractList的父类AbstractCollection的方法 ②源码如下:
   public String toString() {
        Iterator<E> it = iterator();
        if (! it.hasNext())
            return "[]";

        StringBuilder sb = new StringBuilder();
        sb.append('[');
        for (;;) {
            E e = it.next();
            sb.append(e == this ? "(this Collection)" : e);
            if (! it.hasNext())
                return sb.append(']').toString();
            sb.append(',').append(' ');
        }
    }
第一名zz 2019-04-18
  • 打赏
  • 举报
回复
能直接输出的就是这个类重写了toString方法,打印出来的是地址就是这个类么有重写toString方法,
济南彭于晏 2019-04-12
  • 打赏
  • 举报
回复
ArrayList 后面是string 类型的啊。输出不就是string 类型的吗....
十八道胡同 2019-04-12
  • 打赏
  • 举报
回复
你看下ArrayList ToString()的源码,是不是重写了ToString()
Matt丶 2019-04-12
  • 打赏
  • 举报
回复
引用 3 楼 nayi_224 的回复:
    /**
* Returns a string representation of this collection. The string
* representation consists of a list of the collection's elements in the
* order they are returned by its iterator, enclosed in square brackets
* (<tt>"[]"</tt>). Adjacent elements are separated by the characters
* <tt>", "</tt> (comma and space). Elements are converted to strings as
* by {@link String#valueOf(Object)}.
*
* @return a string representation of this collection
*/
public String toString() {
Iterator<E> it = iterator();
if (! it.hasNext())
return "[]";

StringBuilder sb = new StringBuilder();
sb.append('[');
for (;;) {
E e = it.next();
sb.append(e == this ? "(this Collection)" : e);
if (! it.hasNext())
return sb.append(']').toString();
sb.append(',').append(' ');
}
}
为什么字符串转字符数组,直接输出也是toString,字符串转字节数组就是内存地址……,这几个搞得我好乱……
nayi_224 2019-04-12
  • 打赏
  • 举报
回复
    /**
* Returns a string representation of this collection. The string
* representation consists of a list of the collection's elements in the
* order they are returned by its iterator, enclosed in square brackets
* (<tt>"[]"</tt>). Adjacent elements are separated by the characters
* <tt>", "</tt> (comma and space). Elements are converted to strings as
* by {@link String#valueOf(Object)}.
*
* @return a string representation of this collection
*/
public String toString() {
Iterator<E> it = iterator();
if (! it.hasNext())
return "[]";

StringBuilder sb = new StringBuilder();
sb.append('[');
for (;;) {
E e = it.next();
sb.append(e == this ? "(this Collection)" : e);
if (! it.hasNext())
return sb.append(']').toString();
sb.append(',').append(' ');
}
}

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧