Java中的==的作用以及和equals() 的区别

本文介绍了Java中基本数据类型与对象类型在使用==进行比较时的不同,以及String对象在字符串常量池中的处理。同时,详细阐述了equals()方法与==运算符的区别,强调equals()可以重写以比较对象内容,而==比较的是对象引用或基本类型的值。文章通过实例展示了这些概念,并提到了Objects.equals()方法作为安全的对象比较方式。
摘要由CSDN通过智能技术生成



众所周知:

  • 如果是基本数据类型,==判断的是值

  • 如果是对象类型,==判断的是对象的地址
  • 通过直接赋值而不是new的方式给String赋值,如果字符串常量池中有该对象,则不会再创建,此时通过 ==  判断,返回的是true。如:String str1=“Java”;String str2=“Java”;str1 == str2为true.
  • 在JDK1.7以前版本,字符串常量池在方法区中;
  • 在JDK1.7及以后,字符串常量池在堆中。
    对象的引用保存在栈中

所以我们这边比较的是:基本数据类型和包装类之间的数据比较:

如下

double a = 2.0;
double b = 2.0;
Double c = 2.0;
Double d = 2.0;

System.out.println("a == b : " + (a == b));
System.out.println("c == d : " + (c == d));
System.out.println("a == d): " + (a == d));

其中由于自动装箱会将Double 中的value  通过doubleValue()转换成  数字

/**
 * Returns the {@code double} value of this {@code Double} object.
 *
 * @return the {@code double} value represented by this object
 */
@HotSpotIntrinsicCandidate
public double doubleValue() {
    return value;
}

具体的原理如下:

System.out.println("a == b : " + ((a == b) ? 1 : 0));
System.out.println("c == d : " + ((c == d) ? 1 : 0));
System.out.println("a == d : " + ((a == d.doubleValue()) ? 1 : 0));

所以,输出的结果为:

a == b : true
c == d : false
a == d : true

equals()

与 `==` 运算符相对应的是 `equals()` 方法,它是定义在 `Object` 类中的方法,可以被子类重写。
`equals()` 方法用于比较两个对象的内容是否相等。它的默认实现与 `==` 运算符的行为相同,即比较对象的引用是否相等。

然而,许多类(如 `String`、`Integer` 等)重写了 `equals()` 方法,将其定义为比较对象的内容是否相等。
这样,使用 `equals()` 方法可以进行更细粒度的比较,而不仅仅是比较对象的引用。

因此,`==` 运算符和 `equals()` 方法之间的区别可以总结如下:
- `==` 运算符比较的是对象的引用或基本数据类型的值。
- `equals()` 方法比较的是对象的内容,它可以被重写以提供自定义的比较逻辑。

需要注意的是,在使用 `equals()` 方法进行对象比较时,应该确保对象不为 `null`,否则可能会抛出 `NullPointerException` 异常。
通常,应该使用 `Objects.equals(obj1, obj2)` 方法来进行安全的对象比较,该方法会首先检查对象是否为 `null`。

String str1 = "Hello";
String str2 = "Hello";
String str3 = new String("Hello");

System.out.println(str1 == str2);            // true,引用相等
System.out.println(str1.equals(str2));       // true,内容相等

System.out.println(str1 == str3);            // false,引用不相等
System.out.println(str1.equals(str3));       // true,内容相等

Integer num1 = 100;
Integer num2 = 100;
Integer num3 = new Integer(100);

System.out.println(num1 == num2);            // true,引用相等
System.out.println(num1.equals(num2));       // true,内容相等

System.out.println(num1 == num3);            // false,引用不相等
System.out.println(num1.equals(num3));       // true,内容相等

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值