因为默认的equals是调用Object的equals方法而该方法是比较两个对象的内存地址是否相同,也就是是否是一个对象,所以1 3 为false
而2是因为对于Interger类型默认是比较数值是否相同,也就是在Integer中,重载了equals方法

解决方案 »

  1.   

    equals()是Object的方法,可以理解为"相等"。显然两个object相等并不意味着相同;但是需要注意的是,也并不意味着他们对应内存区域的所有字节都相等,比如(但不限于这个原因)他们内部可能还有自己的引用。所以,两个对象是否相等,只有这个对象自己才知道如何判断,java并不知道。所以就需要该类自己提供一个equals方法
    注意equals的参数是Object因此有可能传入的对象与你的类不同,因此在重载equals()方法是要检查类型,并作动态的“下溯造型”
    如果你比较自己定义的类型,在比较之前一定要重载equals()方法,否则你用equals比较就会是==的效果
      

  2.   

    总结如下:在JAVA中,作为参数传递如果是基本类型,则是值传递;
    如果是复合数据类型(即对象或数组),则是引用,传递句柄;传递后两个引用都应用同一个对象,这时候如果只是将其中一个引用指向另一个对象,则
    对另一个引用不产生影响;而如果对其中一个引用做改变,则
    两个引用都将改变
    在下边的例子中正是将引用指向了另一个对象(NULL),所以
    另一个引用不受影响,所以最后的输出结果是a a总结:一般情况下,参数类型为符合数据类型(如数组或类对象)时,自动采用引用的形式,
          即传递给方法的是数据在内存中的地址。这时,如果在方法中不去修改形式参数所引用的
          句柄,且该对象所属的类定义了设置或修改数据成员的方法,就可以通过对象去调用方法
          修改数据成员来达到修改对象的目的,当然,如果该对象所属的类没有定义设置或修改数据成员的方法,
          就不能通过引用 改变对象的状态,比如String 类对象问题的提出:
    public class test {
    String s = "a";
    private void change (test ss) {
    ss = null;
    }
    public static void main(String args[]) {
    test t = new test();
    System.out.println(t.s);
    t.change(t);
    System.out.println(t.s);
    }
    }
    输出结果是什么?为什么?
    答案:a a
      

  3.   

    Integer类跟String类都没有定义修改数据成员的方法,
    所以比较时相当于是否equals