zoukankan      html  css  js  c++  java
  • 关于自动装箱的一道题

    昨天在社团面试的时候看到的一道题目,想到之前也有做过笔记,就贴出来一下

     public class Wrapper {
            public static void main(String[] args) {
                Integer a = 100;
                Integer b = 100;
                Integer c = 1000;
                Integer d = 1000;
                System.out.println(a==b);
                System.out.println(c==d);
            }
        }
    

    如果你什么都不知道,那你可能会认为答案是
    true
    true
    如果你知道比较要用equals方法的话,那你的答案可能是
    false
    false
    但是实际上答案是
    true
    false

    为什么答案会是这样呢,这就涉及到java的自动装箱机制了
    一般来说,a==b会比较两个对象的地址是否指向同一个储存区域
    而不是比较它们的值,所以下面这个例子的结果是false这是理所当然的

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

    但是,自动装箱规范要求boolean、byte、char<=127,short、int属于-128~127之间的数都被包装到固定的对象中,即:

    关于该规范的描述摘自《java核心技术卷一》

    short a = 20;
    byte b = 20;
    Integer c = 20;
    System.out.println(a == b);
    System.out.println(b == c);
    

    结果是两个true,因为它们都包装在同一个对象中
    当然,就算是在-128~127这个范围内,数据不同的话是不会包装在一个对象中的,如:

    Integer a = 20;
    Integer b = 100;
    System.out.println(a == b); // 结果当然是false
    

    当然,有人可能会好奇自动装箱是什么东西,这里举一个小例子:

    ArrayList<Integer> list=new ArrayList<>();
    int a = 3;
    list.add(a);
    

    我们都知道,ArrayList泛型数组的定义要用包装类,也就是Integer,那么,我们要如何把一个int类型的数据添加进一个Integer的数组呢?
    事实上,在执行添加操作的时候java会自动帮你完成
    list.add(Integer.valueOf(a));
    的操作,也就是将int转换成Integer,而这,就是自动装箱

    实际上,在最初的例子的那道题中,Integer a = 100; 我认为被java改成了这样的操作:

    Integer a = Integer.valueOf(100);
    

    所以这种直接赋值实际上都被自动装箱了,如果你用以下的方法赋值:

    Integer a = new Integer(100);
    Integer b = new Integer(100);
    System.out.println(a==b);
    

    则不会被自动装箱,所以结果是false

  • 相关阅读:
    [AngularJS] Html ngSanitize, $sce
    [AngularJS] ngModelController render function
    [MODX] 3. Placeholder +
    [MODX] 2. Chunks $
    HTTP-Runoob:HTPP Content-Type
    HTTP-Runoob:HTTP状态码
    HTTP-Runoob:HTTP请求头信息
    HTTP-Runoob:HTTP请求方法
    HTTP-Runoob:HTPP消息结构
    HTTP-Runoob:HTTP简介
  • 原文地址:https://www.cnblogs.com/fatmanhappycode/p/12231212.html
Copyright © 2011-2022 走看看