包装类

八种常用类之包装类

1.包装类

1.1 什么是包装类?有什么用?

​ Java为8大基本数据类型都分别提供了一个包装类。

1.1.1 用于将基本数据转化为对象,便于操作。

	int aa = 10 ;//基本类型的赋值
	Integer bb = new Integer(10);//包装类的赋值

​ 区别在于基本类型的赋值将数据存于栈内;包装类的赋值是将对象的地址赋值给bb,而真正的数据存储与该地址指向的堆内存内。

1.1.2 将字符串转换为其他类型的数据

​ String类型的值是不能直接强制转换为int类型的,当使用包装类时,由包装类调用相应的方法就能将String类型转换为int类。

		String c = "name";
		int i = Integer.parseInt(c);//正确的String类型转换为int类型的方式

1.2 基本类型和包装类型的相互转换

	int aa = 10;
	Integer bb = new Integer(aa);//基本类型转化为包装类
/******************************************************/
	int cc = bb.intValue(); //包装类型转为基本类型

1.3 装箱与拆箱

​ 上述介绍了包装类型的赋值和与基本类型之间的转化。

​ 装箱: 基本类型 ==》包装类

​ 拆箱: 包装类 ==》基本类型

1.3.1 自动装箱与自动拆箱

​ 上述的转换其实过于麻烦,实际上可以有简化操作。

	int a = 10;
	Integer b = 10 ;//赋值

	Integer c = a;//自动装箱,底层使用的是Integer.valueOf()完成的自动装箱操作
	int d = b;//自动拆箱,底层使用 intValue()完成

1.3.2 基本数据与包装类型数据几种比较

​ ①

  public static void main(String[] args) {
        int a = 10;
        Integer b = 10;
        System.out.println(a == b);//true
        System.out.println(b.equals(a));//true
        System.out.println("====================");

    }

​ 基本类型与包装类型比较时,由于==两边对于基础数据类型是直接比较值的,包装类型的数据在此处做了一个自动拆箱的处理,所以输出为true。

​ 当==两边有任意一边为包装类时都会做自动拆箱处理。

        Integer aa = new Integer(100);
        Integer bb = new Integer(100);
        System.out.println(aa == bb);//false
        System.out.println(aa.equals(bb));//true
        System.out.println("====================");

两边都是由new关键字实例化一个Integer类型,因此比较的时两边的地址,所以输出false。

        Integer aaa = 101 ;
        Integer bbb = 101;
        System.out.println( aaa == bbb);//true
        System.out.println(aaa.equals(bbb));//true
        System.out.println("====================");

​ 自动装箱时底层调用的是valueOf(),当范围为-128~127时可以认为是基本类型比较。

        Integer aaaa = 250 ;
        Integer bbbb = 250;
        System.out.println( aaaa == bbbb );//false

​ 该例为③例的返例,当自动装箱的数据大小超过-128~127的范围时,将由new Integer();实现装箱。

1.3.3 valueOf();

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

​ valueOf()源码如上,IntegerCache.low和IntegerCache.high分别为IntegerCache类中的常量,大小分别为-128,127。由此可见,自动装箱时,数据传入valueOf()会先进行一个判断,当判定数据处于-128~127内部时,将会返回提前储存在数组cache[]中的数,否则由构造器创建一个新的实例。

很明显数组cache[]中有255个数,为何要提前在数组中存储数据?很明显是为了提升性能,因为类IntegerCache中的静态代码块在类初始化时同时初始化,而该数组正处于初始化时的该堆内存内。

java初学者,如有错误或遗漏,还请指教。

posted @ 2021-09-22 10:00  南晨晨晨  阅读(109)  评论(0)    收藏  举报