1. 程式人生 > >909422229__Hashtable、HashMap、hashset區別分析與一些面試小題

909422229__Hashtable、HashMap、hashset區別分析與一些面試小題

HashMap底層實現:

基於雜湊表的Map介面的非同步實現,hashmap與hashTable很想,唯一的區別是hashtable中方法是執行緒安全的,也就是同步的,並

允許null值與null鍵,但是不保證對映的順序,特別是他不保證該順序恆久不變。

hashmap實際上是一個連結串列的陣列的資料結構,每個陣列中的每一項又是一個連結串列,當新建一個hashmap

的時候就會初始化一個數組。存放在連結串列頭節點的陣列,即陣列與連結串列的結合體。

在java語言中,最基本的結構有了兩種,一個是陣列,一個是連結串列。

如何讓hashMap實現執行緒安全?

如果在多執行緒的環境下,可以通過Collections中的synchronizedMap()獲取到一個執行緒安全的hashMap。

HashMap與HashTable的區別:

hashMap是對Map介面的實現,hashtable實現Map介面與dictionary抽象類。hashMap初始容量為16,hashtable是11,

兩者的預設填充因子都是0.75,hashmap擴容時會翻倍。

hashMap與hashset,hashTable區別:

hashSet不是key value結構,僅僅是儲存不重複的元素,相當於簡化版的hashMap,只是包含了hashMap的key而已。

檢視原始碼就是這樣。hashSet也是也是非執行緒安全的。

heapStack有什麼區別?

           Java中的記憶體有兩種,一類是棧記憶體,一類是堆記憶體,棧記憶體是指程式進入一個方法時,會為這個方法單獨分配一塊私有屬性儲存空間,用於儲存這個方法內部的區域性變數,當這個方法結束時,分配這個空間的棧就會釋放,棧中的變數也就隨之是釋放。

堆與棧作用不同得記憶體,例如物件。

Static是否可以被覆蓋! NO or Yes

靜態方法可以被子類繼承,從表面上的確重寫了父類的靜態方法,實際上:

每一個靜態方法都會與本類的類名繫結,才可以直接呼叫靜態方法,

所以父類的靜態方法不會與子類類名繫結,而從表面上看到的重寫【覆蓋】

只是一個在子類中存在的一個新的靜態方法,並不是覆蓋。

== Or equlas的區別

== 號是代表著比較地址,而equlas的呼叫者肯定是引用型別,兩個引用型別呼叫

Equlas 比較的是 值 ,而因為系統自動重寫了equlas方法,所以改變成比較值。

final finally,finalize的區別

final  最終,被定義賦值之後無法被修改。

修飾方法,方法不能被重寫,修飾類,類不能被繼承,修飾變數,就變成了常量

(2)finalize()方法在Object中進行了定義,用於在物件“消失”時,由JVM進行呼叫用於對物件進行垃圾回收,類

似於C++中的解構函式;使用者自定義時,用於釋放物件佔用的資源(比如進行I/0操作);

(3)finally{}用於標識程式碼塊,與try{}進行配合,不論try中的程式碼執行完或沒有執行完(這裡指有異常),

**該程式碼塊之中的程式必定會進行;

被finally控制的語句體一定會執行

特殊情況:在執行到finally之前jvm退出了(比如System.exit(0))

finally的作用

用於釋放資源,

在IO流操作和資料庫操作中會見到

Finally

ThrowsOrthrow區別(面試題)

/*

 * throw:如果出現了異常情況,我們可以把該異常丟擲,這個時候丟擲的是異常的物件

 *                在方法內部

 *

 * throws和throw的區別(面試題)

 * throws

 *                用在方法宣告的後面,跟的是異常類名

 *                可以跟多個異常類名,用逗號隔開

 *                表示丟擲異常,由該方法的呼叫者來處理

 *                throws表示出現異常的一種可能性,並不一定會發生這些異常

 * throw

 *                用在方法體內,跟的是異常物件名

 *                只能丟擲一個異常物件名

 *                表示丟擲異常,由方法體內的語句處理

 *                throw是丟擲了異常,執行throw則一定丟擲了某種異常

 *

JAVA中存在記憶體洩的原因是什麼?

長生命週期的物件持有短生命週期物件的引用就很有可能發生記憶體洩漏。

為什麼要在實體類中序列化?

以某種形式使物件持久化,允許我們在記憶體中建立複用的java物件,通常JVM處於執行時,這些物件那個才可以存在。即這些物件的生命週期不會比JVM的宣告週期長。

序列化可以將記憶體中的類寫入檔案或者資料庫中。下次讀取的時候只需要將序列化的物件進行反序列化到記憶體中並保留序列化時類中大的所有變數和狀態。

簡單來說就是用來處理物件流的一中機制。我們可以對流化的物件進行讀寫。

如何獲得執行緒安全效率又高的集合:

ArrayList-----------CopyOnWriteArrayList();              不是利用鎖機制進行執行緒安全,而是利用複製新的進行替換進行。

   應用場景:讀操作的概率明顯多於寫操作,那麼效率高

HashMap--------ConcurrentHashMap                        對其中的某一段加鎖。互不影響。相當於區域性加鎖。鎖分級。這樣不會影響

hashSet

就是HashMap

值為null

ArrayList

陣列

LinkedList

連結串列

HashTable

陣列加連結串列

ConcurrentHashMap

就是hashMap

分段加鎖

BlockingQueue

實現了生產者和消費者的z阻塞佇列

ExecuteorService

執行緒池,使用完之後等待下次啟動

System。exit();

JDK1.8中介面中的方法可以有實現的方法

Assert 用來除錯程式碼。上線絕不能出現

斷點、junit  已經代替

物件建立:new 工廠方法 = SpringIOC支援   反射  反序列化  克隆

單例

工廠

代理

裝飾

分層

MVC:架構模式