`

Java自动装箱、拆箱原理

阅读更多

在Java中, 所有要处理的东西几乎都是对象 (Object)

        在 Java SE 5.0之后提供了自动装箱的功能,可以直接使用以下语句来打包基本数据类型:Integer integer = 10;

        在进行编译时,编译器会判断是否进行自动装箱动作。自动装箱适用于 boolean、byte、short、char、long、float、double等基本数据类型,会使用对应的打包类型(Wrapper Types)Boolean、Byte、Short、Character、Long、Float或Double。

 

public class AutoBox {
 
    public static void main(String[] args) {
 
        Integer a = 1;//int类型自动装箱
        System.out.println(a + 1);//Integer自动拆箱
    }
 
}

 

装箱中如果数字为1个字节内(-128~127),则会将这个数字放入缓存池中,创建对象时返回该对象的引用,这涉及到了Java的享元模式Flyweigth

 

public class AutoBoxFlyweigth {
	 
    public static void main(String[] args) {
        Integer a = 12;
        Integer b = 12;
        System.out.println(a == b);// true
        Integer c = 1234;
        Integer d = 1234;
        System.out.println(c == d);// false
        
        Integer e = new Integer(13);
        Integer f = new Integer(13);
        System.out.println(e == f);	//false
        
        Integer g = new Integer(1200);
        Integer h = new Integer(1200);
        System.out.println(g == h);	//false
    }
 
}

 

通过Java源代码可以看到Integer.valueOf()中有个内部类IntegerCache(类似于一个常量数组,也叫对象池),它维护了一个Integer数组cache,长度为(128+127+1)=256,Integer类中还有一个Static Block(静态块)。从这个静态块可以看出,Integer已经默认创建了数值【-128-127】的Integer缓存数据。所以使用Integer a=12时,JVM会直接在该在对象池找到该值的引用。也就是说这种方式声明一个Integer对象时,JVM首先会在Integer对象的缓存池中查找有没有12的对象,如果有直接返回该对象的引用;如果没有,则使用new一个对象,并返回该对象的引用地址。因为Java中“==”比较的是两个对象的引用(即内存地址),a、b为同一个对象,所以结果为true,因为1234超过了Integer缓存数据范围,使用new方式创建:c = new Integer(1234);d=new Integer(40);虽然他们值相等,但是属于不同的对象,不会被放到对象池中,所以他们不是同一个引用,返回false。

       用一句简短通俗的话话概括享元模式:

       如果有很多个小的对象,它们有很多属性相同,那可以把它们变成一个对象,那些不同的属性把它们变成方法的参数,称之为外部状态,相同的属性称之为内部状态,这种机制即为享元模式。

 

 

int (-128,127) 范围的处理 和 String s= "a"; 类似 //从缓存池中取,如果没有在在池中和堆上创建

String s = new String("ss"); //直接在堆上创建

 

分享到:
评论

相关推荐

    JAVA装箱拆箱(很详细、易于理解)

    从Java 5开始,引入了自动装箱和拆箱特性,使得基础数据类型和其包装器类之间的转换更加方便。例如: ```java Integer y = 567; // 自动装箱 y++; // 自动拆箱,自增,再自动装箱 System.out.println("y = " + y); ...

    Java自动装箱与拆箱深度解析:原理、应用与性能考量

    为了编写更高效、更可维护的Java代码,开发者需要了解自动装箱和拆箱的工作原理、应用场景以及性能影响,并遵循最佳实践来避免潜在的性能问题。通过合理使用基本数据类型、显式装箱和拆箱、利用缓存范围、避免在高频...

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

    Java自动装箱和拆箱的实现原理是 Java语言的一个重要特性,它使得开发者可以更加方便地使用原始类型和封装类之间的转换,但是同时也容易引发一些疑惑和错误。通过了解自动装箱和拆箱的实现原理,我们可以更好地使用...

    Java中自动装箱、拆箱引起的耗时详解

    Java中自动装箱、拆箱引起的耗时详解 Java中自动装箱和拆箱是Java语言中一个重要的特性,它可以将基本...本文详细介绍了自动装箱和拆箱的定义、示例、原理和耗时问题,并提供了一些解决方法,希望能够对读者有所帮助。

    Java中的自动装箱与拆箱:深入理解基本数据类型与对象的转换

    ### Java中的自动装箱与拆箱详解 #### 引言 在Java开发过程中,开发者经常需要处理各种数据类型之间的转换。对于基本数据类型与包装类之间的转换,Java提供了一个非常便利的功能——自动装箱和自动拆箱。这些功能...

    java陷阱之自动装箱共2页.pdf.zip

    Java语言在设计时引入了自动装箱和拆箱机制,以方便开发者在基本类型与它们对应的包装类之间进行转换。这个特性在提高编程效率的同时,也...同时,理解Java自动装箱和拆箱的原理,有助于在编写代码时做出明智的选择。

    10万字总结java面试题和答案.pdf

    它针对Java语言特点、面向对象与面向过程的区别、Java基本数据类型及其封装类、标识符命名规则、instanceof关键字的作用以及Java自动装箱与拆箱的知识点进行了阐述。下面将详细展开这些知识点。 1. Java语言特点: ...

    Java拆装箱深度剖析

    `是自动装箱的例子。由于Java会进行优化,对于-128到127之间的整数,Integer.valueOf()方法会从缓存中返回相同的对象引用,因此`num1`和`num2`指向的是同一个对象。然而,`Integer num3 = 200;`和`Integer num4 = ...

    JDK 良葛格 java 学习笔记4

    本篇文章将从J2SE5.0新增的自动装箱(Autoboxing)与拆箱(Unboxing)功能入手,探讨它们在Java编程中的作用及其背后的原理。这一特性不仅简化了基本数据类型与包装类之间的转换,而且深刻体现了Java语言在面向对象...

    AutoBundle.zip

    这个项目可能包含了一些示例代码、测试用例和文档,用于演示和解释自动装箱和拆箱的工作原理,以及如何在实际编程中高效地使用这个特性。 总结来说,"AutoBundle.zip"提供的资源对于理解和掌握自动装箱和拆箱的概念...

    Thinking.in.Java第三版.第四版

    3. 自动装箱拆箱:Java 5.0引入了自动装箱拆箱机制,使得基本类型与对应的包装类之间可以无缝转换,提高了代码的简洁性。书中会解释这一特性的原理和使用场景。 4. 面向对象编程:《Thinking in Java》深入讲解了...

    【Java面试+Java学习指南】 一份涵盖大部分Java程序员所需要掌握的核心知识

    Java自动拆箱装箱里隐藏的秘密 Java中的Class类和Object类 Java异常 解读Java中的回调 反射 泛型 枚举类 Java注解和最佳实践 JavaIO流 多线程 深入理解内部类 javac和javap Java8新特性终极指南 序列化和反序列化 ...

    Java面向对象编程:常用类深入剖析与应用技巧

    接着探讨了包装类的自动装箱拆箱机制和数值比较陷阱。对于日期时间类,文档不仅讲解了传统的Date和Calendar类,还重点介绍了Java 8的新日期API如LocalDateTime、Duration等。集合框架部分涵盖了List接口的不同实现类...

    Java工程师面试复习指南

    Java自动拆箱装箱里隐藏的秘密 Java中的Class类和Object类 Java异常 解读Java中的回调 反射 泛型 枚举类 Java注解和最佳实践 JavaIO流 多线程 深入理解内部类 javac和javap Java8新特性终极指南 序列化和反序列化 ...

    15Java语法糖与Java编译器1

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

    Java 编程思想中文第三版(PDF)

    - 包装类与自动装箱拆箱:Java为基本数据类型提供了对应的包装类,以及自动装箱和拆箱机制。 3. **类库与集合框架** - 集合接口与实现:ArrayList、LinkedList、HashSet、HashMap等集合类的使用,以及List、Set、...

    java封装类的作用

    在JDK 5.0之后,Java引入了自动装箱和拆箱机制,使得开发者能够更便捷地处理基本类型和它们对应的包装类。例如: ```java // 装箱 Integer a = new Integer(1); // 拆箱 int b = a.intValue(); ``` 在早期版本中,...

    Java 面试宝典2017版Linux公社高清版

    - 数据类型:基本类型与引用类型的特性,自动装箱拆箱原理。 2. **Java集合框架** - List、Set、Queue、Map接口的理解与应用。 - ArrayList、LinkedList、HashSet、HashMap的实现原理与性能比较。 - ...

    Sun认证Java软件工程师考试(SCJP)试题题库

    6. **包装类和自动装箱拆箱**:了解Integer、Double等基本类型包装类的特性,以及与基本类型之间的转换,包括自动装箱和拆箱的过程。 7. **内存管理**:理解Java的内存模型,包括堆内存、栈内存和方法区,以及对象...

    深入理解Java虚拟机++JVM高级特性与最佳实践1

    书中还探讨了Java编译与代码优化,如即时编译(JIT)、逃逸分析、自动装箱拆箱等特性,以及如何通过HotSpot的即时编译器提升程序性能。这部分内容对于提升Java程序的运行效率至关重要。 最后,书本深入剖析了Java...

Global site tag (gtag.js) - Google Analytics