zoukankan      html  css  js  c++  java
  • 数组和集合(collection)调用syso输出时,结果不一致问题

    问题:

    使用RandomAcessFile已经添加了一些数据
     byte[] bb = new byte[(int) raf.length()]; 
    raf.read(bb);

    关键点输出:
    //这样能够正确输出内容
    System.out.println(Arrays.toString(bb));
    //一下就只能返回getClass().getName() + "@" + Integer.toHexString(hashCode()
    // System.out.println(bb.toString());
    // System.out.println(bb);



    但是在collection,例如list中,
    List<Integer> list = new ArrayList<>();
    list.add(1);
    System.out.println(list);
    直接借助于类对象的名字就可以输出正确list ,而数组则必须使用for循环逐个输出,或者是使用Arrays中tostring方法

    这是为什么?小白,知道这样写,只想知道背后的为什么?已经知道“直接输出类对象时,是调用tostring方法”
    类似就是想明白这个直接输出list对象的时候是调用什么??有专业术语名称吗?

     

    解答:

    Java code
     
    ?
    1
    2
    3
    List<Integer> list = new ArrayList<>();
    list.add(1);
    System.out.println(list);

    其实也是输出的list的toString方法,看源码我们可以知道:
    Java code
     
    ?
    1
    2
    3
    4
    public class ArrayList<E> extends AbstractList<E>
            implements List<E>, RandomAccess, Cloneable, java.io.Serializable
     
    public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> {

    可以看到 ArrayList --> AbstractList --> AbstractCollection
    而在AbstractCollection类型可以看到重写了 toString 方法
    Java code
     
    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    public String toString() {
            Iterator<E> i = iterator();
        if (! i.hasNext())
            return "[]";
     
        StringBuilder sb = new StringBuilder();
        sb.append('[');
        for (;;) {
            E e = i.next();
            sb.append(e == this "(this Collection)" : e);
            if (! i.hasNext())
            return sb.append(']').toString();
            sb.append(", ");
        }
        }

    该方法也是循环输出集合中的元素,所以直接打印list就可以看到里面的数据,而至于数组为什么不能呢,byte[] 它只是一种基本数据类型,并不是一个类,就算是Byte[]那也只是一个包装类,里面存的数据也是Byte类型,而不是Byte[],Byte[]只是说明里面存了一组Byte类型的数据而已。

     

    关于直接调用Array.toString()能够输出Arraylist形式,从源代码的层次上进行分析:

     1  public static String toString(Object[] a) {
     2         if (a == null)
     3             return "null";
     4  
     5         int iMax = a.length - 1;
     6         if (iMax == -1)
     7             return "[]";
     8  
     9         StringBuilder b = new StringBuilder();
    10         b.append('[');
    11         for (int i = 0; ; i++) {
    12             b.append(String.valueOf(a[i]));
    13             if (i == iMax)
    14                 return b.append(']').toString();
    15             b.append(", ");
    16         }
    17     }

  • 相关阅读:
    《Python编程:从入门到实践》第四章 操作列表 习题答案
    Linux学习笔记(十六)Linux网络管理:网络基础(一)
    《Python编程:从入门到实践》第三章 列表简介 习题答案
    《Python编程:从入门到实践》第二章 变量和简单数据类型 习题答案
    想要上网满速?安装200兆以上宽带后请做到这几点
    从编程小白到入门码农的五个途径
    一行终端命令干掉一个小型网站
    用Python讲述冯绍峰和赵丽颖的爱情故事
    Python: 如何判断远程服务器上Excel文件是否被人打开
    Python: Django简介
  • 原文地址:https://www.cnblogs.com/sunpengblog/p/10477836.html
Copyright © 2011-2022 走看看