跳到主要内容

Java 包装类

常用包装类

包装类主要用于为基本数据类型提供引用类型的支持,开发人员可以把基本数据类型当作对象来处理,例如将基本类型放入容器中、作为函数的参数传递等。

常用包装类

  • Byte:表示一个字节,取值范围:-128~127
  • Short:表示一个短整型,取值范围:-32768~32767
  • Integer:表示一个整型,取值范围:-2147483648~2147483647
  • Long:表示一个长整型,取值范围:-9223372036854775808~9223372036854775807
  • Float:表示单精度浮点数,取值范围:1.4e-45~3.4028235e38
  • Double:表示双精度浮点数,取值范围:4.9e-324~1.7976931348623157e308
  • Boolean:表示布尔值,取值范围:true、false
  • Character:表示字符,取值范围:0~65535

包装类一一映射了 Java 中的八种基本类型,基本类型 -> 包装类:

  • byte -> Byte
  • short -> Short
  • int -> Integer
  • logn -> Long
  • float -> Float
  • double -> Double
  • boolean -> Boolean
  • char -> Character

单精度和双精度是什么?

可以理解为 Java 对于数字类型信息在精确度方面的一种描述:

  • 单精度浮点数的精确度为 7 位小数,可以表示的最小单位是 1.0e-45
  • 双精度浮点数的精确度为 15 位小数,可以表示的最小单位是 4.9e-324

为什么有了基础类型之后,Java还要推出一个包装类型?

  • 使用包装类型,可以将基本类型转换成对象,这样就可以使用对象的方法和特性来处理基本类型,例如可以把基本类型传入 ArrayList 对象中
  • 包装类型提供的方法比基本类型更加丰富,比如可以使用 Integer.parseInt() 方法将字符串转换成基本类型,使用 Integer.toString() 方法将基本类型转换成字符串

示例:

//创建Byte对象
Byte b = new Byte((byte) 127); // 'Byte(byte)' is deprecated and marked for removal
System.out.println("Byte object: " + b); // Byte object: 127

//获取byte值
byte bValue = b.byteValue();
System.out.println("byte value: " + bValue); // byte value: 127

//创建Short对象
Short s = new Short((short) 1000); // 'Short(short)' is deprecated and marked for removal
System.out.println("Short object: " + s); // Short object: 1000

//获取short值
short sValue = s.shortValue();
System.out.println("short value: " + sValue);

//创建Integer对象
Integer i = new Integer(10000);
System.out.println("Integer object: " + i);

//获取int值
int iValue = i.intValue();
System.out.println("int value: " + iValue);

//创建Long对象
Long l = new Long(1000000000000L);
System.out.println("Long object: " + l);

//获取long值
long lValue = l.longValue();
System.out.println("long value: " + lValue);

//创建Float对象
// PS: 直接使用float或者double都会造成精度损失,结果是四舍五入后的大约值。使用import java.math.BigDecimal才能百分百保留
Float f = new Float(3.1415926);
System.out.println("Float object: " + f); // Float object: 3.1415925

//获取float值
float fValue = f.floatValue();
System.out.println("float value: " + fValue); // float value: 3.1415925

//创建Double对象
Double d = new Double(3.1415926535);
System.out.println("Double object: " + d);

//获取double值
double dValue = d.doubleValue();
System.out.println("double value: " + dValue);

//创建Boolean对象
Boolean bool = new Boolean(true);
System.out.println("Boolean object: " + bool);

//获取boolean值
boolean boolValue = bool.booleanValue();
System.out.println("boolean value: " + boolValue);


//创建Character对象
Character c = new Character('a');
System.out.println("Character object: " + c);

//获取char值
char cValue = c.charValue();
System.out.println("char value: " + cValue);

说明:

  • 为什么创建Byte对象和Short对象的时候,需要加(byte)和(short)啊?别的却不需要?—— 为了避免由于编译器的类型推断规则导致的隐式类型提升

拆箱和装箱

定义:

  • 拆箱是指将包装类对象转换为基本类型数据的操作。此操作可以通过调用基本类型的值来实现,如 intValue(), doubleValue()
  • 装箱是指将基本类型数据转换为包装类对象的操作,它可以通过调用包装类的静态方法 valueOf() 来实现

自动拆箱是在 Java 5 及以上版本引入的特性,它允许将包装类型自动转换为对应的基本数据类型

示例:

byte b = Byte.valueOf(str); // 把字符串转换为byte
Byte bb = Byte.valueOf(b); // 把byte转换为Byte

short s = Short.valueOf(str); // 把字符串转换为short
Short ss = Short.valueOf(s); // 把short转换为Short

int i = Integer.valueOf(str); // 把字符串转换为int
Integer ii = Integer.valueOf(i); // 把int转换为Integer

long l = Long.valueOf(str); // 把字符串转换为long
Long ll = Long.valueOf(l); // 把long转换为Long

float f = Float.valueOf(str); // 把字符串转换为float
Float ff = Float.valueOf(f); // 把float转换为Float

double d = Double.valueOf(str); // 把字符串转换为double
Double dd = Double.valueOf(d); // 把double转换为Double

boolean b = Boolean.valueOf(str); // 把字符串转换为boolean
Boolean bb = Boolean.valueOf(b); // 把boolean转换为Boolean

char c = Character.valueOf(str); // 把字符串转换为char
Character cc = Character.valueOf(c); // 把char转换为Character