【Java学习笔记】包装类

发布于:2025-06-08 ⋅ 阅读:(21) ⋅ 点赞:(0)

包装类(Wrapper)

1. 介绍

  • (1)针对八种基本数据类型相应的引用类型 --> 包装类

  • (2)有了类的特点,就可以调用类中的方法

2. 分类和继承关系

基本数据类型 包装类 父类
boolean Boolean Object
char Character Object
byte Byte Number
short Short Number
int Integer Number
long Long Number
float Float Number
double Double Number

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


一、包装类和基本数据类型的相互转换(装箱和拆箱

(1)jdk5 前手动装箱和拆箱方式, 装箱:基本类型->包装类型,反之,拆箱

(2)jdk5 以后(含 jdk5)的自动装箱和拆箱方式

(3)底层调用的方法

  • 自动装箱:valueOf()方法

  • 自动拆箱:intValue()方法

(4)下面以Integer举例,其他包装类的方法类似,不一一举例

1. 装箱(int --> Integer)

int n = 10;

// 方式一
Integer integer = Integer.valueOf(n);

// 方式二
Integer integer1 = new Integer(n);

2. 拆箱(Integer --> int)

int n = 10;

// 装箱
Integer integer = Integer.valueOf(n);

// 拆箱
int n1 = integer.intValue();

3. 自动装箱和插箱

int n = 10;

// 自动装箱
Integer integer = n; // 底层调用 valueOf() 方法

// 自动拆箱
int n1 = integer; // 底层调用 intValue() 方法

实现自动的原理:在底层会调用相应的方法


二、包装类和String 类的相互转换

1. Integer --> String的三种方法

  • (1)使用字符串串拼接

  • (2)使用Integer.toString()方法

  • (3)使用String.valueOf()方法

    • String.valueOf()方法在底层接收的是一个对象,而Integer刚好就是一个对象

代码示例

Integer integer = 5; // 自动装箱

// Integer --> String

// 方法一
String str1 = integer + "";

// 方法二
String str2 = integer.toString();

// 方法三
String str3 = String.valueOf(integer);

2. String --> Integer

两种方法

  • (1)使用Integer.parseInt()方法(自动装箱

    • 解读:parseInt()方法返回int类型本质还是把int类型赋值给Integer类型,实现了自动装箱

  • (2)使用构造器,创建Integer对象

代码示例

String str = "123";

Integer integer1 = Integer.parseInt(str); // 使用自动装箱

Integer integer2 = new Integer(str); // 使用构造器

三、Integer类和Character类的一些常用方法

说明:下面举例说明,对于其他类型的大同小异

方法 描述
Integer.MIN_VALUE 返回整数的最小值
Integer.MAX_VALUE 返回整数的最大值
Character.isDigit(char) 判断字符是否为数字
Character.isLetter(char) 判断字符是否为字母
Character.isUpperCase(char) 判断字符是否为大写字母
Character.isLowerCase(char) 判断字符是否为小写字母
Character.isWhitespace(char) 判断字符是否为空格
Character.toUpperCase(char) 将字符转换为大写字母
Character.toLowerCase(char) 将字符转换为小写字母

代码示例

public class Test {
    public static void main(String[] args) {
        System.out.println(Integer.MIN_VALUE); // 返回最小值
        System.out.println(Integer.MAX_VALUE); // 返回最大值

        System.out.println(Character.isDigit('a')); // 判断是不是数字
        System.out.println(Character.isLetter('a')); // 判断是不是字母
        System.out.println(Character.isUpperCase('a')); // 判断是不是大写
        System.out.println(Character.isLowerCase('a')); // 判断是不是小写

        System.out.println(Character.isWhitespace('a')); // 判断是不是空格
        System.out.println(Character.toUpperCase('a')); // 转成大写
        System.out.println(Character.toLowerCase('A')); // 转成小写
    }
}

// 运行结果
-2147483648 // 返回最小值
2147483647 // 返回最大值
false // 判断是不是数字
true // 判断是不是字母
false // 判断是不是大写
true // 判断是不是小写
false // 判断是不是空格
A // 转成大写
a // 转成小写

四、Integer的创建机制底层源码探究

源码如下

public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }

继续追源码,可以得到:low:-127、high:128

int --> Integer底层机制的解释

  • (1)值在 -128 --> 127 范围内会使用缓存池,当两个 Integer 对象的值在这个范围内时,它们会引用相同的缓存对象(存储在Cache数组中)

  • (2)如果数值超出范围,转换时,底层会创建Integer对象

代码示例

(1)数据在范围内:引用相同的缓存对象

Integer integer1 = 1;
Integer integer2 = 1;
System.out.println(integer1 == integer2);

// 输出结果
true

(2)数据不再范围内:创建Integer对象

Integer integer1 = 128;
Integer integer2 = 128;
System.out.println(integer1 == integer2);

// 输出结果
false

五、题目练习

1. 易错题

(1)第一题

Object obj1 = true ? new Integer(1) : new Double(2.0);
System.out.println(obj1);

输出:1.0

解释:三元运算符看成一个整体double优先级最高,所以输出double(遵循自动类型转换中的自动提升原则

自动提升原则:表达式结果的类型自动提升为操作数中最大的类型

int result = true ? 1 : 2.5;
System.out.println(result);

输出:1.0

(2)第二题

Object obj2;
if (true) {
    obj2 = new Integer(1);
} else {
    obj2 = new Double(2.0);
}
System.out.println(obj2);

输出:1

2. 综合题

在这里插入图片描述

在这里插入图片描述

答案

在这里插入图片描述

总结

(1)如果是在范围内:是同一个对象

(2)如果超出范围或者new:只要是创建了对象就不是同一个对象

(3)intInteger只要有基本数据类型,判断的是值是否相等


网站公告

今日签到

点亮在社区的每一天
去签到