问题:
使用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对象的时候是调用什么??有专业术语名称吗?
解答:
1
2
3
|
List<Integer> list =
new
ArrayList<>();
list.add(
1
);
System.out.println(list);
|
其实也是输出的list的toString方法,看源码我们可以知道:
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 方法
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形式,从源代码的层次上进行分析:
* @param a the array whose string representation to return
* @return a string representation of <tt>a</tt>
* @see #deepToString(Object[])
* @since 1.5
*/
public static String toString(Object[] a) {
if (a == null)
return "null";
int iMax = a.length - 1;
if (iMax == -1)
return "[]";
StringBuilder b = new StringBuilder();
b.append('[');
for (int i = 0; ; i++) {
b.append(String.valueOf(a[i]));
if (i == iMax)
return b.append(']').toString();
b.append(", ");
}
}
其底层代码还是调用了StringBuiler缓冲区以及valueof方法,将数组进行输出
关于StringBuilder可以看自己另一篇博客:http://blog.csdn.net/lzm18064126848/article/details/49051233