关于数组和集合中list输出问题

circujoker_06 2015-11-21 04:26:27
使用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对象的时候是调用什么??有专业术语名称吗?
...全文
314 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
circujoker_06 2015-11-21
  • 打赏
  • 举报
回复
引用 1 楼 xiaojiezhu52100 的回复:

List<Integer> list = new ArrayList<>();
list.add(1);
System.out.println(list);
其实也是输出的list的toString方法,看源码我们可以知道:

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 方法

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类型的数据而已。不知道这么说楼主明白了没。
明白了 好的 非常感谢
scmod 2015-11-21
  • 打赏
  • 举报
回复
syso输出默认都是调用这个类的toString()方法,好像没什么专业术语... 或者叫子类"重写"toString()方法这样? 楼主不是已经知道调用是toString()方法了吗?直接输出类对象和list对象不是一个意思吗 只是数组没重写所以调用的是父类Object.toString()所以就这样了
阿宝洁猪 2015-11-21
  • 打赏
  • 举报
回复

List<Integer> list = new ArrayList<>();
list.add(1);
System.out.println(list);
其实也是输出的list的toString方法,看源码我们可以知道:

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 方法

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类型的数据而已。不知道这么说楼主明白了没。

62,616

社区成员

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

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