今天手动模拟实现了一个ArrayList的简化版本,发现要重写toString方法
package TestList;
public class TestList02 {
private Object[] elementData;
private int size;
private static final int DEFAULT_CAPACITY = 10;//源码中数组默认大小就是10
public TestList02() {
elementData = new Object[DEFAULT_CAPACITY];
}
public TestList02(int capacity) {
elementData = new Object[capacity];
}
public void add(Object obj) {
elementData[size++] = obj;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("[");
for (int i = 0;i < size;i++){
sb.append(elementData[i] + ",");
}
//另一种写法,但后面会跟null
/* for (Object obj:elementData){
sb.append(obj + ",");
}*/
sb.setCharAt(sb.length()-1,']');
return sb.toString();
}
public static void main(String[] args) {
TestList02 list = new TestList02();
list.add("a");
list.add("b");
list.add("c");
System.out.println(list);
}
}
下面是实现结果
[a,b,c]
但当时脑子里突然蹦出来一个念头,我根本没有用System.out.println(list.toString()),为什么效果和调用了toString()方法相同呢,难不成是自动调用吗?
怀着疑问我点开了println方法的源码
public void println(Object var1) {
String var2 = String.valueOf(var1);
synchronized(this) {
this.print(var2);
this.newLine();
}
}
发现自动调用valueOf方法,再点进去看
public static String valueOf(Object var0) {
return var0 == null ? "null" : var0.toString();
}
发现valueOf方法自动调用toString方法,由此我知道了println方法会自动调用toString方法
新的问题来了,我现在随意定义一个ArrayList,看看输出效果
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("aa");
list.add("bb");
System.out.println(list);
}
}
[aa, bb]
有方框有空格
和普通的StringBuilder类型对比一下
public class Test {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
sb.append("aa");
sb.append("bb");
System.out.println(sb.toString());
}
}
输出结果
aabb
格式为什么不一样勒?
继续点开ArrayList的源码,发现ArrayList继承自抽象类AbstractList,而AbstractList又继承自抽象类AbstractCollection
在AbstractCollection类里对Object类里的toString方法进行了重写
public String toString() {
Iterator var1 = this.iterator();
if (!var1.hasNext()) {
return "[]";
} else {
StringBuilder var2 = new StringBuilder();
var2.append('[');
while(true) {
Object var3 = var1.next();
var2.append(var3 == this ? "(this Collection)" : var3);
if (!var1.hasNext()) {
return var2.append(']').toString();
}
var2.append(',').append(' ');
}
}
}
具体作用为:
返回此 Collection 的字符串表示形式。
该字符串表示形式由 Collection 元素的列表组成,这些元素按其迭代器返回的顺序排列,并用方括号 “[]” 括起来。相邻元素由字符 ", "(逗号加空格)分隔。
再看下面这个例子
Object obj = new Object();
System.out.println(obj.toString());
输出结果为哈希值,这是因为没有重写toString方法
java.lang.Object@1540e19d
Object类中的toString方法源码如下
public String toString() {
return this.getClass().getName() + "@" + Integer.toHexString(this.hashCode());
}