写Java单链表中移除指定数据的节点操作时,需要比较当前节点和指定删除节点的数据域是否相同,这就涉及到两个Object类型的变量比较,如果直接使用Object类中提供的equals()比较,发现运行结果总不正确。由此引出思考:equals()比较的是什么?equals比较和==有什么区别?这个移除操作该怎么写?
下面是进行链表指定数据移除的代码和进行测试发现的问题:
class="java">
if(node.getNext().getdata().equals(removedata))//如果node的下一节点的数据就是要找的数据,现在node就是要移除数据的前一个指针
{
index=i+1;
count++;
removeNode = node.getNext();//removeNode就是要移除数据的节点
//获取要删除节点的下一个节点,定义为nextNode
Node nextNode = removeNode.getNext();
//将removeNode的下一个节点nextNode赋给node,这样要移除节点的前一个节点就跳过removeNode直接指向nextNode了
node.setNext(nextNode);
}
node = node.getNext();//获取下一节点
定义一个学生类进行测试时,对学生信息管理时发现不管要删除的是哪个位置的节点,运行时却发现它移除的总是根节点。
我们知道,Java中==是比较引用地址的,那么能说equals 是比较内容的吗?
我们先来看看equals 的源码:
public boolean equals(Object obj) {
return (this == obj);
}
equals是Object父类里面定义的一个方法,从Object 角度看对象比较,equals就相当于==,也就是比较的引用地址,这里要比较的是对象里面的内容,所以要重写equals方法。分别比较对象里的各个属性,每个属性都相等,才能说对象相等。
/**
* 重写equals方法
*/
public boolean equals(Object obj)
{
Student stu=(Student)obj;//强制转成Student类型
if(stu.getname()==this.getname()&&stu.getscore()==this.getscore())
return true;
else return false;
}//分别比较学生类中的名字和分数属性