我有一个非常简单的类,只有一个字段成员(例如String).是否可以hashCode()简单地返回fieldMember.hashCode()?或者我应该以某种方式操纵字段的哈希码?另外,如果我应该操纵它,为什么呢?
假设我有以下课程:
class ABC {
private int myInt = 1;
private double myDouble = 2;
private String myString = "123";
private SomeRandomClass1 myRandomClass1 = new ...
private SomeRandomClass2 myRandomClass2 = new ...
//pseudo code
public int myHashCode() {
return 37 *
myInt.hashcode() *
myDouble.hashCode() *
... *
myRandomClass.hashcode()
}
}
Run Code Online (Sandbox Code Playgroud)
这是hashCode的正确实现吗?这不是我通常这样做的方式(我倾向于遵循Effective Java的指导方针),但我总是有诱惑去做类似上面代码的事情.
谢谢
我知道这已经在这里一遍又一遍地讨论,但我尝试过的所有例子都没有为我工作.
我得到了什么
我从Android访问呼叫日志,我得到了所有呼叫的列表.当然,在这里我得到了很多重复.首先我制作一份清单
List<ContactObject> lstContacts = new ArrayList<ContactObject>();
Run Code Online (Sandbox Code Playgroud)
然后我在其中添加对象
While (get some record in call log)
{
ContactObject contact = new ContactObject();
contact.SetAllProperties(......)
lstContacts.add(contact);
}
Set<ContactObject> unique = new LinkedHashSet<ContactObject>(lstContacts);
lstContacts = new ArrayList<ContactObject>(unique);
Run Code Online (Sandbox Code Playgroud)
Contact Object类很简单
public class ContactObject {
public ContactObject() {
super();
}
@Override
public boolean equals(Object obj) {
if (!(obj instanceof ContactObject))
return false;
return this.lstPhones == ((ContactObject) obj).getLstPhones();
}
@Override
public int hashCode() {
return lstPhones.hashCode();
}
private long Id;
private String name;
private List<String> lstPhones; …Run Code Online (Sandbox Code Playgroud) 如果你从db加载一个实体并以某种方式修改它,hibernate会使用equals/hashCode来比较实体的当前状态和它的快照,以确定是否需要执行sql更新?
如果它做了这样的比较,我还有另外一个问题:如果equals将返回true,那么hibernate是否会认为实体没有改变或试图使用它的默认comprasion(可以肯定)?
我目前有一个被覆盖的equals(Object)看起来像这样:
@Override
public boolean equals(Object o) {
if (o == this) return true;
if (! (o instanceof Player)) return false;
Player p = (Player) o;
return getFirstName().equalsIgnoreCase(p.getFirstName()) &&
getLastName().equalsIgnoreCase(p.getLastName());
}
Run Code Online (Sandbox Code Playgroud)
我hashCode()目前看起来像这样:
@Override
public int hashCode() {
int result = 17;
result = 31 * result + getFirstName().toLowerCase().hashCode();
result = 31 * result + getLastName().toLowerCase().hashCode();
return result;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是关于我重写的hashCode()方法.我知道我需要hashCode()为两个对象返回相同的值,如果它们被equals(Object)方法认为是相等的.我的直觉告诉我,有些情况下这个hashCode()会违反合同.
是否有一种可接受的方法在重写的equals(Object)方法中使用equalsIgnoreCase(String)方法并生成不违反合同的哈希码?
我重写了两个int的简单容器对象的equals和hashcode方法.每个int都反映了另一个对象的索引(该对象是什么并不重要).该类的要点是表示两个对象之间的连接.
连接的方向无关紧要,因此无论两个整数在对象中的哪个方向,equals方法都应该返回true.
connectionA = new Connection(1,2);
connectionB = new Connection(1,3);
connectionC = new Connection(2,1);
connectionA.equals(connectionB); // returns false
connectionA.equals(connectionC); // returns true
Run Code Online (Sandbox Code Playgroud)
这是我所拥有的(从Integer的源代码修改):
public class Connection {
// Simple container for two numbers which are connected.
// Two Connection objects are equal regardless of the order of from and to.
int from;
int to;
public Connection(int from, int to) {
this.from = from;
this.to = to;
}
// Modifed from Integer source code
@Override
public boolean equals(Object obj) {
if …Run Code Online (Sandbox Code Playgroud) 考虑我有一个POJO具有String类成员:
class POJO {
String name, address, emailId;
equals() {
}
hashCode() {
// How?
}
}
Run Code Online (Sandbox Code Playgroud)
如何将hashCode我的弦乐组合成一个hashCodePOJO?
这是我的PHP代码:
hash_hmac( "sha256", utf8_encode( $filename ), utf8_encode( $password ) );
Run Code Online (Sandbox Code Playgroud)
这是我的C#代码:
var hmacsha256 = new HMACSHA256( Encoding.UTF8.GetBytes( password ) );
hmacsha256.ComputeHash( Encoding.UTF8.GetBytes( filename ) );
Run Code Online (Sandbox Code Playgroud)
不幸的是,两个结果都不同 任何人都可以给我一个提示吗?
我遇到了以下问题.我想使用java.util.HashMap,并java.util.PriorityQueue在犀牛脚本,在这里我需要使用特定的自定义对象为在HashMap的关键,并且还使用HashMap.containsKey()以检查是否有在Map中的键(另一种选择是检查的对象Collection.contains(Object o)).
所以,显然,我需要在我的对象中基于一些字段值实现equals和hashCode.
例如:
试图使用JavaScript.由于JavaScript没有那些方法不起作用.请参阅样品1和样品2
扩展java.lang.Object.样本3.部分工作,正在调用方法.但
在Java中实现我的自定义类并在JavaScript中扩展它.样本4.作品.但如果我必须使用Java,我是否需要Nashorn?
var PriorityQueue = java.util.PriorityQueue;
var HashMap = java.util.HashMap;
var Integer = java.lang.Integer;
// Sample 1
// Doesn't work, equals and hashCode are not being invoked
function Vertex1(from, cost) {
this.from = from;
this.cost = cost;
this.equals = function(other) { return this.from == other.from; }
this.hashCode = function() { return Integer.hashCode(this.from); } …Run Code Online (Sandbox Code Playgroud) 我对关于哪种哈希码实现更好的 Java 面试问题感到困惑。我们有一个类 Point {int x, y; }. 为什么这个类的 hashcode 31 * x + y 的实现比 x + y 好?正确的答案是“乘数创建了哈希码值对字段处理顺序的依赖,这最终会产生更好的哈希函数”。但我不明白为什么处理的顺序是这里的重点,因为当我执行 point1.equals(point2); 时,整个表达式 31 * x + y 正在计算;并且无论它以何种顺序发生。我错了吗?