美文网首页
java自动拆装箱

java自动拆装箱

作者: ThreeGold | 来源:发表于2018-03-23 15:01 被阅读0次

    一、自动拆装箱


        自动装箱过程就是通过调用valueOf方法实现(如:Integer.valueOf(10)),而拆箱过程就是调用xxxValue方法实现(如Integer.intValue())。

    自动拆装箱:

    Integer a = 10;//自动装箱 -->  Integer a = Integer.valueOf(10);

    int b = a; //自动拆箱 --> int b = a.intValue();

    二、缓存


    Integer,Short,Long,Byte,Character包装类型有缓存机制(cache数组)。

    Boolean类型有TRUE和FALSE两个静态成员。

        public static final Boolean TRUE = new Boolean(true);

        public static final Boolean FALSE = new Boolean(false);

    Double和Float没有缓存机制。

    三、“==” 和“equals”比较(重点)


     Integer有一个静态方法valueOf(int i),当自动装箱触发时,编译器会自动补充调用该方法的代码。

    Integer的valueOf(int i)源码如下:

    public static Integer valueOf(int i) {    final int offset = 128;

          if (i >= -128 && i <= 127) { // must cache

                return IntegerCache.cache[i + offset];

          }

          return new Integer(i);

        }

    “==”运算符是用来比较基本类型变量和引用类型变量。

    1、当2个操作数都是包装类型变量是,比较的是看它们是否指向同一个对象(既比较地址是否相同)

    如:Integer a = 1;    -->会自动装箱,即调用valueOf(1);

    Integer b = 1;      -->会自动装箱,即调用valueOf(1);

    System.out.println(a == b);                //true   

    上面的Integer a = 1;  和  Integer b = 1;因为1在-128-127之间,所以装箱后的Integer指向同一个地址,即 a == b返回true。若没有在-128 - 127之间,这会new对象出来。new出来的对象,地址是不同的。

    如:Integer a = 300;     -->会自动装箱,即调用valueOf(300);

    Integer b = 300;      -->会自动装箱,即调用valueOf(300);

    System.out.println(a == b);                //false 

    2、如果其中有一个操作数是表达式(既包含算术运算)则会先进行自动拆箱,再进行对应的基本类型变量比较。

    如:

    int i = 3;

    Integer a = 1;

    Integer b = 2;

    System.out.println(i == (a+b))       //true  分别对a和b进行了自动拆箱操作,然后再add运

                                                             // 算,之后再与i进行比较,属于数值比较。

    如:

    Integer a = 1;

    Integer b = 2;

    Integer c = 3;

    System.out.println(c == (a+b))     //true  分别对a,b和c进行了自动拆箱操作,之后再进行

                                                           // 数值比较。

    3、基本包装类型重写了equals方法,基本包装类型的equals不会进行类型的转换,类型不同的包装类型的变量直接判定为false,尽管他们的数值可能是相等的。

    如:

    Integer a = 1;

    Long b = 1;

    System.out.println(a.equals(b))     //false  包装类型不同,直接false

    如:

    Integer a = 300;

    Integer b = 300;

    System.out.println(a.equals(b))     //true    包装类型相同,再判断数值,此处的a==b 是false

    四、代码练习


    答案:

    五、其他类型转换为Integer对象

    我们都知道创建一个Integer对象是

        Integer integer_1 = new Integer(10);

    那么Inter还有什么其他方法呢?

    1) 把int转成Integer对象

        Integer integer_2 = Integer.valueOf(10);

    2) 把String转出Integer对象

        Integer integer_3 = Integer.valueOf("10");

    3) 把String转出int

        int a = Integer.parseInt("10");

    4) System.out.println(integer_1 == integer_2);              ////判断的是引用的地址,结果为false

    相关文章

      网友评论

          本文标题:java自动拆装箱

          本文链接:https://www.haomeiwen.com/subject/icarvxtx.html