自动封箱和拆箱

Integer 中

public static Integer valueOf(int i) {
    assert IntegerCache.high >= 127;
    if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}

  

如果没有设置IntegerCache.high的值,默认为127,也就是说值在-128~127之间,返回的都是同一个对象。

  1. Integer f1 = 100, f2 = 100, f3 = 150, f4 = 150;

    System.out.println(f1 == f2);

    System.out.println(f3 == f4);

输出结果是:

  1. true
  2. false

Long、Byte、Short同理。

Boolean中

  public static Boolean valueOf(boolean b) {

    return (b ? TRUE : FALSE);

  }

Character中

  

public static Character valueOf(char c) {
    if (c <= 127) { // must cache
        return CharacterCache.cache[(int)c];
    }
    return new Character(c);
}    

Double中

  1. public static Double valueOf(double d) {

      return new Double(d);

    }

对于任何的duoble类型的数据,每次都是从新装箱,生一个新的对象;Float类型同理。

  1. public static void main(String[] args) {

    Integer a = 1;

    Integer b = 2;

    Integer c = 3;

    Integer d = 3;

    Integer e = 321;

    Integer f = 321;

    Long g = 3L;

    Long h = 2L;

    System.out.println(c==d);//不用解释了把,关于Integer中写的很清楚-128~127都是自动装箱成同一个对象了

    System.out.println(e==f);//看Integer中解释

    System.out.println(c==(a+b));//因为+所有a和b自动拆箱,会各自调用IntValue()方法,得到值后会在调用Integer.valueOf

    System.out.println(c.equals(a+b));

    System.out.println(g==(a+b));

    System.out.println(g.equals(a+b));

    System.out.println(g.equals(a+h));//因h是long类型,a则自动向上转型为Long

    }

输出结果:

  1. true
  2. false
  3. true
  4. true
  5. true
  6. false
  7. true
时间: 2024-10-12 23:56:29

自动封箱和拆箱的相关文章

封箱和拆箱

封箱的含义:把值类型转换为System.Object类型,或者转换为由值类型实现的结构类型. 如:struct MyStruct { pubilc int Val; } MyStruct valType1 = new MyStruct(); valType1.Val = 5; object refType = valType1; //把值类型的结构放入object类型的变量中,以封箱它. 拆箱的含义:是和封箱做相反的操作. 如:valType.Val = 6; //对原值类型进行赋值 MyStr

《Java中的自动装箱和拆箱功能.》

1 //Java中的自动装箱和拆箱功能. 2 class AutoboxingUnboxing 3 { 4 public static void main(String[] args) 5 { 6 //直接把一个基本类型变量赋给Interger对象. 7 Integer inObj = 5; 8 Object inObj1 = 6; 9 //直接把一个boolean类型的变量赋给一个Object类型的变量. 10 Object boolObj = true; 11 //直接把Integer对象赋

java自动装箱与拆箱

基本数据(Primitive)类型的自动装箱(autoboxing).拆箱(unboxing)是J2SE 5.0提供的新功能,跟泛型.变长参数等一样,这也是一颗"语法糖",之前介绍jvm早期优化的时候说过,语法糖对运行期的代码没有任何影响,其目的仅仅是方便程序员使用,所有语法糖编译后都将会还原成基础语法.这次介绍的自动装箱和拆箱也不例外.看下头的例子: public class Demo { public static void main(String[] args) { Intege

Java 自动装箱和拆箱

JDK1.5之后的功能 自动装箱:指的是开发人员可以把一个基本数据类型直接赋给对应的包装类 自动拆箱:指开发人员可以把一个包装类对象直接赋给对应的基本数据类型 public static void main(String[] args) { Integer i = 1; //装箱 int j = i ; //拆箱 } public static void main(String[] args) { List list = new ArrayList(); list.add(1); int j=

深入剖析Java中的自动装箱和拆箱过程

深入剖析Java中的装箱和拆箱 自动装箱和拆箱问题是Java中一个老生常谈的问题了,今天我们就来一些看一下装箱和拆箱中的若干问题.本文先讲述装箱和拆箱最基本的东西,再来看一下面试笔试中经常遇到的与装箱.拆箱相关的问题. 以下是本文的目录大纲: 一.什么是装箱?什么是拆箱? 二.装箱和拆箱是如何实现的 三.面试中相关的问题 若有不正之处,请谅解和批评指正,不胜感激. 请尊重作者劳动成果,转载请标明原文链接: http://www.cnblogs.com/dolphin0520/p/3780005.

自动装箱与拆箱引发的享元设计模式

[java] view plain copy /** * 自动装箱与拆箱 */ public class Autoboxing { public static void main(String[] args) { Integer num1 = 20;          //自动装箱 int num2 = new Integer(20);     //自动拆箱 System.out.println(num2 == num1);   //true //-128~127之间的同一个Intege对象相比

[转]java 自动装箱与拆箱

转自:http://www.cnblogs.com/shenliang123/archive/2012/04/16/2451996.html 这个是jdk1.5以后才引入的新的内容,作为秉承发表是最好的记忆,毅然决定还是用一篇博客来代替我的记忆: java语言规范中说道:在许多情况下包装与解包装是由编译器自行完成的(在这种情况下包装成为装箱,解包装称为拆箱): 其实按照我自己的理解自动装箱就可以简单的理解为将基本数据类型封装为对象类型,来符合java的面向对象:例如用int来举例: //声明一个

由自动装箱和拆箱引发我看Integer源码

背景和问题 在看别人整理的资料时,看到如下一段代码: package com.sitech.test; /** * 自动装箱和拆箱 jdk1.6 * @author liaowp * */ public class TestInteger { public static void main(String[] args) { Integer i1 = 80, i2 = 80, i3 = 999, i4 = 999; System.out.println(i1 == i2);//true Syste

Java 自动装箱与拆箱

Java为每种基本数据类型都提供了对应的对象类型.在Java SE5之前,如果要生成一个数值为7的Integer对象,代码示例:Integer i = new Integer(7);:Java SE5之后,Java提供了新的语法,简化了基本数据类型对象的使用,我们称之为自动装箱(autoboxing)与拆箱(unboxing).之前的代码可以简化为Integer i = 7;. Java提供的自动装箱盒拆箱,是在编译器层实现的.编译之后的字节码仍然是如Java SE5之前的形态.如自动装箱使用对