Java基礎(二)——2019/12/19

Java基礎(二)——2019/12/19

  • Array與ArrayList的區別以及各自的應用場景
  1. Array中的元素可以是基本數據類型,也可以是引用數據類型;ArrayList中的元素只能是引用數據類型。
  2. Array的大小是固定的,ArrayList的大小是動態變化的,ArrayList基於Array實現。
  3. Array適用於對數據數量不變的場景,ArrayList適用於數據數量不確定或者經常變化的場景
  • Java中的值傳遞和引用傳遞
  1. 參數爲基本數據類型時,按值傳遞:傳遞參數的一個副本,在函數內對參數進行修改,不會影響函數外部的值。
  2. 參數爲引用數據類型時,按引用傳遞:傳遞對象引用的一個副本,可以在函數內通過引用副本對外部對象進行修改,但可以將引用副本指向其他對象,此時該引用副本與原對象的聯繫切斷。
  3. 注意:當參數爲String時,雖然也是按引用傳遞,但由於String類由final關鍵字修飾,所以試圖在函數內部修改字符串都會創建新的String對象,不會影響函數外部的String對象。
  • 請你解釋爲什麼會出現4.0 - 3.6 = 0.40000001這種情況?

簡單說來是因爲在計算機中所有的數字:整數、小數都是使用二進制表示的,而使用二進制無法精確表示所有的10進制小數。

  1. 以0.3爲列:0.3 = 0.25 + 0.03125 + 0.015625 + …… = 2^-2 + 2^-5 + 2^-6 + ……,該序列是無限的,但是在計算機中只能用有限位數(32位或者64位)來表示一個小數,只能用23位(float)或者52位(double)來表示小數部分,所以對於0.3這種小數,計算機只能近似表示。
  2. 以0.75爲列:0.75 = 0.5 + 0.25 = 2^-1 + 2^-2,該序列是有限的,所以對於0.75這種小數,計算機能夠精確表示。
  • 十進制數在計算機中是如何存儲的?

十進制數分爲無符號數和有符號數(Java中只支持有符號數),無符號數存儲十分簡單,只需要存儲十進制數相應的二進制就行,有符號數通過二進制補碼存儲。簡單瞭解三種有符號數的表示方法:

  1. 原碼——最高位爲符號位,其餘n-1位表示數值的絕對值
    比如字長爲4的計算機中:
    數值 表示形式
    0 0000 \ 1000
    1 0001
    -1 1001
    2 0010
    -2 1010
    可以觀察到0存在兩種表示形式,而且 -1 + 1 = 1010 = -2,這明顯出現了數值運算的錯誤,所以不能使用原碼錶示有符號數。

  2. 反碼——最高位爲符號位,正數的反碼與原碼相同,負數的反碼是其絕對值按位取反,由此可以得出反碼最高位的權重爲-(2^(n-1)-1)
    比如字長爲4的計算機中:
    數值 表示形式
    0 0000 \ 1111
    1 0001
    -1 1000
    2 0010
    -2 1101
    可以觀察到0存在兩種表示形式,而且 -1 + 1 = 1001 = -6,這明顯出現了數值運算的錯誤。所以不能使用反碼錶示有符號數。

  3. 補碼——最高位爲符號位,正數的補碼與原碼相同,負數的反碼是其絕對值按位取反加1,由此可以得出補碼最高位的權重爲-(2^(n-1))
    比如在字長爲4的計算機中:
    數值 表示形式
    0 0000
    1 0001
    -1 1111
    2 0010
    -2 1110
    可以觀察到0只存在一種表示形式,而且各種組合運算均產生正確的結果,證明略過。
  • ==比較什麼?

如果“==”比較的是引用數據類型,則比較的是引用是否指向同一個對象;如果比較的是基本數據類型,則比較的是數值是否相等。

  • 解釋一下爲什麼重寫equals()時還要重寫hashCode()?

在使用HashMap等容器存儲對象時,要結合hashCode()和equals()判斷一個對象是否已經存在於容器中。首先調用hashCode()計算對象應當存儲的位置,然後調用equals()判斷對象是否已經存在與容器中。如果不重寫hashCode(),那麼由equals()判斷相等的兩個對象很可能hashCode相等(hashCode默認爲內存地址),這樣它們就會被存儲在HashMap的不同位置,這顯然是不合邏輯的。

發佈了11 篇原創文章 · 獲贊 7 · 訪問量 1923
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章