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

  • 相关阅读:
    UVA 1025 A Spy in the Metro DP水题
    ZOJ 3814 Sawtooth Puzzle BFS
    ZOJ 3816 Generalized Palindromic Number
    UVA 10859 Placing Lampposts 树形DP
    UVA 11825 Hackers' Crackdown 状压DP
    POJ 2887 Big String 线段树 离线处理
    POJ 1635 Subway tree systems Hash法判断有根树是否同构
    BZOJ 3110 k大数查询 & 树套树
    sdoi 2009 & 状态压缩
    来自于2016.2.24的flag
  • 原文地址:https://www.cnblogs.com/fatmanhappycode/p/12231212.html
Copyright © 2011-2022 走看看