Java and HashMap/Hashtable |
Java HashMap/Hashtable บทความนี้จะขอธิบายเกี่ยวกับ HashMap และ Hashtable บนภาษา Java ที่อยู่ใน Library ของ java.util จะเป็น Collection ที่จะได้ใช้งานกันบ่อย ๆ เพราะเป็นรูปแบบการจัดเก็บค่าตัวแปร ที่อยู่ในรูปแบบของ Key และ Value ซึ่งจะแตกต่างกับ ArrayList ที่จะมีเพียงแค่ Index ที่ทำหน้าที่เป็นทั้ง Key และ Value ใน Collection ของ HashMap และ Hashtable สามารถเพิ่มสมาชิกได้ไม่จำกัดนำนวน และไม่ต้องทราบถึงจำนวนขนาดหรือ Size สมาชิกล่วงหน้า คือสามารถเพิ่มได้เรื่อย ๆ จนเพียงพอแต่ความต้องการใช้งาน แต่การจัดเก็บจนมาเกินไปก็จะมีผลต่อ memory และความเร็วในการทำงานเช่นเดียวกัน เพราะฉะนั้นการใช้ตัวแปรเหล่านี้จะต้องใช้ให้เหมาะสม ยิ่งเมื่อต้องการจัดเก็บข้อมูลประเภท Object , Byte หรือพวก Bitmap ก็จะต้องใช้ memory จำนวนมากในการจัดเก็บเช่นเดียวกัน แต่ถ้าเป็นข้อมูลประเภท String หรือ Int(Number) จะสามารถเก็บได้ในประมาณมาก สำหรับรูปแบบการทำงานของ HashMap และ Hashtable นั้นจะคล้ายกันเกือบถึง 95% คือมีรูปแบบ และ method ที่เหมือน ๆ กับ แต่จะมีข้อแตกต่างกันอยู่ 2-3 ชุด เช่น
HashMap จะยอมให้มีค่าว่าง (null) เป็นทั้ง Key และ Value และ HashMap จะเป็นประเภท unsynchronized
Hashtable จะไม่ยอมให้มีค่าว่าง (null) ที่เป็น Key หรือ Value และจะเป็นประเภท synchronized
ความแตกต่างระหว่า unsynchronized กับ synchronized คือ รูปแบบ unsynchronized จะสามารถเข้าใช้งาน Collection นั้น ๆ ได้พร้อมกันหลาย ๆ Thread พร้อมกัน เฉพาะฉะนั้นจะสามารถทำงานเร็วกกว่า เหมาะกับข้อมูลที่ไม่ต้องการเปลี่ยนแปลง เพราะถ้ามีการเปลี่ยนแปลงข้อมูลเกิดขึ้นก่อนที่จะทำการ Update ไปยัง Collection การทำงานของ Thread อื่น ๆ ที่กำลังทำอยู่ในขณะเดียวกัน ก็อาจจะได้ข้อมูลที่ไม่ค่อยถูกต้อง ส่วน synchronized เป็นรูปแบบการทำงานที่จะ Lock Collection ที่ถูกเรียกใช้งานอยู่และ Thread ที่จะเข้ามาใช้งานต่อจากนั้นจะต้องรอคิวจนกว่า Thread แรกได้ทำงานเสร็จสิ้นไปแล้ว ซึ่งจะเหมาะกับชุดของข้อมูล ที่มีการเปลี่ยนแปลงบ่อยและต้องการความถูกต้องแม่นย้ำสูง แต่ข้อเสียคือการทำงานก็จะช้าลงไปด้วย
เพราะฉะนั้นการเลือกใช้งานระหว่าง HashMap และ Hashtable จะต้องเลือกใช้ให้เหมาะสมกับประเภทของชุดข้อมูลด้วย แต่ในหลักการเขียนโปรแกรมทั่ว ๆ ไป HashMap จะเป็นทางเลือกในใช้งานผ่าน Collection ประเภทนี้ซะมากว่า ส่วนเหตุผลได้อธิบายจากความแตกต่างระหว่าง unsynchronized กับ synchronized
(ผิดพลาดประการใดต้องขออภัยมา ณ ที่นี้ด้วยครับ)
รูปแบบ HashMap และ Hashtable
HashMap<DataType,DataType> map = new HashMap<DataType,DataType>();
Hashtable<DataType,DataType> table = new Hashtable<DataType,DataType>();
ตัวอย่างการใช้ HashMap และ Hashtable
- HashMap
HashMap<String,String> map = new HashMap<String,String>();
map = new HashMap<String, String>();
map.put("MemberID", "1");
map.put("Name", "Weerachai");
map.put("Tel", "0819876107");
ตัวอย่างการประกาศตัวแปรแบบ HashMap ซึ่งมี Key และ Value อยู่ 3 รายการ
- HashMap
Hashtable<String,String> table = new Hashtable<String,String>();
table = new Hashtable<String, String>();
table.put("MemberID", "2");
table.put("Name", "Win");
table.put("Tel", "021978032");
ตัวอย่างการประกาศตัวแปรแบบ Hashtable ซึ่งมี Key และ Value อยู่ 3 รายการ
ตัวอย่างนับขนาดหรือ Size ของ HashMap และ Hashtable
map.size();
table();
ตัวอย่าง Loop ค่าของ HashMap และ Hashtable
- HashMap
Iterator<String> Vmap = map.keySet().iterator();
while(Vmap.hasNext()){
String key = (String)(Vmap.next()); // Key
String val = map.get(key); // Value
}
map.clear();
- Hashtable
Iterator<String> Vtable = table.keySet().iterator();
while(Vtable.hasNext()){
String key = (String)(Vtable.next()); // Key
String val = table.get(key); // Value
}
table.clear();
ตัวอย่างการอ้างถึงตำแหน่งของ HashMap และ Hashtable
map.containsKey("MemberID"); // result = 1
table.containsKey("MemberID"); // result = 2
map.containsValue("0819876107"); // result = Tel
table.containsValue("021978032"); // result = Tel
Example 1 ตัวอย่างการสร้าง HashMap และการ Loop ค่าจาก HashMap ออกมาแสดง
MyClass.java
package com.java.myapp;
import java.util.HashMap;
import java.util.Iterator;
public class MyClass {
public static void main(String[] args) {
HashMap<String,String> map = new HashMap<String,String>();
map = new HashMap<String, String>();
map.put("MemberID", "1");
map.put("Name", "Weerachai");
map.put("Tel", "0819876107");
Iterator<String> Vmap = map.keySet().iterator();
while(Vmap.hasNext()){
String key = (String)(Vmap.next()); // Key
String val = map.get(key); // Value
System.out.println(key + " = " + val);
}
map.clear();
}
}
Output
Name = Weerachai
MemberID = 1
Tel = 0819876107
Example 2 ตัวอย่างการสร้าง Hashtable และการ Loop ค่าจาก Hashtable ออกมาแสดง
MyClass.java
package com.java.myapp;
import java.util.Hashtable;
import java.util.Iterator;
public class MyClass {
public static void main(String[] args) {
Hashtable<String,String> table = new Hashtable<String,String>();
table = new Hashtable<String, String>();
table.put("MemberID", "2");
table.put("Name", "Win");
table.put("Tel", "021978032");
Iterator<String> Vtable = table.keySet().iterator();
while(Vtable.hasNext()){
String key = (String)(Vtable.next()); // Key
String val = table.get(key); // Value
System.out.println(key + " = " + val);
}
table.clear();
}
}
Output
Name = Win
MemberID = 2
Tel = 021978032
|