一、包装类:
1.定义:
在 Java 中,包装类(Wrapper Classes)是用于将原始数据类型(如 int
, char
, double
等)封装成对象的类。这些类提供了将基本数据类型转换为对象的功能,并且还提供了很多便利的方法来操作这些数据
2.主要功能:
-
对象化:包装类允许基本数据类型作为对象来处理,适用于需要对象的场景,例如集合框架(
List
,Set
,Map
等)。 -
类型转换:包装类提供了将字符串转换为相应基本数据类型的方法,例如
Integer.parseInt("123")
。 -
方法和常量:包装类提供了丰富的方法和常量,例如
Integer.MAX_VALUE
和Double.parseDouble("3.14")
。 -
自动装箱和拆箱:Java 提供了自动装箱(将基本类型转换为包装类对象)和拆箱(将包装类对象转换为基本类型)的功能,使得基本数据类型和包装类之间的转换更加简便。
3. 例:
强类型的语言本质其实来自于数据在内存当中的存储。
public class WrapperExample {
public static void main(String[] args) {
int num = 42;
Integer wrappedNum = num; // 自动装箱
System.out.println("Wrapped Number: " + wrappedNum);
String str = "123";
int parsedNum = Integer.parseInt(str); // 从字符串解析为基本类型
System.out.println("Parsed Number: " + parsedNum);
}
}
4.java针对每一个基本数据类型都设计了一个包装类
二、128陷阱:
我们先来看一段代码
public static void main(String[] args) {
Integer num1 = 100;
Integer num2 = 100;
System.out.println(num1 == num2);
Integer num3 = 200;
Integer num4 = 200;
System.out.println(num3 == num4);
}
此代码的输出结果,是true和false,答案就在Integet的valueOf()方当中,我们将数值在-128-127之间的数值都存储在有一个catch数组当中,该数组相当于一个缓存,当我们在-128-127之间进行自动装箱的时候,我们就直接返回该值在数组当中的地址,所以在-128-127之间的数值用==进行比较是相等的。而不在这个区间的数,需要新开辟一个内存空间,所以不相等
三、 自动拆装箱:
自动拆箱和装箱是 Java 的特性,用于在基本数据类型和包装类之间自动转换。
- 装箱:将基本数据类型转换为其对应的包装类对象。例如,
int
转换为Integer
。Java 自动完成这个过程,如Integer a = 10;
。 - 拆箱:将包装类对象转换为基本数据类型。例如,
Integer
转换为int
。Java 自动完成这个过程,如int b = a;
。
具体示例
- 装箱:
Integer a = 10;
这里10
是int
类型,Java 会自动将其装箱为Integer
对象。 - 拆箱:
int b = a;
这里a
是Integer
类型,Java 会自动将其拆箱为int
类型。
public static void main(String[] args) {
int a = 10;
int b = 10;
Integer a1 = 10;
Integer b1 = 10;
Integer a2 = new Integer(10);
Integer b2 = new Integer(10);
System.out.println(a == b); // T 基本数据类型 == 比较值
System.out.println(a1 == b1); // T 128陷阱
System.out.println(a2 == b2); // F 引用数据类型 == 比较地址
System.out.println(a1 == a); // T 用 == 判断,自动拆箱
System.out.println(a1.equals(a)); // T 用 equals() 判断,自动装箱 ,这个地方要给同学们讲一下Integer类当中的equals()
System.out.println(a1 == a2);//F
System.out.println(a == a2);// T a2自动拆箱
}
System.out.println(a == b); T 基本数据类型的比较是比较值,a 和 b 都是 10,所以结果为 true。
System.out.println(a1 == b1);T 对于 -128 到 127 范围内的 Integer 对象,Java 会缓存这些对象,因此 a1 和 b1 指向同一个对象,所以结果为 true。
System.out.println(a2 == b2);F `new Integer(10)` 每次创建一个新对象,a2 和 b2 是不同的对象,比较的是地址,结果为 false。
System.out.println(a1 == a); T `a1` 是 `Integer` 对象,`a` 是基本数据类型,`a1` 会自动拆箱为基本类型,比较 `10 == 10`,结果为 true。
System.out.println(a1.equals(a));T `a1.equals(a)` 会自动装箱 `a` 为 `Integer` 对象,然后比较 `a1` 和这个新对象的值,结果为 true。
System.out.println(a1 == a2); F `a1` 和 `a2` 是不同的对象,`a1` 是缓存的对象,而 `a2` 是通过 `new` 创建的对象,比较的是地址,结果为 false。
System.out.println(a == a2); T `a2` 会被自动拆箱为 `10`,然后与 `a` 比较,结果为 true。
1.自动装箱:
自动装箱是 Java 编程语言中的一个特性,它允许 Java 在需要时自动将基本数据类型(如 int
、char
、double
)转换为其对应的包装类对象(如 Integer
、Character
、Double
)。这个过程发生在你将基本数据类型赋值给对象类型变量或者将其作为参数传递给方法时。
2.自动拆箱:
自动拆箱是指在 Java 编程语言中,自动将包装类(如 Integer
、Double
)转换为其对应的基本数据类型(如 int
、double
)的过程。这通常发生在需要基本数据类型的上下文中,如算术运算或条件判断时。比如,当你用 Integer
对象进行算术操作时,Java 会自动将其转换为 int
类型。这使得代码更加简洁和易读。
3.Integer类当中的equals()
Integer a = new Integer(100);
Integer b = new Integer(100);
Integer c = new Integer(200);
System.out.println(a.equals(b)); // 输出 true
System.out.println(a.equals(c)); // 输出 false
System.out.println(a.equals("100")); // 输出 false,因为 "100" 不是 Integer 类型
equals()
方法只比较Integer
对象的值是否相等,不考虑对象的内存地址。- 在进行
equals()
比较时,obj
必须是Integer
类型;如果是其他类型的对象,则直接返回false
。 - 在比较基本类型和包装类的情况下,Java 会自动进行装箱和拆箱。