Java:存储对象的高效数据结构,无';逻辑';复制品
假设我有一个名为City的类,它存储有关城市的一些数据:Java:存储对象的高效数据结构,无';逻辑';复制品,java,data-structures,hash,hashset,Java,Data Structures,Hash,Hashset,假设我有一个名为City的类,它存储有关城市的一些数据: public class City { String [] states; String name; double lat, lng; //Constructors, getters/setters, etc } 我想保留一份没有副本的城市列表。现在通常情况下这很容易(使用哈希集),但我将比较两个在技术上不同(不同的内存地址)但相同字符串和双精度值的对象。我希望我的哈希集考虑具有相同的内部值的对象是“
public class City {
String [] states;
String name;
double lat, lng;
//Constructors, getters/setters, etc
}
我想保留一份没有副本的城市列表。现在通常情况下这很容易(使用哈希集),但我将比较两个在技术上不同(不同的内存地址)但相同字符串和双精度值的对象。我希望我的哈希集考虑具有相同的内部值的对象是“等价的”。< /P>
我似乎不知道该怎么做。我是否重写hashCode()方法?或者我重写equals()方法
你想做以下工作吗
public int hashCode() {
return (double) name.hashCode() + lat * 100 + lng;
}
只需使用一个集合并为类重新定义
City
两种方法:
HashSet
和HashMap
这样的奇怪行为,则不可能只重新定义其中一个
注:是正确的数据结构,因为对于定义:
不包含重复元素的集合。更正式地说,设置
不包含一对元素e1和e2,使得e1.equals(e2)和at
大多数情况下只有一个空元素。正如其名称所暗示的那样,该接口建模
数学集合抽象
只需使用一个集合并为类重新定义
City
两种方法:
HashSet
和HashMap
这样的奇怪行为,则不可能只重新定义其中一个
注:是正确的数据结构,因为对于定义:
不包含重复元素的集合。更正式地说,设置
不包含一对元素e1和e2,使得e1.equals(e2)和at
大多数情况下只有一个空元素。正如其名称所暗示的那样,该接口建模
数学集合抽象
在比较
equals
中的字符串
和double
值的实际值时,您应该重写equals
和hashCode
,并将哈希值建立在hashCode
方法中的值的基础上
在您显示的实现中,哈希可能很弱—您可能希望使用一个主种子
当按照建议实施时,equals
和hashCode
将比较对象,并根据其成员的值将它们放入bucket中,这通常是您想要的
如果您使用的是IDE(这是推荐的),您可以让IDE为您起草这些方法 在比较
equals
中字符串
和double
值的实际值时,您应该重写equals
和hashCode
,并将哈希值基于hashCode
方法中的值
在您显示的实现中,哈希可能很弱—您可能希望使用一个主种子
当按照建议实施时,equals
和hashCode
将比较对象,并根据其成员的值将它们放入bucket中,这通常是您想要的
如果您使用的是IDE(这是推荐的),您可以让IDE为您起草这些方法 如果要使用HashSet,可以重写hashCode和equals,也可以重写这两种方法。将字段设为最终字段(或至少在逻辑上为最终字段)。如果它们是可变的,则在
集合中可能会出现重复项,因为它们在插入时是“唯一的”,但在插入后不是唯一的。如果要使用hashset,可以同时重写hashCode和equals。将字段设为final(或至少在逻辑上是final)。如果它们是可变的,您可能会在集合中得到重复的,因为它们在插入时是“唯一的”,但随后不是。Joshua Bloch的《有效Java》一书在第8项和第9项中详细讨论了这一主题Joshua Bloch的《有效Java》一书在第8项和第9项中详细讨论了这一主题