java基础(六)-----浅谈java中“==”和“equals”的区别

学习java已经差不多有一整年的时间了,暂时学到servlet,每次想继续学习新知识的时候,总是听到旁边的人说java基础如何如何重要,的确,万丈高楼平地起,只有经过时间和代码的积累,才会有一个相对的提升。学习java并不是你看了几本书,看了多少的视频,关键在于学习的基础上多总结。比如说,java中“eqals”与“==”的异同。我反正在这个问题上面犯晕过。截止现在想写关于“equals”与“==”的区别时候,也可能理解的有偏颇。废话不说了。
首先我们先撇开字符串类。后面再说。

对于一般的类,“==”与“equals“的效用相同。都是比较两个对象的hasnCode是相等。即比较两个对象在内存中的地址是否相同。相同返回true,不同则返回false。

package myday01;

public class Test {

	public static void main(String[] args) {
		
		
		Person p1=new Person("a","123");//创建两个person对象	
		Person p2=new Person("a","123");
		System.out.println(p1==p2);//创建了两个对象,返回false
		System.out.println(p1.equals(p2));//返回false

	}

}
class Person
{
	private String name;
	private String password;
	
	Person(String name,String password)
	{
		this.name=name;
		this.password=password;
		
	}
	
	/*public boolean equals(Object obj)
	{
		if(obj instanceof Person)
		{
			Person p = (Person)obj;
			if(name.equals(p.name)&&password.equals(p.password))
			{
				return true;
			}
		
	}
		return super.equals(obj);
	}
	
	public int hashCode()
	{
		return name.hashCode();
	}*/
}
综上,如果类没有改写equlas和hashcode,那么,他们的用途相同。但是,在String和Integer等其他类来说,他们不相同,这是为什么呢? 因为这些包装类已经重写了equlas方法和hasnCode方法。这些类的equals方法已经不是比较两个对象的hash值,也就是重写了hashcode方法。见代码:

package myday01;

public class Test2 {

	public static void main(String[] args) {
		
		Integer i1=new Integer(111);
		Integer i2=new Integer(111);
		System.out.println(i1==i2);//返回false,比较的是hashcode,即内存中的地址
		System.out.println(i1.equals(i2));//返回true,改写了Object的方法,只要构造函数中的参数相同,就返回t//rue

	}

}
再看一例:


package myday01;

public class Test3 {

	public static void main(String[] args) {
		
		String s1=new String("abc");
		String s2=new String("abc");
		System.out.println(s1==s2);//,根据上面的结论,可以得出:返回false
		System.out.println(s1.equals(s2));//返回true

	}

}
再看一例:

package myday01;

public class Test4 {

	public static void main(String[] args) {
		
		String s1="abc";
		String s2="abc";
		System.out.println(s1==s2);//??
		System.out.println(s1.equals(s2));//毫无疑问,此处为true

	}

}

问号处答案为:true。与上面例子的结果不同。为甚?
因为java的字符串中有一个字符串常量池的概念,定义s1的时候,虚拟机会再常量池中寻找是否有”abc“的对象,找到以后,就把该对象的地址赋值给s1,第一步没有“abc”对象,所以会创建一个,第二步会找到该对象,也会把该对象得地址(也可以说是hash值)赋值给s2。所以两变量指向同一个对象,结果就为两个true。
综上:常常听见有人说equals是比较值是否相等,==比较地址,这种说法很片面。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值