`
天府小茶客
  • 浏览: 12798 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

java基础数据类型自动装箱拆箱

    博客分类:
  • java
阅读更多

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类型可以为nullint类型不能为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使用方式的不同,比如与集合类合作使用时只能使用包装类型。

 

 

1
0
分享到:
评论

相关推荐

    Java中的自动装箱与拆箱Java开发Java经验技巧共6

    在Java编程语言中,自动装箱(Autoboxing)和自动拆箱(Unboxing)是两个重要的特性,它们简化了基本类型(如int、double等)与对应的包装类(如Integer、Double等)之间的转换过程。这些特性是在Java 5引入的,极大...

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

    对于基本数据类型与包装类之间的转换,Java提供了一个非常便利的功能——自动装箱和自动拆箱。这些功能极大地简化了编程流程,使代码更加简洁易读。 #### 基本数据类型与包装类 在Java中,**基本数据类型**是指...

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

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

    Java中的自动装箱和拆箱是什么?它们有什么作用?(java面试题附答案).txt

    在Java中,自动装箱(Autoboxing)和拆箱(Unboxing)是Java编译器提供的一种特性,用于在基本数据类型和对应的包装类之间进行自动转换。这种特性简化了编程过程中的类型转换操作,使得代码更为简洁易读。 **自动...

    java自动装箱拆箱深入剖析

    Java中的自动装箱和拆箱是自J2SE 5.0版本引入的特性,它极大地简化了基本数据类型与其对应的包装类之间的转换过程。基本数据类型包括int、double、boolean等,而包装类如Integer、Double和Boolean分别对应这些基本...

    《深入理解java虚拟机》自动装箱拆箱实例.doc

    在Java中,自动装箱是指将基本数据类型自动转换为对应的包装类对象的过程,而自动拆箱则是指将包装类对象自动转换为基本数据类型的逆过程。这一特性自Java 5起引入,极大地简化了开发者的编程工作。 #### 基本数据...

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

    在Java编程中,自动装箱(Autoboxing)和自动拆箱(Unboxing)是两个非常核心的概念,它们允许基本数据类型和它们对应的包装类之间无缝转换。这种转换机制在Java 5中引入,极大地简化了代码编写,但同时也带来了一些...

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

    Java中自动装箱和拆箱是Java语言中一个重要的特性,它可以将基本数据类型和它们的包装类之间进行转换,这个过程是透明的,程序员不需要手动进行转换。但是,这个过程会引起一些耗时问题,本文将详细介绍Java中自动...

    详解Java包装类及自动装箱拆箱

    "详解Java包装类及自动装箱拆箱" Java 包装类是 Java 语言中的一种基本类型的封装体,它将基本类型的值“包装”到对象中,使基本类型的值能够包含在集合中,或者作为方法的返回值。Java 包装类有两个主要的目的:将...

    Java软件开发实战 Java基础与案例开发详解 8-3 装箱和拆箱 共4页.pdf

    装箱和拆箱就是Java提供的一种自动转换机制,用于在基本数据类型和其对应的包装类之间进行转换。 #### 二、包装类的概念 **包装类**是为了实现面向对象编程中的“一切皆对象”思想而存在的。在Java中,每种基本...

    java编程中自动拆箱与自动装箱详解

    Java编程中自动拆箱与自动装箱是从J2SE 5.0开始提供的功能,可以简化Java编程中的数据类型转换。下面是自动拆箱与自动装箱的详细解释: 1. 基本数据类型的自动装箱(Autoboxing) 自动装箱是指将基本数据类型...

    深入剖析Java中的装箱和拆箱

    自动装箱和拆箱问题是Java中一个老生常谈的问题了,我们来一些看一下装箱和拆箱中的若干问题。本文先讲述装箱和拆箱基本的东西,再来看一下面试笔试中经常遇到的与装箱、拆箱相关的问题。  以下是本文的目录大纲:...

    深入理解Java中的装箱和拆箱

    装箱是指将基本数据类型自动转换为包装器类型的过程,而拆箱则是指将包装器类型自动转换为基本数据类型的过程。 二、装箱和拆箱是如何实现的? 装箱和拆箱是通过调用包装器的valueOf方法和xxxValue方法实现的。...

    Java 装箱与拆箱详解及实例代码

    装箱(Boxing)是Java自动将基本数据类型转换为对应的包装类的过程。例如,int类型转换为Integer,char类型转换为Character等。这是Java 5引入的自动装箱特性,旨在简化代码,提高开发效率。当我们将一个基本类型...

    浅谈Java自动装箱与拆箱及其陷阱

    Java中的自动装箱和拆箱是自JDK 1.5版本引入的一种语言特性,它极大地简化了基础数据类型(如int)与它们对应的包装类(如Integer)之间的转换过程。这一特性使得开发者无需手动创建包装类实例或使用显式类型转换,...

    Java语言 包装类讲解案例代码 ( 设计目的(作用)和用途、自动装箱与拆箱、常用方法、 null和默认值)

    自动装箱与拆箱:自动装箱(Autoboxing)指的是自动地将基本数据类型转换为对应的包装类对象;自动拆箱(Unboxing)则是将包装类对象自动转换为基本数据类型。 常用方法:演示如何使用包装类中的这些常见方法。 null...

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

    自动装箱是指Java编译器自动将基本数据类型(如int、char、boolean等)转换为它们对应的包装类(如Integer、Character、Boolean等)的过程。反之,自动拆箱则是将包装类对象转换回基本数据类型。例如,当我们把一个...

    Tedu正则表达式与Object与自动装箱与拆箱

    在 Java 5 中引入了自动装箱与拆箱的功能,使得开发者在使用基本类型和它们对应的包装类之间更加灵活。 **示例**: ```java // 自动装箱 int num = 10; Integer numObj = num; // numObj 是 Integer 对象 // 自动...

    Java基础教程2023年最新整理

    本文将为您带来Java基础教程的最新整理,涵盖Java中的数据类型、基本类型、包装类型、自动装箱和拆箱、缓存池等重要知识点。 一、数据类型 Java中的数据类型可以分为两大类:基本类型和引用类型。基本类型包括byte...

    Java基础教程之基本类型数据类型、包装类及自动拆装箱

    Java基础教程之基本类型数据类型、包装类及自动拆装箱是Java编程语言的基础知识,它们之间的关系和转换是Java程序员必须了解和掌握的。下面我们将详细介绍Java基础教程之基本类型数据类型、包装类及自动拆装箱。 一...

Global site tag (gtag.js) - Google Analytics