== 和 equals 的区别是什么?
本文于 2123 天之前发表,文中内容可能已经过时。
简单来说,此题的结论可以总结为:”==”相等判断符用于比较基本数据类型和引用类型数据。 当比较基本数据类型的时候比较的是数值,当比较引用类型数据时比较的是引用(指针)。
而equals是引用类型自定义的判断是否相等的方法。
那么问题来了:
首先什么是基本数据类型:
在java中基本数据类型总共有八种:分别是int,float,char,boolean,double,long,short,byte
他们在判断是否相等的时候就可直接使用”==”
例如:
int a = 10;
int b = 10;
System.out.println(a == b); // true
引用类型在开发过程中最多用到的就是String了。
1. String a = "abc";
2. String b = "abc";
3. System.out.println(a == b); // true
这里可能有人会有疑问,为什么使用的 == 判断结果会是true,解释如下:
其实第1行代码只是创建了一个对象,结果是将”abc”放到了字符串常量池,而a指向了它,第二句代码执行的时候编译器会发现字符串常量池里边已经存在
了该常亮,所以不会再次创建,而只是创建了一个新的指针b指向它,所以当执行==时,由于a和b指向的是同一个字符串常量,所以结果为true
4. String c = new String("abc);
5. System.out.println( a == c); // false
第4行代码在堆(heap)中创建了一个对象,然后将字符串常亮池里边的”abc”指向它,而且它自己指向了常量c,所以在使用 “==” 时,实质上判断的是
常量池中的”abc”和堆中保存的对象,结果肯定是false,所以String才内置了equals方法来判断他们是否值相同,具体的可以看看String的equls的源码。
基础知识:
栈(stack):主要保存基本类型(或者叫内置类型)(char、byte、short、int、long、float、double、boolean)和对象的引用,数据可以共享,速度仅次于寄存器(register),快于堆。
堆(heap):用于存储对象