`

JAVA拆箱与装箱及cache范围

    博客分类:
  • Java
阅读更多

 

1. 调用Integer.valueOf()时, 对[-128,127]进行了缓存!

 

    public final class Integer extends Number implements Comparable<Integer> {
    private static class IntegerCache {
	private IntegerCache(){}

	static final Integer cache[] = new Integer[-(-128) + 127 + 1];

	static {
	    for(int i = 0; i < cache.length; i++)
		cache[i] = new Integer(i - 128);
	}
    }


    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);
    }

}

 

 

 

 

 

2. 装箱与拆箱的本质:

 

装箱: 自动Integer.valueOf();
Integer   jjj = 1;
编译后源码:
Integer   jjj = Integer.valueOf(1);


拆箱: 自动对象.intValue();
int       jjj =  new Integer(2);
编译后源码:
int       jjj = (new Integer(2)).intValue();

EG:

示例代码:

public class Test {
	public static void main(final String[] args) {
	    Integer a = 100;
	    Integer b = 100;
	    System.out.println(a == b); 
	    
	    main2();
	    main3();
	}	
	public static void main2() {
	    Integer a = 156;
	    Integer b = 156;
	    System.out.println(a == b); 
	}	
	public static void main3() {
	    int a = new Integer(156);
	    int b = Integer.valueOf(156);
	    System.out.println(a == b); 
	}
}

 

 

经过装箱拆箱本质代码为:

public class Test
{
  public static void main(String[] args)
  {
    Integer a = Integer.valueOf(100);
    Integer b = Integer.valueOf(100);
    System.out.println(a == b);

    main2();
    main3();
  }

  public static void main2() {
    Integer a = Integer.valueOf(156);
    Integer b = Integer.valueOf(156);
    System.out.println(a == b);
  }

  public static void main3() {
    int a = new Integer(156).intValue();
    int b = Integer.valueOf(156).intValue();
    System.out.println(a == b);
  }
}

 

运行结果:

true
false
true

 

3.  yekui说, 查了一下源码,确实如此!

java使用该机制是为了达到最小化数据输入和输出的目的,这是一种优化措施,提高效率.

valueOf缓存范围
其他的包装器:
Boolean: (全部缓存)
Byte:       (全部缓存)

Character   [0, 127] 缓存
Short          [-128, 127] 缓存
Long           [-128, 127] 缓存

Float       (没有缓存)
Doulbe    (没有缓存)

 

 

 

参照: http://xiaoyu1985ban.iteye.com/blog/1384191

分享到:
评论

相关推荐

    详解Java 自动装箱与拆箱的实现原理

    自动装箱与拆箱的实现原理 自动装箱是指Java将原始类型值转换成对应的对象的过程,如将int类型的变量转换成Integer对象。反之,将对象转换成原始类型值的过程称为拆箱。因为这里的装箱和拆箱是自动进行的非人为转换...

    java编程中自动拆箱与自动装箱详解

    Java编程中自动拆箱与自动装箱详解 Java编程中自动拆箱与自动装箱是从J2SE 5.0开始提供的功能,可以简化Java编程中的数据类型转换。下面是自动拆箱与自动装箱的详细解释: 1. 基本数据类型的自动装箱(Autoboxing...

    Java中的装箱和拆箱深入理解

    在Java SE 5及以后的版本中,为了方便开发者使用,引入了自动装箱和拆箱的功能。 一、什么是装箱和拆箱? 装箱(Boxing)是将Java的基本数据类型转换为其对应的包装器类型的自动过程。例如,将int类型转换为...

    《深入理解java虚拟机》自动装箱拆箱实例.doc

    ### 自动装箱与拆箱概念 在Java中,自动装箱是指将基本数据类型自动转换为对应的包装类对象的过程,而自动拆箱则是指将包装类对象自动转换为基本数据类型的逆过程。这一特性自Java 5起引入,极大地简化了开发者的...

    Java拆装箱深度剖析

    如果需要调整这个范围,可以通过JVM启动参数`-Djava.lang.Integer.IntegerCache.high`设置,但必须保证不超过Integer的最大值(即`Integer.MAX_VALUE`)。 在实际开发中,理解拆装箱和Integer对象的缓存机制是非常...

    java包装类练习.doc

    Java 包装类型的自动装箱拆箱机制是指在(assign)操作时,Java 会自动地将基本类型转换为包装类型,或者将包装类型转换为基本类型。例如,Integer i = 100;这里的 i 就是自动装箱的结果。 5. Java 语句 Integer i=1;...

    15Java语法糖与Java编译器1

    自动装箱与自动拆箱是Java中的一项语法糖特性,它简化了基本类型与对应包装类之间的转换过程。自动装箱是将基本类型自动转换为包装类型,而自动拆箱则是将包装类型转换为基本类型。例如,在Java程序中,我们可以直接...

    Java 基础.pdf_电子版pdf版

    本文将深入探讨Java的基础知识,包括数据类型、包装类型、自动装箱与拆箱以及Integer类的缓存池机制。 1. 数据类型 Java的数据类型分为两大类:基本类型(Primitive Data Types)和引用类型(Reference Types)。...

    28.java基本类型封装.docx

    在Java 5引入了自动装箱和拆箱机制,这使得开发者可以直接将基本数据类型与对应的包装类型互相转换,而无需显式地使用构造函数或转换方法。 - **自动装箱**:将基本数据类型自动转换为其对应的包装类型。例如,`int...

    Java面试题全集.pdf

    文件中涵盖了多个与Java编程和面试相关的知识点,包括但不限于方法重载与重写、访问控制关键字、基本数据类型、浮点数精度问题、自动装箱和拆箱、整型缓存机制等。以下是根据文件内容整理出的详细知识点: 1. 方法...

    java中Integer包装类装箱的一个细节详解

    自从Java 5引入自动装箱和拆箱机制以来,我们可以在代码中方便地在int和Integer之间进行转换。然而,对于Integer的装箱过程,有一个细节需要注意,它可能导致在某些特定情况下的不预期行为。 当我们直接写`Integer ...

    Java面试八股文001-Java-Java基础

    例如,`Integer` 类有一个 `cache` 字段,该字段缓存了一定范围内的 `Integer` 对象,以提高性能。这种方式减少了频繁创建相同数值的 `Integer` 对象的开销,提高了程序的效率。 #### 6. 自动装箱与拆箱 - **自动...

    Java学习笔记,常用类

    从Java 1.5开始,引入了自动装箱和拆箱机制。自动装箱是指基本数据类型在需要对象的上下文时自动转换为包装类的对象,例如`Integer i = 5;`。这个过程由编译器自动完成,实际上等同于`Integer i = Integer.valueOf(5...

    2023最新100道JAVA面试题

    值得注意的是,当使用自动装箱时,对于小数值(-128到127),JAVA会使用缓存池(IntegerCache)来复用已有的对象,以提高性能。对于超出这个范围的值,则每次都会创建新的对象。 以上是根据给定的文件内容总结出的相关...

    Integer IntegerCache源码阅读

    这个范围的选择是因为这些数值在Java虚拟机(JVM)中会被自动进行"装箱"(boxing)和"拆箱"(unboxing)操作,无需每次都创建新的对象。当 `Integer.valueOf()` 被调用时,如果传入的整数值在这个范围内,那么它会...

    55丨享元模式(下):剖析享元模式在JavaInteger、String中的应用1

    当我们在-128到127这个范围内的值创建Integer对象时,Java会使用享元模式来复用已存在的对象。这是因为Integer类内部有一个缓存池,即IntegerCache,它预先创建了-128到127之间的所有Integer对象。当我们调用valueOf...

    Integer创建对象

    实际上,Java编译器会自动执行`Integer.valueOf(40)`方法,这是由于Java的自动装箱机制。`Integer.valueOf()`方法的目的是优化性能,因为它利用了对象池机制。对象池在`Integer`类中以内部类`IntegerCache`的形式...

    【Java学习】Integer.ValueOf()引发的血案

    在Java中,基本类型`int`与封装类`Integer`之间可以自动转换,这就是所谓的装箱和拆箱。装箱是将基本类型的值转换为对应的封装类对象,而拆箱则是将封装类对象转换为基本类型的值。 题目中提到的"血案"实际上是一个...

    年java面试题大全编程资料

    Java从Java 5开始支持自动装箱和拆箱。例如,在下面的代码中: ```java Integer a = new Integer(3); Integer b = 3; // 自动装箱 int c = 3; System.out.println(a == b); // false,两个引用没有指向同一个...

    阿里巴巴 Java 开发手册

    5. **数据类型**:合理使用基本数据类型和包装类,避免自动装箱拆箱带来的性能损耗。对于可能为null的值,使用Optional类来表示,减少NullPointerException的风险。 6. **代码结构**:提倡模块化和高内聚、低耦合的...

Global site tag (gtag.js) - Google Analytics