【Java 基础类】Java包装类详解

本文深入讲解Java中的包装类,包括其概念、作用、装箱拆箱过程及注意事项,如Integer类的比较和自动装箱值范围问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >




一、Java数据类型:

  Java中有两大数据类型:基本数据类型和引用数据类型。
在这里插入图片描述

二、Java包装类

1.概念

  8大基本数据类型都有包装类。包装类是一个类,有方法属性构造器
  包装类Integer就像String和Math一样是一个类,有方法属性构造器

  • 基本数据类型对应的包装类(图表)

2.作用

编码过程中只接收对象的情况,比如ArrayList中泛型只能存入对象,不能存入基本数据类型。泛型的参数只能是对象,不能是原始数据类型;(请粘贴以下代码到编译器中,感受一下编译报错)

import java.util.ArrayList;
// 并不推荐使用中文做类名,我这里只是为了演示方面
public class 包装类 {
	public static void main(String[] args) {
		// 下面才是正确的
		ArrayList<Integer> list2 = new ArrayList<>();
		// 下面这句在编译期就会报错,因为泛型<>括号中不能是基本数据类型,如果要用需要是包装类
		ArrayList<int> list = new ArrayList<>();
	}
}

方便类型之间的转换,比如String和int之间的转换可以通过int的包装类Integer来实现,具体如下。

public static void main(String[] args) {
		// 这是一个字符串
		String numStr = "123"; 
		// 字符串转换成包装类
		Integer num01 = Integer.valueOf(numStr);
		// 包装类型向基本数据类型转换(拆箱)
		int num = num01;
		System.out.println(num);
	}

3.文档中查看

  包装类是一个JDK自带的类,所以可以在JDK API离线文档中查看到。下面是JDK API下载链接和JDK API Documentation 教程使用详解。

  推荐学会JDK API的查看。

  JDK API下载链接:传送门

  JDK API Documentation 教程使用详解链接:JDK API Documentation 教程使用详解

4.包装类的装箱拆箱(Integer举例)

  jdk1.5以后,装箱和拆箱都是自动完成(自动拆箱装箱),但是有的时候还是需要我们手动进行拆装箱。

  装箱:由基本数据类型向包装类型转换

// 装箱:将基本数据类型转换成引用类型
int i = 11;
Integer integer = new Integer(i); // 手动写代码装箱
System.out.println(integer);
// 自动装箱
Integer integer2 = 11;
System.out.println(integer2);

  拆箱:由包装类型向基本数据类型转换

// 拆箱:由包装类型向基本数据类型转换
Integer integer3 = new Integer(33);
int i3 = integer3.intValue(); // 手动写代码拆箱
System.out.println(i3);
// 自动拆箱
int i4 = new Integer(44);
System.out.println(i4);

5.注意点

1.包装类型的比较相等问题(Integer举例)

包装类之间不可用==来比较是否相等,需要比较字面值是否相等则需要使用Integer包装类的equals()方法!

public static void main(String[] args) {
	Integer num01 = new Integer(99); // 创建num01对象
	Integer num02 = new Integer(99); // 创建num02对象 
	// 下面输出false的原因:包装Integer是在堆中创建了2个对象,而==比较的是内存地址,两个对象的内存地址并不一样,所以false
	System.out.println(num01 == num02); // false
	// 下面输出true的原因:和String类的equals()方法一样,比较的是字面值是否相等,所以返回true
	System.out.println(num01.equals(num02)); // ture
}
2.Integer自动装箱值范围问题

现象:Integer自动装箱时,当值在范围[-128, 127]之间时,使用==号比较内存地址将会返回true,而超过此范围时返回false。

public static void main(String[] args) {
	// Integer自动装箱底层调用的是valueof()方法。in2和in3的自动装箱同下面这句一样
	Integer in = Integer.valueOf(0);
	// [-128, 127]范围内,源码并未创建对象,所以返回true
	Integer in2 = 127;
	Integer in3 = 127;
	System.out.println(in2 == in3); // true
	Integer in4 = -128;
	Integer in5 = -128;
	System.out.println(in4 == in5); // true
	// 超过了范围[-128, 127]创建新的Integer对象,in6和in7是不同对象,==比较时是不同地址,所以返回false
	Integer in6 = 233;
	Integer in7 = 233;
	System.out.println(in6 == in7); // false
}

原因:因为Integer自动装箱底层调用的是valueof()方法。而valueof()方法在区间[-128, 127]时并不会创建对象,而是在Integer的缓冲cache中拿。当超过了范围[-128, 127]时,则会创建新的Integer对象

valueOf()方法:
在这里插入图片描述


相关

【Java SE 基础】目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值