如何区分“==”与Equals方法?

“==”一般比较的是基础变量(4类8种)的大小。比如:

int a=3,b=3;
System.out.println(a==b); //true

肯定的,a=b。显示为true。

 

比较2个字符串内容是否相等时,例如:

String s1="HelloWorld";
String s2="HelloWorld";	
System.out.println(s1==s2);//true

注意此时,s1 ,s2里的东西并不是new出来的,而是直接用“==”号出来的。在字符串中,字符串的大小并不能被改变。(此时的s1和s2你可以“稍微”当做基础变量来对待。) 看下图:

 

字符串变量是存储在JAVA虚拟机的Data Segment里面。此时的s1和s2指向的其实是同一个内容即“HelloWorld”。所以s1==s2。 

接下来我们来比较对象,例如:

class Cat{
	private int height;
	String name;
	float weight;
	 Cat(String n,int h,float w){
		this.name=n;
		this.height=h;
		this.weight=w;
		}
	void run() {
			System.out.println("我是猫 ,正在跑");
		}
	
}

新建了一个猫类,并且构造方法有三个参数,名字,身高和体重。

		Cat c1=new Cat("mimi",40,15);
		Cat c2=new Cat("mimi",40,15);
		System.out.println(c1==c2);//false
		System.out.println(c1.equals(c2));//false
	Cat c1=new Cat("mimi",40,15);
		Cat c2=new Cat("mimi",40,15);
		System.out.println(c1==c2);//false
		System.out.println(c1.equals(c2));//false
	

我们在主程序中new 出2个猫的对象,c1和c2,给它们传入的3个参数也都相同。然后判断它们是否相等。发现2个结果都是false。先看第一种:“==”比较这2个时,是比较它们是不是同一个对象。在内存中的图如下所示。

 

在栈中存放着c1和c2对象的引用(可以看出来它们指向的对象是2个对象,尽管里面传入的3个成员变量参数是一样的,但是它们始终是2个东西),所以“c1==c2”肯定是不相等的。

然后我们又看到c1和c2用equals比较时(System.out.println(c1.equals(c2));//false),结果还是false,这是为什么?我们去API文档看一看equals方法的说明。如下:

我们看最下面的一段话:从that is之后的翻译:“也就是说,对于任何非空的引用值x和y,当且仅当x和y引用相同的对象时,该方法返回true(x == y有值为真)。”从这里我们知道,equals方法在Object里的实现方式默认是和“==”的比较方式是一样的。所以当c1==c2返回值为false时候,equals的返回值也是false,因为在这里它们比较的方式一样,比较c1和c2是否为同一个对象,答案当然不是。

然后我们在看String对象的比较,代码如下:

		
		String s3 =new String("HelloCSDN");
		String s4 =new String("HelloCSDN");
		System.out.println(s3==s4); //false
		System.out.println(s3.equals(s4));//true

此时的s3和s4是new出来的。它们都传入了相同的参数“HelloCSDN”此时用“==”号比较时,发现结果是false,但是用equals比较之后发现结果是true。这是为什么呢?s3,s4是String 类的2个对象,所以我们去查看API里关于String类包含的方法那一部分,发现它也有equals方法,说明String类里重写了equals方法。内容如下:

 

Compares this string to the specified object. The result is true if and only if the argument is not null and is a String object that represents the same sequence of characters as this object.

译文:将此字符串与指定的对象进行比较。如果且仅当参数不是null并且是表示该对象的相同字符序列的字符串对象时,结果是正确的。

此时s3和s4比较时调用的equals方法是重写之后的方法,按照上面的方法内容,它们比较的是“字符序列”,我们传入的2个参数都是“HelloCSDN”,所以s3,s4,equals之后的结果是true。

在这里我们在Cat类里面重写equals方法,想让它按照我们的比较方式来进行比较,(即使这2个猫不是同一个对象,但是它们的名字,身高,体重相同我们就认为它们是相同的对象)。重写的代码如下:

 

public boolean equals(Object obj) {
		if(obj==null) return false;
		else {
			if(obj instanceof Cat) {
				Cat c= (Cat)obj;
				if(c.name==this.name&&c.height==this.height&&c.weight==this.weight) {
					return true;
				}
			}
		}
		return false;
	}

此时我们在运行一遍程序

		Cat c1=new Cat("mimi",40,15);
		Cat c2=new Cat("mimi",40,15);
		System.out.println(c1==c2);//false
		System.out.println(c1.equals(c2));//true	Cat c1=new Cat("mimi",40,15);
		Cat c2=new Cat("mimi",40,15);
		System.out.println(c1==c2);//false
		System.out.println(c1.equals(c2));//true

发现,c1和c2此时用equals比较,结果为true了,符合我们的意愿。

 


在实际中进行2个对象的比较时候,如果要调用equals方法,则首先了解要比较的这2个对象的类里是否重写了equals方法(查API文档),如果没有,则需要自己手动重写之后再调用。否则结果是和“==”的结果是一样的。。。
 

(在初学JAVA时候“==”号“equals”这个问题困扰了我很久,在看了马士兵老师的JAVA教学视频后,终于明白了)~

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值