细聊Equals和==的区别

简介: Equals和==的区别可以说是在找工作的过程中笔试、面试必问必考的知识点了,今天就来说道说道!

Equals和==的区别可以说是在找工作的过程中笔试、面试必问必考的知识点了,今天就来说道说道!


首先看看下面这段代码:


package Demo1;
public class TestDemo2 {
  public static void main(String[] args) {
    String s1 = "hello";
    String s2 = "hello";
    String s3 = new String("hello");
    String s4 = new String("hello");
    int a=21;
    int b=21;
    System.out.println(s1==s2);
    System.out.println(s1==s3);
    System.out.println(s2==s3);
    System.out.println(s3==s4);
    System.out.println(s1.equals(s2));
    System.out.println(s2.equals(s3));
    System.out.println(s1.equals(s3));
    System.out.println(s4.equals(s3));
  }
}
复制代码


上面的代码输出的结果是什么呢?


我们都知道,在JVM的内存结构有堆内存跟栈内存。当我们通过new创建一个新对象的时候,就会调用该对象的构造函数在堆内存中开辟空间并且将对象的值(内容)存储到堆内存中,与此同时在栈内存中会生成该对象对应的引用,而在后续调用的时候用的就是栈内存中的引用。


所以上面得代码在堆栈内存中的分配就是


70c1dce00b0b4422897e7ee15e8f88c0~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg


可以发现s1和s2和equals的结果输出都是true,而s1和s2对于s3的的结果为false而equals的结果是true, 参考上面的内存图可以看到s1和s2都指向了同一块堆内存区域,而s3和s4都是单独指向了一块新的内存区域,所以s1和s2引用的是同一对象的,而s3和s4都是分别引用的是另一个新的对象,只是对象的值一样。


这里涉及到一个字符串常量池的概念,大致意思就是通过=新建一个字符串的时候会先去常量池看看有没有这个值,如果有则直接将这个字符串的引用指向这块内存地址,如果没有则新建一个。而通过new的方式新建一个对象不管堆内存中是否有这个值,都会重新申请一块内存并进行引用。


这时候我们来看看上述代码的输出结果:


true
false
false
false
true
true
true
true
复制代码


关于equals和==区别的总结:


== 用于引用类型:比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,即是否是指相同一个对象。比较的是真正意义上的指针操作。


== 用于基本数据类型:则比较值是否相同。基本数据类型不存储在堆内存中,成员变量的基本数据类型是存在方法区的常量池中,局部变量的基本数据类型是存在栈内存的常量池中


equals是用来比较的是两个对象的内容是否相等,并且equals不能应用于基本数据类型,如果强行写的话会报错:


Cannot invoke equals(int) on the primitive type int
复制代码


本文对equals和==的区别做了一个简单的分析和总结,很多人对于这个也一直比较模糊,这个问题也基本是笔试面试的必问题了,所以必须弄清楚!

目录
相关文章
|
1月前
|
Java
== 和 equals 有什么区别?
本文解释了在Java中,"=="用于比较基本数据类型的值或引用类型的引用是否相等,而"equals"默认也是比较引用,但常常被重写为比较对象的值是否相等,例如在String和Integer类中,并且提供了如何自定义"equals"方法的示例。
72 0
== 和 equals 有什么区别?
|
1月前
|
C# 开发者
【捞底干货】C#中equals和==运算符的区别
【捞底干货】C#中equals和==运算符的区别
26 1
|
3月前
|
Java
“a == b” 和 “a.equals(b)” 的区别
【8月更文挑战第22天】
56 0
|
5月前
|
存储 Java
equals与==区别
equals与==区别
39 0
equals 和 == 的区别?
equals 和 == 的区别?
79 0
|
Java
== 和 equals 的区别是什么
== 运算符用于比较两个对象的引用是否相等。它对于基本类型比较值的相等性,对于引用类型比较引用的相等性。当使用 == 比较两个对象时,它会检查它们是否指向相同的内存地址。如果两个对象具有相同的内存地址,则它们被认为是相等的。
70 1
|
Java
==和equals()
==和equals()
73 0
equals和 == 的区别
equals和 == 的区别
77 0
|
存储 Java
详解“==”和equals的区别
“==”和equals 最大的区别是 “==”是运算符,如果是基本数据类型,则比较存储的值;如果是引用数据类型,则比较所指向对象的地址值。 equals是Object的方法,比较的是所指向的对象的地址值,一般情况下,重写之后比较的是对象的值。