int和Integer的比较

int和Integer的区别:

1、int是基本数据类型,存储的是数值,默认是0

2、Integer是int的包装类,存放的是对象的引用,必须实例化之后才能使用,默认是null

int和Integer比较

== 地址比较

1、int对象赋给Integer对象,int会自动装箱成Integer,实际上是调用了Integer.valueOf(int),如果数值范围在-128到127会默认从常量池获取对象,引用地址相同;超过范围会new对象,在堆中重新分配内存。

2、int 和 Integer 比较时,会自动进行Integer的拆箱操作,即比较的是数值,相同数值的肯定相同。

3、凡是new出来的对象,都在堆中重新分配内存,引用地址必然不相同。

equals 数值的比较

object.java中equals 中实际上是实现的地址比较==,Integer重写了equals(),比较的是数值,equals 相同。

  • Integer.valueOf() 享元模式,在 -128到127区间内,共享一份实例。
public static Integer valueOf(int i) {
    if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}
复制代码
  • Integer.equals()
public boolean equals(Object obj) {
    if (obj instanceof Integer) {
        return value == ((Integer)obj).intValue();
    }
    return false;
}
复制代码

Integer.class

public final class Integer extends Number implements Comparable<Integer> {
    private final int value; // Integer里面包含的值
}
复制代码

笔试题 == 、 equals

测试,结果均标记在下

public static void compareInt2Integer() {
    
    /**
     * i、j实际上都是调用了 Integer.valueOf(128)
     * 都是从常量池取的,所有内存地址一样,true
     */
    Integer i = 127;
    Integer j = 127;
    System.out.println(i == j);    // true
    System.out.println(i.equals(j)); // true

    /**
     * m、n 实际上都是调用了 Integer.valueOf(128),进行自动装箱操作
     * m、n 都是新创建的对象,会在堆中重新分配内存,地址不同,false
     */
    Integer m = 128;
    Integer n = 128;
    System.out.println(m == n);   //false
    System.out.println(m.equals(n)); //true

    /**
     * k取的是缓存,h是新创建的对象,false
     */
    Integer k = 127;
    Integer h = new Integer(127);
    System.out.println(k == h);   //false
    System.out.println(k.equals(h));//true

    /**
     * new 操作符会分配内存,a、b都是新创建的对象
     * == 比较的是引用的地址,false
     */
    Integer a = new Integer(127);
    Integer b = new Integer(127);
    System.out.println(a == b);  //false
    System.out.println(a.equals(b)); //true

    /**
     * Integer.valueOf() 会优先判断常量池缓存,缓存范围是-128到127,超过范围会new一个对象,
     * w 实际也是调用了 Integer.valueOf(128)
     * w、y 都是新创建的对象 false
     */
    Integer w = 128;
    Integer y = Integer.valueOf(128);
    System.out.println(w == y); // false
    System.out.println(w.equals(y)); //true

    /**
     * Integer和int比较,Integer会自动拆箱成int,数值比较,true
     */
    Integer x = 128;
    int z = 128;
    System.out.println(x == z); //true
    System.out.println(x.equals(z)); //true
}
复制代码

转载于:https://juejin.im/post/5b7fdef1f265da43606e9c8f

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值