JAVA学习【12】“==”、“equals”判断包装类是否相等

        Java判断基本数据类型变量内容是否相等时用“==”,判断其他类的变量内容是否相等用“equals()”函数,一般在该类中重写equals()函数,判断其他类变量的引用地址是否相同用“==”

        然而,包装类则介于基本数据类型与类之间,使用“==”符号时就会涉及到自动拆装箱。

        先看下面一段代码(题目来源牛客网):

public class CodeOne
{
    public static void main(String[] args)
    {
        Integer n1 = new Integer(47);
        Integer n2 = new Integer(47);
        Integer n3 = 3;
        Integer n4 = 3;
        System.out.println("n1==n2: "+(n1 == n2));
        System.out.println("n1.equals(n2):"+(n1.equals(n2)));
        System.out.println("n1!=n2: "+(n1 != n2));
        System.out.println("n3==n4: "+(n3 == n4));
        System.out.println("n3!=n4: "+(n3 != n4));
    }
}
        运行结果:
        

        “Integer n1 = new Integer(47);” 在JVM堆Heap中申请一块区域,存储非基本数据类型变量n1,同理,n2存储在Heap中另一块区域, "==" 比较两个对象的引用(内存地址)是否相同,因此n1!=n2。包装类作为一种特殊的类,与其他类相同, "==" 比较引用地址,都存储在Heap

        "Integer n3 = 3;"对基本类型数据进行自动装箱,等价于“Integer i = Integer.valueOf(100);”valueOf()的JDK源代码如下:

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


        对于–128到127(默认是127)之间的值,Integer.valueOf(int i) 返回Integer缓存,并未新建对象,可以认为n3仍是基本数据类型,“==”相当于只是在栈中对基本数据类型变量进行比较;超过这个范围则在Heap新建一个Integer类。

        因此,可以认为自动装箱等价于:


        示例代码如下:

public class CodeOne
{
    public static void main(String[] args)
    {
		//在-128~127 之外的数
		 Integer i1 =200;
		 Integer i2 =200;
		 System.out.println("i1==i2: "+(i1==i2));
		 // 在-128~127 之内的数
		 Integer i3 =100;
		 Integer i4 =100;
		 System.out.println("i3==i4: "+(i3==i4));
    }
}
        运行结果:
        i1==i2: false
        i3==i4: true

        具体参考博客http://www.cnblogs.com/danne823/archive/2011/04/22/2025332.html

        由前面JVM知识,基本类型变量存储在JVM栈(Stack),其他类的对象实例存储在堆(Heap),存储在栈(Stack)中的数据可以更加快速存取。除此之外强调一下:包装类没有初始值,基本类型有初始值。见下例:

public class CodeOne
{
	static int n1;
    static Integer n2;
    public static void main(String[] args)
    {
		int n3;
		Integer n4;
        System.out.println("n1: "+n1);
        System.out.println("n2: "+n2);
        //System.out.println("n3: "+n3);  //错误:可能尚未初始化变量n3
        //System.out.println("n4: "+n4);  //错误:可能尚未初始化变量n3
    }
}
         运行结果:
        n1: 0

        n2: null


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值