Java中包装类

本文围绕Java包装类展开,介绍了其设计原因是弥补基本数据类型无对象性质的缺陷。阐述了包装类本质、使用场景,包括与基本数据类型、字符串的相互转化。还讲解了自动装箱与拆箱,以及不同类型间的转化方式,最后分析了包装类的缓存问题。

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

为什么设计包装类?

Java是一门面向对象的语言,但是Java中的基本数据类型(byte,short,int,long,char,boolean,float,double)并不具备对象的性质,即没有成员变量和成员方法可以调用,但是在实际中,我们经常需要将基本数据类型转化成对象,以便于操作。为了弥补这个缺陷,Java提供了包装类。

什么是包装类?

包装类的本质就是将基本数据类型以及一些辅助方法包装到类中,即将基本数据类型“包装起来”,使得它具有了对象的性质,并且为其添加了属性和方法吗,丰富了基本类型的操作。

包装类的使用?

(1)作为和基本数据类型对应的类型存在,方便涉及到对象的操作,如集合等操作。

(2)包含每种基本数据类型的相关属性,如最大值,最小值等,以及相关的操作方法(用于基本数据类型,包装类,字符串之间的相互转化)---------intValue()方法和valueOf()方法的使用

 

基本数据类型和包装类的相互转化:

Integer a = new Integer(100);
Integer b = Integer.valueOf(100);

int a1= a.intValue();
int b1=b.intValue();

在上述代码中,展示了基本数据类型和包装类的相互转化,基本数据类型转化为包装类有两种方式,分别是使用new关键字和包装类的valueOf()方法;包装类转化为基本数据类型则采用intValue()方法。

 

字符串和包装类的相互转化:

Integer a = new Integer("444");
Integer b = Integer.parseInt("999");

String a1 = a.toString();
String b1 = b.toString();

上述代码中,展示了字符串和包装类的相互转化,字符串转化为包装类有两种方式,分别是使用new关键字和包装类的parseInt()方法;包装类转化为字符串则采用toString()方法。

自动装箱与拆箱?

在JDK1.5之后,Java引入了自动装箱与拆箱,自动装箱与拆箱就是将基本数据类型和包装类之间进行自动转换。

自动装箱:将基本数据类型转换成包装类对象。基本数据类型的数据处于需要对象的环境中时,会自动换为“对象”。系统调用valueOf()方法进行自动装箱。

Integer a = 4;

Integer a = Integer.valueOf(4);

上述代码中,Integer a =4就是将基本数据类型4转换成包装类对象,其本质是JVM执行了Integer a =Integer.valueOf(4)这样的操作,这就是Java的自动装箱。

自动拆箱:将包装类转换成基本数据类型,系统调用**Value()(如intValue(),doubleValue()等)方法进行自动拆箱。

Integer a = Integer.valueOf(4);
int b=a;

int b=a.intValue();

上述代码中,int b=a就是将包装类对象a转换成基本数据类型b,其本质是JVM执行了int b=a.intValue();这样的操作,这就是Java的自动封箱。

 

类型转化?

int到Integer:

(1)使用Integer类的构造方法

(2)使用Integer类内部的valueOf()方法

(3)自动装箱

Integer到int:

(1)使用Integer类内部intValue()方法

(2)自动拆箱

 

包装类的缓存问题

整型,char类型所对应的包装类,在自动装箱时,对于-128~127之间的值会进行缓存处理,其目的是提高效率。

缓存处理的原理为:如果数据在-128~127这个区间,那么在类加载就已经为该区间的每个数值创建了对象,并将这256个对象存放到一个名为cache的数组中。每当自动装箱过程发生时,就会判断数据是否在该区间,如果在则直接获取数组中对应的包装类对象的引用,如果不在该区间,则会通过new调用包装类的构造方法来创建对象。

		Integer in1=1234;
		Integer in2=1234;
		System.out.println(in1==in2);           //false
		System.out.println(in1.equals(in2));    //ture
		
		Integer in3=45;
		Integer in4=45;
		System.out.println(in3==in4);           //true
		System.out.println(in3.equals(in4));    //true

在上述代码中,基本数据类型1234进行自动装箱时,通过比较1234不在-128~127这个区间,则在堆中创建一个新的对象in1,同理在堆中创建一个新的对象in2,由于in1和in2不是同一个对象,故其内存地址不同;基本数据类型45进行自动装箱时,通过比较45在-128~127这个区间,则直接获取cache数组中已经创建好的45包装类对象的引用,并赋值给in3,同理赋值给in4,由于in3和in4指向同一个包装类对象,故其内存地址相同。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值