Hướng Dẫn Và Ví Dụ Java HashMap - Openplanning

  • Tất cả tài liệu
  • Java
    • Java Basic
    • Java Collections Framework
    • Java IO
    • Java New IO
    • Java Date Time
    • Servlet/JSP
    • Eclipse Tech
      • SWT
      • RCP
      • RAP
      • Eclipse Plugin Tools
    • XML & HTML
    • Java Opensource
    • Java Application Servers
  • Maven
  • Gradle
  • Servlet/Jsp
  • Thymeleaf
  • Spring
    • Spring Boot
    • Spring Cloud
  • Struts2
  • Hibernate
  • Java Web Service
  • JavaFX
  • SWT
  • Oracle ADF
  • Android
  • iOS
  • Python
  • Swift
  • C#
  • C/C++
  • Ruby
  • Dart
  • Batch
  • Database
    • Oracle
    • MySQL
    • SQL Server
    • PostGres
    • Other Database
  • Oracle APEX
  • Report
  • Client
  • ECMAScript / Javascript
  • TypeScript
  • NodeJS
  • ReactJS
  • Flutter
  • AngularJS
  • HTML
  • CSS
  • Bootstrap
  • OS
    • Ubuntu
    • Solaris
    • Mac OS
  • VPS
  • Git
  • SAP
  • Amazon AWS
  • Khác
    • Chưa phân loại
    • Phần mềm & ứng dụng tiện ích
    • VirtualBox
    • VmWare
Hướng dẫn và ví dụ Java HashMap
  1. HashMap
  2. HashMap làm việc thế nào?

1. HashMap

HashMap<K,V> là một lớp nằm trong nền tảng tập hợp của Java (Java Collection Framework), và implements interface Map<K,V>. HashMap hỗ trợ đầy đủ tất cả các tính năng được đặc tả trong interface Map bao gồm cả các tính năng tuỳ chọn.HashMap cho phép lưu trữ các cặp khoá và giá trị (key & value), các khoá không thể trùng lặp.public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable
  • Map
  • TreeMap
  • WeakHashMap
  • LinkedHashMap
  • IdentityHashMap
  • ConcurrentHashMap
  • ConcurrentSkipListMap
  • EnumMap
Các đặc điểm của HashMap:
  • HashMap chứa các cặp khoá và giá trị.
  • Nó có thể có một khóa null và nhiều giá trị null.
  • HashMap không duy trì thứ tự với các khoá.
  • Nó hoạt động trên kỹ thuật băm (hashing technique). (Xem thêm giải thích về kỹ thuật này ở phần dưới).
Hãy đến với một ví dụ đơn giản, sử dụng HashMap để mô phỏng một danh bạ điện thoại, trong đó số điện thoại là khoá (key) và tên người sở hữu là giá trị (value). Các khoá sẽ không bao giờ trùng lặp.HashMapEx1.javapackage org.o7planning.hashmap.ex; import java.util.HashMap; import java.util.Map; import java.util.Set; public class HashMapEx1 { public static void main(String[] args) { Map<String, String> phonebook = new HashMap<String, String>(); phonebook.put("01000005", "Tom"); phonebook.put("01000002", "Jerry"); phonebook.put("01000003", "Tom"); phonebook.put("01000004", "Donald"); Set<String> phoneNumbers = phonebook.keySet(); for (String phoneNumber : phoneNumbers) { String name = phonebook.get(phoneNumber); System.out.println("Phone Number: " + phoneNumber + " ==> Name: " + name); } } }Output:Phone Number: 01000004 ==> Name: Donald Phone Number: 01000003 ==> Name: Tom Phone Number: 01000005 ==> Name: Tom Phone Number: 01000002 ==> Name: JerryVề cơ bản tất cả các tính năng của HashMap đều tuân thủ theo đặc tả của interface Map, vì vậy bạn có thể đọc bài viết về Map dưới đây để hiểu thêm về cách sử dụng HashMap:
  • Hướng dẫn và ví dụ Java Map
Xem thêm: Lớp WeakHashMap là một biến thể tiết kiệm bộ nhớ của lớp HashMap. Các ánh xạ không thực sự cần thiết sẽ bị loại bỏ một cách tự động bởi Java Garbage Collector (Trình gom rác của Java)
  • Hướng dẫn và ví dụ Java WeakHashMap

2. HashMap làm việc thế nào?

Các nhà thiết kế Java đã sử dụng kỹ thuật băm (hashing technique) cho lớp HashMap để lưu trữ dữ liệu và nâng cao hiệu xuất của nó, và bây giờ chúng ta sẽ xem kỹ thuật này được sử dụng thế nào trong HashMap. Về cơ bản chúng ta phân tích xem điều gì sẽ xẩy ra khi gọi các phương thức HashMap.put(K,V), HashMap.get(K)HashMap.remove(key).
  • Tìm hiểu về Java System.identityHashCode, Object.hashCode và Object.equals
HashMap<K,V> quản lý một mảng các đối tượng Node<K,V>, mảng này sẽ được thay thế bởi một mảng khác có kích thước lớn hơn nếu tất cả các phần tử của nó đã được gán giá trị.static final int hash(Object key) { int h; return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16); }Lớp Node<K,V> bao gồm 4 trường (field). Và trường next là một tham chiếu tới đối tượng Node tiếp theo, nó có thể không phải là phần tử tiếp theo trong mảng.static class Node<K,V> implements Map.Entry<K,V> { int hashcode; K key; V value; Node<K,V> next; }HashMap đảm bảo rằng các Node cùng một hashcode (mã băm) sẽ có tham chiếu liên tiếp nhau, điều này giúp nó nhanh chóng tìm được tất cả các Node có cùng hashcode được chỉ định.HashMap.put(key,value)Khi gọi phương thức HashMap.put(key,value), HashMap sẽ tìm kiếm các Node với thoả mãn điều kiện node.hashcode == hash(key). Nếu không tìm thấy thì một đối tượng Node mới sẽ được gán vào mảng. (Xem hình dưới)Ngược lại, HashMap sẽ nhanh chóng xác định được các Node liên tiếp nhau thoả mãn điều kiện node.hashcode == hash(key) và thu hẹp đáng kể phạm vi các Node cần tìm kiếm theo key.
  • Nếu tìm thấy Node tương ứng với key, giá trị mới sẽ được gán cho Node.value.
  • Ngược lại, một đối tượng Node mới sẽ được tạo ra và gán vào mảng (Xem hình dưới).
HashMap.get(key)Khi phương thức HashMap.get(key) được gọi, HashMap sẽ nhanh xác định được các Node liên tiếp nhau thoả mãn điều kiện node.hashcode == hash(key), điều này thu hẹp đáng kể phạm vi các Node cần tìm kiếm theo key. Tiếp theo nó tìm kiếm Node theo key và trả về node.value nếu tìm thấy, ngược lại nó sẽ trả về null.HashMap.remove(key)
Kết luận: Phương thức Object.hashcode() trả về hashcode (mã băm) của một đối tượng, giá trị này theo mặc định được tạo ra bởi JVM, và rất hiếm khi trùng lặp. Các lớp con của lớp Object có thể ghi đè (override) phương thức này để trả về hashcode tuỳ biến.HashMap sử dụng kỹ thuật băm (hashing technique) giúp nâng cao hiệu xuất của nó, vì so sánh 2 số bao giờ cũng nhanh hơn so với việc so sánh 2 đối tượng.

Các hướng dẫn Java Collections Framework

  • Hướng dẫn và ví dụ Java PriorityBlockingQueue
  • Hướng dẫn sử dụng nền tảng tập hợp trong Java (Java Collection Framework)
  • Hướng dẫn và ví dụ Java SortedSet
  • Hướng dẫn và ví dụ Java List
  • Hướng dẫn và ví dụ Java Iterator
  • Hướng dẫn và ví dụ Java NavigableSet
  • Hướng dẫn và ví dụ Java ListIterator
  • Hướng dẫn và ví dụ Java ArrayList
  • Hướng dẫn và ví dụ Java CopyOnWriteArrayList
  • Hướng dẫn và ví dụ Java LinkedList
  • Hướng dẫn và ví dụ Java Set
  • Hướng dẫn và ví dụ Java TreeSet
  • Hướng dẫn và ví dụ Java CopyOnWriteArraySet
  • Hướng dẫn và ví dụ Java Queue
  • Hướng dẫn và ví dụ Java Deque
  • Hướng dẫn và ví dụ Java IdentityHashMap
  • Hướng dẫn và ví dụ Java WeakHashMap
  • Hướng dẫn và ví dụ Java Map
  • Hướng dẫn và ví dụ Java SortedMap
  • Hướng dẫn và ví dụ Java NavigableMap
  • Hướng dẫn và ví dụ Java HashMap
  • Hướng dẫn và ví dụ Java TreeMap
  • Hướng dẫn và ví dụ Java PriorityQueue
  • Hướng dẫn và ví dụ Java BlockingQueue
  • Hướng dẫn và ví dụ Java ArrayBlockingQueue
  • Hướng dẫn và ví dụ Java TransferQueue
Show More
  • Java cơ bản
  • Các hướng dẫn Java Date Time
  • Các hướng dẫn Java IO
  • Các hướng dẫn Maven
  • Các hướng dẫn Java Web Services
  • Các hướng dẫn Spring Boot
  • Các hướng dẫn Spring Cloud
  • Các hướng dẫn Java Oracle ADF
  • Các hướng dẫn lập trình JavaFX
  • Các hướng dẫn lập trình Java SWT
  • Các hướng dẫn Gradle

Các hướng dẫn Java Collections Framework

  • Hướng dẫn và ví dụ Java PriorityBlockingQueue
  • Hướng dẫn sử dụng nền tảng tập hợp trong Java (Java Collection Framework)
  • Hướng dẫn và ví dụ Java SortedSet
  • Hướng dẫn và ví dụ Java List
  • Hướng dẫn và ví dụ Java Iterator
  • Hướng dẫn và ví dụ Java NavigableSet
  • Hướng dẫn và ví dụ Java ListIterator
  • Hướng dẫn và ví dụ Java ArrayList
  • Hướng dẫn và ví dụ Java CopyOnWriteArrayList
  • Hướng dẫn và ví dụ Java LinkedList
  • Hướng dẫn và ví dụ Java Set
  • Hướng dẫn và ví dụ Java TreeSet
  • Hướng dẫn và ví dụ Java CopyOnWriteArraySet
  • Hướng dẫn và ví dụ Java Queue
  • Hướng dẫn và ví dụ Java Deque
  • Hướng dẫn và ví dụ Java IdentityHashMap
  • Hướng dẫn và ví dụ Java WeakHashMap
  • Hướng dẫn và ví dụ Java Map
  • Hướng dẫn và ví dụ Java SortedMap
  • Hướng dẫn và ví dụ Java NavigableMap
  • Hướng dẫn và ví dụ Java HashMap
  • Hướng dẫn và ví dụ Java TreeMap
  • Hướng dẫn và ví dụ Java PriorityQueue
  • Hướng dẫn và ví dụ Java BlockingQueue
  • Hướng dẫn và ví dụ Java ArrayBlockingQueue
  • Hướng dẫn và ví dụ Java TransferQueue
Show More
  • Java cơ bản
  • Các hướng dẫn Java Date Time
  • Các hướng dẫn Java IO
  • Các hướng dẫn Maven
  • Các hướng dẫn Java Web Services
  • Các hướng dẫn Spring Boot
  • Các hướng dẫn Spring Cloud
  • Các hướng dẫn Java Oracle ADF
  • Các hướng dẫn lập trình JavaFX
  • Các hướng dẫn lập trình Java SWT
  • Các hướng dẫn Gradle

Các bài viết mới nhất

  • Dart Stream Single và Broadcast
  • Xử lý lỗi trong Dart Stream
  • Hướng dẫn và ví dụ Dart Stream
  • So sánh đối tượng trong Dart với thư viện Equatable
  • Flutter BloC cho người mới bắt đầu
  • Xử lý lỗi 404 trong Flutter GetX
  • Ví dụ đăng nhập và đăng xuất với Flutter Getx
  • Hướng dẫn và ví dụ Flutter NumberTextInputFormatter
  • Hướng dẫn và ví dụ Flutter multi_dropdown
  • Hướng dẫn và ví dụ Flutter flutter_form_builder
  • Hướng dẫn và ví dụ Flutter GetX obs Obx
  • Hướng dẫn và ví dụ Flutter GetX GetBuilder
  • Từ khoá part và part of trong Dart
  • Hướng dẫn và ví dụ Flutter InkWell
  • Hướng dẫn và ví dụ Flutter Radio
  • Bài thực hành Flutter SharedPreferences
  • Hướng dẫn và ví dụ Flutter Slider
  • Hướng dẫn và ví dụ Flutter SkeletonLoader
  • Chỉ định cổng cố định cho Flutter Web trên Android Studio
  • Tạo Module trong Flutter
Show More
  • Các hướng dẫn Java Collections Framework

Từ khóa » Ví Dụ Về Hashmap Trong Java