为链表创建equals和hashcode方法

时间:2011-04-18 19:18:09

标签: java equals hashcode nodes singly-linked-list

我的任务应该是使用单链表(节点)从列表和链表中实现某些方法。

我想知道如何使用它实现equals方法和hashcode方法,equals方法比较两个列表,但我不确定它是如何转换为节点的,它是否创建了两个节点列表?或者一个接着另一个,我将如何创建测试相等的方法?


public class List12 implements java.util.List {

private Node head; private int size;

private class Node{ T data; Node next; Node previous; Node(T data){ this.data = data; } public Node(){ this.data = null; this.next = null; }

 public Node(T data, Node<T> next){
   this.data = data;
   this.next = next;
  }

 public T getData(){
   return data;
  }

 public void setData(T data){
   this.data = data;
  }

 public Node<T> getNext(){
   return next;
  }

 public void setNext(Node<T> next){
   this.next = next;
  }

}

public void removeNode(Node node){ if(size == 0) head = null; else{ if(node == head){ head = node.next; node.next.previous = null; } else{ node.next.previous = node.previous; node.previous.next = node.next; } } size--; }

public Node findNode(int index){ Node myNode; myNode = head; while( index-- > 0) myNode = myNode.next; return myNode; }

public List12() { head = null; size = 0; }

这只是我的节点及其方法的代码,我已经实现了其他方法,但我不知道相等和hashcode方法。谢谢你的帮助。

3 个答案:

答案 0 :(得分:1)

阅读本文:这是Joshua Bloch的“Effective Java”的第3章。它会告诉你如何正确地做到这一点。

http://java.sun.com/developer/Books/effectivejava/Chapter3.pdf

答案 1 :(得分:0)

您可以使用apache commons Apache EqualsBuilder中的实用程序类EqualsBuilder。此类提供了为任何类构建良好equals方法的方法。它遵循Joshua Bloch在Effective Java中规定的规则。此外,Apache commons还包含HashCodeBuilder类。

代码的典型用法如下(来自EqualsBuilder javadoc):

public boolean equals(Object obj) {
if (obj == null) { return false; }
if (obj == this) { return true; }
if (obj.getClass() != getClass()) {
 return false;
}
MyClass rhs = (MyClass) obj;
return new EqualsBuilder()
             .appendSuper(super.equals(obj))
             .append(field1, rhs.field1)
             .append(field2, rhs.field2)
             .append(field3, rhs.field3)
             .isEquals();

}

答案 2 :(得分:0)

不要考虑对象内部。您正在比较某些对象的两个序列。它们如何在内部实施并不重要。话虽这么说,只需逐项比较两个列表,相同的故事为equals。使用项目,机器人代表。

请注意,此实现非常通用,您实际上可以将它用于任何类型的列表甚至集合。