Java包装类、拆箱和装箱详解
- 格式:docx
- 大小:22.56 KB
- 文档页数:4
Java自动装箱与拆箱及其陷阱分析定义大家在平时编写Java程序时,都常常以以下方式来定义一个Integer对象:Integeri=100;从上面的代码中,大家可以得知,i为一个Integer类型的引用,100为Java中的基础数据类型(primitivedatatype)。
而这种直接将一个基础数据类型传给其相应的封装类(wrapperclass)的做法,便是自动装箱(Autoboxing)。
在jdk1.5中,自动装箱首次被引入。
而在jdk1.5之前,如果你想要定义一个value为100的Integer对象,则需要这样做:Integeri=newInteger(100);原理我们在以上代码“Integeri=100;”处打一个断点,跟踪一下。
接下来,我们可以看到,程序跳转到了Integer类的valueOf(inti)方法中/***Returnsa Integer instancerepresentingthespecified*int value.*Ifanew Integer instanceisnotrequired,thismethod*shouldgenerallybeusedinpreferencetotheconstructor*{@link#Integer(int)},asthismethodislikelytoyield*significantlybetterspaceandtimeperformancebycaching *frequentlyrequestedvalues.**@paramian int value.*@returna Integer instancerepresenting i.*@since1.5*/publicstaticIntegervalueOf(inti){if(i>=-128&&i<=IntegerCache.high)returnIntegerCache.cache[i+128];elsereturnnewInteger(i);}换句话说,装箱就是jdk自己帮你完成了调用Integer.valueOf(100)。
java boxed用法Java中的Boxed用法在Java中,有时候需要将基本数据类型转换为对象,以便能够在面向对象的环境中使用它们。
这时,就可以使用Boxed用法来实现。
Boxed用法是将基本数据类型包装成对应的包装类,以便能够使用包装类的属性和方法。
Boxed用法可以分为两个方面来描述:自动装箱和手动装箱。
1. 自动装箱自动装箱是指将基本数据类型自动转换为包装类对象的过程。
在Java中,当我们将基本数据类型赋值给对应的包装类时,编译器会自动调用该包装类的构造方法来创建一个包装类对象。
例如,我们可以将一个int类型的变量赋值给一个Integer类型的变量:```javaint num = 10;Integer number = num; // 自动装箱,将int类型的num转换为Integer类型的number```同样地,我们也可以将一个boolean类型的变量赋值给一个Boolean类型的变量:```javaboolean flag = true;Boolean bool = flag; // 自动装箱,将boolean类型的flag转换为Boolean类型的bool```通过自动装箱,我们可以将基本数据类型直接使用在需要包装类的场景中,方便了我们的开发。
2. 手动装箱手动装箱是指我们显式地将基本数据类型转换为包装类对象。
这种方式可以通过包装类的构造方法来实现。
例如,我们可以通过Integer的构造方法将一个int类型的变量转换为对应的包装类对象:```javaint num = 10;Integer number = new Integer(num); // 手动装箱,将int类型的num转换为Integer类型的number```同样地,我们也可以通过Boolean的构造方法将一个boolean类型的变量转换为对应的包装类对象:```javaboolean flag = true;Boolean bool = new Boolean(flag); // 手动装箱,将boolean类型的flag转换为Boolean类型的bool```需要注意的是,手动装箱需要我们显式地进行转换操作,因此较为麻烦,但在一些特殊情况下可能会使用到。
Java基本类型和包装类型在Java编程语言中,有8种基本类型和对应的包装类型。
基本类型是Java语言的内置类型,用于存储简单的数据值,而包装类型则是基本类型的对象表示。
本文将详细介绍Java的基本类型和包装类型,包括它们的定义、特性和常见用法。
基本类型Java的8种基本类型分为4种整型、2种浮点型、1种字符型和1种布尔型。
基本类型的定义如下:1.整型–byte:8位有符号整数,取值范围为-128到127。
–short:16位有符号整数,取值范围为-32768到32767。
–int:32位有符号整数,取值范围为-2147483648到2147483647。
–long:64位有符号整数,取值范围为-9223372036854775808到9223372036854775807。
2.浮点型–float:32位浮点数,取值范围为1.4e-45到3.4028235e+38,精度为6-7位小数。
–double:64位浮点数,取值范围为4.9e-324到1.7976931348623157e+308,精度为15位小数。
3.字符型–char:16位Unicode字符,取值范围为’000’到’’。
4.布尔型–boolean:表示真或假的值,取值为true或false。
基本类型具有以下特点:•基本类型的变量直接存储值,不占用堆内存空间。
•基本类型的默认值与其对应的包装类型的默认值不同。
例如,int的默认值为0,而Integer的默认值为null。
•基本类型的赋值是按值传递的,即将一个变量的值复制给另一个变量。
基本类型的使用示例:int age = 20;double salary = 5000.0;char grade = 'A';boolean isMarried = false;包装类型Java的包装类型是为了将基本类型转换为对象而提供的。
每种基本类型都有对应的包装类型,包装类型位于ng包中。
java判断基本数据类型的方法在Java中,判断基本数据类型的方法包括使用关键字"instanceof"、自动装箱与拆箱、逻辑运算符、比较运算符、类型转换等。
下面将分别详细介绍这些方法。
1. 使用关键字"instanceof":instanceof是Java中的一个二元操作符,可以用来判断一个对象是否是一些类的实例,也可以用来判断一个类是否是另一个类的子类。
通过使用instanceof关键字,我们可以判断一个对象是否是一些基本数据类型的实例。
例如,我们可以使用下面的代码判断一个对象是否是整数类型的实例:```Object obj = 123;if (obj instanceof Integer)System.out.println("obj是整数类型的实例");```这段代码中,我们使用instanceof关键字将obj与Integer类型进行比较,如果obj是Integer类型的实例,则输出"obj是整数类型的实例"。
2.自动装箱与拆箱:在Java中,基本数据类型和对应的包装类之间存在着自动装箱和拆箱的机制。
自动装箱是指将基本数据类型自动转换为对应的包装类,而自动拆箱则是将包装类自动转换为对应的基本数据类型。
通过使用自动装箱和拆箱机制,我们可以将基本数据类型与包装类进行比较。
例如,我们可以使用下面的代码判断一个对象是否是整数类型的实例:```Object obj = 123;if (obj instanceof Integer)System.out.println("obj是整数类型的实例");```这段代码中,我们将整数123自动装箱为Integer类型的对象,然后再使用instanceof关键字将obj与Integer类型进行比较。
3.逻辑运算符:在Java中,逻辑运算符可以用来对基本数据类型进行判断。
老九Java基础课关于包装类的总结1、包装类:将基本数据类型值作为对象处理。
把基本类型相应的属性和方法封装到包装类中,以后使用基本类型自带强悍方法基本类型的值不是对象,可以使用JavaAPI中的包装类包装成对象ng包2、基本类型包装类Int Integerdouble Doublechar Character除int char外的首字母大写为包装类3、将Java基本类型打包成对象装箱拆箱4、举例int num1 = 10;//打包基本类型Integer iNum = new Integer(num1); //或者Integer iNum = Integer.valueOf(num1);//自动装箱Integer iNum = num1;//拆箱int num2 = iNum2.intvalue();//自动拆箱int num3 = iNum2;//比较值pareTo(iNum2); //iNum1 > iNum2 返回-1 相等返回0 小于返回-1 5、用包装类方法可以将String类型转换成double等基本类型double num = Double parseDouble("3.14");6、为了节约装箱和拆箱的过程,直接把基本类型定义成包装类型String str = "123";Integer.parseInt(str);Double parseDouble(str);7、char的包装类Character的一些方法Character.isDigit 是否是字母Character.isLetter(ch) 是否是字母Character.isLetterOrDigit(ch) 是否是数字或字母Character.isJavaIdentifierPart(ch) 判断用来定义Java变量的单词中,除首字符外,其他字符是否是合法字符Character.isJavaIdentifierStart(ch) 判断JAVA变量中,第一个字符是否是合法字符Character.isUpperCase(ch) 判断是否是大写字母8、注意<1>包装类没有无参构造,所有包装类的实例都是不可变的,一旦创建对象后,他们内部的值就不能改变<2>每个基本类型包装类都有常量MAX_VALUE和MAX_INVALUE 老九学堂会员社群出品作者:小萌男神。
Java中的包装类装箱和拆箱在java中,数据类型总共可分为两大种,基本数据类型(值类型)和类类型(引用数据类型)。
基本类型的数据不是对象,不能作为对象调用其toString()、hashCode()、getClass()、equals()等等方法。
所以在java中,针对8种基本数据类型,提供了针对每个基本数据类型的包装类。
如下:所谓装箱,就是把基本类型用它们相对应的引用类型包起来,使它们可以具有对象的特质,如我们可以把int型包装成Integer类的对象,或者把double包装成Double,等等。
所谓拆箱,就是跟装箱的方向相反,将Integer及Double这样的引用类型的对象重新简化为值类型的数据。
//JDK1.5 之前使用手动方式进行装箱和拆箱的操作public class IntegerDemo{public static void main (String []agrs){int i=10;Integer j=new Integer(i); //手动装箱操作int i1=j.intValue();//手动拆箱操作System.out.println(i1*i1);}}; //output:100//JDK1.5之后可自动进行的装箱和拆箱的操作,比较方便public class IntegerDemo02{public static void main (String []agrs){int i=10Integer j=i;int k=j;System.out.println(++k);}}; //output:11包装类的另外一个比较有用的是可以将String 字符串类型转换为相应的基本数据类型。
下面以将String转为int为例:public class IntegerDemo04{public static void main (String[] args){String str="1500";try{int i=Integer.parseInt(str);System.out.println(++i);}catch (Exception e){e.printStackTrace(); //打印异常信息}}};// output: 1501如果在上述方法中str="15er00";则在调用parseInt方法时候会产生NumberFormatException异常,见JDK API中对该方法的描述:public static int parseInt(String s) throws NumberFormatException将字符串参数作为有符号的十进制整数进行解析。
详解Java⾃动装箱与拆箱的实现原理什么是⾃动装箱和拆箱⾃动装箱就是Java⾃动将原始类型值转换成对应的对象,⽐如将int的变量转换成Integer对象,这个过程叫做装箱,反之将Integer对象转换成int类型值,这个过程叫做拆箱。
因为这⾥的装箱和拆箱是⾃动进⾏的⾮⼈为转换,所以就称作为⾃动装箱和拆箱。
原始类型byte, short, char, int, long, float, double 和 boolean 对应的封装类为Byte, Short, Character, Integer, Long, Float, Double, Boolean。
下⾯例⼦是⾃动装箱和拆箱带来的疑惑public class Test {public static void main(String[] args) {test();}public static void test() {int i = 40;int i0 = 40;Integer i1 = 40;Integer i2 = 40;Integer i3 = 0;Integer i4 = new Integer(40);Integer i5 = new Integer(40);Integer i6 = new Integer(0);Double d1=1.0;Double d2=1.0;System.out.println("i=i0\t" + (i == i0));System.out.println("i1=i2\t" + (i1 == i2));System.out.println("i1=i2+i3\t" + (i1 == i2 + i3));System.out.println("i4=i5\t" + (i4 == i5));System.out.println("i4=i5+i6\t" + (i4 == i5 + i6));System.out.println("d1=d2\t" + (d1==d2));System.out.println();}}请看下⾯的输出结果跟你预期的⼀样吗?输出的结果:i=i0 truei1=i2 truei1=i2+i3 truei4=i5 falsei4=i5+i6 trued1=d2 false为什么会这样?带着疑问继续往下看。
⼋⼤基本数据类型及包装类(装箱拆箱)⼀、⼋⼤基本数据类型 ⼋⼤基本数据类型包括:整数类型(byte、short、int、long),浮点类型(float、double),字符类型(char),布尔类型(boolean) byte:8位,占⽤空间为1字节,最多存储数据量是255,存放的数据范围为-128~127之间。
short:16位,占⽤空间为2字节,最⼤数据存储量为65536,数据范围为-32768~32767。
int:32位,占⽤空间为4字节,最⼤数据存储量为232-1,数据范围为-231~231-1。
long:64位,占⽤空间位8字节,最⼤数据存储量为264-1,数据范围为-263~263-1。
float:32位,占⽤空间为4字节,数据范围为3.4e45~1.4e38,直接赋值时必须在数字后加上f或F。
double:64位,占⽤空间为8字节,数据范围为4.9e324~1.8e308,赋值时可以加d或D,也可以不加。
boolean:占内存1字节,可存储true与false两个数值,分别表⽰逻辑的真与假。
char:16位,存储Unicode码,⽤单引号赋值。
范围从⼩到⼤依次为:byte、short、char、int、long、float、double⼆、包装类2.1 Java为每种基本数据类型分别设计了对应的类,称之为包装类。
基本数据类型对应的包装类byte Byteshort Shortint Integerlong Longchar Characterfloat Floatdouble Doubleboolean Boolean每个包装类的对象可以封装⼀个相应的基本数据类型的数据,并提供了其他⼀些有⽤的⽅法。
包装类对象⼀经创建,其内容不可改变。
基本数据类型与包装类的相互交换: 由基本数据类型向对应的包装类转换称为装箱,例如把int包装成integer类的对象。
由包装类相对应的基本数据类型转换称为拆箱,例如把integer类的对象重新简化为int。
Java语言的基本数据类型的包装类Java是一种面向对象语言,Java中的类把方法与数据连接在一起,并构成啦字包含式的处理单元。
为了能在Java中将今本数据类型视为对象来处理,并能连接相关的方法。
Java在ng包中为每个基本数据类型都提供了一个相应的包装类。
这样,我们便可以把这些基本数据类型转化为对象来处理了。
表1列出了所有的包装类。
值得说明的是,Java是可以直接处理基本数据类型的,但是在有些情况下我们需要将其作为对象来处理,这是我们需要将其转化为包装类了。
表1原始数据类型的包装类原始数据类型包装类byte(字节bytechar(字符型charint(整型integerlong(长整形longfloat(浮点型floatdouble(双精度doubleboolean(布尔booleanshort(短整型short通过将要包装的值传递到相应的构造方法中,可以构造包装对象,如示例1所示示例1public class Test1{public static void main(String[]args{int num1=5;Integer num=new Integer(num1;int num2=num.intValue(;}}代码说明:在示例1中,num是包装类Integer的对象。
最后一条语句通过调用Integer对象的intValue(方法,将num1的值存入num2。
下面通过包装类Double的完整示例,向大家展示包装类与基本数据类型以及包装类与自负串之间的相互转换过程,如示例2所示,运行结果如图1所示。
示例2package s2Java.sg.appendix;public class WrapperTest{public static void main(String[]args{/***Double类构造函数Double(double d和Double(String s*可以由double类型数值或包含了浮点值的字符串创建*/Double db=new Double(1000.00;String str="100.00";Double db1=new Double(str; System.out.println(db;System.out.println(db1;/***将Double值作为byte返回*/Double db2=new Double(100;byte bt;bt=db2.byteValue(;System.out.println(bt;/***将Double值作为double类型返回*/Double db3=new Double(400; System.out.println(db3.doubleValue(; /***将Double值作为int类型返回*/System.out.println(db3.intValue(;/***将Double值作为long类型返回*/System.out.println(db3.longValue(;/***Double的静态方法toString(double d*返回double参数的字符串表示形式*/System.out.println(Double.toHexString(db3; /** *Double的静态方法parseDouble(String s*返回一个新的double值*该值呗初始化为用字符串s表示的值*/try{String str1="123";String str2="string";System.out.println(Double.parseDouble(str1; System.out.println(Double.parseDouble(str2;}catch(RuntimeException e{System.out.println("无效的数据格式:"+e.getMessage(; }/***Double的静态方法valueOf(double d*返回表示指定的double值的Double对象*/double d5=200;Double db4=Double.valueOf(d5;System.out.println(db4;/***Double的静态方法valueOf(String s;*返回用参数字符串s表示的double值的Double对象*/try{String str3="900";Double db5=Double.valueOf(str3;System.out.println(db5;}catch(NumberFormatException e{System.out.println("无效的数据格式:"+e.getMessage(;}}}图1示例2的运行结果代码说明:包装类Double的各种方法的使用说明请参见示例2中的注释代码。
java中八个基本类型的包装类型-概述说明以及解释1.引言1.1 概述概述在Java编程语言中,有八个基本数据类型,即整型(byte、short、int、long)、浮点型(float、double)、字符型(char)和布尔型(boolean)。
尽管这些基本类型在编程中非常有用,但它们并不是对象,因此无法直接进行操作和传递。
为了解决这个问题,Java提供了对应的包装类型,也就是每个基本类型所对应的类。
在Java中,对于每个基本类型都有相应的包装类:Byte、Short、Integer、Long、Float、Double、Character和Boolean。
这些包装类是在Java的标准库中预先定义好的,并提供了许多有用的方法和属性,以便进行更复杂的操作。
在本文中,我们将详细探讨每个基本类型的包装类型,探索它们的作用和优势,以及它们与基本类型之间的关系。
我们还将对Java编程中使用这些包装类型的重要性和应用场景进行讨论。
接下来的章节将深入研究这些方面,并解释为什么在某些情况下使用包装类型是有益的。
我们还将总结基本类型和包装类型的特点,并探讨它们在Java编程中的重要性。
让我们开始这个有趣的探索吧!1.2文章结构1.2 文章结构本篇文章将围绕Java中八个基本类型的包装类型展开讨论。
以下是文章的主要结构:1. 引言:引言部分将提供对Java基本类型和包装类型的简要概述,介绍它们在编程中的作用和使用场景。
2. 正文:2.1 基本类型和包装类型的关系:这一部分将详细探讨基本类型和包装类型之间的关系,包括各种基本类型对应的包装类型的命名规则和特点。
2.2 包装类型的作用和优势:文章将进一步介绍包装类型的作用和优势。
我们将探讨包装类型的主要用途,如提供更多的功能和方法,和基本类型在集合操作中的应用等。
3. 结论:3.1 总结基本类型和包装类型的特点:这一部分将对前文的内容进行总结,重点强调基本类型和包装类型之间的差异和共性,以及使用时需注意的一些问题。
自动装箱(boxing)和自动拆箱(unboxing)首先了解下Java的四类八种基本数据类型自动装箱Java中所谓的装箱通俗点就是:八种基本数据类型在某些条件下使用时,会自动变为对应的包装器类型。
如下清单1:输出:解释下清单1第11句输出true的原因:当包装器类型进行“==”比较时,i3会调用Integer.valueOf自动装箱基本数据类型为包装器类型。
从源码中可以看出,Integer对象自动缓存int值范围在low~high(-128~127),如果超出这个范围则会自动装箱为包装类。
Note:1.Integer、Short、Byte、Character、Long这几个包装类的valueOf方法的实现是类似的;2.Double、Float的valueOf方法的实现是类似的。
3.Boolean的valueOf方法的实现是个三目运算,形如` return (b ? TRUE : FALSE); `自动拆箱Java中所谓的拆箱通俗点就是:八种包装器类型在某些条件下使用时,会自动变为对应的基本数据类型。
清单2:输出:解释下清单2第10句输出true的原因:当程序执行到第10句时,i4会调用Integer.intValue方法自动拆箱包装器类型为基本数据类型。
从源码可以看出,当包装器类型和基本数据类型进行“==”比较时,包装器类型会自动拆箱为基本数据类型。
清单3内容如下:输出:解释第15句为什么会输出true:因为在Integer包装类实现的equals方法中,只要比较的当前对象是Integer实例,那么就会自动拆箱为基本数据类型。
从以下Integer类的equals方法的源码就可看出:Note:1.Integer、Short、Byte、Character、Long这几个包装类的intValue方法的实现是类似的;2.Double、Float的intValue方法的实现是类似的。
3.Boolean的booleanValue方法的实现和intValue方法的实现也是类似的。
java面试基础知识java面试基础知识1、静态变量和实例变量的区别?在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加。
在程序运行时的区别:实例变量是属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配内存空间,才可以使用这个实例变量。
静态变量不属于某个实例对象,而是属于类,所以也称为类变量,只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会分配内存空间,而且只分配一次,静态变量就可以被使用了。
总之,实例变量必须创建后才可以通过这个对象来使用,静态变量则直接可以使用类名来调用。
2、什么是反射机制?java反射是在运行状态中,对任意一个类,都能够知道这个类的所有属性和方法,对于任何一个对象,都能够调用它的任意一个属性和方法,这种动态获取信息以及动态调用对象的方法的功能称为java的反射机制。
3、什么是装箱?什么是拆箱?装箱:自动将基本数据类型转换为包装器类型。
拆箱:自动将包装器类型转换为基本数据类型。
4、Java 中覆盖和重载是什么意思?覆盖(Override)是指子类对父类方法的一种重写,只能比父类抛出更少的异常,访问权限不能比父类的小,被覆盖的方法不能是private的,否则只是在子类中重新定义了一个新方法。
重载(Overload)表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同。
java基础知识面试题及答案1、static关键字什么意思?java中是否可以覆盖一个private或者是static的方法?“static”表明一个成员变量或者是成员方法可以在没有所属类的实例变量的情况下访问。
java中static方法不能被覆盖,因为方法覆盖是基于运行时动态绑定的,而static方法是编译时静态绑定的。
static方法与类的任何实例都不相关。
java中不可以覆盖private方法。
因为private修饰的变量和方法只能在当前类中使用,如果是其他类继承当前类,继承类中是不能访问到private变量和方法的。
详解Java 的自动装箱与拆箱(Autoboxing and unboxing) 2015/09/22 5010 一、什么是自动装箱拆箱很简单,下面两句代码就可以看到装箱和拆箱过程//自动装箱Integer total = 99;//自定拆箱int totalprim = total; 简单一点说,装箱就是自动将基本数据类型转换为包装器类型;拆箱就是自动将包装器类型转换为基本数据类型。
下面我们来看看需要装箱拆箱的类型有哪些:这个过程是自动执行的,那么我们需要看看它的执行过程:public class Main { public static void main(String[] args) { //自动装箱Integer total = 99; //自定拆箱int totalprim = total; }} 反编译class 文件之后得到如下内容:javap -c StringTestInteger total = 99; 执行上面那句代码的时候,系统为我们执行了:Integer total = Integer.valueOf(99);int totalprim = total; 执行上面那句代码的时候,系统为我们执行了:int totalprim= total.intValue();我们现在就以Integer 为例,来分析一下它的源码:1、首先来看看Integer.valueOf 函数public static Integer valueOf(int i) { return i = 128 || i -128 ? new Integer(i) : SMALL_VALUES[i + 128];} 它会首先判断i 的大小:如果i 小于-128 或者大于等于128,就创建一个Integer 对象,否则执行SMALL_VALUES[i + 128]。
首先我们来看看Integer 的构造函数:private final int value;public Integer(int value) { this.value = value;}public Integer(String string) throws NumberFormatException { this(parseInt(string));} 它里面定义了一个value 变量,创建一个Integer 对象,就会给这个变量初始化。
详解Java的⾃动装箱与拆箱(Autoboxingandunboxing)⼀、什么是⾃动装箱拆箱很简单,下⾯两句代码就可以看到装箱和拆箱过程1//⾃动装箱2 Integer total = 99;34//⾃动拆箱5int totalprim = total;简单⼀点说,装箱就是⾃动将基本数据类型转换为包装器类型;拆箱就是⾃动将包装器类型转换为基本数据类型。
下⾯我们来看看需要装箱拆箱的类型有哪些:这个过程是⾃动执⾏的,那么我们需要看看它的执⾏过程:1 public class Main {2 public static void main(String[] args) {3//⾃动装箱4 Integer total = 99;56//⾃定拆箱7int totalprim = total;8 }9 }反编译class⽂件之后得到如下内容:1 javap -c StringTestInteger total = 99;执⾏上⾯那句代码的时候,系统为我们执⾏了:Integer total = Integer.valueOf(99);int totalprim = total;执⾏上⾯那句代码的时候,系统为我们执⾏了:int totalprim = total.intValue();我们现在就以Integer为例,来分析⼀下它的源码:1、⾸先来看看Integer.valueOf函数1public static Integer valueOf(int i) {2return i >= 128 || i < -128 ? new Integer(i) : SMALL_VALUES[i + 128];3 }它会⾸先判断i的⼤⼩:如果i⼩于-128或者⼤于等于128,就创建⼀个Integer对象,否则执⾏SMALL_VALUES[i + 128]。
⾸先我们来看看Integer的构造函数:1private final int value;23public Integer(int value) {4this.value = value;5 }67public Integer(String string) throws NumberFormatException {8this(parseInt(string));9 }它⾥⾯定义了⼀个value变量,创建⼀个Integer对象,就会给这个变量初始化。
自动装箱(boxing)和自动拆箱(unboxing)自动装箱Java中所谓的装箱通俗点就是:八种基本数据类型在某些条件下使用时,会自动变为对应的包装器类型。
如下清单1:输出:解释下清单1第11句输出true的原因:当包装器类型进行“==”比较时,i3会调用Integer.valueOf自动装箱基本数据类型为包装器类型。
从源码中可以看出,Integer对象自动缓存int值范围在low~high(-128~127),如果超出这个范围则会自动装箱为包装类。
Note:1.Integer、Short、Byte、Character、Long这几个包装类的valueOf方法的实现是类似的;2.Double、Float的valueOf方法的实现是类似的。
3.Boolean的valueOf方法的实现是个三目运算,形如` return (b ? TRUE : FALSE); ` 自动拆箱Java中所谓的拆箱通俗点就是:八种包装器类型在某些条件下使用时,会自动变为对应的基本数据类型。
清单2:输出:解释下清单2第10句输出true的原因:当程序执行到第10句时,i4会调用Integer.intValue方法自动拆箱包装器类型为基本数据类型。
从源码可以看出,当包装器类型和基本数据类型进行“==”比较时,包装器类型会自动拆箱为基本数据类型。
清单3内容如下:输出:解释第15句为什么会输出true:因为在Integer包装类实现的equals方法中,只要比较的当前对象是Integer实例,那么就会自动拆箱为基本数据类型。
从以下Integer类的equals方法的源码就可看出:Note:1.Integer、Short、Byte、Character、Long这几个包装类的intValue方法的实现是类似的;2.Double、Float的intValue方法的实现是类似的。
3.Boolean的booleanValue方法的实现和intValue方法的实现也是类似的。
java的封箱和拆箱1、基本概念字节的单位:byte。
位的单位:bit,1byte=8bit2、8种基本数据类型4种整型,2种浮点类型,1种⽤于表⽰Unicode编码的字符单元的字符类型和1种⽤于表⽰真值的boolean类型。
数据类型浮点型⼤⼩(占字节数,2的⼏次⽅)范围默认值包装器类型byte(字节)8 -128 - 1270Byteshot(短整型)16-32768 - 327680Shortint(整型)32 -2147483648-21474836480Integerlong(长整型)64-9233372036854477808-92333720368544778080Longfloat(浮点型) 32-3.40292347E+38-3.40292347E+380.0f Floatdouble(双精度)64-1.79769313486231570E+308-1.79769313486231570E+3080.0d Doublechar(字符型)16‘ \u0000 - u\ffff ’ ‘\u0000 ’Characterboolean(布尔型)1true/false false Boolean3、包装类 包装类即使把基本类型变成对象类型,包含每种基本数据类型的相关属性如最⼤值、最⼩值等,以及相关的操作⽅法。
4、包装类转换关系 基本类型 --> 包装器类 Integer obj=new Integer(10); 包装器类 --> 基本类型 int num=obj.intValue(); 字符串 --> 包装器类 Integer obj=new Integer("100"); 字符串 --> 基本类型 int num=Integer.parseInt("-45.36");5、⾃动装包/拆包(Autoboxing/unboxing)基本类与包装类的转换,则是装包与拆包 ⾃动装包/拆包⼤⼤⽅便了基本类型数据和它们包装类地使⽤。
Java包装类、拆箱和装箱详解
虽然Java 语言是典型的面向对象编程语言,但其中的八种基本数据类型并不支持面向对象编程,基本类型的数据不具备“对象”的特性——不携带属性、没有方法可调用。
沿用它们只是为了迎合人类根深蒂固的习惯,并的确能简单、有效地进行常规数据处理。
这种借助于非面向对象技术的做法有时也会带来不便,比如引用类型数据均继承了Object 类的特性,要转换为String 类型(经常有这种需要)时只要简单调用Object 类中定义的toString()即可,而基本数据类型转换为String 类型则要麻烦得多。
为解决此类问题,Java 为每种基本数据类型分别设计了对应的类,称之为包装类(Wrapper Classes),也有教材称为外覆类或数据类型类。
每个包装类的对象可以封装一个相应的基本类型的数据,并提供了其它一些有用的方法。
包装类对象一经创建,其内容(所封装的基本类型数据值)不可改变。
基本类型和对应的包装类可以相互装换:
∙由基本类型向对应的包装类转换称为装箱,例如把int 包装成Integer 类的对象;
∙包装类向对应的基本类型转换称为拆箱,例如把Integer 类的对象重新简化为int。
包装类的应用
八个包装类的使用比较相似,下面是常见的应用场景。
1) 实现int 和Integer 的相互转换
可以通过Integer 类的构造方法将int 装箱,通过Integer 类的intValue 方法将Integer 拆箱。
例如:
1.public class Demo {
2.public static void main(String[] args){
3.int m =500;
4. Integer obj =new Integer(m);// 手动装箱
5.int n = obj.intValue();// 手动拆箱
6. System.out.println("n = "+ n);
7.
8. Integer obj1 =new Integer(500);
9. System.out.println("obj 等价于 obj1?"+ obj.equals(obj1));
10. }
11.}
运行结果:
n = 500
obj 等价于obj1?true
2) 将字符串转换为整数
Integer 类有一个静态的paseInt() 方法,可以将字符串转换为整数,语法为:
1.parseInt(String s,int radix);
s 为要转换的字符串,radix 为进制,可选,默认为十进制。
下面的代码将会告诉你什么样的字符串可以转换为整数:
1.public class Demo {
2.public static void main(String[] args){
3. String str[]={"123","123abc","abc123","abcxyz"};
4.
5.for(String str1 : str){
6.try{
7.int m = Integer.parseInt(str1,10);
8. System.out.println(str1 +" 可以转换为整数 "+ m);
9.}catch(Exception e){
10. System.out.println(str1 +" 无法转换为整数");
11. }
12. }
13. }
14.}
运行结果:
123 可以转换为整数123
123abc 无法转换为整数
abc123 无法转换为整数
abcxyz 无法转换为整数
3) 将整数转换为字符串
Integer 类有一个静态的toString() 方法,可以将整数转换为字符串。
例如:
1.public class Demo {
2.public static void main(String[] args){
3.int m =500;
4. String s = Integer.toString(m);
5. System.out.println("s = "+ s);
6.}
7.}
运行结果:
s = 500
自动拆箱和装箱
上面的例子都需要手动实例化一个包装类,称为手动拆箱装箱。
Java 1.5(5.0) 之前必须手动拆箱装箱。
Java 1.5 之后可以自动拆箱装箱,也就是在进行基本数据类型和对应的包装类转换时,系统将自动进行,这将大大方便程序员的代码书写。
例如:
1.public class Demo {
2.public static void main(String[] args){
3.int m =500;
4. Integer obj = m;// 自动装箱
5.int n = obj;// 自动拆箱
6. System.out.println("n = "+ n);
7.
8. Integer obj1 =500;
9. System.out.println("obj 等价于 obj1?"+ obj.equals(obj1));
10. }
11.}
运行结果:
n = 500
obj 等价于obj1?true
自动拆箱装箱是常用的一个功能,读者需要重点掌握。