class Value
{
int i;
}
public class EqualsMethod
{
public static void main(string[] args)
{
Value v1=new Value();
Value v2=new Value();
v1.i=v2.i=100;
System.out.println(v1.equals(v2));
}
}输出为false.想问下为啥?不是说equals是在比较两个对象的内容么?这两个对象的内容不是相等的么?谢谢回答。另外在帮我个,今天看到个Random rand=new Random(47);这句是什么意思?
Object 类的 equals 方法对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true(即x == y 具有值 true)。
v1和v2当然不相等了 后边一个问题是Random类型的变量rand实例化并且是在0--46之间产生一个随机数给rand
return (this == obj);
}对于非空的对象,引用同一对象时才相等
public boolean equals(Object obj)
{
if(obj==null)return false;//obj为空。直接返回false
if(obj.getClass()!=this.getClass())//如果与当前类名不同,直接返回false
return false;
else return hashCode()==((Value)obj).hashCode();//比较其hashCode来进行比较是否相等
}
public int hashCode()
{
final int n=34;
return i*n+n^2;//随便你怎么写。最后写得你都记不住,为最佳
}
{
if(obj==null)return false;//obj为空。直接返回false
if(this==obj)//如果地址和本对象一致,就没必要进行比较了
return true;
if(obj.getClass()!=this.getClass())//如果与当前类名不同,直接返回false
return false;
else return hashCode()==((Value)obj).hashCode();//比较其hashCode来进行比较是否相等
}
public int hashCode()
{
final int n=34;
return i*n+n^2;//随便你怎么写。最好写得你都记不住,为最佳
}
因为你没有重写object的equals方法,所以调用的是object的equals方法,而该方法(object的equals)比较的
是引用的两个Value对象的地址,所以不同。
使用单个 long 种子创建一个新的随机数生成器。
Alt+.看看equals()源码。。
但你可以这样赋值:v1.i=1;v2=v1;这样也会得到相应的结果.
class Value
{
int i;
public boolean equals(Object obj)
{
int k;
k=i;
if(obj instanceof Value)
return ((Value)obj).i==k;
return false;
}}
他们的内存地址肯定不相同,(因为虽然是同一个类,但是它new出来两个不同的对象,在内存的堆里面有不同的位置)
所以要想让他们相等, 必须重写equals 方法. 可以参考4楼 或 11楼
当然如果只在这里的话, 不用重写hashCode 方法, 也会返回true.
hashCode 方法在一个对象作为一个键的索引时才会被重写, 比如用Hashable
当然, 在一般情况下, 只要重写equals方法,肯定会重写hashCode方法, 避免出现意外的错误...
这个样子岂不是只要一个类创建出来的对象全都相等?
不需要那么复杂的
class Value
{
int i;
public boolean equals(Object obj)
{
if(obj instanceof Value)
return ((Value)obj).i==i;
return false;
}}
Value v2=new Value();
在是2个对象,他们的内存地址不一样 不重写equals比较不了
{
int i;
public boolean equals(Object obj)
{
if(obj instanceof Value)
return ((Value)obj).i==i;
return false;
}}
支持~~~
int i;
public boolean equals(Object obj){
if(this.i == ((Value)obj).i){
return true;
}
return false;
}
}