java基础数据类型自动装箱拆箱
一、定义:
public class test { public static void main(String[] args) { Integer a = 3;//装箱 int b = a;//拆箱 } }
查看Integer的源码,可知:
基础类型的包装类,装箱,实际调用的是包装类的valueof方法;
拆箱,调用的是包装类的:xxxValue方法;
比如对于Integer,装箱:Integer.valueOf(int i);拆箱:Integer.intValue()。
二、运用举例及坑:
1、运用举例代码:
public class TestAutoBoxing { /** * 测试类演示基础类型的自动装箱和拆箱,及比较规则 * @author cdzhujun */ public static void main(String[] args) { /** * 在-128~127 之内的数,如果已经有了,则会缓存,支持复用 类似类型还有:Short/Character/Long/Byte * 取值范围: Integer,Byte,Short,Long:[-128,127] Character:[0,127] * Float,Double:没有缓存,每次都new一个新的 Boolean:只有两个固定值,只要值一样就相等 */ System.out.println("############################"); // 在-128~127 之外的数 Integer ii1 = 200; Integer ii2 = 200; System.out.println("ii1==ii2: " + (ii1 == ii2));// false // 在-128~127 之内的数 Integer ii3 = 100; Integer ii4 = 100; System.out.println("i3==i4: " + (ii3 == ii4));// true System.out.println("—————————"); Double d1 = 100.0; Double d2 = 100.0; Double d3 = 200.0; Double d4 = 200.0; System.out.println(d1 == d2); // false System.out.println(d3 == d4); // false System.out.println("—————————"); Boolean b1 = false; Boolean b2 = false; Boolean b3 = true; Boolean b4 = true; System.out.println(b1 == b2);// true System.out.println(b3 == b4);// true System.out.println("—————————"); /** * ==比较: * 都为基础类型时,比较的是值;都为包装类时,按缓存规则比较;基础类和包装类比较,包装类会自动拆箱 * new就不说了,每次new,都在堆内存中新建一个对象 */ System.out.println("############################"); // Example 1: 都为基础类型时,比较的是值 int i1 = 1; int i2 = 1; System.out.println("i1==i2 : " + (i1 == i2)); // true // Example 2: 都为包装类时,按缓存规则比较 Integer obj1 = 1; Integer obj2 = 1; System.out.println("obj1 == obj2 : " + (obj1 == obj2)); // true // Example 3: 基础类和包装类比较,包装类会自动拆箱 Integer num1 = 1; int num2 = 1; System.out.println("num1 == num2 : " + (num1 == num2)); // true // Example 4: new就不说了,每次new,都在堆内存中新建一个对象 Integer one = new Integer(1); Integer anotherOne = new Integer(1); System.out.println("one == anotherOne : " + (one == anotherOne)); // false // Example 5: 一个是包装类,一个是new出来的,也相当于两个new System.out.println(num1 == one); // false /** * ==的特殊场景: * 1、如果==号比较的其中一个为表达式(以+、-、*、/、>、<运算符运算的,包装类先拆包参与运算 * 2、当 ==运算符的两个操作数都是包装器类型的引用,则是比较指向的是否是同一个对象; * 而如果其中有一个操作数是表达式(即包含算术运算),则比较的是数值(即会触发自动拆箱的过程)。 */ System.out.println("############################"); Integer num111 = 100; int num222 = 100; Long num333 = 200L; long numm3 = 100L; Integer numm1 = 200; //num111先拆箱参与运算,num111+num222运算后为int类型,然后在装箱变为Integer //由于右侧的操作是包含表达式,故最终num333和(num111 + num222)计算的结果会自动拆箱,变成long与int类型 //long/int基础类型是可以进行==比较的,比较的仅仅是值,故最终结果返回true System.out.println(num333 == (num111 + num222)); //true System.out.println(num222 == numm3); //true //System.out.println(num333 == numm1);//这样写是不行的,应为类型不匹配 /** * 包装类的equals():类型相同,且变量的值相等,才会最终返回true * 注意:包装类的equals()方法重写了Object类的相同方法; * 而String、Date类亦重写了Object类equals(),只是实现不一样(不在这里讨论) */ System.out.println("############################"); Integer num11 = 100; int num22 = 100; Long num4 = 200L; System.out.println(num11.equals(num22)); //true System.out.println(num4.equals(num11 + num22)); //false,因为equals不拆箱,因Long与Integer类型不匹配 System.out.println(num4 == (num11 + num22)); // true,有操作符,+计算结果会拆箱 } }
2、坑:Integer类型可以为null,int类型不能为null。
Integer i1=null; int i2=i1;
这两行代码是完全合法的,完全能够通过编译的,但是在运行时,就会抛出空指针异常,因为int类型不能为null。
所以:在自动拆箱时,要保证包装类的值不能为null。
三、自动装箱拆箱的优点及弊端:
1、优点:
省事, 简化代码。自动把基础类型和包装类互转。
节约内存。如上面的例子,在数字范围比较小时,可复用类的对象( [-128,127] )。
2、弊端:在一个循环中进行自动装箱操作的情况,如下面的例子就会创建多余的对象,影响程序的性能。
Integer sum = 0; for(int i=1000; i<5000; i++){ sum+=i; }
内部实际为:
sum = sum.intValue() + i; Integer sum = new Integer(result);
new了很多个对象出来,但没实际用处,故会增加外内存开销,影响性能。
四、基本类型与包装类型的异同
1、在Java中,一切皆对象,但八大基本类型(char,byte,int,double,float,short,long,boolean)却不是对象。
2、声明方式的不同,基本类型无需通过new关键字来创建,而封装类型需new关键字。
3、存储方式及位置的不同,基本类型是直接存储变量的值保存在栈中能高效的存取,封装类型需要通过引用指向实例,具体的实例保存在堆中。
4、初始值的不同,封装类型的初始值为null,基本类型的的初始值视具体的类型而定,比如int类型的初始值为0(整数:包括int,short,byte,long ,初始值为0),boolean类型为false,浮点型:float,double ,初始值为0.0,字符:char ,初始值为空格,即'' ",如果输出,在Console上是看不到效果的。
5、使用方式的不同,比如与集合类合作使用时只能使用包装类型。
相关推荐
在Java编程语言中,自动装箱(Autoboxing)和自动拆箱(Unboxing)是两个重要的特性,它们简化了基本类型(如int、double等)与对应的包装类(如Integer、Double等)之间的转换过程。这些特性是在Java 5引入的,极大...
对于基本数据类型与包装类之间的转换,Java提供了一个非常便利的功能——自动装箱和自动拆箱。这些功能极大地简化了编程流程,使代码更加简洁易读。 #### 基本数据类型与包装类 在Java中,**基本数据类型**是指...
从Java 5开始,引入了自动装箱和拆箱特性,使得基础数据类型和其包装器类之间的转换更加方便。例如: ```java Integer y = 567; // 自动装箱 y++; // 自动拆箱,自增,再自动装箱 System.out.println("y = " + y); ...
在Java中,自动装箱(Autoboxing)和拆箱(Unboxing)是Java编译器提供的一种特性,用于在基本数据类型和对应的包装类之间进行自动转换。这种特性简化了编程过程中的类型转换操作,使得代码更为简洁易读。 **自动...
Java中的自动装箱和拆箱是自J2SE 5.0版本引入的特性,它极大地简化了基本数据类型与其对应的包装类之间的转换过程。基本数据类型包括int、double、boolean等,而包装类如Integer、Double和Boolean分别对应这些基本...
在Java中,自动装箱是指将基本数据类型自动转换为对应的包装类对象的过程,而自动拆箱则是指将包装类对象自动转换为基本数据类型的逆过程。这一特性自Java 5起引入,极大地简化了开发者的编程工作。 #### 基本数据...
在Java编程中,自动装箱(Autoboxing)和自动拆箱(Unboxing)是两个非常核心的概念,它们允许基本数据类型和它们对应的包装类之间无缝转换。这种转换机制在Java 5中引入,极大地简化了代码编写,但同时也带来了一些...
Java中自动装箱和拆箱是Java语言中一个重要的特性,它可以将基本数据类型和它们的包装类之间进行转换,这个过程是透明的,程序员不需要手动进行转换。但是,这个过程会引起一些耗时问题,本文将详细介绍Java中自动...
"详解Java包装类及自动装箱拆箱" Java 包装类是 Java 语言中的一种基本类型的封装体,它将基本类型的值“包装”到对象中,使基本类型的值能够包含在集合中,或者作为方法的返回值。Java 包装类有两个主要的目的:将...
装箱和拆箱就是Java提供的一种自动转换机制,用于在基本数据类型和其对应的包装类之间进行转换。 #### 二、包装类的概念 **包装类**是为了实现面向对象编程中的“一切皆对象”思想而存在的。在Java中,每种基本...
Java编程中自动拆箱与自动装箱是从J2SE 5.0开始提供的功能,可以简化Java编程中的数据类型转换。下面是自动拆箱与自动装箱的详细解释: 1. 基本数据类型的自动装箱(Autoboxing) 自动装箱是指将基本数据类型...
自动装箱和拆箱问题是Java中一个老生常谈的问题了,我们来一些看一下装箱和拆箱中的若干问题。本文先讲述装箱和拆箱基本的东西,再来看一下面试笔试中经常遇到的与装箱、拆箱相关的问题。 以下是本文的目录大纲:...
装箱是指将基本数据类型自动转换为包装器类型的过程,而拆箱则是指将包装器类型自动转换为基本数据类型的过程。 二、装箱和拆箱是如何实现的? 装箱和拆箱是通过调用包装器的valueOf方法和xxxValue方法实现的。...
装箱(Boxing)是Java自动将基本数据类型转换为对应的包装类的过程。例如,int类型转换为Integer,char类型转换为Character等。这是Java 5引入的自动装箱特性,旨在简化代码,提高开发效率。当我们将一个基本类型...
Java中的自动装箱和拆箱是自JDK 1.5版本引入的一种语言特性,它极大地简化了基础数据类型(如int)与它们对应的包装类(如Integer)之间的转换过程。这一特性使得开发者无需手动创建包装类实例或使用显式类型转换,...
自动装箱与拆箱:自动装箱(Autoboxing)指的是自动地将基本数据类型转换为对应的包装类对象;自动拆箱(Unboxing)则是将包装类对象自动转换为基本数据类型。 常用方法:演示如何使用包装类中的这些常见方法。 null...
自动装箱是指Java编译器自动将基本数据类型(如int、char、boolean等)转换为它们对应的包装类(如Integer、Character、Boolean等)的过程。反之,自动拆箱则是将包装类对象转换回基本数据类型。例如,当我们把一个...
在 Java 5 中引入了自动装箱与拆箱的功能,使得开发者在使用基本类型和它们对应的包装类之间更加灵活。 **示例**: ```java // 自动装箱 int num = 10; Integer numObj = num; // numObj 是 Integer 对象 // 自动...
本文将为您带来Java基础教程的最新整理,涵盖Java中的数据类型、基本类型、包装类型、自动装箱和拆箱、缓存池等重要知识点。 一、数据类型 Java中的数据类型可以分为两大类:基本类型和引用类型。基本类型包括byte...
Java基础教程之基本类型数据类型、包装类及自动拆装箱是Java编程语言的基础知识,它们之间的关系和转换是Java程序员必须了解和掌握的。下面我们将详细介绍Java基础教程之基本类型数据类型、包装类及自动拆装箱。 一...