• 面试:int和Integer值是否相等


    在 Java 5 中,为 Integer 的操作引入了一个新的特性,用来节省内存和提高性能。整型对象在内部实现中通过使用相同的对象引用实现了缓存和重用,上面的规则适用于整数区间 -128 到 +127。

    这种缓存行为不仅适用于Integer对象。我们针对所有整数类型的类都有类似的缓存机制。

    • 有 ByteCache 用于缓存 Byte 对象
    • 有 ShortCache 用于缓存 Short 对象
    • 有 LongCache 用于缓存 Long 对象
    • 有 CharacterCache 用于缓存 Character 对象

    Byte,Short,Long 有固定范围: -128 到 127。对于 Character, 范围是 0 到 127。除了 Integer 可以通过参数改变范围外,其它的都不行。

    问题:int a = 1000;int b = 1000;a == b?

    再换成integer呢?

    int a = 1000,integer b =1000;a == b?

    首先我们要知道,Integer是int的包装类,必须经过实例化才能使用。integer实际是对象的引用,当new一个integer时,实际上是生成一个指针指向此对象,而int是直接存储数据值。integer的默认值是null,int的默认值是0。

    总结:

    ​ Int和Int比较,只要数值相等都相等。

    ​ Integer和Integer比较,数值相等时,(-128,127)内的相等,其他的不等。

    ​ new Integer 和 new Integer比较,都不相等。

    ​ new Integer 和 Integer比较,都不相等。

    ​ Int和Integer比较,只要数值相等都相等。

    分类讨论:

    第一组

    1. Integer a = new Integer(10);
    2. Integer b = new Integer(10);
    3. a==b?

    false不相等,此时ab指向的是integer对象的地址

    第二组

    1. Intger a = new Integer(10);
    2. int b = 10;
    3. a == b ?

    true相等,当包装类integer和基本数据对象int比较时,java会自动拆箱valueOf方法,实际上比较的就是两个int变量,只要值相等就相等。

    第三组

    1. Integer a = new Integer(10);
    2. Integer b = 10;
    3. a == b?

    false不相等,a和b的区别是,a是new生成的Integer变量,指向堆中新建的对象,b是非new生成的integer变量,指向Java常量池中的对象,两者在内存中地址不同。

    第四组

    1. Integer a = 10;
    2. Integer b = 10;
    3. a == b?

    true相等,直接声明Integer a = 10时,Java会自动装箱为

    Integer a = Integer.valueOf(10);
    当a的范围在(-128,127)之内时,第一次声明会将放入缓存中,第二次取缓存中已有的对象,而不是重新创建一个Integer对象。(-128,127)范围内的Integer值可以直接用==判断,但这个区间外的所有数据,都会在堆上产生,不会复用已有对象。

    第五组

    1. Integer a = 128;
    2. Integer b = 128;
    3. a == b?

    false不相等,此时a和b不在(-128,127)内,都会在堆上新产生一个对象。

    第六组

    1. int a = 10;
    2. Integer b = 10;
    3. a == b?

    true相等,根据integer的自动拆箱。

    第七组

    1. int a = 128;
    2. Integer b = 128;
    3. a == b?

    true相等,同上一组,根据integer的自动拆箱。

    总结:

    ​ Int和Int比较,只要数值相等都相等。

    ​ Integer和Integer比较,数值相等时,(-128,127)内的相等,其他的不等。

    ​ new Integer 和 new Integer比较,都不相等。

    ​ new Integer 和 Integer比较,都不相等。

    ​ Int和Integer比较,只要数值相等都相等。

    1. public static void main(String[] args) throws Exception {
    2.         String s1 = "123abc";
    3.         String s2 = "123abc";
    4.         String s3 = new String("123abc");
    5.         String s5 = "123" + "abc";
    6.         String s = "123";
    7.         String s6 = s + "abc";
    8.         
    9.         System.out.println("s1==s2:" + (s1 == s2));
    10.         System.out.println("s3==s1:" + (s3 == s1));
    11.         System.out.println("s5==s2:" + (s5 == s2));
    12.         System.out.println("s6==s2:" + (s6 == s2));
    13.     }

    s1==s2:true
    s3==s1:false
    s5==s2:true
    s6==s2:false

  • 相关阅读:
    嘉绩咨询:八位一体产业创新,赋能品牌新零售
    名词作形容词的用法
    SpringMVC的上传下载
    PostCSS概述
    谷粒商城 (二十五) --------- 商品服务 API 平台属性 ② 销售属性与分组关联属性
    web基础学习
    Flink-CDC——MySQL、SqlSqlServer、Oracle、达梦等数据库开启日志方法
    Redis发布订阅和数据类型
    ConcurrentHashMap 概述及源码解析
    【Docker】使用Docker Client和Docker Go SDK为容器分配GPU资源
  • 原文地址:https://blog.csdn.net/cpcpcp123/article/details/127812638