【发布时间】:2010-12-05 04:04:00
【问题描述】:
我是 Python 的长期用户,非常喜欢字典的使用方式。它们非常直观且易于使用。有没有一个好的 Java 相当于 python 的字典?我听说有人使用哈希图和哈希表。谁能解释一下使用 hashtables 和 hashmaps 与 python 字典的异同?
【问题讨论】:
标签: java python hash dictionary
我是 Python 的长期用户,非常喜欢字典的使用方式。它们非常直观且易于使用。有没有一个好的 Java 相当于 python 的字典?我听说有人使用哈希图和哈希表。谁能解释一下使用 hashtables 和 hashmaps 与 python 字典的异同?
【问题讨论】:
标签: java python hash dictionary
据我所知(我实际上并不使用 java)字典只是 hashmap/hashtable 的另一个名称。
从http://www.fluffycat.com/Java/HashMaps/ 获取代码,它们似乎以非常相似的方式使用,带有一些额外的 java 样板。
【讨论】:
Python 的 dict 类是 Python 文档非正式地称为“mapping types”的实现。在内部,dict 是使用哈希表实现的。
Java 的HashMap 类是Map 接口的实现。在内部,HashMap 是使用哈希表实现的。
语法上存在一些细微差别,我相信实现的调整略有不同,但总体而言它们是完全可以互换的。
【讨论】:
两者之间的一个区别是dict 对哪些数据类型可以作为键有更严格的要求。 Java 将允许任何对象作为键工作——尽管您应该注意确保对象的hashCode() 方法返回反映其内部状态的唯一值。 Python 需要键以符合其对 hashable 的定义,该定义指定对象的哈希码在其生命周期内永远不会改变。
【讨论】:
hashCode() 方法或 Python __hash__() 方法中,您应该尝试返回反映内部状态的唯一值。在 Java 或 Python 中,如果您有一个可变对象,它可能不应该是哈希表键,因此从 hashCode() 或 __hash__() 方法抛出异常是有意义的。
dictionary 和 Map 的思想类似。两者都包含像
这样的元素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
查看java8中的HashMap文档https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html
【讨论】:
//,而不是# :)