百度地图|你对 Java 中 HashCode 方法,有哪些思考?( 三 )


   public boolean equals(Object obj) {
   // 为了提高效率:如果两个内存地址相等 , 那么一定是指向同一个对内存中的对象 , 就无需比较两个对象的属性值(自己跟自己比 , 没啥意义嘛)
       if (this == obj) {
           return true;
       
       // 为了提供程序的健壮性
       // 我先判断一下 , obj是不是学生的一个对象 , 如果是 , 再做向下转型 , 如果不是 , 直接返回false 。
       // 这个时候 , 我们要判断的是对象是否是某个类的对象?
       // 记住一个格式:对象名 instanceof 类名 。 表示:判断该对象是否是该类的一个对象
       if (!(obj instanceof Student)) {
           return false;
       
       // 如果是就继续
       Student s = (Student) obj;
       // 强制转换 , 即向下转型(毕竟Object类型没有具体的对象属性)
       return this.name.equals(s.name) && this.age == s.age && this.address.equals(s.address);//判断两个对象的属性值是否相等
   



上述代码中 , 首先判断传递进来的对象与当前对象的地址是否相等 , 如果相等 , 则肯定是同一个堆内存中的对象 。 因为传递进来的参数是Object类型 , 所以任何对象都可以接收 。 一旦接收进来 , 就将Object类型的对象向下转型 , 然后判断具体的属性值 。
四、 Java基础不简单 , 谈谈hashCode()和equals()之间的联系重写equals()方法就可以比较两个对象是否相等 , 为什么还要重写hashcode()方法呢?
因为HashSet、HashMap底层在添加元素时 , 会先判断对象的hashCode是否相等 , 如果hashCode相等才会用equals()方法比较是否相等 。 换句话说 , HashSet和HashMap在判断两个元素是否相等时 , 会先判断hashCode , 如果两个对象的hashCode不同则必定不相等 。
那么有些人看到这里 , 就会问 , 如果两个对象返回的哈希码都是一样的话 , 是不是就一定相等?
答案是不一定的 , 因为HashSet、HashMap判断哈希码相等后还会再用equals()方法判断 。
总而言之:
  • 哈希码不相等 , 则两个对象一定不相同 。
  • 哈希码相等 , 两个对象不一定相同 。
  • 两个对象相同 , 则哈希码和值都一定相等 。
Java 中深拷贝与浅拷贝的区别?首先需要明白 , 浅拷贝和深拷贝都是针对一个已有对象的操作 。 那先来看看浅拷贝和深拷贝的概念 。 在 Java 中 , 除了基本数据类型(元类型)之外 , 还存在 类的实例对象 这个引用数据类型 。 而一般使用 『 = 』号做赋值操作的时候 。 对于基本数据类型 , 实际上是拷贝的它的值 , 但是对于对象而言 , 其实赋值的只是这个对象的引用 , 将原对象的引用传递过去 , 他们实际上还是指向的同一个对象 。
而浅拷贝和深拷贝就是在这个基础之上做的区分 , 如果在拷贝这个对象的时候 , 只对基本数据类型进行了拷贝 , 而对引用数据类型只是进行了引用的传递 , 而没有真实的创建一个新的对象 , 则认为是浅拷贝 。
反之 , 在对引用数据类型进行拷贝的时候 , 创建了一个新的对象 , 并且复制其内的成员变量 , 则认为是深拷贝 。
所以到现在 , 就应该了解了 , 所谓的浅拷贝和深拷贝 , 只是在拷贝对象的时候 , 对 类的实例对象 这种引用数据类型的不同操作而已 。