Java/包装类

包装类用途

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

  2. 包含每种基本数据类型的相关属性如最大值、最小值等,以及相关的操作方法(这些操作方法的作用是在基本数据类型、包装类对象、字符串之间提供相互之间的转化!)。
    在这里插入图片描述
    在这八个类名中,除了Integer和Character类以外,其它六个类的类名和基本数据类型一致,只是类名的第一个字母大写而已。
    在这八个类中,除了Character和Boolean以外,其他的都是“数字型”,“数字型”都是java.lang.Number的子类。Number类是抽象类,因此它的抽象方法,所有子类都需要提供实现。Number类提供了抽象方法:intValue()、longValue()、floatValue()、doubleValue(),意味着所有的“数字型”包装类都可以互相转型。

包装类与基本类型互换

举个栗子:int/Integer

package TestClass;

public class TestWeappedClass {
	public static void main(String[] args) {
		
		// 基本类型转化成Integer对象
		Integer a = new Integer(3);
		Integer b = Integer.valueOf(5);
		//valueOf()用于返回实例对象
		
		// Integer对象转化成int
		int c = a.intValue();
		
		// 字符串转化成Integer对象
		Integer d = new Integer("666");
		Integer e = Integer.parseInt("999");
		//返回实例对象所表示的基本数据类型
		
		// Integer对象转化成字符串
		String f = d.toString();
		
		// 一些常见int类型相关的常量
		System.out.println("int最大整数"+Integer.MAX_VALUE);

	}
}

自动拆箱与自动装箱

“编译器蜜糖(Compiler Sugar)”
自动装箱:
基本类型的数据处于需要对象的环境中时,会自动转为“对象”。
以Integer为例:在JDK1.5以前,这样的代码 Integer i = 5 是错误的,必须要通过Integer i = new Integer(5) 这样的语句来实现基本数据类型转换成包装类的过程;而在JDK1.5以后,Java提供了自动装箱的功能,因此只需Integer i = 5这样的语句就能实现基本数据类型转换成包装类,这是因为JVM为我们执行了Integer i = Integer.valueOf(5)这样的操作,这就是Java的自动装箱。

自动拆箱:
每当需要一个值时,对象会自动转成基本数据类型,没必要再去显式调用intValue()、doubleValue()等转型方法。
如 Integer i = 5;int j = i; 这样的过程就是自动拆箱。

用一句话总结自动装箱/拆箱:

自动装箱过程是通过调用包装类的valueOf()方法实现的,而自动拆箱过程是通过调用包装类的
xxxValue()方法实现的(xxx代表对应的基本数据类型,如intValue()、doubleValue()等)。

		//自动装箱
		Integer i = 100;
		//相当于编译器自动为您作以下的语法编译:Integer i = Integer.valueOf(100);
		//调用的是valueOf(100),而不是new Integer(100)
		
		//自动拆箱
		Integer k = 100;
		int j = k;
		//相当于编译器自动为您作以下的语法编译:	int j = i.intValue();
		
		//包装类空指针异常问题
		Integer m = null;
        int n = m;
        //相当于int n = m.intValue(); 
        //调用空指针方法报错NullPointerException
	

包装类的缓存

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

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

Integer int1 = 100;
        Integer int2 = 100;
        System.out.println(int1 == int2);//true
        System.out.println(int1.equals(int2));//true
        Integer int3 = 1024;
        Integer int4 = 1024;
        System.out.println(int3 == int4);//false
        System.out.println(int3.equals(int4));//true

Integer类相关源码如下:

public static Integer valueOf(int i) {
    if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}
  1. IntegerCache类为Integer类的一个静态内部类,仅供Integer类使用。
  2. 一般情况下 IntegerCache.low为-128,IntegerCache.high为127,IntegerCache.cache为内部类的一个静态属性,
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值