• 谈谈Java中对象的比较(好文就要转)


    看看程序,说出你的结果(我最后再给出答案)
    程序一:
    public class Equivalence {
      public static void main(String[] args) {
        Integer n1 = new Integer(47);
        Integer n2 = new Integer(47);
        System.out.println(n1 == n2);
        System.out.println(n1 != n2);
      }
    }
     
    你的结果如果是true和false的话,那么很不幸告诉你这是错误的答案,如果你不信的话可以在程序中试试,现在讲一下为什么。
    Java中比较对象的时候和C或者C++中不一样,Java比较的是对象的句柄(关于句柄可以看我前两天写的谈谈Java中重要的基础知识中关于句柄的介绍),不是对象的内容,所以上面的例子中虽然n1和n2对象的内容一样,但是他们的句柄并不一样(有点像C++中两个指针指向同一内容,但是指针不一样)
     
    程序二:
    public class EqualsMethod {
      public static void main(String[] args) {
        Integer n1 = new Integer(47);
        Integer n2 = new Integer(47);
        System.out.println(n1.equals(n2));
      }
    }
    程序的结果就不要我再说了吧!!
     
    程序三:
     
    class Value {
      Value(int i)
      {
         data=i;
      }
      int data;
    }

    public class EqualsMethod2 {
      public static void main(String[] args) {
        Value v1 = new Value(47);
        Value v2 = new Value(47);
        System.out.println(v1.equals(v2));
      }
    }
     
    仔细考虑一下,如果你认为结果是false的话,那么恭喜你,你已经进步了,现在讲讲为什么.
    由于equals()方法默认比较的是句柄,解决的方法是在Value类中覆盖equals()方法.
  • 相关阅读:
    快速排序和归并排序的迭代实现
    Longest Increasing Subsequence Review
    IOCCC 1987 最佳单行代码解读
    C++类的成员函数对应的链接器符号的解析
    Scalable Global ID Generator Design
    欧拉回路 (Euler Circuit) POJ 1780
    深入理解函数内静态局部变量初始化
    memcached 线程模型
    类的加载与ClassLoader的理解
    字符集常见码表说明
  • 原文地址:https://www.cnblogs.com/xiaoyunxiao/p/2411820.html
Copyright © 2020-2023  润新知