1. 程式人生 > >Java中Hashtable和HashMap區別

Java中Hashtable和HashMap區別

第一,繼承和實現不同

public class Hashtable<K,V>
    extends Dictionary<K,V>
    implements Map<K,V>, Cloneable, java.io.Serializable

public class HashMap<K,V>
    extends AbstractMap<K,V>
    implements Map<K,V>, Cloneable, Serializable

第二,執行緒安全不同

Hashtable 中的方法是同步的,而HashMap中的方法在預設情況下是非同步的。Hashtable的所有 public 方法宣告中都有 synchronized 關鍵字。在多執行緒併發的環境下,可以直接使用Hashtable,但是要使用HashMap的話就要自己增加同步處理了。

第三,對NULL處理不同

Hashtable中,key和value都不允許出現null值。

在HashMap中,null可以作為鍵,這樣的鍵只有一個;可以有一個或多個鍵所對應的值為null。當get()方法返回null值時,即可以表示 HashMap中沒有該鍵,也可以表示該鍵所對應的值為null。因此,在HashMap中不能由get()方法來判斷HashMap中是否存在某個鍵, 而應該用containsKey()方法來判斷。

第四,兩個遍歷方式的內部實現上不同

Hashtable、HashMap都使用了 Iterator。而由於歷史原因,Hashtable還使用了Enumeration的方式 。

第五,雜湊值使用不同

雜湊值的使用不同,HashTable直接使用物件的hashCode。而HashMap重新計算hash值。

HashTable:

int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;
HashMap:
int hash = hash(k);
int i = indexFor(hash, table.length);

static int hash(Object x) {
  int h = x.hashCode();

  h += ~(h << 9);
  h ^= (h >>> 14);
  h += (h << 4);
  h ^= (h >>> 10);
  return h;
}

static int indexFor(int h, int length) {
  return h & (length-1);

第六,預設大小和增長方式不同

Hashtable和HashMap它們兩個內部實現方式的陣列的初始大小和擴容的方式。HashTable中hash陣列預設大小是11,增加的方式是 old*2+1。HashMap中hash陣列的預設大小是16,而且一定是2的指數。 


相關推薦

JavaHashtableHashMap區別

第一,繼承和實現不同 public class Hashtable<K,V> extends Dictionary<K,V> implements Map<K,V>, Cloneable, java.io.Serializ

javaArrayListLinkedList區別

插入 list 新的 查找 arr tro 基於 列表 時間復雜度 ArrayList和LinkedList最主要的區別是基於不同數據結構 ArrayList是基於動態數組的數據結構,LinkedList基於鏈表的數據結構,針對這點,從時間復雜度和空間復雜度來看主要區別:

HashTableHashMap區別

shc 使用 num 應該 extend 是否 bstr shm nbsp ①繼承不同。 public class Hashtable extends Dictionary implements Map public class HashMap extends Abs

javaequals==的區別

ML int .net 重寫 com span double str 文獻 (表達可能存在錯誤,需進一步完善) 1、首先搞清楚java裏面的數據類型包括: 基本數據類型和引用數據類型 2、數據類型 基本數據類型: byte,short(2 byte),int(4 byt

JavaArrayListLinkedList區別(轉)

java linked .com -s lan font array href spa 具體詳情參考原博客: http://pengcqu.iteye.com/blog/502676Java中ArrayList和LinkedList區別(轉)

Javaequals==的區別總結

1)對於==,如果作用於基本資料型別的變數,則直接比較其儲存的 “值”是否相等;如果作用於引用型別的變數,則比較的是所指向的物件的地址。 2)對於equals方法,equals方法是Object的,所有繼承了Object類的類都有該方法,注意:equals方法不能作用於基本資料型別的變數

JavaerrorException區別

1、error—錯誤 : 是指程式無法處理的錯誤,表示應用程式執行時出現的重大錯誤。 例如jvm執行時出現的OutOfMemoryError以及Socket程式設計時出現的端口占用等程式無法處理的錯誤 2、Exception — 異常 :異常可分為執行時異常跟編譯異常) 1.執行時異常:

JavainstanceofisInstance區別

instanceof: obj.instanceof(class) 判斷這個物件是不是這種型別, 1.一個物件是本身類的一個物件 2.一個物件是本身類父類(父類的父類)和介面(介面的介面)的一個物件 3.所有物件都是Object 4.凡是null有關的都是fals

JavaComparableComparator區別小結

回到頂部一、Comparable簡介   Comparable是排序介面。若一個類實現了Comparable介面,就意味著該類支援排序。實現了Comparable介面的類的物件的列表或陣列可以通過Collections.sort或Arrays.sort進行自動排序。   此外,實現此介面的物件可以用作有序對映

JavaArrayListLinkedList區別(常見面試題)

一般大家都知道ArrayList和LinkedList的大致區別:     1.ArrayList是實現了基於動態陣列的資料結構,LinkedList基於連結串列的資料結構。     2.對於隨機訪問get和set,ArrayList覺得優於LinkedList,因為Lin

後端---JavaArrayListLinkedList區別聯絡

ArrayList和LinkedList的區別和聯絡 在一個多月之前,我曾寫過一篇部落格想要迅速簡潔的瞭解Java中所有的集合型別(List、Set、Map),然後一個月多後的我不得已又抱起《Java核心卷I 》仔細研讀,這是為什麼呢??? 是因為“溫故而知新”還是因為“書讀百遍其

JavaArrayListLinkedList區別以及時間複雜度與空間複雜度

Java中ArrayList和LinkedList區別以及時間複雜度與空間複雜度? 一.時間複雜度 二.空間複雜度 三.總結    一般大家都知道ArrayList和LinkedList的大致區別: 1.ArrayList是實現了基於動態陣

Java Equals==的區別

在談論equals和==的區別前,我們先簡單介紹一下JVM中記憶體分配的問題。 在JVM中 記憶體分為棧記憶體和堆記憶體。二者有什麼區別呢? 當我們建立一個物件(new Object)時,就會呼叫它的建構函式來開闢空間,將物件資料儲存到堆記憶體中,與此同時在棧記憶體中生成對

Javaequals==的區別,equalshashcode的區別

Java中的資料型別,可分為兩類: 1.基本資料型別,也稱原始資料型別。byte,short,char,int,long,float,double,boolean   他們之間的比較,應用雙等號(==),比較的是他們的值。 2.複合資料型別(類)   當他們用(==)進行比較

javanull""的區別

" "分配了記憶體 ;null沒有 呼叫null的字串的方法會拋空指標異常。 ""是一個字串(String).它在記憶體中是存在的.它可以使用Object物件中的方法(如"".toString();"".equals()) 而null它是一個空物件.在記憶體中是不存在的.它

Javainitclinit區別完全解析

init和clinit區別 ①init和clinit方法執行時機不同 init是物件構造器方法,也就是說在程式執行 new 一個物件呼叫該物件類的 constructor 方法時才會執行init方法,而clinit是類構造器方法,也就是在jvm進行類載入—–驗證—-解析—

Java區別

在函式中定義的一些基本型別的變數和物件的引用變數都在函式的棧記憶體中分配。      當在一段程式碼塊定義一個變數時,Java就在棧中為這個變數分配記憶體空間,當超過變數的作用域後,Java會自動釋放掉為該變數所分配的記憶體空間,該記憶體空間可以立即被另作他用。  

JavaNIOIO區別適用場景

線程 直接 就是 好的 服務器 調用 發送 很好 次數 NIO是為了彌補IO操作的不足而誕生的,NIO的一些新特性有:非阻塞I/O,選擇器,緩沖以及管道。管道(Channel),緩沖(Buffer) ,選擇器( Selector)是其主要特征。 概念解釋: Cha

Java語法----Javaequals==的區別

和equal tps 成員變量 lean 位置 get https 覆寫 學生 【正文】 平時在學Android和Java語言的時候,總是碰到“equals”和“==”這兩個字符,老感覺差不多;其實還是有一些區別的,今天幹脆

java棧的區別

mem 線程 所有 生成 werror 空間 調用 訪問 指向 01,各司其職;         棧內存用來存儲局部變量和方法的調用,         而堆內存用來存儲java中的對象,無論是成員變量,局部變量,還是類變量         他們指向的對象都存儲在堆內存中。