Java系列(面试必备):Java 中 == 与 equals 区别,确认一下!

前言

今天博主将为大家分享:Java系列(面试必备):Java 中 双等号 与 equals 区别,确认一下!不喜勿喷,如有异议欢迎讨论!首先推荐结合博主的这两篇文章进行阅读===>Java系列(面试必备):简单的hashCode和equals面试题,有好多坑!
Java系列(面试必备):你真的了解Java中"=="和equals()的区别?

之前和大家分享了一篇=>[Java系列(面试必备):你真的了解Java中"=="和equals()的区别?今天再来跟大家确认一下!


"=="介绍

它的作用是判断两个对象的地址是不是相等。即,判断两个对象是不是同一个对象(基本数据类型 双等号 比较的是值,引用数据类型==比较的是内存地址)。

  • 基本数据类型:byte,short,char,int,long,float,double,boolean。他们之间的比较,应用双等号(==),比较的是他们的值。

  • 引用数据类型:当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址(确切的说,是堆内存地址)。


package com.test;

/**
 * 
 * @Description: 双等号==
 * @ClassName: IntegerSameTest.java
 * @author ChenYongJia
 * @Date 2019年6月28日 下午15:16
 * @Email chen87647213@163.com
 */
public class IntegerSameTest {

	public static void main(String[] args) {
		int i = 100;// 基本数据类型
		int ii = 100;// 基本数据类型
		Integer j = 100;// 引用类型
		Integer jj = 100;// 引用类型
		Integer k = new Integer(100);// 引用类型
		Integer kk = new Integer(100);// 引用类型
		System.out.println("i的地址:" + System.identityHashCode(i));
		System.out.println("ii的地址:" + System.identityHashCode(ii));
		System.out.println("j的地址:" + System.identityHashCode(j));
		System.out.println("jj的地址:" + System.identityHashCode(jj));
		System.out.println("k的地址:" + System.identityHashCode(k));
		System.out.println("kk的地址:" + System.identityHashCode(kk));

		// 基本类型相互比较其中的值,所以得出true
		System.out.println("i == ii 结果:" + (i == ii));
		// 当int的引用类型Integer与基本类型进行比较的时候,包装类会先进行自动拆箱
		// 然后与基本类型进行值比较,所有得出true
		System.out.println("i == j 结果:" + (i == j));
		// 同上,包装类先拆箱成基本类型,然后比较,得出true
		System.out.println("i == k 结果:" + (i == k));

		// 都是引用类型,所有比较的是地址,因为j与jj的地址相同,所有true
		System.out.println("j == jj 结果:" + (j == jj));
		// 都是引用类型,所有比较的是地址,因为k与kk的地址相同,所有true
		System.out.println("k == kk 结果:" + (k == kk));
	}

}

输出结果

在这里插入图片描述

为什么j和jj的地址是一样的,k与kk的地址却不一样呢?

答案:在-128~127的Integer值并且以Integer x = value;的方式赋值的参数,x会从包装类型自动拆箱成基本数据类型,以供重用!所以,j、jj的内存地址都是一样的!

我们把100变成1000试试!

package com.test;

/**
 * 
 * @Description: 双等号==
 * @ClassName: IntegerSameTest.java
 * @author ChenYongJia
 * @Date 2019年6月28日 下午15:16
 * @Email chen87647213@163.com
 */
public class IntegerSameTest {

	public static void main(String[] args) {
		int i = 1000;// 基本数据类型
		int ii = 1000;// 基本数据类型
		Integer j = 1000;// 引用类型
		Integer jj = 1000;// 引用类型
		Integer k = new Integer(1000);// 引用类型
		Integer kk = new Integer(1000);// 引用类型
		System.out.println("i的地址:" + System.identityHashCode(i));
		System.out.println("ii的地址:" + System.identityHashCode(ii));
		System.out.println("j的地址:" + System.identityHashCode(j));
		System.out.println("jj的地址:" + System.identityHashCode(jj));
		System.out.println("k的地址:" + System.identityHashCode(k));
		System.out.println("kk的地址:" + System.identityHashCode(kk));

		// 基本类型相互比较其中的值,所以得出true
		System.out.println("i == ii 结果:" + (i == ii));
		// 当int的引用类型Integer与基本类型进行比较的时候,包装类会先进行自动拆箱
		// 然后与基本类型进行值比较,所有得出true
		System.out.println("i == j 结果:" + (i == j));
		// 同上,包装类先拆箱成基本类型,然后比较,得出true
		System.out.println("i == k 结果:" + (i == k));

		// 都是引用类型,所有比较的是地址,因为j与jj的地址相同,所有true
		System.out.println("j == jj 结果:" + (j == jj));
		// 都是引用类型,所有比较的是地址,因为k与kk的地址相同,所有true
		System.out.println("k == kk 结果:" + (k == kk));
	}

}

在这里插入图片描述

当j、jj超出-128~127区间的时候,地址就变了,所以比较的结果就是false。

再看其它的包装器自动拆箱情况:

在这里插入图片描述


equals()方法介绍

它的作用也是判断两个对象是否相等。但它一般有两种使用情况:

  • 情况1:类没有覆盖 equals() 方法。则通过 equals() 比较该类的两个对象时,等价于通过“==”比较这两个对象。

  • 情况2:类覆盖了 equals() 方法。一般,我们都覆盖 equals() 方法来比较两个对象的内容是否相等;若它们的内容相等,则返回 true (即,认为这两个对象相等)。

Boolean、Byte、Short、Integer、Long、Float、Doulbe、Character 8种基本类型的包装类都重写了 equals() 方法,所以比较的时候,如果内容相同,则返回 true,例如:

//因为内容相同,返回的都是true
System.out.println("j.equals(jj) 结果:" + (j.equals(jj)));
System.out.println("(k.equals(kk) 结果:" + (k.equals(kk)));

String类型的比较介绍

string是一个非常特殊的数据类型,它可以通过String x = value;的方式进行赋值,也可以通过String x = new String(value)方式进行赋值。

String x = value;方式赋予的参数,会放入常量池内存块区域中;
String x = new String(value)方式赋予的参数,会放入堆内存区域中,当成对象处理。

package com.test;

/**
 * 
 * @Description: 字符串之Equals
 * @ClassName: EqualsTest.java
 * @author ChenYongJia
 * @Date 2019年6月27日 晚上21:16
 * @Email chen87647213@163.com
 */
public class EqualsTest {

	public static void main(String[] args) {
		String a = new String("ab"); // a 为一个引用
		String b = new String("ab"); // b为另一个引用,对象的内容一样
		String aa = "ab"; // 放在常量池中
		String bb = "ab"; // 从常量池中查找
		System.out.println("a地址:" + System.identityHashCode(a));
		System.out.println("b地址:" + System.identityHashCode(b));
		System.out.println("aa地址:" + System.identityHashCode(aa));
		System.out.println("bb地址:" + System.identityHashCode(bb));
		// 地址相同,所以返回true
		if (aa == bb) {
			System.out.println("aa==bb");
		}
		// 地址不同,非同一个对象,所以返回false
		if (a == b) {
			System.out.println("a==b");
		}
		// 地址不同,但是内容相同,所以返回true
		if (a.equals(b)) {
			System.out.println("aEQb");
		}
	}

}

输出结果

在这里插入图片描述

为什么string的equals()方法比较返回true,因为string重写了equals()方法,源码如下:

public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        String anotherString = (String)anObject;
        int n = value.length;
        if (n == anotherString.value.length) {
            char v1[] = value;
            char v2[] = anotherString.value;
            int i = 0;
            while (n-- != 0) {
                if (v1[i] != v2[i])
                    return false;
                i++;
            }
            return true;
        }
    }
    return false;
}

如果内容相同,则返回true!


到这里:Java系列(面试必备):Java 中 双等号 与 equals 区别,确认一下!,分享完毕了,快去试试吧!


最后

  • 如果需要比较某个对象是否相同,一定要重写equals(),比较其中的内容是否相同,如果相同,返回true;否则,返回false

  • 更多参考精彩博文请看这里:《陈永佳的博客》

  • 喜欢博主的小伙伴可以加个关注、点个赞哦,持续更新嘿嘿!


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

陈永佳

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

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

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

打赏作者

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

抵扣说明:

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

余额充值