数组和集合(collection)调用syso输出时,结果不一致问题

Posted sunpengblog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数组和集合(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     }

 

以上是关于数组和集合(collection)调用syso输出时,结果不一致问题的主要内容,如果未能解决你的问题,请参考以下文章

集合类——集合输出栈和队列及Collections集合

JAVA集合01_Collection接口概述常用方法集合和数组互转3种遍历方式

Laravel 集合(Collection)对象里数组里对象转数组

Java——Collection集合

jdk 5.0 新增的foreach循环(用于遍历集合数组)

sort方法和自定义比较器的写法