Showing posts with label HashMap. Show all posts
Showing posts with label HashMap. 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.

Wednesday, November 11, 2015

[Java] HashMap trong Java và ví dụ

HashMap còn được gọi là mảng băm chứa cặp khóa - giá trị và được ký hiệu  HashMap <Key, Value> hoặc HashMap <K, V> . HashMap là implements(thực thi) của Map Interface. HaskMap tương tự như Hashtable, các phương thức của HashMap không đồng bộ (unsynchornized) và cho phép khóa và giá trị có thể nhận giá trị null. HashMap được sử dụng để lưu trữ ánh xạ giá trị vào khóa tương ứng.
HashMap không phải là một Collection có thứ tự điều đó có nghĩa là các giá trị được lấy từ HashMap ra không theo thứ tự mà chúng đã được chèn vào trong HashMap.
Ví dụ về HashMap:
Chương trình sau cài đặt hầu hết các method quan trọng của HashMap. Để biết thêm chi tiết về các phương thức bạn có thể xem thêm tại đây
package simplecodecjava;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class SimpleCodeCJava {
    public static void main(String[] args) {
     HashMap<Integer, String> hmap = new HashMap<Integer, String>();
      /*Thêm giá trị tương ứng vào các key.*/
      hmap.put(12, "Hà Nội");
      hmap.put(2, "Đà Nẵng");
      hmap.put(7, "Nha Trang");
      hmap.put(49, "Thành Phố Hồ Chí Minh");
      hmap.put(3, "Cà Mau");
      /* Hiện thị giá trị bên trong HashMap sử dụng Iterator*/
      Set set = hmap.entrySet();
      Iterator iterator = set.iterator();
      while(iterator.hasNext()) {
         Map.Entry mentry = (Map.Entry)iterator.next();
         System.out.print("key is: "+ mentry.getKey() + " & Value is: ");
         System.out.println(mentry.getValue());
      }

      /* Lấy ra giá trị dựa vào key*/
      String var= hmap.get(2);
      System.out.println("Value at index 2 is: "+var);

      /* Xóa dữ liệu dựa vào key*/
      hmap.remove(3);
      System.out.println("Map key and values after removal:");
      Set set2 = hmap.entrySet();
      Iterator iterator2 = set2.iterator();
      while(iterator2.hasNext()) {
          Map.Entry mentry2 = (Map.Entry)iterator2.next();
          System.out.print("Key is: "+mentry2.getKey() + " & Value is: ");
          System.out.println(mentry2.getValue());
       }
   }
}
Kết quả chạy chương trình:
key is: 49 & Value is: Thành Phố Hồ Chí Minh
key is: 2 & Value is: Đà Nẵng
key is: 3 & Value is: Cà Mau
key is: 7 & Value is: Nha Trang
key is: 12 & Value is: Hà Nội
Value at index 2 is: Đà Nẵng
Map key and values after removal:
Key is: 49 & Value is: Thành Phố Hồ Chí Minh
Key is: 2 & Value is: Đà Nẵng
Key is: 7 & Value is: Nha Trang
Key is: 12 & Value is: Hà Nội
Danh sách phương thức của HashMap.
  1. void clear(): Loại bỏ tất cả các cặp khóa và giá trị ra khỏi HashMap.
  2. Object clone(): Trả về một bản copy tất cả các cặp khóa và giá trị, thường được sử dụng để sao chép sang một HashMap khác.
  3. boolean containsKey(Object key): trả về TRUE nếu trong HashMap có chứa key, trả về FALSE nếu trong HashMap không chứa key.
  4. boolean containsValue(Object value): trả về TRUE nếu trong HashMap có chứa value, trả về FALSE nếu trong HashMap không chứa value.
  5. Value get(Object key): Trả về giá trị được ánh xạ bởi key tương ứng.
  6. boolean isEmpty(): Thực hiện kiểm tra HashMap có rỗng hay không.
  7. Set keySet(): Trả về Set - danh sách tất cả các key được lấy từ HashMap.
  8. Value put(Key k, Value v): Chèn thêm value vào trong HashMap với key tương ứng.
  9. int size(): Trả về số lượng phần tử có trong HashMap.
  10. Collection values(): Trả về danh sách tất cả các giá trị có trong HashMap.
  11. Value remove(Object key): Trả về cặp khóa giá trị tương ứng với key truyền vào.
  12. void putAll(Map m): Copy tất cả các giá trị của HashMap vào Map truyền vào.