1. 程式人生 > >ArrayList集合--關於System.out.print(Object obj);的理解

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

邏輯 print 字符 into system code 覆寫 哈希 string

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() + [email protected] + Integer.toHexString(hashCode())

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