==:是一个比较运算符,用来判断两个变量是否相等即两个对象在内存中的首地址是否相同。
equals ():是Object类提供的一个实例方法也就是说每个类都含有这个方法,如果不对其重写。它的作用是和==是一样的
如果不对其重写。
下面看个例子
package com.iss.test;
public class Test {
public static void main(String[] args) {
String s1, s2, s3 = "abc", s4 = "abc";
s1 = new String("abc");
s2 = new String("abc");
System.out.println(s3 == s4);// 结果为true这是因为在字符串池中如果已经有相同的字符串,就会将值直接赋给引用,因此它们指向的同一个对象
System.out.println(s1 == s2);// 結果为false这是因为它们的内存地址不一样,指向的对象不一样
System.out.println(s1.equals(s2));// 结果为true。为什么呢不是说它和==的作用是一样的吗?原因在于它把从Object继承而来的equals方法重写只要保证内容相同就返回true
// 但是在Stringbuilder中就没有对equals()进行重写所以结果为false;
StringBuilder builder = new StringBuilder("abc");
StringBuilder builder2 = new StringBuilder("abc");
System.out.println(builder.equals(builder2));
// 变为String类型就会相等了可见String对equals()进行了重写
System.out.println(builder.toString().equals(builder2.toString()));
}
}
Object 中默认的equals()和==是等价的只是比较内存的中的地址,我们可以通过重写equals()来自定义自己的等价规则
ps:对基本类型的比较只能是通过==进行比较因为他们没有equals()这个方法只要数值相同,可以不问他们的数据类型。这是因为java的自动数据类型提升。
int a = 10;
float b = 10.0f;
double c = 10.0000;
System.out.println(a==b);//true
System.out.println(a==c);//true
8个基本类型所对应的包装类型的equals()方法也被重写成只比较内容。
Integer num1=new Integer(12);
Integer num2=new Integer(12);
System.out.println(num1==num2);//false
System.out.println(num1.equals(num2));//true
总结:两者区别就在于equals()方法有没有被重写。