在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 5开始,引入了自动装箱和拆箱特性,使得基础数据类型和其包装器类之间的转换更加方便。例如: ```java Integer y = 567; // 自动装箱 y++; // 自动拆箱,自增,再自动装箱 System.out.println("y = " + y); ...
为了编写更高效、更可维护的Java代码,开发者需要了解自动装箱和拆箱的工作原理、应用场景以及性能影响,并遵循最佳实践来避免潜在的性能问题。通过合理使用基本数据类型、显式装箱和拆箱、利用缓存范围、避免在高频...
Java自动装箱和拆箱的实现原理是 Java语言的一个重要特性,它使得开发者可以更加方便地使用原始类型和封装类之间的转换,但是同时也容易引发一些疑惑和错误。通过了解自动装箱和拆箱的实现原理,我们可以更好地使用...
Java中自动装箱、拆箱引起的耗时详解 Java中自动装箱和拆箱是Java语言中一个重要的特性,它可以将基本...本文详细介绍了自动装箱和拆箱的定义、示例、原理和耗时问题,并提供了一些解决方法,希望能够对读者有所帮助。
### Java中的自动装箱与拆箱详解 #### 引言 在Java开发过程中,开发者经常需要处理各种数据类型之间的转换。对于基本数据类型与包装类之间的转换,Java提供了一个非常便利的功能——自动装箱和自动拆箱。这些功能...
Java语言在设计时引入了自动装箱和拆箱机制,以方便开发者在基本类型与它们对应的包装类之间进行转换。这个特性在提高编程效率的同时,也...同时,理解Java自动装箱和拆箱的原理,有助于在编写代码时做出明智的选择。
它针对Java语言特点、面向对象与面向过程的区别、Java基本数据类型及其封装类、标识符命名规则、instanceof关键字的作用以及Java自动装箱与拆箱的知识点进行了阐述。下面将详细展开这些知识点。 1. Java语言特点: ...
`是自动装箱的例子。由于Java会进行优化,对于-128到127之间的整数,Integer.valueOf()方法会从缓存中返回相同的对象引用,因此`num1`和`num2`指向的是同一个对象。然而,`Integer num3 = 200;`和`Integer num4 = ...
本篇文章将从J2SE5.0新增的自动装箱(Autoboxing)与拆箱(Unboxing)功能入手,探讨它们在Java编程中的作用及其背后的原理。这一特性不仅简化了基本数据类型与包装类之间的转换,而且深刻体现了Java语言在面向对象...
这个项目可能包含了一些示例代码、测试用例和文档,用于演示和解释自动装箱和拆箱的工作原理,以及如何在实际编程中高效地使用这个特性。 总结来说,"AutoBundle.zip"提供的资源对于理解和掌握自动装箱和拆箱的概念...
3. 自动装箱拆箱:Java 5.0引入了自动装箱拆箱机制,使得基本类型与对应的包装类之间可以无缝转换,提高了代码的简洁性。书中会解释这一特性的原理和使用场景。 4. 面向对象编程:《Thinking in Java》深入讲解了...
Java自动拆箱装箱里隐藏的秘密 Java中的Class类和Object类 Java异常 解读Java中的回调 反射 泛型 枚举类 Java注解和最佳实践 JavaIO流 多线程 深入理解内部类 javac和javap Java8新特性终极指南 序列化和反序列化 ...
接着探讨了包装类的自动装箱拆箱机制和数值比较陷阱。对于日期时间类,文档不仅讲解了传统的Date和Calendar类,还重点介绍了Java 8的新日期API如LocalDateTime、Duration等。集合框架部分涵盖了List接口的不同实现类...
Java自动拆箱装箱里隐藏的秘密 Java中的Class类和Object类 Java异常 解读Java中的回调 反射 泛型 枚举类 Java注解和最佳实践 JavaIO流 多线程 深入理解内部类 javac和javap Java8新特性终极指南 序列化和反序列化 ...
自动装箱与自动拆箱是Java中的一项语法糖特性,它简化了基本类型与对应包装类之间的转换过程。自动装箱是将基本类型自动转换为包装类型,而自动拆箱则是将包装类型转换为基本类型。例如,在Java程序中,我们可以直接...
- 包装类与自动装箱拆箱:Java为基本数据类型提供了对应的包装类,以及自动装箱和拆箱机制。 3. **类库与集合框架** - 集合接口与实现:ArrayList、LinkedList、HashSet、HashMap等集合类的使用,以及List、Set、...
在JDK 5.0之后,Java引入了自动装箱和拆箱机制,使得开发者能够更便捷地处理基本类型和它们对应的包装类。例如: ```java // 装箱 Integer a = new Integer(1); // 拆箱 int b = a.intValue(); ``` 在早期版本中,...
- 数据类型:基本类型与引用类型的特性,自动装箱拆箱原理。 2. **Java集合框架** - List、Set、Queue、Map接口的理解与应用。 - ArrayList、LinkedList、HashSet、HashMap的实现原理与性能比较。 - ...
6. **包装类和自动装箱拆箱**:了解Integer、Double等基本类型包装类的特性,以及与基本类型之间的转换,包括自动装箱和拆箱的过程。 7. **内存管理**:理解Java的内存模型,包括堆内存、栈内存和方法区,以及对象...
书中还探讨了Java编译与代码优化,如即时编译(JIT)、逃逸分析、自动装箱拆箱等特性,以及如何通过HotSpot的即时编译器提升程序性能。这部分内容对于提升Java程序的运行效率至关重要。 最后,书本深入剖析了Java...