一:什么是==?
==(等于比较运算符)如果进行比较的两个操作数都是数值类型,即使他们的数据类型不相同,只要他们的值相等,也都将返回true.如果两个操作数都是引用类型,那么只有当两个引用变量的类型具有父子关系时才可以比较,而且这两个引用必须指向同一个对象,才会返回true.(在这里我们可以理解成==比较的是两个变量的内存地址)
对于基本数据类型,==表示对值是否相等进行判断
int a = 5;
int b = 5;
System.out.println(a==b);//true
对于引用数据类型,==表示对于地址值的判断是否相等
String str1 = new String("str1");
String str2 = new String("str2");//false,因为是两个不同的对象,在堆内存中给它开辟了两块不同的内存空间
二:什么是equals?
equals()方法是Object类的方法,在Object类中的equals()方法体内实际上返回的就是使用==进行比较的结果.但是我们知道所有的类都继承Object,而且Object中的equals()方法没有使用final关键字修饰,那么当我们使用equal()方法进行比较的时候,我们需要关注的就是这个类有没有重写Object中的equals()方法.
public boolean equals(Object obj) {
return (this == obj);
}
在源码中我们可以看出,equals在Object类中实际上封装的也是通过==来进行判断的
所以当我们需要两个对象去比较实体内容的话,我们可以考虑将equals进行重写
三:它们之间的区别
== 是java提供的等于比较运算符,用来比较两个变量指向的内存地址是否相同.而equals()是Object提供的一个方法.Object中equals()方法的默认实现就是返回两个对象==的比较结果.但是equals()可以被重写,所以我们在具体使用的时候需要关注equals()方法有没有被重写。像String、Date、File、包装类等都重写了Object类中的equals()方法。
四:一个小知识点,但是个“坑”
引出Integer中重写后的equals的源码
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
JDK1.5之后,新增了自动拆箱,装箱功能,如以前创建一个Integer对象,需要使用“new”关键字
而现在Java中可以直接赋值如下:
Integer不是new出Integer对象,而是直接赋值,就是自动装箱过程。
Integer a = new Integer("100");
//JDK1.5之后
Integer b = 300;
int x = 300;
System.out.println(b==x);
再来测试如下代码:
这里结果不一致原因是,因为new了两个 Integer()对象,开辟了两块内存空间,所以是两个引用类型在进行内存地址之间的比较,而引用变量并没有指向同一个对象地址,所以就是false了
对于两个非new生成的Integer对象,进行比较时,如果两个变量的值在区间-128~127之间,则比较结果为ture,如果在这个范围之外则为false
Integer i = new Integer(1);
Integer j = new Integer(1);
System.out.println(i == j);//false
Integer i = 1;
Integer j = 1;
System.out.println(i == j);//true
这里的不同,我们引入了常量缓存池的概念
Integer i = 1时,会将1进行缓存,下次再写Integer j = 1时,就会直接从缓存中取,就不会new了,这样取到的1的地址也是相同的,所以如下==判断返回true。但对于-128到127范围之外的数,实际上就是new才得到的,地址不同==判断为假,所以如下==判断为false
Integer i = 1;
Integer j = 1;
System.out.println(i == j);//true
Integer i = 128;
Integer j = 128;
System.out.println(i == j);//false
为什么常量缓存池是 -128~127?
引入的一个有助于节省内存,提高性能的特征
这里的引入了拆箱的概念,直接用==比较,Integer类型做了拆箱的操作,会自动拆箱为int,所以也可以直接用==判断
Integer i = 5;
int j = 5;
System.out.println(i==j);
下面这些输出之后是什么,并解释它的原理
//-128 ~ +127 之间
Integer a = 5;
int b = 5;
Integer c = new Integer(5);
Integer d = 5;
System.out.println(a.equals(b));
System.out.println(a == b);
System.out.println(a.equals(c));
System.out.println(a == c);
System.out.println(a == d);
//-128 ~ +127 之外
Integer a = 128;
int b = 128;
Integer c = new Integer(128);
Integer d = 128;
System.out.println(a.equals(b));
System.out.println(a == b);
System.out.println(a.equals(c));
System.out.println(a == c);
System.out.println(a == d);