程序如下:
package dierzhang;
class Value{
int i;
}
public class EqualsMethods {
  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?请各位高手解释一下。

解决方案 »

  1.   

    你这个是实例化的两个class对象,肯定是不一样的
      

  2.   

    在堆区两个内存快,equal比较引用,而堆区是两个两块,引用的当然不一样
      

  3.   


     public boolean equals(Object obj) {
    return (this == obj);
        }这是Object类里面的方法,如果你没有覆写的话那么他调用的是这个,即:比较的是两个对象的地址;
    Value v1 = new Value();
    Value v2 = new Value();
    这两个对象的地址当然是不一样的。虽然Value对象里面的值是一样的,但是比较的并非是里面的值,而是这两个对象在内存中的地址,所以就是false咯
      

  4.   

    System.out.println(v1.hashCode());
    System.out.println(v2.hashCode());
      

  5.   

    String v1 = new String("1");
    String v2 = new String("1");
    if(v1.equals(v2))
    {
    System.out.println("equals");
    }
    if(v1==v2)
    {
    System.out.println("==");
    }
    打印equals
      

  6.   

    String v1 = "1";
    String v2 = "1";
    if(v1.equals(v2))
    {
    System.out.println("equals");
    }
    if(v1==v2)
    {
    System.out.println("==");
    }
    打印equals ==
      

  7.   

    class Value{
        int i;
        @Override
        public int hashCode() {
            return this.i;
        }    @Override
        public boolean equals(Object v) {
          if (this==v) return true;
          if (!(v instanceof Value)) return false;
          return this.i==((Value)v).i;
        }
      }
      

  8.   

    你需要重写equals方法和hashCode方法
      

  9.   

     是实例化的两个class对象,肯定是不一样的
      

  10.   

        判断两个非系统类时,要看是否重写了equal()和hashcode()的两个方法,这是Objec类中很重要的方法
      

  11.   

    equals 判断栈内存中的地址是否相同 两个都是新开辟的空间 内存地址一定不一样的 
           栈             堆
    譬如v1的地址是0x001   100
        v2的地址是0x002   100
    equals 判断栈地址不一样 你把equals换成==判断的就是堆中的值 结果就是true
      

  12.   

    换成值比较可以为TRUE   这么样必然是FALSE
      

  13.   

    The equals method for class Object implements the most discriminating possible equivalence relation on objects; that is, for any non-null reference values x and y, this method returns true if and only if x and y refer to the same object (x == y has the value true). 这是帮助文档中的内容,用户自定义的类需要覆盖equals函数 否则默认的和 == 一样的功能!   (注意String 类不是用户自定义的类,所以其已经覆盖了该方法)
      

  14.   

    System.out.println(v1.equals(v2));
    此句代码比较的是两个对象的堆内存地址。
    在声明及实例化对象的时候,两个对象会在堆内存空间引用两个不同的地址,而以上代码正是比较两个对象的堆内存地址,因此,地址肯定是不同的,为false!
      

  15.   

    因为equals()的默认行为是比较对象的引用。所以除非在自己的新类中覆盖equals方法,否则就是false.在Thinking in JAVA里有一个十分相似的例子的。。==
      

  16.   

    第一:Value类中的equals方法继承自Object类,Object类中的equals方法比较的是地址;
    第二:如果你想根据成员变量i比较两个对象,必须重写equals方法;
    public boolean equals(Object obj) {
    Value o = (Value)obj;
                    if(this.i == o.i){
                        return true;
                    }
                    return false;
    }
      

  17.   

    值类型是存储在内存中的堆栈(以后简称栈),而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中。==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。equals操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同。==比较的是2个对象的地址,而equals比较的是2个对象的内容。所以,当equals为true时,==不一定为true.
      

  18.   

    没有改写的equals方法默认的都是继承Object中的equals方法,Object中的equals方法比较的是内存地址
    你每new一次 它就会在对内存分配一个新的内存,所以比较后返回的会是false 
      

  19.   

    这里的equals相当于等于是比较的地址~ 
    前面的的String是Java给的 不用override equals