Có bao nhiêu cách để lấy giá trị của Map trong Java

Bạn bè rãnh rỗi ngồi đố nhau: Mi biết mấy cách để lấy giá trị của Map trong Java ? Bạn sẽ trả lời như thế nào hở ?

Nếu mình nhận được câu hỏi như thế, mình sẽ hỏi lại nó: Giờ mi muốn lấy như thế nào ? Muốn lấy toàn bộ key của Map, hay muốn lấy toàn bộ value của Map, hay lấy toàn bộ entry (vừa key vừa value) của Map ?

1. Lấy toàn bộ entry của Map:

Cách 1: Dùng For-Each loop

For-Each loop được giới thiệu từ JDK 5 trở đi, có nghĩa rằng nếu bạn chỉ dùng được với phiên biển JDK 5 trở đi.

Cách 2: Dùng Iterator loop

2. Lấy toàn bộ key của Map:

Cách 1: Dùng For-Each loop

Cách 2: Dùng Iterator loop

3. Lấy toàn bộ value của Map:

Cách 1: Dùng For-Each loop

Cách 2: Dùng Iterator loop

4. Lấy toàn bộ key của Map, sau đó lấy value tương ứng

Vậy nên dùng cách nào:

  • Nếu các bạn muốn lấy entry/key/value của Map và các bạn đang dùng JDK 5 trở đi, thì nên sử dụng For-Earch, làm cho code dễ hiểu hơn. Nhưng chú ý, For-Earch loop sẽ ném ra NullPointerException nếu như map null, do đó cần check null trước khi sử dụng For-Each loop.
  • Trường hợp còn lại, nếu các bạn dùng JDK phiên bản trước JDK 5, thì phải sử dụng Iterator. Tuy nhiên, khi dùng Iterator các bạn có thể remove một entry ra khỏi map bằng lệnh iterator.remove(). Nếu dùng For-Each mà cố remove một entry ra khỏi map, ConcurrentModificationException sẽ được ném ra.
  • Lưu ý rằng, kể cả khi bạn dùng Iterator, nếu một thread làm thay đổi map, trong khi một thread khác đang loop map thì ConcurrentModificationException vẫn được ném ra nhé, hy vọng bài tới mình sẽ có bài chia sẽ làm thế nào để tránh ConcurrentModificationException khi loop Map/Collections trong Java.
  • Xét về hiệu năng, thì For-Each và Iterator là như nhau, do đó để tối ưu hiệu năng, các bạn phải xác định là muốn lấy: entry, key hay value của Map ? Và tuyệt đối ko dùng Lấy toàn bộ key của Map, sau đó lấy value tương ứng, vì đây là cách làm giảm hiệu năng của chương trình nhất. Tại sao ? Cùng nhau nhìn vào hàm get(Object key) của java.util.AbstractMap bên dưới. Các bạn có thể thấy, mỗi lần gọi hàm get(Object key) là mỗi lần loop lại Map.

Các bạn có thể chạy code sau để thấy được sự khác biệt về hiệu năng giữa: For-Each, Iterator và lấy key sau đó lấy value.

Kết quả:

 

 

Spread the love
  •  
  •  
  •  
  •  
  •  

Leave a Reply

3 Comments on "Có bao nhiêu cách để lấy giá trị của Map trong Java"

Notify of
avatar
Sort by:   newest | oldest | most voted
Cao Quảng Bình
Admin

Mong bạn giải thích rõ hơn về vấn đề hiệu năng của các cách trên 🙂
Xưa nay đôi lúc mình cũng dùng cách get all keys :3