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);这句是什么意思?

解决方案 »

  1.   

    因为你的Value类没有重写equals方法。默认调用Object的equals方法。
    Object 类的 equals 方法对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true(即x == y 具有值 true)。 
      

  2.   

    v1.equals(v2)相当于判断v1==v2而你上边是v1.i=v2.i (v1.i!=v1,v2.i!=v2)
    v1和v2当然不相等了  后边一个问题是Random类型的变量rand实例化并且是在0--46之间产生一个随机数给rand
      

  3.   

    equals的源码很简单,就是判断是否“==”public boolean equals(Object obj) {
    return (this == obj);
        }对于非空的对象,引用同一对象时才相等
      

  4.   

    在Value类中重写hashCode()与equals()方法:
    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;//随便你怎么写。最后写得你都记不住,为最佳
    }
      

  5.   

    在Value类中重写hashCode()与equals()方法: Java codepublic boolean equals(Object obj)
    {
    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;//随便你怎么写。最好写得你都记不住,为最佳
    }
      

  6.   


    因为你没有重写object的equals方法,所以调用的是object的equals方法,而该方法(object的equals)比较的
    是引用的两个Value对象的地址,所以不同。

    使用单个 long 种子创建一个新的随机数生成器。
      

  7.   

    47明明就是个种子,你误导楼主了,生成0-46的随机整数数是用Random.nextInt(47)
      

  8.   

    Random 包前不包后  从 0 开始的随机数
      

  9.   

    正解
    Alt+.看看equals()源码。。
      

  10.   

    如果是vi.i(equals(v2.i);就是你要得到的结果,而v1和v2有不同的地址当然用equals会false了.
    但你可以这样赋值:v1.i=1;v2=v1;这样也会得到相应的结果.
      

  11.   

    你比较的是对象v1,v2是不是指向同一内存地址,这显然不是如果你要比较对象里面的内容的话,需要在Value类里面重写equals()方法:
    class Value
    {
       int i;
       
       public boolean equals(Object obj)
    {
    int k;
    k=i;
    if(obj instanceof Value)
    return ((Value)obj).i==k;
    return false;
    }}
      

  12.   

    因为你比较的是两个对象, 所以会比较他们的内存地址, 
    他们的内存地址肯定不相同,(因为虽然是同一个类,但是它new出来两个不同的对象,在内存的堆里面有不同的位置)
    所以要想让他们相等, 必须重写equals 方法. 可以参考4楼 或 11楼  
    当然如果只在这里的话, 不用重写hashCode 方法, 也会返回true. 
    hashCode 方法在一个对象作为一个键的索引时才会被重写, 比如用Hashable
    当然, 在一般情况下, 只要重写equals方法,肯定会重写hashCode方法, 避免出现意外的错误...
      

  13.   

    if(obj.getClass()!=this.getClass())//如果与当前类名不同,直接返回false
    这个样子岂不是只要一个类创建出来的对象全都相等?
      

  14.   


    不需要那么复杂的
    class Value
    {
       int i;
       
       public boolean equals(Object obj)
        {       
            if(obj instanceof Value)
                return ((Value)obj).i==i;
            return false;
        }}
      

  15.   

    Value v1=new Value();
    Value v2=new Value();
    在是2个对象,他们的内存地址不一样 不重写equals比较不了
      

  16.   

    class Value
    {
       int i;
       
       public boolean equals(Object obj)
        {       
            if(obj instanceof Value)
                return ((Value)obj).i==i;
            return false;
        }}
    支持~~~
      

  17.   

    class Value {
    int i;
    public boolean equals(Object obj){

    if(this.i == ((Value)obj).i){
    return true;
    }
    return false;

    }
    }