包装类介绍
Java是一种面向对象语言,Java中的类把方法与数据连接在一起,并构成了自包含式的处理单元。但在java中不能定义基本类型(primitive type),为了能将基本类型视为对象来处理并能连接相关的方法,Java为每个基本类型都提供了包装类。如此,我们便可以把这些基本类型转化为对象来处理了。
包装类(封装类)使用针对八种基本数据类型定义的相应的引用类型。有了类的特点,就可以调用类中的方法。
包装类在实际开发中用的最多的在于字符串变为基本数据类型。
基本数据类型对象包装类:是按照面向对象思想将基本数据类型封装成了对象。
包装类的作用:
1)作为和基本数据类型对应的类类型存在,方便涉及到对象的操作(可以通过对象中的属性和行为操作基本数据)。
2)包含每种基本数据类型的相关属性如最大值、最小值、所占位数等,以及相关的操作方法。
3)集合不允许存放基本数据类型,故常用包装类
当需要往ArrayList,HashMap中放东西时,像int,double这种基本类型是放不进去的,因为容器都是装object的,这是就需要这些基本类型的包装类了。
4)可以实现基本数据类型和字符串之间的转换。
下表列出了基本数据类型和包装类的关系:
基本数据类型 | boolean | byte | short | char | int | long | float | double |
包装类 | Boolean | Byte | Short | Character | Integer | Long | Float | Double |
由上表可知在这八个包装类中,除了Integer和Character类以后,其它六个类的类名都是将其所对应基本数据类型的第一个字母大写。
装箱
基本数据类型包装成包装类的实例。
1)通过包装类的构造器实现:
所有包装类都可以将与之对应的基本数据类型作为参数来创建它们的实例对象。
int i = 10;
Integer t = new Integer(i);
2)通过字符串参数构造包装类对象:
除了Character类之外,其他包装类都可以将一个字符串作为参数来构造它们的实例。
Integer i = new Integer("10");
Float f = new Float("2.27");
Boolean类的构造方法参数为String类型时,若该字符串为true(不论大小写),则该对象表示true,否则表示false。
Boolean b = new Boolean("true"); // true
Boolean b = new Boolean("TRUE"); // true
Boolean b = new Boolean("zwj"); // false
当包装类Number构造方法的参数为String类型时,字符串不能为null,并且该字符串必须能够解析为基本类型的数据。
Integer i1= new Integer(""); // NumberFormatException: For input string: ""
Integer i2= new Integer(null); // NumberFormatException: null
Integer i3= new Integer("abc"); // NumberFormatException: For input string: "abc"
拆箱
获得包装类对象中包装的基本类型变量。
调用包装类的.xxxValue()方法:
int i = iObj.intValue();
boolean b = bObj.booleanValue();
自动装箱和自动拆箱
从JDK1.5就开始引入了自动拆装箱的语法功能,也就是系统将自动进行基本数据类型和与之相对应的包装类型之间的转换,这使得程序员书写代码更加方便。
//自动装箱(类型必须匹配)
int i = 10;
Integer in = i; // int类型会自动转换为Integer类型
System.out.println(in); // 10
//自动拆箱(类型必须匹配)
Integer inn = new Integer(10);
int n = inn; // Integer类型会自动转换为int类型
System.out.println(n); // 10
字符串转换成基本数据类型
通过包装类的构造器实现:
int i = new Integer("10");
通过包装类的parseXxx(String s)静态方法:
基本数据类型对象包装类中除了Character都有XXX.parseXXX 方法。
float f = Float.parseFloat("12.1");
基本数据类型转换成字符串
调用字符串重载的valueOf()方法:
String fstr = String.valueOf(2.22f);
更直接的方式:
String intStr = 10 + "";
将一个十进制整数转成其他进制
转成二进制:toBinaryString
转成八进制:toOctalString
转成十六进制:toHexString
toString(int num,int radix);
//将int数转换为任意进制的String类型的数,常用于十进制数转换为任意进制数
String str1 = Integer.toString(100,8); // 144
String str2 = Integer.toString(100,16); // 64
将其他进制转换十进制
parseInt(string,radix); //将给定的数转成指定的基数进制;
//将字符串按任意进制转换为int数
int i1 = Integer.parseInt("100", 8);
int i2= Integer.parseInt("ff", 16);
使用包装类进行运算
在jdk1.5版本后,对基本数据类型对象包装类进行升级。在升级中,使用基本数据类型对象包装类可以像使用基本数据类型一样,进行运算。
Integer i = new Integer(4); // 1.5版本之前的写法;
Integer i = 4; // 自动装箱,1.5版本后的写法;
i = i + 5;
以上代码中i对象是不能直接和5相加的,其实底层先将i转成int类型,再和5相加。而转成int类型的操作是隐式的。自动拆箱:拆箱的原理就是i.intValue();i+5运算完是一个int整数。如何赋值给引用类型i呢?其实有对结果进行装箱。
Integer a = 258;
Integer b = 258;
Integer c = 257;
Integer d = 257;
System.out.println(a == b); //false
System.out.println(c == d); //true
从以上示例可以看出,在装箱时,如果数值在byte范围之内,那么数值相同,不会产生新的对象,也就是说多个数值相同的引用指向的是同一个对象。
包装类中“==”与equals的用法比较
值得注意的是,包装类中的equals方法和String类一样,都是重写了Object类中的equals方法,因此比较的是内容而不是地址,而“==”比较的依然是引用变量的地址,只是当包装类型和与之相对应的基本类型进行“==”比较时会先做自动拆箱处理。
private static void testEquals() {
Integer a = new Integer(-10);
Integer b = new Integer("-10");
int c = -10;
System.out.println(a == b); // false
System.out.println(a == c); // true
System.out.println(b == c); // true
System.out.println(a.equals(b)); // true
String s1 = new String("hello");
String s2 = new String("hello");
System.out.println(s1 == s2); // false
System.out.println(s1.equals(s2)); // true
}