在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 = ...
这个项目可能包含了一些示例代码、测试用例和文档,用于演示和解释自动装箱和拆箱的工作原理,以及如何在实际编程中高效地使用这个特性。 总结来说,"AutoBundle.zip"提供的资源对于理解和掌握自动装箱和拆箱的概念...
3. 自动装箱拆箱:Java 5.0引入了自动装箱拆箱机制,使得基本类型与对应的包装类之间可以无缝转换,提高了代码的简洁性。书中会解释这一特性的原理和使用场景。 4. 面向对象编程:《Thinking in Java》深入讲解了...
Java自动拆箱装箱里隐藏的秘密 Java中的Class类和Object类 Java异常 解读Java中的回调 反射 泛型 枚举类 Java注解和最佳实践 JavaIO流 多线程 深入理解内部类 javac和javap Java8新特性终极指南 序列化和反序列化 ...
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...
JDK1.5的重大改进包括泛型、增强for循环、可变参数、注解和自动装箱拆箱等,同时还推出了EJB3.0和JSF(Java Server Faces)框架。后续的JDK1.6和Java SE7、SE8继续优化性能和增加新功能,如Lambda表达式等。 Java...