前言
我们知道 Java 是面向对象的编程语言,在 Java 的设计中提倡一种思想,即一切皆对象。从数据类型的划分中,我们知道 Java 中的数据类型分为基本数据类型
和引用数据类型
。对于简单的运算,可以直接使用基本数据类型;对于需要对象化交互的场景(例如,将基本数据类型存入集合中),就需要将基本数据类型封装成 Java 对象,但是基本数据类型怎么能够称为对象呢?
于是 Java 为每种基本数据类型分别设计了对应的类,称之为包装类(Wrapper Classes)。
包装类可以分为 3 类:Character、Number、Boolean,包装类的架构图如下所示:
基本数据类型与包装类
下表列出了基本数据类型对应的包装类。这些包装类都位于 java.lang
包下,因此使用包装类时,我们不需要手动引入。
序号 | 基本数据类型 | 对应的包装类 |
---|---|---|
1 | byte | Byte |
2 | short | Short |
3 | int | Integer |
4 | long | Long |
5 | char | Character |
6 | float | Float |
7 | double | Double |
8 | boolean | Boolean |
除了 Integer 和 Character 定义的名称与基本数据类型定义的名称相差较大外,其它的 6 种类型的名称都是其基本数据类型的首字母的大写。
包装类常用方法
Number 类是所有数值类型包装类的父类,这里以其中一个子类 Integer 类为例,介绍其构造方法、常用方法以及常量。
Integer 类
构造方法
Integer 类提供两个构造方法:
- Integer(int value):以 int 型变量作为参数创建 Integer 对象;
- Integer(String s):以 String 型变量作为参数创建 Integer 对象。
但是,官方文档中显示这两个构造方法都有 @Deprecated 注解了,它们从 JDK9 就开始过时了,被废弃使用。
官方推荐使用Deprecated.
It is rarely appropriate to use this constructor. The static factoryvalueOf(int)
is generally a better choice, as it is likely to yield significantly better space and time performance.
Integer num1 = Integer.valueOf(int);
这种构造方法,因为它会有更好的空间和时间性能。官方推荐使用Deprecated.
It is rarely appropriate to use this constructor. UseparseInt(String)
to convert a string to a int primitive, or usevalueOf(String)
to convert a string to an Integer object.
Integer num2 = Integer.parseInt(String)
或者 Integer num3 = Integer.valueOf(String);
把 String 型变量创建 Integer 对象。// 'new Integer()' 已经过时了,使用 valueOf(int)
Integer num1 = Integer.valueOf(999);
// 使用 parseInt(String)
Integer num2 = Integer.parseInt("100");
// 或者使用 valueOf(String)
Integer num3 = Integer.valueOf("666");
常用方法
byte byteValue()
:以 byte 类型返回该 Integer 的值;short shortValue()
:以 short 类型返回此 Integer 对象;int intValue()
:以 int 类型返回此 Integer 对象;long longValue()
:以 long 类型返回此 Integer 对象;float floatValue()
:以 float 类型返回此 Integer 对象;double doubleValue()
:以 double 类型返回此 Integer 对象;int compareTo(Integer anotherInteger)
:在数值上比较两个 Integer 对象。如果这两个值相等,则返回 0;如果调用对象的数值小于 anotherInteger 的数值,则返回负值;如果调用对象的数值大于 anotherInteger 的数值,则返回正值;boolean equals(Object obj)
:比较此对象与指定对象是否相等;String toString()
:返回一个表示该 Integer 值的 String 对象;static Integer valueOf(String s)
:返回保存指定的 String 值的 Integer 对象;static int parseInt(String s)
:返回字符串参数 s 解析的等价 int 整数值;static String toBinaryString(int i)
:返回整数参数 i 的二进制字符串表示形式;static String toOctalString(int i)
:返回整数参数 i 的八进制字符串表示形式;static String toHexString(int i)
:返回整数参数 i 的十六进制字符串表示形式。
内置常量
BYTES
:用于以2的补码二进制形式表示 int 值的字节数。MAX_VALUE
:int 累型可取的最大值,231-1。MIN_VALUE
:int 累型可取的最小值,-231。SIZE
:表示以二进制补码形式表示 int 值的位数。TYPE
:表示 Class 实例的基本类型。
int bytes = Integer.BYTES;
int maxValue = Integer.MAX_VALUE;
int minValue = Integer.MIN_VALUE;
int size = Integer.SIZE;
Class<Integer> type = Integer.TYPE;
System.out.println("int 类型的二进制字节数:" + bytes);
System.out.println("int 类型可取的最大值:" + maxValue);
System.out.println("int 类型可取的最小值:" + minValue);
System.out.println("int 类型的二进制位数:" + size);
System.out.println("int 类型的 Class实例:" + type);
Character 类
构造方法
自从 JDK9 开始,Character(char value)
也废弃了,官方推荐使用 Character c = Character.valueOf(char)
代替。
常用方法
char charValue()
:返回此 Character 对象的值;int compareTo(Character anotherCharacter)
:返回此 Character 对象的值,根据数字比较两个 Character 对象,若这两个对象相等则返回 0 ;boolean equals(Object obj)
:将调用该方法的对象与指定的对象相比较;static char toUpperCase(char ch)
:将字符参数转换为大写;static char toLowerCase(char ch)
:将字符参数转换为小写;String toString()
:返回一个表示指定 char 值的 String 对象;static boolean isLetter(char ch)
:判断指定字符是否为字母,如果字符为字母,则返回 true;否则返回 false;static boolean isDigit(char ch)
:判断指定字符是否为数字,如果字符为数字,则返回 true;否则返回 false;static boolean isLetterOrDigit(char ch)
:判断指定字符是否为一个字母或数字,如果字符是字母或数字,则返回 true,否则为 false。static boolean isUpperCase(char ch)
:判断指定字符是否是大写字符;static boolean isLowerCase(char ch)
:判断指定字符是否是小写字符。
Boolean 类
构造方法
自从 JDK9 开始,官方文档推荐使用 Boolean bool = Boolean.valueOf(boolean);
代替 Boolean(boolean value)
,使用 Boolean bool = Boolean.parseBoolean(String);
或者 Boolean bool = Boolean.valueOf(String);
代替 Boolean(String s)
。
常用方法
boolean booleanValue()
:将 Boolean 对象的值以对应的 boolean 值返回;boolean equals(Object obj)
:判断调用该方法的对象与 obj 是否相等,当且仅当参数不是 null,而且与调用该方法的对象一样都表示同一个 boolean 值的 Boolean 对象时, 才返回 true;static boolean parseBoolean(String s)
:将字符串参数解析为 boolean 值;String toString()
:返回表示该 boolean 值的 String 对象;static boolean valueOf(String s)
:返回一个用指定的字符串表示值的 boolean 值。
内置常量
FALSE
:对应基值 false 的 Boolean 对象;TRUE
:对应基值 true 的 Boolean 对象;TYPE
:表示基本类型 Class 实例。
装箱和拆箱
基本数据类型转换为包装类的过程称为装箱
,例如把 int 包装成 Integer 类的对象;包装类变为基本数据类型的过程称为拆箱
,例如把 Integer 类的对象重新简化为 int。
装箱和拆箱又有自动和手动之分,手动实例化一个包装类称为手动拆箱装箱。
Java1.5 版本之前必须手动拆箱装箱,之后可以自动拆箱装箱,也就是在进行基本数据类型和对应的包装类转换时,系统将自动进行装箱及拆箱操作,不用在进行手工操作,为开发者提供了更多的方便。例如:
int i = 500;
// 自动装箱
Integer obj1 = i;
// 自动拆箱
int j = obj1;
System.out.println("j = " + j);
// 手动拆箱
int k = obj1.intValue();
System.out.println("k = " + k);
Integer obj2 = 500;
System.out.println("obj1 是否等价于 obj2:" + obj2.equals(obj1));
自动拆箱就是直接将一个包装类型的变量,赋值给对应的基本数据类型变量;手动拆箱通过调用对应包装类下的 xxxValue()
方法来实现。
注意点
- 在使用集合时,要使用包装类而不是基本数据类型;
- 包装类的默认值都是 null,基本数据类型中数值型的默认值是 0;
String str = null
与String s = ""
不一样,前者表示生成一个 String 类型的引用,但不分配内存空间;而后者会分配内存空间来存放空字符串""。
参考
易百教程
JAVAschool
官方API文档