Java中equals和==的区别

本文详细介绍了Java中基本数据类型和引用数据类型使用'=='比较时的区别,以及equals方法的默认行为和在特定类中的重写。在String类型的比较中,说明了常量池和intern()方法的影响。同时,讨论了哈希相关概念,包括hashCode()和equals()方法的关系,强调了在自定义类中重写这两个方法的原则。
摘要由CSDN通过智能技术生成

java当中的数据类型和“==”的含义:

  1. 基本数据类型(也称原始数据类型) :byte,short,char,int,long,float,double,boolean。他们之间的比较,应用双等号(==),比较的是他们的值。
  2. 引用数据类型:当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址(确切的说,是堆内存地址)。

注:对于第二种类型,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。因为每new一次,都会重新开辟堆内存空间。

 

equals()方法介绍:

JAVA当中所有的类都是继承于Object这个超类的,在Object类中定义了一个equals的方法,equals的源码是这样写的:

public boolean equals(Object obj) {

    //this - s1

    //obj - s2

    return (this == obj);

}

可以看到,这个方法的初始默认行为是比较对象的内存地址值,一般来说,意义不大。所以,在一些类库当中这个方法被重写了,如String、Integer、Date。在这些类当中equals有其自身的实现(一般都是用来比较对象的成员变量值是否相同),而不再是比较类在堆内存中的存放地址了。

所以说,对于复合数据类型之间进行equals比较,在没有覆写equals方法的情况下,他们之间的比较还是内存中的存放位置的地址值,跟双等号(==)的结果相同;如果被复写,按照复写的要求来。

 

 == 的作用:

  基本类型:比较的就是值是否相同

  引用类型:比较的就是地址值是否相同

equals 的作用:

  引用类型:默认情况下,比较的是地址值。

 

String 类型的比较

public class StringDemo {

    public static void main(String args[]) {

        String str1 = "Hello";

        String str2 = new String("Hello");

        String str3 = str2; // 引用传递

        System.out.println(str1 == str2); // false

        System.out.println(str1 == str3); // false

        System.out.println(str2 == str3); // true

        System.out.println(str1.equals(str2)); // true

        System.out.println(str1.equals(str3)); // true

        System.out.println(str2.equals(str3)); // true

    }

}

https://images0.cnblogs.com/blog/641601/201408/221553240496054.png

new String()会放在堆中,String a = “d”会放在常量池中

Intern:

public class ObjectDemo{

    public static void main(String[] args) {

        String s1 = "Hello";

        String s2 = new String("Hello");

        s2 = s2.intern();

        System.out.println(s1 == s2);       //  true

        System.out.println(s1.equals(s2));  //  true

    }

}

检查字符串池里是否存在"abc"这么一个字符串,如果存在,就返回池里的字符串;如果不存在,该方法会 把"abc"添加到字符串池中,然后再返回它的引用。

 

哈希相关概念

Hash 就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出(int),该输出就是散列值。这种转换是一种 压缩映射,也就是说,散列值的空间通常远小于输入的空间。不同的输入可能会散列成相同的输出,从而不可能从散列值来唯一的确定输入值。简单的说,就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。

equals 与 hashCode

 二者均是Object类里的方法。由于Object类是所有类的基类,所以一切类里都可以重写这两个方法。

原则 1 : 如果 x.equals(y) 返回 “true”,那么 x 和 y 的 hashCode() 必须相等 ;

原则 2 : 如果 x.equals(y) 返回 “false”,那么 x 和 y 的 hashCode() 有可能相等,也有可能不等 ;

原则 3 : 如果 x 和 y 的 hashCode() 不相等,那么 x.equals(y) 一定返回 “false” ;

原则 4 : 一般来讲,equals 这个方法是给用户调用的,而 hashcode 方法一般用户不会去调用 ;

原则 5 : 当一个对象类型作为集合对象的元素时,那么这个对象应该拥有自己的equals()和hashCode()设计,而且要遵守前面所说的几个原则。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值