Showing posts with label HashTable. Show all posts
Showing posts with label HashTable. Show all posts

Wednesday, January 6, 2016

[Java] Sự khác nhau giữa HashMap và Hashtable

Sự khác nhau giữa HashMap HashTable ? Đây là câu hỏi thường được đưa ra trong các cuộc phỏng vấn chuyên gia Java/J2EE.
HashMapHashTable đều được implements từ java.util.Map interface. Tuy nhiên có một vài sự khác biệt giữa chúng trong cách thức hoạt động và sử dụng.
HashMap vs HashTable.
1. Khả năng đồng bộ.
- HashMap là lớp không đồng bộ (non-synchronized). Điều đó có nghĩa là HashMap có thể cho phép có nhiều hơn một thread cùng truy cập và sử lý dữ liệu và nó chứa đựng một cách đồng thời.
 void clear()
 Object clone()
 boolean containsKey(Object key)
 boolean containsValue(Object value)
 Set<Entry<K, V>> entrySet()
 V get(Object key)
 boolean isEmpty()
 Set<k> keySet()
 V put(K key, V value)
 void putAll(Map map)
 V remove(Object key)
 int size()
 Collection<v> values()

- HashTable là lớp đồng bộ (synchronized). Điều đó có nghĩa là HashTable chỉ cho phép tối đa một thread truy cập và xử lý dữ liệu tại một thời điểm. Thread này chiếm giữ HashTable và các Thread khác phải chờ cho đến khi Thread này truy cập và xử lý  xong.
 synchronized void clear()
 synchronized Object clone()
 boolean contains(Object value)
 synchronized boolean containsKey(Object key)
 synchronized boolean containsValue(Object value)
 synchronized Set<Entry<K, V>> entrySet()
 synchronized boolean equals(Object object)
 synchronized V get(Object key)
 synchronized int hashCode()
 synchronized boolean isEmpty()
 synchronized Set<k> keySet()
 synchronized Enumeration<k> keys()
 synchronized V put(K key, V value)
 synchronized void putAll(Map map)
 synchronized V remove(Object key)
 synchronized int size()
 synchronized String toString()
 synchronized Collection<v> values()


2. Khóa và Giá trị.
- HashMap cho phép lưu khóa và giá trị là NULL.
- HashTable không cho phép lưu khóa và giá trị là NULL.
package simplecodecjava.blogspot.com;

import java.util.HashMap;
import java.util.Hashtable;

public class HashMapvsHashTable {
 private HashMap<String, String> myHashMap = new HashMap<String, String>();
 private Hashtable<String, String> myHashTable = new Hashtable<String, String>();
 public HashMapvsHashTable() {
  try{
  myHashMap.put(null, null);
  myHashTable.put(null, null);
  }catch(Exception e){
   e.printStackTrace();
  }
 }
 public static void main(String[]args){
  new HashMapvsHashTable();
 }
}
Output
java.lang.NullPointerException
 at java.util.Hashtable.put(Unknown Source)
 at simplecodecjava.blogspot.com.HashMapvsHashTable.<init>(HashMapvsHashTable.java:12)
 at simplecodecjava.blogspot.com.HashMapvsHashTable.main(HashMapvsHashTable.java:18)

3. Chèn và ánh xạ.
- HashMap là cài đặt của LinkedHashMap TreeMap. Vì vậy mà khi các phần từ được chèn vào trong HashMap theo một thứ tự và sắp xếp sự ánh xạ theo thứ tự tăng dần của khóa.
- HashTable thì ngược lại. Tức các phần tử được chèn vào trong HashTable không theo một thứ tự và sự ánh xạ cũng không theo thứ tự tăng dần của khóa.
4. Thành phần của Java Collection Framework.
- HashMap là một thành phần của Java Collection Framework.
- HashTable là lớp được dùng lại từ thành phần Java cũ nên không thuộc Java Collection Framework.
//HashTable được định nghĩa như sau
public class Hashtable extends Dictionary implements Map, Cloneable, Serializable {}
//HashMap được định nghĩa như sau
public class HashMap extends AbstractMap implements Map, Cloneable, Serializable {}
5. Cải tiến
 HashMap khắc phục một vài thiếu sót của HashTable. HashTable có phương thức contains(Object value) sẻ trả về true nếu HashTale có chứa đối tượng value. Trong khi đó HashMap có hai phương thức: phương thức containsKey(Object key) trả về true nếu HashMap có chứa đối tượng khóa, phương thức containValue(Object value) trả về true nếu HashMap có chứa đối tượng giá trị.
Sử dụng HashMap và HashTable.
1. Như so sánh ở trên sự khác nhau quan trọng nhất của HashMap HashTable là khả năng đồng bộ. Khi muốn sự thực thi của các luồng diễn ra an toàn thì nên sử dụng HashTable.
2. Sự đồng bộ sẽ làm giảm hiệu năng của chương trình vì vậy việc đồng bộ các luồng (synchromized) nên được tránh trừ trường hợp thực sự cần thiết. Do đó trong trường chương trình có nhiều Thread không đọc và ghi dữ liệu đồng thời thì nên sử dụng HashMap.