这种讲解equals和==区别的方式,全网第一!

  • 2019 年 10 月 31 日
  • 筆記

开始学习Java的总是被equals==混淆,即使看了相关的技术贴子,过一段时间也很容易忘记,那么有没有一种办法使得还在“淤泥”中挣扎中的攻城狮们过目不忘呢?或许本文对你会有所帮助,不信,你看看再说话。

首先咱来了解一下在JVM中内存分配的知识

在JVM中,内存分为堆内存和栈内存。它们的区别可以用下图来形象的解释:

暂且不管方法区。单看堆和栈。 TestClass testClass = new TestClass();,当我们创建对象TestClass()时候,就会调用TestClass的构造函数来开辟空间,将对象数据存储到堆内存中,与此同时在栈内存中生成对应的引用,在后续代码中调用的时候我们直接调用的是栈内存中的引用。

equals与==区别:

1.==是判断两个变量或实例是不是指向同一个内存空间,equals是判断两个变量或实例所指向的内存空间的值是不是相同 2.==是指对内存地址进行比较 , equals()是对字符串的内容进行比较 3.==指引用是否相同, equals()指的是值是否相同 用一张具有生命力的图直观表示一下他们之间的关系:

神总结:

  • == 比较如果说是基本数据类型比较的是值 如果是引用数据类型比较的是内存
  • equals 比较的是值
简单的用代码检验一下:
//a为一个引用  String a = new String("abcd" );  //b为另一个引用,a跟b的对象内容是一致的  String b = new String("abcd");  //把“abcd"放在常量池中  String c = "abcd";  //从常量池中查找“abcd"  String d = "abcd" ;  System.out.println(a == b);//false  System.out.println(a.equals(b));//true,在String中 equals方法被重写当物理地址不同时,会进一步比较值。  System.out.println(d == c);//true  System.out.println(c.equals(d));//true