二者的区别在于:
==比较的是两个对象的引用(即内存地址)是否相等,而equals ()比较的是两个对象的值(即内存地址里存放的值)是否相等。 当 然equals ()在个别类中被重写了那就例外了。
我们先定义一个字符串str1,再令str2==str1,分别输出二者
String str1="aaa";
String str2=str1;
System.out.println(str1==str2);
System.out.println(str1.equals(str2));
运行结果如下,都是true
我们再对代码进行修改,str2单独new一个空间
String str1=new String("aaa");
String str2=new String("aaa");
System.out.println(str1==str2);
System.out.println(str1.equals(str2));
运行结果如下:
这是因为在上一个例子中,str2=str1是浅层复制,二者共用一个内存空间,因此str1==str2必然返回真,而在此例中str1和str2都分别new了一个空间,str1==str2返回假。
我们依然对上例进行修改:
String str1=new String("aaa");
String str2=new String("bbb");
System.out.println(str1==str2);
System.out.println(str1.equals(str2));
结果如下
二者的值不相同,内存地址也不相同。因此str1==str2和str1.equal(str2)都返回假。
由此,我们可以总结出eqauls 与 ==之异同:
1)比较方式角度:
= =是面向过程的操作符;equals是面向对象的操作符
= =不属于任何类,equals则是任何类(在Java中)的一个方法;
我们可以1)Primitive1 (基本类型)= = Primitive2(基本类型);
2)Object Reference1(对象引用)= = Object Reference2(对象引用)
3)Object Reference1 (对象引用) .equals(Object Reference2 (对象引用))
这三种比较
但却不能Primitive1 (基本类型).equals( Primitive2(基本类型));
对于基本类型,没有面向对象中发送消息一说,自然也不会有
方法成员。
2)比较目的角度:
1) 如果要比较两个基本类型是否相等,请用= =;
2) 如果要比较两个对象引用是否相等,请用= =;
3) 如果要比较两个对象逻辑上(内容)是否一致,请用equals;
对两个对象(逻辑上)是否一致的阐释:
有人会问:在C++中, 比较两个对象相等不是也可以用==吗?我知道你是指运算符重载,但是很遗憾,Java中不支持运算符重载(java中亦有重载过运算符,他们是 “+”,“+=”,不过也仅此两个,而且是内置实现的);所以,对象的是否相等的比较这份责任就交由 equals()来实现 。
这个“逻辑上”其实就取决于人类的看法,实际开发中,就取决于用户的需求;