java学习笔记——自动拆箱装箱(Autoboxing&Unboxing)

一、基本类型打包器

1、基本类型:long、int、double、float、boolean

2、类类型:Long、Integer、Double、Float、Boolean

区别:基本类型效率更高,类类型的对象却可以携带更多的信息。

public class TestInteger01 {

	public static void main(String[] args) {

		int a = 10;
		int b = 20;
		Integer A = new Integer(a);
		Integer B = new Integer(b);
		System.out.println(a / 3);
		System.out.println(A.doubleValue()/ 3);
		System.out.println(A.compareTo(B));
	}
}
/*
输出结果:
3
3.3333333333333335
-1
*/

doubleValue()可以将打包值以double类型返回

compareTo()可以与另一个Integer对象比较,相同为0,小于为-1,大于为1

二、自动拆箱和装箱

Integer A = 10;  //自动装箱

int a = A;   //自动拆箱

自动拆箱和装箱的内幕

看第一个例子,这个例子声明了int和Integer两个类型,“==”为比较是否参考于同一个对象

public class TestInteger02 {

	public static void main(String[] args) {

		int a = 100;
		int b = 100;
		if (a == b){
			System.out.println("int基本类型:a == b");
		}
		else{
			System.out.println("int基本类型:a != b");
		}

		Integer c = 100;
		Integer d = 100;
		if (c == d){
			System.out.println("Integer类类型:c == d");
		}
		else{
			System.out.println("Integer类类型:c != d");
		}
	}

}
/*
输出结果:
int基本类型:a == b
Integer类类型:c == d
*/

由结果可知,a和b,c和d都是同一个对象。

再来看第二个例子,我们将abcd的值全部改为200,输出却出现了意想不到的结果。 

public class TestInteger03 {

	public static void main(String[] args) {

		int a = 200;
		int b = 200;
		if (a == b){
			System.out.println("int基本类型:a == b");
		}
		else{
			System.out.println("int基本类型:a != b");
		}

		Integer c = 200;
		Integer d = 200;
		if (c == d){
			System.out.println("Integer类类型:c == d");
		}
		else{
			System.out.println("Integer类类型:c != d");
		}
	}

}
/*
输出结果:
int基本类型:a == b
Integer类类型:c != d
*/

我们发现,此时a和b还是同一个对象,c和d却已经不是同一个对象了! 

这是什么原因呢?我们可以查看java/lang/Integer.java

public static Integer valueOf(int i) {
        return  i >= 128 || i < -128 ? new Integer(i) : SMALL_VALUES[i + 128];
    }

这段代码的意思是,在Integer类中,当传进来的值在(-128—127)之间时,便会查看缓存中有没有打包过相同的值,如果有就直接返回,如果没有就new创建。

当传进来的值不在(-128—127)这个区间时,就直接new创建。所以c和d为200,已经超出区间,所以各自开辟一块内存空间存储数据,所以也不会引用自同一个对象。

而基本类型int,就不会有这个烦恼,每次传值,都会查看缓存中是否已经存在。

理解了这个,我们也就理解了基本类型与String型的区别。

我在这篇随笔中(Java中关键字super与this的区别),初步介绍了基本类型与String型的用法区别,但并没有深入认识到这点,而今天看到了林信良先生的java学习笔记,终于有一种醍醐灌顶的感觉。

时间: 2024-12-26 10:54:29

java学习笔记——自动拆箱装箱(Autoboxing&Unboxing)的相关文章

JAVA高级特性--自动拆箱-装箱,枚举类型

基本数据类型转换为引用类型对象 一个自动装箱的例子 Integer i=10; 相当于 Integer i=new Integer(10); 一个自动拆箱的例子 Integer m=10; int n=m; 相当于n=m.intValue(); 枚举类型 所有枚举类型都继承了Enum类 枚举值都是public  static final 的  ,也就是常量,因此枚举值应大写 枚举构造器都是私有化的 //当jvm去加载使用枚举类的时候,会预先创建多个枚举类型的对象供外部使用 public stat

java自动拆箱装箱易导致的两个错误

自J2SE 5.0开始提供的基本数据类型的自动装箱(autoboxing).拆箱(unboxing)功能. 何为自动装箱: 当我们创建一个Integer对象时,却可以这样: Integer i = 100; (注意:不是 int i = 100; ) 实际上,执行上面那句代码的时候,系统为我们执行了:Integer i = new Integer(100); 此即基本数据类型的自动装箱功能. 何为自动拆箱 自动拆箱(unboxing),也就是将对象中的基本数据从对象中自动取出.如下可实现自动拆箱

JAVA学习笔记-自动装箱和自动拆箱(包装类)

自动装箱 基本类型就自动地封装到与它相同类型的包装中,如: Integer i =100; 本质上是,编译器编译时为我们添加了: Integer i =new Integer(100); 自动拆箱 包装类对象自动转换成基本类型数据.如: int a = new Integer(100); 本质上,编译器编译时为我们添加了: int a new Integer(100).intValue(); 缓存问题: 实际上,为了提高效率. 在[-128-127]之间,仍然当做基本数据类型来处理.(但是它仍然

java 1.5 自动拆箱和装箱的注意事项

背景 java1.5后引入了自动装箱和自动拆箱的概念 自动拆箱:将引用类型转化为基本数据类型 自动装箱:将基本数据类型装为引用类型 但是实际使用中,什么情况自动拆箱什么情况自动装箱呢? 自动装箱 Integer i = 100; (调用Integer.valueOf(100)) 这里存在一个缓存变量 -128~127 ,如果基本数据类型在此范围内,则使用缓存的对象,否则new Integer(number) 自动拆箱 //第一种情况 Integer i = 100; int x = i; (调用

关于Java自动拆箱装箱中的缓存问题

1 package cn.zhang.test; 2 /** 3 * 测试自动装箱拆箱 4 * 自动装箱:基本类型自动转为包装类对象 5 * 自动拆箱:包装类对象自动转化为基本数据类型 6 * 7 * 8 * /*缓存问题*/ 9 /*缓存[-128,127]之间的数字,也就是一个byte,实际上是系统在初始的时候创建了一个范围在[-128,127]之间的一个数组 10 * 当我们调用valueOf的时候,首先判断该数字是否在[-128,127]之间,如果在,则在数组中拿出该对象,侧面印证了数组

一文读懂什么是Java中的自动拆装箱

基本数据类型 基本类型,或者叫做内置类型,是Java中不同于类(Class)的特殊类型.它们是我们编程中使用最频繁的类型. Java是一种强类型语言,第一次申明变量必须说明数据类型,第一次变量赋值称为变量的初始化. Java基本类型共有八种,基本类型可以分为三类: 字符类型char 布尔类型boolean 整数类型byte.short.int.long 浮点数类型float.double. Java中的数值类型不存在无符号的,它们的取值范围是固定的,不会随着机器硬件环境或者操作系统的改变而改变.

转!!Java学习之自动装箱和自动拆箱源码分析

自动装箱(boxing)和自动拆箱(unboxing) 首先了解下Java的四类八种基本数据类型 基本类型 占用空间(Byte) 表示范围 包装器类型 boolean 1/8 true|false Boolean char 2 -128~127 Character byte 1 -128~127 Byte short 2 -2ˆ15~2ˆ15-1 Short int 4 -2ˆ31~2ˆ31-1 Integer long 8 -2ˆ63~2ˆ63-1 Long float 4 -3.403E38

Java学习之自动装箱和自动拆箱源码分析

自动装箱(boxing)和自动拆箱(unboxing) 首先了解下Java的四类八种基本数据类型 基本类型 占用空间(Byte) 表示范围 包装器类型 boolean 1 true|false Boolean char 2 -128~127 Character byte 1 -128~127 Byte short 2 -2ˆ15~2ˆ15-1 Short int 4 -2ˆ31~2ˆ31-1 Integer long 8 -2ˆ63~2ˆ63-1 Long float 4 -3.403E38~3

Java的自动拆箱和装箱

Java 1.5中引入了自动装箱和拆箱机制 自动装箱:(看代码) <span style="font-family:SimSun;font-size:18px;color:#000000;">//自动装箱:把基本类型用它们所对应的引用类型包装起来,使它们具有对象的属性 Integer integer_a = 8; </span> 自动拆箱:(看代码) <span style="font-family:SimSun;font-size:18px;c