java 基础 int与Integer值比较

    /**
     * 1.基本类型只能按值传递,而每个基本类型对应的封装类是按引用传递的。
     * 2.从性能上说java中的基本类型是在堆栈上创建的,而所有的对象类型都是在堆上创建的,(对象的引用在堆栈上创建)
     * 3.自动装箱和自动拆箱,java对于Integer与int的自动装箱与拆箱的设计,是一种模式:叫享元模式(flyweight)
     * 自动装箱:将基本数据类型重新转化为对象
     * 例:
     * <code>
     * public class Test {
     * public static void main(String[] args) {
     * // 声明一个Integer对象,用到了自动的装箱:解析为:Integer num = Integer.valueOf(9);
     * Integer num = 9;
     * }
     * }
     * </code>
     * 自动拆箱:将对象重新转化为基本数据类型
     * 例:
     * <code>
     * public class Test {
     * public static void main(String[] args) {
     * / /声明一个Integer对象
     * Integer num = 9;
     * <p>
     * // 进行计算时隐含的有自动拆箱
     * System.out.print(num--);
     * }
     * }
     * </code>
     * (1)加大对简单数字的重利用,Java定义在自动装箱时对于在-128~127之内的数值,它们被装箱为Integer对象后,会存在内存中被重用,始终只存在一个对象。
     * (2)而如果在-128~127之外的数,被装箱后的Integer对象并不会被重用,即相当于每次装箱时都新建一个 Integer对象。
     */
    @Test
    public void compareValue() {
        // 基本类型变量
        int int1 = 2;
        int int2 = 2;
        int int3 = 127;
        int int4 = 128;
        int int5 = 127;
        int int6 = 128;
        // 引用(包装)类型变量,非new直接赋值的变量
        Integer integer1 = 2;
        Integer integer2 = 2;
        Integer integer3 = 127;
        Integer integer4 = 128;
        Integer integer5 = 127;
        Integer integer6 = 128;
        // 引用(包装)类型变量,new 的对象地址赋值的变量
        Integer integerNew1 = new Integer(2);
        Integer integerNew2 = new Integer(2);
        Integer integerNew3 = new Integer(127);
        Integer integerNew4 = new Integer(128);
        Integer integerNew5 = new Integer(127);
        Integer integerNew6 = new Integer(128);

        // 1.基本类型比较,在堆栈中保存,可直接比较
        System.out.println("int1[" + int1 + "]==int2[" + int2 + "] >> " + (int1 == int2));
        System.out.println("int3[" + int3 + "]==int5[" + int5 + "] >> " + (int3 == int5));
        System.out.println("int4[" + int4 + "]==int6[" + int6 + "] >> " + (int4 == int6));
        /* 2.Integer作为变量时(在非new出来时)对于-128到127之间的数,会进行缓存,当超过范围就是new Integer()来new一个对象
         * 也就是说int integer3 = 127时,在范围之内,这个时候就存放在缓存中,当再创建integer5时,java发现缓存中存在127这个数了,就直接取出来赋值给integer5,
         * 所以integer3 == integer5为true;
         * 当integer4、integer6的值超过范围,java开始通过new Integer()来创建,integer4、integer6都是new Integer(128)出来的变量
         * 所以integer4 == integer6为true;
         */
        System.out.println("integer1[" + integer1 + "]==integer2[" + integer2 + "] >> " + (integer1 == integer2));
        System.out.println("integer3[" + integer3 + "]==integer5[" + integer5 + "] >> " + (integer3 == integer5));
        System.out.println("integer4[" + integer4 + "]==integer6[" + integer6 + "] >> " + (integer4 == integer6));
        /*
         * 3. 通过new出来的对象的变量,创建的对象其引用内存地址不同,所以即使值相等,内存地址也不同,
         * 所以都为false,可以通过equals比较值是否相等
         */
        System.out.println("integerNew1[" + integerNew1 + "]==integerNew2[" + integerNew2 + "] >> " + (integerNew1 == integerNew2));
        System.out.println("integerNew3[" + integerNew3 + "]==integerNew5[" + integerNew5 + "] >> " + (integerNew3 == integerNew5));
        System.out.println("integerNew4[" + integerNew4 + "]==integerNew6[" + integerNew6 + "] >> " + (integerNew4 == integerNew6));
        /*
         * 4.Integer是int的封装类,当Integer与int进行==比较时,Integer就会拆箱成一个int类型,
         * 相当于两个int类型进行比较,这里的Integer,不管是直接赋值,还是new创建的对象引用,
         * 只要跟int比较就会拆箱为int类型,就是相等的,所以都为true。
         */
        System.out.println("int1[" + int1 + "]==integer1[" + integer1 + "] >> " + (int1 == integer1));
        System.out.println("int3[" + int3 + "]==integer3[" + integer3 + "] >> " + (int3 == integer3));
        System.out.println("int4[" + int4 + "]==integer4[" + integer4 + "] >> " + (int4 == integer4));
        System.out.println("int1[" + int1 + "]==integerNew1[" + integerNew1 + "] >> " + (int1 == integerNew1));
        System.out.println("int3[" + int3 + "]==integerNew3[" + integerNew3 + "] >> " + (int3 == integerNew3));
        System.out.println("int4[" + int4 + "]==integerNew4[" + integerNew4 + "] >> " + (int4 == integerNew4));
        /*
         * 5.变量创建方式不一样,integer1、integer3、integer4为直接赋值的变量,而integerNew1、integerNew3、integerNew4为new对象的引用
         * 非new生成的Integer变量指向的是静态常量池中cache数组中存储的数据,指向了堆中的Integer对象,
         * 而new Integer()生成的变量指向堆中新建的对象,两者在内存中的对象引用(地址)不同。
         * 所以任何时候比较时都为false
         */
        System.out.println("integer1[" + integer1 + "]==integerNew1[" + integerNew1 + "] >> " + (integer1 == integerNew1));
        System.out.println("integer3[" + integer3 + "]==integerNew3[" + integerNew3 + "] >> " + (integer3 == integerNew3));
        System.out.println("integer4[" + integer4 + "]==integerNew4[" + integerNew4 + "] >> " + (integer3 == integerNew4));


        /*
         * 总结:
         * 1、任何时候,非new的Integer与new的Integer的变量比较都不会相等。不会经历拆箱过程,因为它们存放的内存地址不一样。
         * 2、两个都是非new出来的Integer,如果数在-128到127之间,则是true,否则为false。
         * 3、两个都是new出来的,则为false。
         * 4、int和integer(new或非new)比较,都为true,因为会把Integer自动拆箱为int,其实就是相当于两个int类型比较。
         */
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值