= =和equals的区别是什么

一、Java基础

==和equals的区别是什么

       该问题是Java中最基本的小白问题,但是很多人不去注意,就会导致之后编写代码的时候出现一些最基本的错误,却总是找不到错误来源。
       其实很简单,只要了解了之后就会觉得,哎呦,一般般了。

“==”在Java中是操作数的值相等
public class Test {
	public static void main(String[] args){
		int a=2;
		int b=2;
		System.out.println(a==b);
		
		String m = "abc";
		String n = "abc";
		System.out.println(m==n);
		
		String x = new String("hello world");
		String y = new String("hello world");
		System.out.println(x==y);
	}
}

输出的结果为: true ture false


       首先说一下为什么生成true或者false,在Java中关系操作符生成的是一个布尔类型的结果类型。
       因此对于第一个输出,输出结果为true,原因刚才已经提及,“==”代表的是值是否相等,很明显2=2。
       对于第二个输出为true,也很好理解,但是第三个输出为什么就是false了呢?
       这里要说明一下,基本类型与非基本类型的区别。
       对于Java中8种基本数据类型(不懂的自己搜索吧,这里不一一列举)的变量,变量直接存储的是“值”,所以在进行“= =”操作时,比较的是值本身。但是对于String类型,它非基本数据类型的变量。
首先说:
String x = new String(“hello world”);
String y = new String(“hello world”);
       x指向了一个对象(也可以说对象的引用),此时变量x中存储的是它指向的对象在内存中的存储地址。

然后再看下边:
String m = “abc”;
String n = “abc”;
       Java中相同字符串用的是同一块内存,它没有单独创建一块内存,所以引用的地址也是相同的。

equals比较

       看了一些资料和论坛,equals方法是基类Object中的方法,为了更直观的查看不同大部分博客中直接写出了Object类中equals方法的实现。代码如下:

public boolean equals(Object obj){
		return (this == obj);
	}

可以看出上面的方法是比较两个对象的引用是否相等。

public class Test {
	public static void main(String[] args){
		String a = "abc";
		String b = "abc";
		System.out.println(a.equals(b));
		
		String c = new String("hello");
		String d = new String("hello");
		System.out.println(c.equals(d));
	}
}

输出的结果为: true ture
       可能很多人会问不是比较引用的地址吗?为什么new出来的比较也为true呢?其实这里又涉及到String类中的equals方法,Java中许多类(String类就是其中一个)对equals方法进行了重写,用来比较指向的字符串对象所存储的字符串是否相等。所以结果如上。


再扩展一点,代码的魅力无穷你得使劲的钻研啊!看下面的代码:

public class Test {
	public static void main(String[] args){
		int i = 2;
		int j = 2;
		System.out.println(i == j);
		
		Integer n=new Integer(2);
		Integer m=new Integer(2);
		System.out.println(n.equals(m));
		System.out.println(n==m);
		System.out.println(i==m);
		
		String a = "abc";
		String b = "abc";
		System.out.println(a==b);
		System.out.println(a.equals(b));
		
		String c = new String("hello");
		String d = new String("hello");
		System.out.println(c.equals(d));
		System.out.println(c==d);
	}

1 true 2 true 3 false 4 true 5 true 6 true 7 true 8false
前边加了序号,好让你们查看
Integer类型是int的包装类,这个结果大家可以自己细细体味。对于地址和值,以上输出结果按照上面的理解可以解决。

总结一下:“==”和equals的不同在于

1.“==”对于基本类型比较的是值的大小是否相同,对于非基本类型的数据,比较的是引用地址是否相同。
2.对于非基本类型的变量,看是否new了新的内存空间,如果new,则不同,否则相同。
3.equals比较的是非基本类型的数据的引用地址(即内存地址)是否相同,但是对于重写equals方法的类型,比较的是对象内容是否相同。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不想当个程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值