首页 > 代码库 > ArrayList集合--关于System.out.print(Object obj);的理解

ArrayList集合--关于System.out.print(Object obj);的理解

1.ArrayList集合中常用的方法
ArrayList<Student> stuArrayList = new ArrayList<>(); //定义一个集合对象
stuArrayList.add();    //添加元素
stuArrayList.add(index, e):    //在某个位置添加元素,但不覆盖原元素
stuArrayList.get(index):    //获取某位置的元素
stuArrayList.size():    //获取集合长度
stuArrayList.remove(""):    //删除某元素
stuArrayList.remove(index):    //删除某位置元素
stuArrayList.set(index,e):    //用e覆盖某位置元素


2.一个问题点:
ArrayList<String> list = new ArrayList<>();
System.out.println(list);  //打印结果为空,并不是地址值,因为底层作了toString转换。
/*println(obj)接收到obj参数时,会判断obj是否为空,如果为空,则输出null;若不为空,则调用Object的toString(),
返回的是"类名(利用反射获取)@哈希散列特征码(调用hashCode()方法,如果覆写就用覆写后的,如果没覆写就用本地的(c语言写的,jdk未提供耗源码))"*/

int []arr = new int[2];
syso(arr)://打印结果为内存地址

二.关于System.out.print(Object obj);的理解
1.System调用其类属性out,而out又是PrintStream类型,所以out可以调用类PrintStream的方法print.
2.调用print()打印Object时,会判断Object是否为空,如果为空,输出null;如果非空,调用Object的toString().
3.如果toString()方法被覆写,那就调用覆写后的;如果没有被覆写,就用自身的,自身的方法是用反射获取类名称,
     然后拼接一个"@",再调用hashCode()方法,并将其返回值变为16进制字符串.
4.如果hashCode()被覆写了,就调用覆写后的,输出后为哈希散列特征码;如果没有被覆写,就用自身的,
     这个自带的hashCode()实现的逻辑是本地代码,JDK源码并末提供.输出为地址值.

附:
public void print(Object obj)--java.io.PrintStream
     The string produced by the String.valueOf(Object) method is translated into bytes
public String toString()--- java.lang.String
     getClass().getName() + ‘@‘ + Integer.toHexString(hashCode())

ArrayList集合--关于System.out.print(Object obj);的理解