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