欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java中的“==“和“equals“不同(区别和使用)

程序员文章站 2022-03-26 16:51:23
对于Java初学者来说,==和equals方法真的是一个绕不过去的巨坑,我自己在写算法题时都被这玩意坑了好几次,这篇文章承载着我过去所有关于跳入此坑中的辛酸史,好好记录一下两者的区别...

1.==“==”
对于Java中的==“==”比较来说,如果被比较的是基本数据类型,则比较的是基本数据类型的值(注:等号两边的数据类型不一定要相同,只要是值相同,就能返回true,但对于某些不同数据类型的比较,编译器会直接报错)

 public static void main(String[] args) { int a=1; int b=1; char c=1; byte d=1; //byte数据类型:代表一个字节(8位:-128~127) boolean e=true; System.out.println(a==b);//true System.out.println(a==c);//true System.out.println(a==d);//true System.out.println(a==e);//报错 } 

Java中的基本数据类型有:
1.逻辑类: boolean
2.文本类 :char
3.整数类 :byte, short, int, long
4.浮点类 :double, float。

也就是说,对于以上的数据类型,=="“=="采取的都是值比较,值相等就返回true,值不相等就返回false。

如果被比较的不是基本数据类型,而是引用类型的话,那=="“=="所比较的就不是他们“内容”的值,而是两者内存地址的值,如果两者内存地址相同,则返回true,否则返回false

 public static void main(String[] args) { Object a=new Object(); Object b=new Object(); Object c= a; System.out.println(a==b);//false System.out.println(a==c);//true } 

Java中的引用类型有:
1.类:class
2.接口:Interface
3.数组:Array

记录一个String类中的巨坑:

 public static void main(String[] args) { String a="123"; String b="123"; String c=new String("123"); String d=new String("123"); System.out.println(a==b); //ture System.out.println(a==c); //false System.out.println(c==d); //false } 

为什么会出现明明字符串a、b、c、d的值都相等,但是====符号比较出来的结果却是有的相等,而有的却不同呢。这就涉及到Java的一些底层原理了。我们知道,String对象的创建有两种方式,一种是String a=“123”;另一种是String c=new String(“123”);如果以第一种方式创建对象,则对象是创建在Java的常量池中的,具体的创建方式是Java虚拟机会现在常量池中找是否存在对象“123”,如果存在,则直接返回“123”的引用,如果不存在,则创建一个对象“123”,再返回它的引用,所以实际上,a与b是同一个对象“123”的引用;而如果以第二种方式创建对象,则对象是创建再堆中的,虚拟机会在堆中创建一个对象,然后再常量池中找对象“123”,如果没有就在常量池中创建一个,然后将常量池中的对象“123”拷贝到堆中新创建的对象里,再返回堆中对象的引用,所以c与d引用的对象在堆中,而且是不同的对象,显然c、d的对象地址是不同的而a、b的对象地址是相同的。
Java中的“==“和“equals“不同(区别和使用)

2.equals()
equals方法的原型在类Object中,而Object类是所有类的父类,如果我们翻看equals方法在Object类中的源码就会发现只有一行代码

Java中的“==“和“equals“不同(区别和使用)
并且我们可以看到Object类中的equal方法和====是一样的,对于类来说依旧是地址比较,但是在很多其他类中都重写了equals方法,使其不再是地址比较,比如String类。
Java中的“==“和“equals“不同(区别和使用)
对于在String类中的equals(),如果地址相同则返回true,如果地址不同则会调用StringLatin1类中的equals()方法或者StringUTF16中的equals()方法。

我们再来看看StringLatin1类中的equals()方法是怎样的(StringUTF16类中的原理大同小异)

Java中的“==“和“equals“不同(区别和使用)

明显可以看到,StringLatin1类中的equals()方法对字符串进行了逐字符的比较,所以equals()方法在String类中进行重写后,不再是地址比较,而是值比较,所以我们在比较两个字符串是否相等时最好不要用====,而是使用equals方法。

public class Main{ public static void main(String[] args) { String a=new String("123"); String b=new String("123"); System.out.println(a==b);//false System.out.println(a.equals(b));//true } } 

本文地址:https://blog.csdn.net/CY2333333/article/details/107968005