Эквивалент Java-словарей Python


95

Я давно пользуюсь Python, и мне очень нравится, как используются словари. Они очень интуитивно понятны и просты в использовании. Есть ли хороший Java-эквивалент словарей Python? Я слышал о людях, использующих хэш-карты и хэш-таблицы. Может ли кто-нибудь объяснить сходства и различия использования хэш-таблиц и хэш-карт по сравнению со словарями Python?

Ответы:


108

dictКласс Python - это реализация того, что в документации Python неофициально называется « типами отображения ». Внутри dictреализовано с помощью хеш-таблицы.

HashMapКласс Java - это реализация Mapинтерфейса. Внутри HashMapреализовано с помощью хеш-таблицы.

Есть несколько незначительных отличий в синтаксисе, и я считаю, что реализации настроены немного иначе, но в целом они полностью взаимозаменяемы.


42
Пример не предоставлен :(
Камран Бигдели

1
@kami: Какой пример вам нужен?
Дэниел Прайден

5
Любой пример, иллюстрирующий java-эквивалент словаря python в действии. Полезный ответ включает несколько примеров, потому что большинство людей приходят сюда, чтобы увидеть примеры и использовать их в своем коде.
Камран Бигдели

14
@kami: Я не думаю, что это правильно. Вопрос не спрашивает «каков эквивалентный код Java для определенного кода Python». На самом деле вопрос вообще не содержит кода. Я не уверен, какова будет ценность добавления примеров использования API карты в Java; этот ответ уже ссылается на каноническую документацию. Если вы хотите изучить Java, начните с учебника, а не с Stack Overflow. Я определенно не думаю, что этот ответ заслуживает отрицательного голоса только потому, что в нем отсутствует образец кода, который можно скопировать и вставить.
Дэниел Прайден,

4
Печально читать этот комментарий, в котором говорится, что «большинство людей приходят сюда, чтобы посмотреть примеры и использовать их в своем коде », я надеюсь, что это неправильно.
0xc0de

31

Идея словаря и карты схожа. Оба содержат такие элементы, как

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

В Java Mapреализован различными способами , например HashMap, или и TreeMapт.д. put(), get()операции аналогичны

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 

См. Документацию HashMap в java8 https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html


5

Насколько мне известно (я фактически не использую java), словари - это просто еще одно название для хэш-карты / хеш-таблицы.

Взяв код из http://www.fluffycat.com/Java/HashMaps/, кажется, что они используются очень похожим образом, с небольшим количеством дополнительных шаблонов java.


3
В Java даже есть интерфейс словаря, который реализуется Hashtable. Однако обычно предпочтительнее использовать HashMap.
Майкл Майерс

1
@Michael Myers: Словарь устарел, Oracle рекомендует использовать вместо него
Broken_Window

5

Одно различие между ними заключается в dictболее строгих требованиях к тому, какие типы данных могут выступать в качестве ключа. Java позволяет любому объекту работать как ключ, хотя вы должны позаботиться о том, чтобы hashCode()метод объекта возвращал уникальное значение, отражающее его внутреннее состояние. Python требует, чтобы ключи соответствовали его определению хеширования , которое указывает, что хэш-код объекта никогда не должен изменяться в течение его времени существования.


1
Это правда, но на самом деле это не применяется ни одним из языков. Очевидно, что либо в hashCode()методе Java, либо в __hash__()методе Python вы должны попытаться вернуть уникальное значение, отражающее внутреннее состояние. В Java или Python, если у вас есть изменяемый объект, он, вероятно, не должен быть ключом хэш-таблицы, поэтому имеет смысл генерировать исключение из методов hashCode()или __hash__().
Дэниел Прайден,

1
По моему опыту, почти все в Python может быть ключом dict ... каковы «более строгие требования»?
Рон Калиан
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.