java從入門到精通「head first java怎麼樣」

43.hashCode()介紹

hashCode() 的作用是獲取哈希碼,也稱為散列碼;它實際上是返回一個int整數。這個哈希碼的作用是確定該對象在哈希表中的索引位置。hashCode() 定義在JDK的Object.java中,這就意味著Java中的任何類都包含有hashCode()函數。

散列表存儲的是鍵值對(key-value),它的特點是:能根據「鍵」快速的檢索出對應的「值」。這其中就利用到了散列碼!(可以快速找到所需要的對象)

44.為什麼要有 hashCode

我們以「HashSet 如何檢查重複」為例子來說明為什麼要有 hashCode:

當你把對象加入 HashSet 時,HashSet 會先計算對象的 hashcode 值來判斷對象加入的位置,同時也會與其他已經加入的對象的 hashcode 值作比較,如果沒有相符的hashcode,HashSet會假設對象沒有重複出現。但是如果發現有相同 hashcode 值的對象,這時會調用equals()方法來檢查 hashcode 相等的對象是否真的相同。如果兩者相同,HashSet 就不會讓其加入操作成功。如果不同的話,就會重新散列到其他位置。(摘自我的Java啟蒙書《Head first java》第二版)。這樣我們就大大減少了 equals 的次數,相應就大大提高了執行速度。

hashCode()與equals()的相關規定

如果兩個對象相等,則hashcode一定也是相同的

兩個對象相等,對兩個對象分別調用equals方法都返回true

兩個對象有相同的hashcode值,它們也不一定是相等的

因此,equals 方法被覆蓋過,則 hashCode 方法也必須被覆蓋

hashCode() 的默認行為是對堆上的對象產生獨特值。如果沒有重寫 hashCode(),則該 class的兩個對象無論如何都不會相等(即使這兩個對象指向相同的數據)

對象的相等與指向他們的引用相等,兩者有什麼不同?

對象的相等 比的是內存中存放的內容是否相等而 引用相等 比較的是他們指向的內存地址是否相等。

45.抽象類和介面(Java7)的區別

1. 抽象類可以提供成員方法的實現細節,而介面中只能存在public abstract 方法;

2. 抽象類中的成員變數可以是各種類型的,而介面中的成員變數只能是public static final類型的;

3. 介面中不能含有靜態代碼塊以及靜態方法,而抽象類可以有靜態代碼塊和靜態方法;

4. 一個類只能繼承一個抽象類,而一個類卻可以實現多個介面。

46.Java 8的介面新增了哪些特性?

增加了default方法和static方法,這2種方法可以有方法體。

47.重寫和重載的區別

重寫是子類對父類的允許訪問的方法的實現過程進行重新編寫, 返回值和形參都不能改變。即外殼不變,核心重寫!

重寫的好處在於子類可以根據需要,定義特定於自己的行為。 也就是說子類能夠根據需要實現父類的方法。

重寫方法不能拋出新的檢查異常或者比被重寫方法申明更加寬泛的異常。

重載(overloading) 是在一個類裡面,方法名字相同,而參數不同。返回類型可以相同也可以不同。

每個重載的方法(或者構造函數)都必須有一個獨一無二的參數類型列表

48.ArrayList和LinkedList有什麼區別?

1. ArrayList和LinkedList的差別主要來自於Array和LinkedList數據結構的不同。

ArrayList是基於數組實現的,LinkedList是基於雙鏈表實現的。另外LinkedList類不僅是List介面的實現類,可以根據索引來隨機訪問集合中的元素,除此之外,LinkedList還實現了Deque介面,Deque介面是Queue介面的子介面,它代表一個雙向隊列,因此LinkedList可以作為雙向隊列 ,棧(可以參見Deque提供的介面方法)和List集合使用,功能強大。

2. 因為Array是基於索引(index)的數據結構,它使用索引在數組中搜索和讀取數據是很快的,可以直接返回數組中index位置的元素,因此在隨機訪問集合元素上有較好的性能。Array獲取數據的時間複雜度是O(1),但是要插入、刪除數據卻是開銷很大的,因為這需要移動數組中插入位置之後的的所有元素。

3. 相對於ArrayList,LinkedList的隨機訪問集合元素時性能較差,因為需要在雙向列表中找到要index的位置,再返回;但在插入,刪除操作是更快的。因為LinkedList不像ArrayList一樣,不需要改變數組的大小,也不需要在數組裝滿的時候要將所有的數據重新裝入一個新的數組,這是ArrayList最壞的一種情況,時間複雜度是O(n),而LinkedList中插入或刪除的時間複雜度僅為O(1)。ArrayList在插入數據時還需要更新索引(除了插入數組的尾部)。

4. LinkedList需要更多的內存,因為ArrayList的每個索引的位置是實際的數據,而LinkedList中的每個節點中存儲的是實際的數據和前後節點的位置。

49.靜態代理和動態代理的區別

靜態代理中代理類在編譯期就已經確定,而動態代理則是JVM運行時動態生成,靜態代理的效率相對動態代理來說相對高一些,但是靜態代理代碼冗餘大,一單需要修改介面,代理類和委託類都需要修改

50.JDK動態代理和CGLIB動態代理的區別

JDK動態代理只能對實現了介面的類生成代理,而不能針對類。

CGLIB是針對類實現代理,主要是對指定的類生成一個子類,覆蓋其中的方法。因為是繼承,所以該類或方法最好不要聲明成final。

原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/259062.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
投稿專員的頭像投稿專員
上一篇 2024-12-15 16:30
下一篇 2024-12-15 16:30

相關推薦

發表回復

登錄後才能評論