什么是==?
等于比较运算符。即使他们的数据类型不相同,只要他们的值相等,也都将返回true…(在这里我们可以理解成==比较的是两个变量的内存地址)
什么是equals()?
equals()方法是Object类的方法,在Object类中的equals()方法体内实际上返回的就是使用==进行比较的结果.但是我们知道所有的类都继承Object,而且Object中的equals()方法没有使用final关键字修饰,那么当我们使用equal()方法进行比较的时候,我们需要关注的就是这个类有没有重写Object中的equals()方法.
区别
是java提供的等于比较运算符,用来比较两个变量指向的内存地址是否相同.而equals()是Object提供的一个方法.Object中equals()方法的默认实现就是返回两个对象==的比较结果.但是equals()可以被重写,所以我们在具体使用的时候需要关注equals()方法有没有被重写.
坑
int 和 Integer(Integer范围是-128~127之间)
public static void main(String[] args) {
//-128 ~ +127 之间
Integer a = 5;
int b = 5;
Integer c = new Integer(5);
Integer d = 5;
System.out.println(a.equals(b));//true
System.out.println(a == b);//true
System.out.println(a.equals(c));//true
System.out.println(a == c);//flase
System.out.println(a == d);//true
//-128 ~ +127 之外
a = 128;
b = 128;
c = new Integer(128);
d = 128;
System.out.println(a.equals(b));//true
System.out.println(a == b);//true
System.out.println(a.equals(c));//true
System.out.println(a == c);//flase
System.out.println(a == d);//flase
}
重点:
System.out.println(a == d); 同样的表达式,不同的值为什么结果不同
System.out.println(a == c); 与 System.out.println(a == d); 同样的对象类型,为什么复制方式不一样,比较结果不一样
System.out.println(a == c); 与 System.out.println(a.equals©); 不同的比较方式,结果为什么不同
结论:
赋值方式中如果调用了new关键字,一定会在内存中给你分配一个新的地址
给Integer类型赋值的时候,如果没有调用new关键字,并且值在-128与+127之间,包括-128和+127,那么指向的都是同一个内存位置.
Integer类中重写了equals()方法,使用equals()方法进行比较的时候,实际上比较的内存中最终指向的值的内存位置,不是直接比较变量的内存位置.
重写的equals()方法
另一种解读
==的解读:
如果用作基本数据类型的变量,则比较的是其存储的值是否相等。
如果用作引用类型的变量,则比较的是所指向的对象的地址。
equals的解读:
public static void main(String[] args) {
//基本数据类型的比较
int num1 = 10;
int num2 = 10;
System.out.println(num1 == num2); //true
//引用数据类型的比较
String s1 = "hello";
String s2 = "hello";
System.out.println(s1 == s2); //true
System.out.println(s1.equals(s2)); //true
//String类中==与equals的比较
String s3 = new String("hello");
String s4 = new String("hello");
System.out.println(s3 == s4); //false
System.out.println(s3.equals(s4)); //true
//没有重写类中的==与equals类型的比较 就是没有在父类中重写equals方法的类
People p1 = new People();
People p2 = new People();
System.out.println(p1.equals(p2)); //false
People p = p2;
System.out.println(p.equals(p2)); //true
}
解释
针对第一种的基本类型的比较,正常比较其值即可。
针对String类型的比较,这里展开说明一下,因为String类对equals()方法进行了重写。
首先创建字符串对象通常有以下两种写法:
1 String s1 = "hello";
2 String s2 = new String("world");
第一种的话在字符串常量池中创建对象,并将对象引用赋值给s1;
第二种的话通过new关键字在堆中创建对象,并将对象引用赋值给s2.
equals方法是基类Object中的实例方法,对所有继承与Object的类都会有该方法,其比较的是对象
如果类没有对equals方法进行重写,那么就是==, 即比较的对象的地址
如果类对equals方法进行了重写,一般用来比较两个对象的内容是否相等。如String中的equals()是被重写了,比较的是对象的值。