包装类
包装类
什么是包装类
包装类就是将基本数据类型封装在类中
-
自定义包装类
将基本数据类型包装成一个类对象的本质就是使用Object进行接收处理。
-
Java提供包装类
对象型(Object的直接子类):Boolean(boolean)、Character(char)
数值型(Number的直接子类):Byte、Double、Short、Long、Integer(int)、Float.
包装类的特点
- 封装性:将基本数据类型封装成对象,使得它们可以存储在集合中(如List、Set等),因为集合只能存储对象。
- 提供方法:包装类提供了一系列的方法,用于操作封装的基本数据类型。例如,
Integer
类提供了parseInt(String s)
方法,用于将字符串转换为整数。 - 自动装箱和拆箱:从Java 5(也称为Java 1.5)开始,引入了自动装箱(Autoboxing)和自动拆箱(Unboxing)机制。这意味着在基本数据类型和对应的包装类之间进行赋值时,Java编译器会自动完成装箱和拆箱操作,无需程序员显式调用包装类的构造器或转换方法。
- 缓存机制:对于某些包装类(如
Integer
、Short
、Byte
、Character
和Boolean
),Java在自动装箱时会使用缓存机制。对于Integer
来说,当数值在-128到127之间时,Java会返回缓存中的对象,而不是创建新的对象。这可以提高性能并减少内存消耗。
基本数据类型和包装类
基本数据类型 | 包装类型 |
---|---|
byte | java.lang.Byte(父类为Number) |
short | java.lang.Short(父类为Number) |
int | java.lang.Integer(父类为Number) |
long | java.lang.Long(父类为Number) |
float | java.lang.Float(父类为Number) |
double | java.lang.Double(父类为Number) |
boolean | Java.lang.Boolean(父类为Object) |
char | java.lang.Character(父类为Object) |
其中Number是一个抽象类,无法实例化对象。 |
包装类的共同点
-
封装基本数据类型
包装类将Java中的基本数据类型(如int、double、char等)封装为对象。这使得基本数据类型能够以对象的形式存在和操作,从而提供了更多的灵活性和功能。
提供额外的方法
包装类提供了一系列额外的方法,这些方法使得对基本数据类型的操作更加丰富和灵活。例如,
Integer
类提供了parseInt(String s)
方法用于将字符串转换为整数,toString()
方法用于将整数转换为字符串等。 -
实现Comparable接口
大多数包装类都实现了
Comparable
接口,这使得它们支持比较操作。通过实现compareTo(T other)
方法,包装类对象可以与其他相同类型的对象进行比较,以确定它们的大小关系。 -
重写Object类的方法所有包装类都重写了
这些方法在包装类对象进行比较和哈希表存储时非常重要。
equals(Object obj)`:用于判断两个包装类对象是否相等。在包装类中,这个方法通常会比较对象内部封装的基本数据类型值,而不是对象的引用地址。
hashCode()
:返回一个对象的哈希码值,这个值在对象的哈希表存储中非常重要。对于包装类对象,
hashCode()`方法通常会基于内部封装的基本数据类型值来计算哈希码。 -
缓存机制
对于某些包装类(如
Integer
、Short
、Byte
、Character
和Boolean
),Java在自动装箱时会使用缓存机制。这意味着对于特定范围内的值(如Integer
的-128到127),Java会返回缓存中的对象,而不是创建新的对象。这有助于提高性能和减少内存消耗。提供了与String的转换方法
包装类通常提供了将自身转换为
String
类型的方法(如toString()
),以及将String
类型解析为包装类对象的方法(如parseInt()
、parseDouble()
等)。这使得包装类与字符串之间的转换变得非常方便。 -
不可变性
除了
String
类之外,包装类对象也是不可变的。一旦一个包装类对象被创建并初始化,其内部封装的基本数据类型值就不能被改变。这有助于保持数据的一致性和安全性。 -
泛型适用性
包装类可以作为泛型类型参数使用,而基本数据类型则不能。这使得包装类在泛型编程中更加灵活和强大
-
缓存机制
对于某些包装类(如
Integer
、Short
、Byte
、Character
和Boolean
),Java在自动装箱时会使用缓存机制。这意味着对于特定范围内的值(如Integer
的-128到127),Java会返回缓存中的对象,而不是创建新的对象。这有助于提高性能和减少内存消耗。 -
提供了与String的转换方法
包装类通常提供了将自身转换为
String
类型的方法(如toString()
),以及将String
类型解析为包装类对象的方法(如parseInt()
、parseDouble()
等)。这使得包装类与字符串之间的转换变得非常方便。 -
不可变性
除了
String
类之外,包装类对象也是不可变的。一旦一个包装类对象被创建并初始化,其内部封装的基本数据类型值就不能被改变。这有助于保持数据的一致性和安全性。 -
泛型适用性
包装类可以作为泛型类型参数使用,而基本数据类型则不能。这使得包装类在泛型编程中更加灵活和强大。
自动装箱,自动拆箱
自动装箱
自动装箱是指将基本数据类型(如int、double等)的值自动转换为对应的包装类对象(如Integer、Double等)的过程。这个过程是在编译时由Java编译器自动完成的,而不需要程序员显式地调用包装类的构造器。
示例:
int num = 10;
Integer numWrapper = num; // 自动装箱
在上面的示例中,num
是一个基本数据类型int
的变量,而numWrapper
是一个Integer
类型的变量。将num
赋值给numWrapper
时,Java编译器会自动将num
的值包装成一个Integer
对象,并将其赋值给numWrapper
。
自动拆箱
自动拆箱是指将包装类对象自动转换为对应的基本数据类型值的过程。这个过程也是在编译时由Java编译器自动完成的,而不需要程序员显式地调用包装类的转换方法(如intValue()
、doubleValue()
等)。
Integer numWrapper = 10; // 实际上是自动装箱
int num = numWrapper; // 自动拆箱
在上面的示例中,numWrapper
是一个Integer
类型的变量,而num
是一个基本数据类型int
的变量。将numWrapper
赋值给num
时,Java编译器会自动将numWrapper
对象拆箱,获取其内部封装的基本数据类型值,并将其赋值给num
。