Java中的boxing和unboxing(转)

测试代码:

System.out.println(0L == 0);//true
System.out.println(((Long)0L).equals(0));//false
Integer i1 = 100;
Integer i2 = 100;
Integer i3 = 1000;//如果int values between -128 and 127,VM使用相同的对象,否则创建新的对象。
Integer i4 = 1000;
System.out.println(i1==i2);//true
System.out.println(i3==i4);//false

Autoboxing和unboxing又名拆箱和装箱,简单一点讲,就是从primitive转换到wrapper class,例如int类型到Integer类型就是装箱,而Integer类型到int类型则是拆箱。当然,这里的装箱和拆箱都是auto的,是JVM在工作的内容,事实上不用我们手写,然而也有手写的对应方式,如下所示:

1 int i=10;2 Integer a=new Integer(i);//装箱的操作3 int j=a.intValue();//拆箱的操作

上面是手动的,在Java5.0之后已经在JVM中有了自动的装箱和拆箱的转换,如下所示:

1 int i=10;2 Integer b=i;//自动的装箱3 int k=b;//自动的拆箱

装箱和拆箱就是这么简单,下面可以看一下自增是怎么一个过程,这是一个很有意思的事情,递减也是一样。

1 Integer d=new Integer(10);2 d++;//这条语句使得d先拆箱,然后进行++操作,而后对结果再装箱

上面的这条语句,使得Java保证了wrapper class也可以是正常使用通用的操作符,但这绝对不是C++中的运算符重载。你还可以试着分析三元表达式和条件表达式中的装箱拆箱过程。

这里需要注意的一点就是装箱和拆箱在Method Overload时候的问题,例如下面:

1 public void doSomething(double num);2 public void doSomething(Integer num);

在一个类中有这么两个函数,那么对于整数int k,如果进行doSomething(k)的调用,会调用哪个呢?

在Java1.4中,显然是调用double类型的函数,然而,现在有了自动的拆箱和装箱之后会调用哪个呢?还double类型的函数。这样可以保证以前的代码在现在新的版本中也可以正确的运行。(向下兼容,Backwards compatibility,在计算机中指在一个程序或者类库更新到较新的版本后,用旧的版本程序创建的文档或系统仍能被正常操作或使用,或在旧版本的类库的基础上开发的程序仍能正常编译运行的情况。)

注意,Java5中,Method的解析是三个pass的过程:

A.编译器会试着不用任何的boxing和unboxing,或者启用vararg(可变参数)来定位正确的method。这会找到根据Java1.4的规则而会调用的任何method。

B.如果第一个pass失败了,编译器会再度尝试解析method,但这次会允许boxing和unboxing转换。具有vararg的method不在这次pass的考虑中。

C.如果第二个pass也失败了,编译器会做最后一次的尝试,允许boxing和unboxing,且同时也考虑到vararg method。

时间: 2024-08-05 16:43:45

Java中的boxing和unboxing(转)的相关文章

Java中基本数据的包装类

java中基本数据类型的包装类有:Character.Boolean.Byte.Short.Integer.Long.Float和Double. 基本数据类型:char.  boolean.  byte.short. int .   long.   float. double 这些包装类位于java.lang包中,包装类可以将基本的数据类型当作对象处理. 1. Character类 Character character = new Character('a'): //创建一个Character

Java中的三目运算符可能出现的问题

你真的了解Java中的三目运算符吗? 原创 2018-04-27 刨根问底的 Hollis Hollis Hollis 微信号 hollischuang 功能介绍 一个对Coding有着独特追求的人. 三目运算符是我们经常在代码中使用的,a= (b==null?0:1);这样一行代码可以代替一个if-else,可以使代码变得清爽易读. 但是,三目运算符也是有一定的语言规范的.在运用不恰当的时候会导致意想不到的问题.本文就介绍一个我自己曾经踩过的坑. 一.三目运算符 对于条件表达式b?x:y,先计

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

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

Java中的基本类型和包装类型区别

首先看一下几个测试题,验证一下java中对基本类型和包装类型的理解,看看最后输出的答案对不对,答案在这篇博客中哦: // 第一题: 基本类型和包装类型 int a = 100; Integer b = 100; System.out.println(a == b); // 第二题: 两个包装类型 Integer c = 100; Integer d = 100; System.out.println(c == d); // 第三题 c = 200; d = 200; System.out.pri

Java 中的语法糖

定义:指的是,在计算机语言中添加某种语法,这种语法能使程序员更方便的使用语言开发程序,同时增强程序代码的可读性,避免出错的机会:但是这种语法对语言的功能并没有影响.Java中的泛型,变长参数,自动拆箱/装箱,条件编译等都是 泛型:ava的泛型只在源代码存在,只供编辑器检查使用,编译后的字节码文件已擦除了泛型类型 public static void main(String[] args) { List<String> stringList = new ArrayList<String&g

Java 中的泛型详解-Java编程思想

Java中的泛型参考了C++的模板,Java的界限是Java泛型的局限. 2.简单泛型 促成泛型出现最引人注目的一个原因就是为了创造容器类. 首先看一个只能持有单个对象的类,这个类可以明确指定其持有的对象的类型 class Holder1 { private Circle a; public Holder1(Circle a) { this.a = a; } Circle get() { return a; } } 上面的类的可重用性不怎么样,无法持有其他类型的任何对象,下面通过持有Object

关于Java中枚举Enum的深入剖析

在编程语言中我们,都会接触到枚举类型,通常我们进行有穷的列举来实现一些限定.Java也不例外.Java中的枚举类型为Enum,本文将对枚举进行一些比较深入的剖析. 什么是Enum Enum是自Java 5 引入的特性,用来方便Java开发者实现枚举应用.一个简单的Enum使用如下. // ColorEnum.javapublic enum ColorEmun { RED, GREEN, YELLOW} public void setColorEnum(ColorEmun colorEnum) {

Java中整型的缓存机制

译文出处: 张洪亮   原文出处:Java Papers 本文将介绍Java中Integer的缓存相关知识.这是在Java 5中引入的一个有助于节省内存.提高性能的功能.首先看一个使用Integer的示例代码,从中学习其缓存行为.接着我们将为什么这么实现以及他到底是如何实现的.你能猜出下面的Java程序的输出结果吗.如果你的结果和真正结果不一样,那么你就要好好看看本文了. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 pa

Java核心(四):Java中的装箱和拆箱

一.为什么需要装箱和拆箱? 基础数据类型是数据,不是对象,也不是Object的子类.Java为每种基本数据类型都提供了对应的包装器类型.装箱就是自动将基本数据类型转换为包装器类型:拆箱就是自动将包装器类型转换为基本数据类型. 把一个基本类型包装成对应的包装器类对象,有以下三点好处: 一是包装器类对象具有很多可以调用的方法: 二是Java向面像对象语言的靠近.其实Java还不算是很纯的面向对象的语言.真正的面向对象,是没有基本数据类型的.它只有一种类型,就是对象: 三是在泛型中,基本类型是不可以做