What is HashMap's get/put complexity in Java?

Free Coding Questions Catalog
Boost your coding skills with our essential coding questions catalog. Take a step towards a better tech career now!

HashMap's get/put Complexity in Java

HashMap is a part of the Java Collections Framework and is widely used for storing key-value pairs. The performance of HashMap operations, particularly get and put, is one of its primary advantages. Here’s a detailed explanation of the time complexity for these operations.

Time Complexity

Average Case

  • put(K key, V value): O(1) - constant time
  • get(Object key): O(1) - constant time

Worst Case

  • put(K key, V value): O(n) - linear time
  • get(Object key): O(n) - linear time

How HashMap Works

Internal Structure

  • Buckets: HashMap uses an array of buckets. Each bucket is essentially a linked list or a tree (in case of high collision scenarios).
  • Hash Function: When you put a key-value pair into the HashMap, the key’s hash code is computed, and this hash code is used to determine the bucket where the entry should be stored.
  • Collision Handling: If multiple keys hash to the same bucket, a linked list or a balanced tree is used to store these entries.

put Operation

  1. Calculate Hash Code: The hash code of the key is calculated.
  2. Determine Bucket Index: The bucket index is determined using the hash code.
  3. Check for Collision: If there is already an entry in the bucket, check for collision:
    • No Collision: If the bucket is empty, place the entry in the bucket.
    • Collision: If there is a collision, traverse the linked list or tree to:
      • Update: Update the value if the key already exists.
      • Insert: Add a new node if the key does not exist.

get Operation

  1. Calculate Hash Code: The hash code of the key is calculated.
  2. Determine Bucket Index: The bucket index is determined using the hash code.
  3. Traverse Bucket: Traverse the linked list or tree in the bucket to find the key and return its associated value.

Why O(1) in Average Case?

  • Uniform Distribution: A good hash function distributes keys uniformly across the buckets, minimizing collisions.
  • Load Factor: HashMap maintains a load factor (default 0.75), which ensures that the map is resized when it reaches a certain threshold, keeping the number of elements in each bucket low.
  • Resizing: When the load factor threshold is exceeded, the HashMap is resized (doubled in size), and entries are rehashed to new buckets, which helps maintain constant time complexity.

Why O(n) in Worst Case?

  • Poor Hash Function: If the hash function is poor, it might cause many keys to hash to the same bucket, resulting in a long linked list or a deeply nested tree.
  • No Resizing: If resizing is disabled or not done appropriately, the HashMap may end up with many entries in the same bucket.
  • Collisions: High collision scenarios lead to longer chains or deeper trees, causing the time complexity to degrade to O(n) as each key needs to be compared sequentially.

Example Code

put Operation

import java.util.HashMap; public class HashMapExample { public static void main(String[] args) { HashMap<String, Integer> map = new HashMap<>(); // Putting elements into the HashMap map.put("one", 1); map.put("two", 2); map.put("three", 3); System.out.println("HashMap: " + map); } }

get Operation

import java.util.HashMap; public class HashMapExample { public static void main(String[] args) { HashMap<String, Integer> map = new HashMap<>(); // Putting elements into the HashMap map.put("one", 1); map.put("two", 2); map.put("three", 3); // Getting elements from the HashMap System.out.println("Value for key 'one': " + map.get("one")); // Output: 1 System.out.println("Value for key 'four': " + map.get("four")); // Output: null } }

Summary

  • Average Case: O(1) time complexity for both put and get operations due to efficient hashing and a good load factor.
  • Worst Case: O(n) time complexity when there are many collisions, leading to long chains or deep trees in buckets.
  • Efficient Handling: A well-implemented HashMap with a good hash function and proper resizing maintains efficient performance in most scenarios.

For more in-depth knowledge and practical examples on data structures and other programming concepts, consider exploring Grokking the Coding Interview on DesignGurus.io, which provides comprehensive courses on essential coding and interview techniques.

TAGS
Coding Interview
CONTRIBUTOR
Design Gurus Team

GET YOUR FREE

Coding Questions Catalog

Design Gurus Newsletter - Latest from our Blog
Boost your coding skills with our essential coding questions catalog.
Take a step towards a better tech career now!
Explore Answers
Humanizing technical interviews through empathetic communication
Why do you want to join Airbnb?
What are your biggest challenges in your career?
Related Courses
Image
Grokking the Coding Interview: Patterns for Coding Questions
Grokking the Coding Interview Patterns in Java, Python, JS, C++, C#, and Go. The most comprehensive course with 476 Lessons.
Image
Grokking Data Structures & Algorithms for Coding Interviews
Unlock Coding Interview Success: Dive Deep into Data Structures and Algorithms.
Image
Grokking Advanced Coding Patterns for Interviews
Master advanced coding patterns for interviews: Unlock the key to acing MAANG-level coding questions.
Image
One-Stop Portal For Tech Interviews.
Copyright © 2024 Designgurus, Inc. All rights reserved.