包装类 -- 自动拆箱和自动装箱 -- 享元模式

本文详细介绍了Java中基本数据类型与包装类的关系,解释了为何使用包装类及其提供的方法,如valueOf和parseInt。同时,深入探讨了自动装箱和拆箱过程,并通过实例演示了享元模式在Integer类中的应用,特别是在[-128,127]区间内的缓存机制。

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

包装类

包装类有哪些

基本数据类型其对应的包装类(可以在API文档中查询到)
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble
charCharacter
booleanBoolean

为什么要使用包装类

基本数据不能调用方法

Integer方法

static Integer valueOf(int i) 返回一个表示指定的 int 值的 Integer 实例。
static Integer valueOf(String s) 返回保存指定的 String 的值的 Integer 对象。
static int parseInt(String s) 将字符串参数作为有符号的十进制整数进行解析。
Integer(int value)
构造一个新分配的 Integer 对象,它表示指定的 int 值。
Integer(String s)
构造一个新分配的 Integer 对象,它表示 String 参数所指示的 int 值

自动装箱和自动拆箱

装箱 : 把一个基本数据类型的数据赋值给一个其对应的包装类的过程
拆箱 : 把一个包装类对象赋值给一个其对应的基本数据类型的变量的过程

Integer i = 10; //装箱 底层还是把10转换成了 new Integer(10)
int t = new Integer(10); //拆箱

享元模式

享元模式 的时候在[-128,127]

享元模式:当在进行装箱的值在[-128,127]范围内时,内存中就不会新开辟空间,堆中会有一个缓存空间,里面存放着[-128,127]的数,当对象Integer的对象!当采用赋值方式,会先到缓存中查找是否有值缓存着,如果有,直接使用引用地址

public class test03 {
	public static void main(String[] args) {
		Integer i1=128;
		Integer i2=128;
		
		Integer i3 = 10;
		Integer i4 = 10;
		
		Integer i5= new Integer(20); //只要new 一定会在堆里面开辟空间   == 比较的地址值
		Integer i6=	new Integer(20); 
		
		System.out.println(i1==i2);
		System.out.println(i3==i4);
		System.out.println(i5==i6);
		
		System.out.println("------------------------");
		
		System.out.println(i1.equals(i2));// equals经过覆写  使用equals比较 比较的是表示的值
		System.out.println(i3.equals(i4));
		System.out.println(i5.equals(i6));
	}
}

结果为:

false
true
false
------------------------
true
true
true

/*[-128~127]缓存,对象Integer的对象!当采用赋值方式,会先到缓存中查找是否有值缓存着,如果有,直接使用引用地址 */
Integer i1 = 20;
Integer i2 = 20;
System.out.println(i1 == i2);//true此处不存在拆箱比较值,比较的是对象的地址
/但凡是new 都会在堆内存中,创建一个新的对象,对象的地址值不一样/
Integer i3 = new Integer(20);
Integer i4 = new Integer(20);
System.out.println("i3 == i1 "+(i3 == i1));//false
System.out.println(i3 == i4);//false
/*赋值范围超过缓存值的范围,享源模式中没有缓存值,则会自动创建对象, */
Integer i5 = 128;
Integer i6 = 128;
System.out.println(i5 == i6);
/*上面比较的都是Integer 对象 */
System.out.println(i1.equals(i2));//true
System.out.println(i1.equals(i3));//true
System.out.println(i3.equals(i4));//true
/*在强化,对象比较还是用equalsjava中Integer 已经覆写了equals */

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值