"=="操作符的作用
1.对比基本数据类型的值是否相等
2.对比引用在对内存中的引用内存是否相同
equals的作用
对比两个不同对象的内容是否相同
equals所在位置:
在Object类当中,而Object是所有类的父类,包含在jdk里面,但并不适合绝大多数场景,通常需要重写
public boolean equals(Object obj) { return (this == obj); }
用几个简单例子轻松了解区别
例子1.两个变量名不同 赋值相同
String b = new String("b1");
String b1 = new String("b1");
System.out.println("==2结果 "+(b==b1)); //flase
System.out.println("equals2 "+b.equals(b1)); //true
结论:如果String缓冲池内不存在与其指定值相同的String对象,那么此时虚拟机将为此创建新的String对象,并存放在String缓冲池内。
如果String缓冲池内存在与其指定值相同的String对象,那么此时虚拟机将不为此创建新的String对象,而直接返回已存在的String对象的引用。
所以此时两个变量引用地址相同 用== 跟equals结果相同
例子2.两个String对象引用不同,内容相同
String b = new String("b1");
String b1 = new String("b1");
System.out.println("==2结果 "+(b==b1)); //flase
System.out.println("equals2 "+b.equals(b1)); //true
结论:
两条new语句创建了两个对象,然后这两个变量分别指向了其中一个对象,这是两个不同的对象,它们的首地址是不同的,即两个引用中存储的数值(引用地址值)是不相同的,所以用==会返回flase 而用equals 会返回true
例子3.两个Object对象引用不同 内容相同
public class test {
String a;
int b;
public test(String a,int b){
this.a=a;
this.b=b;
}
public static void main(String args[]){
test t = new test("a的值",1);
test t1 = new test("a的值",1);
System.out.println("==的结果:"+(t==t1)); //flase
System.out.println("equals的结果:"+(t.equals(t1))); //false
}
结论:如果一个类没有自己定义equals方法,它默认的equals方法(从Object类继承的)就是使用==操作符,也是在比较两个变量指向的对象是否是同一对象,这时候使用equals和使用==会得到同样的结果,如果比较的是两个独立的对象则总返回false。