Data structures HashMap的不同用途

Data structures HashMap的不同用途,data-structures,programming-languages,hashmap,Data Structures,Programming Languages,Hashmap,我已经熟悉HashMaps很多年了。在java中,我像使用关联数组一样使用它们,在ActionScript中,我将它们用于一些有趣的技巧(参见下面的示例)。我很少需要使用对象作为键,我想知道是否有人有有趣的例子,您使用对象作为键的HashMaps。请用您选择的语言回答,此问题与任何特定语言无关 我很清楚,在某些语言中,字符串、Int等都是对象 ActionScript示例:存储与对象相关的值,而不更改对象的接口 当我有一个复杂的键时,我通常使用值对象作为键;这类似于在包含多个列的数据库表中使用主

我已经熟悉HashMaps很多年了。在java中,我像使用关联数组一样使用它们,在ActionScript中,我将它们用于一些有趣的技巧(参见下面的示例)。我很少需要使用对象作为键,我想知道是否有人有有趣的例子,您使用对象作为键的HashMaps。请用您选择的语言回答,此问题与任何特定语言无关

我很清楚,在某些语言中,字符串、Int等都是对象

ActionScript示例:存储与对象相关的值,而不更改对象的接口


当我有一个复杂的键时,我通常使用值对象作为键;这类似于在包含多个列的数据库表中使用主键。例如,假设您有一门包含多个部分的大学课程。在Java中,您可能有一个值对象,如:

class Section {
   private String courseName;
   private int sectionNumber;
   ...
} 
使用getter、setter、equals()和hashCode()。您还可能在value对象上具有其他属性,但如果使用这两个属性编写equals和hashCode,则可以使用Section作为映射键


我见过一些人简单地将他们想要作为键的字段连接成一个字符串,比如
stringkey=course+Integer.toString(section)map.put(section,students)
map.put(section.getCourseName()+Integer.toString(section.getSectionNumber())

更具表现力,这取决于键的相等定义。如果相等意味着对象标识(相同的内存地址),那么任何对象都可以。如果键相等性取决于对象的内部状态,那么大多数库建议您提供有意义的
hash()
实现。Python还需要知道用作键的对象是不可更改的,因此在将键添加到映射后,不能通过修改键来破坏不变量。Pythons关于键的相等定义是深度比较。在其他语言/库中,关于不变量、相等性、哈希和不变性的固有要求是相同的,但它们没有强制执行。

+1感谢您的反馈。有趣的是,Python使用了深度比较,我不知道这一点。@Zevan它可以使用深度比较,因为它最多只允许已知不可变类型的元组,这些类型都是基本的和有效的比较。
class Section {
   private String courseName;
   private int sectionNumber;
   ...
}