当前位置: 移动技术网 > IT编程>开发语言>Java > Java中的“==“和“equals“不同(区别和使用)

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

2020年08月17日  | 移动技术网IT编程  | 我要评论
对于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的对象地址是相同的。
在这里插入图片描述

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

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

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

在这里插入图片描述

明显可以看到,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

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网