1. 程式人生 > 實用技巧 >第五次總結 初次接觸雜湊演算法

第五次總結 初次接觸雜湊演算法

  1. ArrayList與LinkedList的區別
  2. Stack與LinkedList的區別
  3. HashSet與HashMap的區別
  4. HashMap的實現原理
  5. TreeMap的實現原理
  6. 雜湊演算法

1.ArrayList與LinkedList的區別

1、ArrayList的實現是基於陣列,LinkedList的實現是基於雙向連結串列
2、對於隨機訪問,ArrayList優於LinkedList
3、對於插入和刪除操作,LinkedList優於ArrayList
4、LinkedList比ArrayList更佔記憶體,因為LinkedList的節點除了儲存資料,還儲存了兩個引用,一個指向前一個元素,一個指向後一個元素。(可以單向引用)
具體可檢視:https://zhuanlan.zhihu.com/p/33141246


2.Stack與LinkedList的區別

  1. Stack繼承自Vector,LinkedList繼承自AbstractSequentialList,而AbstractSequentialList繼承自AbstractList
  2. Stack主要用於實現後進先出(LIFO),LinkedList主要用於新增和刪除操作
  3. Stack是執行緒安全的(Vector是執行緒安全的),LinkedList不是執行緒安全的

3.HashSet與HashMap的區別

HashMap實現了Map介面 HashSet實現了Set介面
HashMap儲存鍵值對 HashSet僅僅儲存物件
使用put()方法將元素放入map中 使用add()方法將元素放入set中
HashMap中使用鍵物件來計算hashcode值 HashSet使用成員物件來計算hashcode值,對於兩個物件來說hashcode可能相同,所以equals()方法用來判斷物件的相等性,如果兩個物件不同的話,那麼返回false
HashMap比較快,因為是使用唯一的鍵來獲取物件 HashSet較HashMap來說比較慢

4.HashMap的實現原理

1.8以前:HashMap底層是一個長度可變陣列+連結串列
1.8之後:HashMap底層是一個長度可變陣列+連結串列+紅黑樹

放資料的時候:
1.先判斷陣列的容量,如果容量不是2的n次方,就向上轉為最接近指定容量的最小的2的次方
2.計算Key的hash值
3.根據hash值來計算結點應該放到陣列的那個位置
陣列長度必須是2的n次方
hash & (陣列.length-1) = hash%陣列.length
4.計算出下標之後,先看這個位置有沒有資料,如果沒有,就直接放
如果有資料就比較hash值和key是否相等,如果相等就覆蓋掉原來的結點

如果hash值不相等,就將該結點掛在已有結點的尾部
5.如果陣列裝滿了,就要擴容
擴容之後,需要重新計算結點的位置

6.從jdk1.8開始,如果單個下標位置的連結串列長度超過8,就將該變數轉換成一個紅黑樹


5.TreeMap的實現原理

  1. 按照key的自然順序或者執行的比較器來迭代
  2. TreeMap的底層一個二叉排序樹,所有的結點都在二叉樹上
  3. 遍歷的時候是按照中序遍歷的方式取出所有結點中的元素

6.雜湊演算法

Java中的每個物件都有一個hashcode方法用來計算物件的雜湊值
Java中的每個物件都有一個equals方法來判斷物件是否"相等"

equals 比較兩個物件是否相等

==是比較兩個資料的記憶體地址是否相同
equals方法是Object的方法,預設和==一樣,都是比較地址是否相同
每個類都可以重寫equals方法,equals方法是否相等,到底比較什麼?取決於是如何重寫的??

如果兩個equals相等,則hashcode必須相等
如果重寫了equals方法,要求要重寫hashcode方法

對於equals不一定相等,hashcode不要求不相等,
為了提高程式的效率,通常希望equals不相等的時候,hashcode也不相等

(具體可檢視API)