Java tương đương với từ điển Python


93

Tôi là người sử dụng Python lâu năm và thực sự thích cách sử dụng từ điển. Chúng rất trực quan và dễ sử dụng. Có Java tốt tương đương với từ điển của python không? Tôi đã nghe nói về những người sử dụng hashmap và hashtables. Ai đó có thể giải thích sự giống và khác nhau của việc sử dụng bảng băm và bản đồ băm so với từ điển của python không?

Câu trả lời:


106

dictLớp của Python là sự triển khai của cái mà tài liệu Python gọi là " các kiểu ánh xạ ". Trong nội bộ, dictđược triển khai bằng cách sử dụng bảng băm.

HashMapLớp của Java là một triển khai của Mapgiao diện. Trong nội bộ, HashMapđược triển khai bằng cách sử dụng bảng băm.

Có một vài khác biệt nhỏ về cú pháp và tôi tin rằng các triển khai được điều chỉnh hơi khác một chút, nhưng nhìn chung chúng hoàn toàn có thể hoán đổi cho nhau.


40
Không có ví dụ nào được cung cấp :(
Kamran Bigdely

1
@kami: Bạn muốn loại ví dụ nào?
Daniel Pryden 14/09/16

5
Bất kỳ ví dụ nào minh họa java tương đương với từ điển của python đang hoạt động. Một câu trả lời hữu ích bao gồm một số ví dụ vì hầu hết mọi người đến đây để xem các ví dụ và sử dụng chúng trong mã của họ.
Kamran Bigdely

13
@kami: Tôi không nghĩ điều đó đúng. Câu hỏi không hỏi "mã Java tương đương cho một số mã Python cụ thể là gì". Trong thực tế, câu hỏi không chứa bất kỳ mã nào cả. Tôi không chắc giá trị của việc thêm các ví dụ về việc sử dụng API bản đồ trong Java là gì; câu trả lời này đã liên kết đến tài liệu chuẩn. Nếu bạn muốn học Java, hãy bắt đầu với một hướng dẫn, không phải Stack Overflow. Tôi chắc chắn không nghĩ rằng câu trả lời này đảm bảo một phản đối chỉ vì nó thiếu một mẫu mã có thể sao chép.
Daniel Pryden 14/09/2016

4
Thật buồn khi đọc bình luận nói rằng "hầu hết mọi người đến đây để xem các ví dụ và sử dụng chúng trong mã của họ ", tôi hy vọng điều này là sai.
0xc0de

31

Ý tưởng của từ điển và Bản đồ là tương tự. Cả hai đều chứa các yếu tố như

key1:value1, key2:value2 ... and so on

Trong Java, Mapđược thực hiện theo các cách khác nhau như HashMap, hoặc TreeMapv.v. các put(), get()hoạt động tương tự

import java.util.HashMap;

Map map = new HashMap();
// Put elements to the map
map.put("Ram", new Double(3434.34));
map.put("Krishna", new Double(123.22));
map.put("Hary", new Double(1378.00));
//to get elements
map.get("Krishna"); # =123.22
map.get("Hary"); # = 1378.00 

Xem tài liệu về HashMap trong java8 https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html


5

Theo như tôi biết (tôi không thực sự sử dụng java) từ điển chỉ là một tên khác của một hashmap / hashtable.

Lấy mã từ http://www.fluffycat.com/Java/HashMaps/ có vẻ như chúng được sử dụng theo cách rất giống nhau, với một chút bổ sung java boiler-plate.


3
Java thậm chí còn có một giao diện Từ điển được thực hiện bởi Hashtable. Tuy nhiên, HashMap thường được ưa thích hơn.
Michael Myers

1
@Michael Myers: Dictionary không được dùng nữa, Oracle khuyến nghị sử dụng Map thay vì docs.oracle.com/javase/7/docs/api/java/util/Dictionary.html
Broken_Window 26/03/15

5

Một điểm khác biệt giữa hai loại này là dictcó các yêu cầu nghiêm ngặt hơn về loại dữ liệu nào có thể hoạt động như một khóa. Java sẽ cho phép bất kỳ đối tượng nào hoạt động như một khóa - mặc dù bạn nên cẩn thận để đảm bảo rằng hashCode()phương thức của đối tượng trả về một giá trị duy nhất phản ánh trạng thái bên trong của nó. Python yêu cầu các khóa để phù hợp với định nghĩa của nó về hashable , điều này chỉ định rằng mã băm của đối tượng không bao giờ được thay đổi trong suốt thời gian tồn tại của nó.


1
Điều này đúng, nhưng nó không thực sự được thực thi bởi một trong hai ngôn ngữ. Rõ ràng là trong một hashCode()phương thức Java hoặc một __hash__()phương thức Python , bạn nên cố gắng trả về một giá trị duy nhất phản ánh trạng thái bên trong. Trong Java hoặc Python, nếu bạn có một đối tượng có thể thay đổi, nó có thể không phải là một khóa băm, vì vậy sẽ hợp lý khi ném một ngoại lệ khỏi hashCode()hoặc __hash__()các phương thức.
Daniel Pryden

1
Theo kinh nghiệm của tôi, hầu hết mọi thứ trong Python đều có thể là một khóa dict ... 'yêu cầu nghiêm ngặt hơn' là gì?
Ron Kalian
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.