Java中基元类型的封装类
在Java中,有两种重要的数据类型:引用(references)
和基元数据类型(primitives)
。大多数情况下,数值、字符和布尔值都是基元数据类型,因为它在处理速度和内存需求方面更有效。尽管如此,当需要在对象中存储基元类型值时,仍有一些场景(如使用集合Collections)。为此,Java提供了一组类,用于在对象中包装基元类型值
。
每个基元类型都有一个包装类:
基元类型(Primitive type) | 包装类(Wrapper class) |
---|---|
boolean | Boolean |
char | Character |
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
除了主要角色(管理基元值)之外,包装类还包含一组实用程序方法,用于将值转换为不同类型或将字符串值解析为数字值。
如何定义和创建包装器对象
包装器对象是使用以下方法创建的:
- 类构造函数和[new]运算符;
- 静态方法: valueOf()。
除了[Character],其余的包装类都提供了构造函数,可以基于数值或字符串创建对象,如下所示:
Integer intObject1 = new Integer(34); Integer intObject2 = new Integer("35"); Boolean boolValue1 = new Boolean("true"); Boolean boolValue2 = new Boolean(true); Character charObject = new Character('a'); //the only way
布尔类Boolean构造函数定义了一个构造函数,该构造函数接受一个字符串值,该字符串值仅解释为[不区分大小写]值“true”(如““TRUE””、“True”、“tTuE”…)。任何其他值都转换为false:
Boolean boolValue1 = new Boolean("true"); //true Boolean boolValue2 = new Boolean(true); //true Boolean boolValue3 = new Boolean("True"); //true Boolean boolValue4 = new Boolean("ZZZ"); //false
valueOf()方法有两种形式,分别接收字符串和表示所需数值基数的字符串:
Integer intObject3 = Integer.valueOf("36"); Integer intObject4 = Integer.valueOf("1001", 2); // 相当于10进制9
包装类的实用方法
作为类,包装器还定义了一组用于处理数值的实用程序方法:
[byte|short|int|long|float|double]Value()每个包装类都有6个这种类型的方法,用于将当前对象值转换为任何原始数值类型:
Float floatObject = new Float(520.3f); byte byteValue = floatObject.byteValue(); //it is 8 short shortValue = floatObject.shortValue(); //it is 520
parse–每个包装类都有一个静态方法(Integer有parseInt),用于将字符串转换为原始值(与方法名类型相同); valueOf()方法有两种形式,因为它还接受数值转换的基;如果字符串无效,则该方法抛出一个NumberFormatException:
int intValue = Integer.parseInt("234"); long longValue = Integer.parseInt("ffff", 16); //65535 in base 16 int value = Integer.parseInt("12a"); //NumberFormatException
toString()–从返回值的字符串表示形式的对象(与任何其他Java类一样)继承的方法;它被隐式调用;数值包装类还提供静态toString()方法;Integer和Long提供第三种形式的toString(),它是静态的,允许将任何基10值转换为另一个基:
Double doubleObject = new Double(123.4); System.out.println("double value = " + doubleObject.toString()); System.out.println("boolean value " + Boolean.toString(true)); System.out.println("65000 in hex is "+Long.toString(65000, 16));
to[Binary | Octal | Hexadecimal]String()–仅以整数定义的静态方法,用于将基数10转换为基数2、8或16:
String hexValue = Integer.toHexString(32); String octValue = Integer.toOctalString(32); String bynaryValue = Integer.toBinaryString(32); System.out.println("32 is " + hexValue + " (16), " + octValue + "(8) or " + bynaryValue + "(2)");
什么是Java自动装箱(autoboxing)和拆箱(unboxing)
装箱(boxing)是自Java1.5以来的一个可用功能,它允许程序员以更方便的方式使用包装类。在此之前,我们必须编写大量代码来执行一些简单的操作,例如在包装器和基元类型之间传输值:
Integer intObj1 = new Integer(23); int intPrimitive = intObj1.intValue(); intPrimitive += 10; Integer intObj2 = new Integer(intPrimitive);
使用autoboxing,同样的事情很容易完成,因为编译器为我们进行转换
Integer intObj1 = 23; //自动装箱 int intPrimitive = intObj1; //unboxing intPrimitive++; Integer intObj2 = intPrimitive; //autoboxing
装箱(boxing)是将基元类型值包装到对象中的过程。
自动装箱(autoboxing)是在不显式调用构造函数的情况下完成的过程。
取消装箱(拆箱)是一个相反的过程,它允许在不显式调用[[byte | short | int | long | float | double]value()方法的情况下提取值。
因为,在Java 1.5之前,我们没有自动装箱和取消装箱功能,因此无法(现在可以)在条件语句中使用布尔对象:
Boolean boolValue = true; if(boolValue) //unboxing System.out.println("It's true !");