JDK自带的缓存--包装类的缓存

关于包装类和基本类型的文章我前面已经整理过了,这里大致罗列下重点。我们主要是想研究下包装类的缓存。
  • 1,自动装箱和自动拆箱
java1.5之后就提供了自动装箱和自动拆箱的功能,当然我们也可以手动来装箱和拆箱。
基本类型-->包装类对象:new WrapperClass(primitive),Integer a = new Integer(1);
包装类对象-->基本类型:WrapperIntance.xxxValue(),int intValue = a.intValue();
  • 2,包装类和字符串的转换
字符串-->包装类:
包装类提供的parseXxx(String)静态方法,Integer aa = Integer.parseInt("1");
包装类提供的Xxx(String)构造器,Integer cc = new Integer("1");注意,不推荐使用这个,因为不能用缓存了呢
包装类-->字符串:
包装类后面加一个加号,String aaa = new Integer(1) + "";
String类提供的valueOf()方法,String bbb = String.valueOf(a);注意,别用这种,加号运算符编码简单而且高效
  • 3,包装类的缓存
ok,现在进入我们的真正主题,缓存。我们先来看一段代码:
public static void main(String[] args)
	{
		Integer a = new Integer(1);
		Integer b = new Integer(1);
		System.out.println(a == b);//false


		Integer c = 1;
		Integer d = 1;
		System.out.println(c == d);//true
	}
从上面的代码我们看出,如果我们自己人工来装箱和拆箱的话,系统不会给我们缓存的,输出是false,但是如果我们使用JDK的自动装箱和自动拆箱的话,系统就会给我们缓存起来,输出true。所以以后编码不管是为了编码简洁,还是为了性能,我们直接使用自动装箱和自动拆箱就OK了。
现在我们来研究下包装类的缓存:
打开JDK里面Integer的源码,我们看到该类里面有一个内部类IntegerCache,这个内部类里面定义了一个数组,这个数组就是来放我们的缓存数据的。
static
	{
		//执行初始化,创建-128到127的Integer实例,并放入cache数组中
		for (int k = 0; k < cache.length; k++)
		{
			cache[k] = new Integer(j++);
		}
	}


总结:以后我们在使用包装类的时候,不管是处理基本类型还是装换包装类型,或者是操作字符串的相关转换,都使用jdk的自动拆箱和自动装箱功能,不要人工的new Integer实例,这样子就可以使用缓存了。

  • 最后补充一点包装类的注意点:
应该认真的体会下设计出包装类的良苦用心。JDK设计包装类出来只是更好的支持基本类型的面向对象编程,并不说说从根本上来取代基本类型。系统提供的自动装箱和拆箱功能也不能用来作为消除基本类型的后门。在使用包装类代码和等价使用基本类型的代码从性能上面对比差了好多,因为每次自动装箱和自动拆箱都会增加性能开销的,所以我们不要滥用,一般来说除了在定义对象属性类型用包装类之外,最好都使用基本类型。

原文地址:https://www.cnblogs.com/LinkinPark/p/5232970.html