java基础复习3 |equal与==的区别

这是一个很让人似懂非懂的问题。
————————————————————————————

区别

equal是方法,而==是运算符。
equal为java的Object中的方法,因此除了基本类型外其他所有类型都可以调用。
equal方法比较的是内容。
“==”施加于原始数据类型变量时,是比较变量所保存的数据是否相等
当“==”施加于引用类型变量时,是比较这两个变量是否引用同一对象。

下面是例子说明:

public class Demo3 {
	public static void main(String[] args) {
		String a="1";
		String b="1";
		int c =1;
		int d =1;
		System.out.println(a.equals(b));
		System.out.println(a==b);
		System.out.println(c==d);
	}
}

输出结果如下
在这里插入图片描述

public class Demo3 {
	public static void main(String[] args) {
		a obj1 = new a();
		a obj2 = new a();
		System.out.println(obj1 == obj2);
	}
}

class a {
	int value = 100;
}

输出结果如下:
在这里插入图片描述
再理解下面的代码

		   Integer aaa=new Integer(5);
           Integer bbb=new Integer(5);
           
           int a=10;
           int b=10;
           
           String str1=new String("justice");
           String str2=new String("justice");
           
           String str3;
           str3=str1;
           
           System.out.println(aaa==bbb);
           System.out.println(aaa.equals(bbb));
           System.out.println(a==b);
           System.out.println(str1==str2);
           System.out.println(str1.equals(str2));
           System.out.println(str1==str3);
           System.out.println(str1.equals(str3));


输出结果如下:
在这里插入图片描述

内存中的常量池问题例子:
什么是常量池呢,我这里复制了之前放在另外一篇文章的图来给大家看
在这里插入图片描述
内存中有放局部变量的栈,有放new出来的对象、数组的堆,还有放着类的加载信息、静态域、常量池的方法区。

    String s1 = "abc";
    String s2 = "abc";
    System.out.println(s1.equals(s2));
    System.out.println(s1 == s2);

输出结果为:
在这里插入图片描述
当一开始s1运行创建一个对象时,就会在常量池中寻找是否存在相同的对象,如果没有,就会在常量池中创建一个对象"abc",而s2运行时,在常量池中找到了相同的对象,就把"abc"这个对象直接使用,所以两次创建的对象其实是同一个对象,它们的地址值相等。
分析:

  • aaa和bbb都是Integer封装类型,是不同的对象,变量存储地址, 所以==结果为false,equals为true

  • a和b都是基本数据类型,变量存储值,所以==为true,基本数据类型无equals方法

  • str1和str2都是String类型,属于引用类型,变量存储地址,所以==为false,equals为true

  • 创建str3的时候,str3指向了str1,所以str1和str3的指向同一个地址,存储的数据自然相同,所以均为true

java中需要选用合适的方法比较

对象域,使用equals方法 。
类型安全的枚举,使用equals或== 。
可能为null的对象域 : 使用 == 和 equals 。
数组域 : 使用 Arrays.equals 。
除float和double外的原始数据类型 : 使用 == 。
float类型: 使用Float.floatToIntBits转换成int类型,然后使用==。
double类型: 使用Double.doubleToLongBit转换成long类型,然后使用==。

————————————————————————————————————
看了大佬的博客发现了 ”==“ 一个很有趣的例子

     Integer a=100;
     Integer b=1000;
     Integer c=100;
     Integer d=1000;
	 
	 System.out.println(a==b);
	 System.out.println(a==c);
	 System.out.println(b==c);
	 System.out.println(b==d);

输出结果如下:
在这里插入图片描述
a 和 b 不相等这个大家都知道,可是为啥 a 和 c 相等而 b 和 d 又不相等了呢。
因为在定义一个Integer变量时,会默认进行Integer.valueOf(a)操作,方法的源码如下:

 public static Integer valueOf(int i) {
        assert IntegerCache.high >= 127;
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }

而high的值为127,low的值为-128,当进行这个方法时如果值在-128-127之间,返回的值也就是地址是相同的,所以a和c的地址相同,ac自然为true,而 b 和 d 超过了-128-127之间,返回了一个new Integer(i),堆中创建了新的实例对象,地址不相同,所以bd为false。
参考:
https://www.cnblogs.com/chenssy/p/3416195.html
https://blog.csdn.net/qq_44543508/article/details/95449363

发布了11 篇原创文章 · 获赞 0 · 访问量 170

猜你喜欢

转载自blog.csdn.net/weixin_44824500/article/details/104402405
今日推荐