Java Wrapper 类内部缓存

我们所有人都知道如何在Java中创建对象,即使用new关键字。还有其他创建实例方法,但这不是重点。用Java创建的新实例占用堆中的一些内存空间,因此创建新对象始终是一个昂贵的过程

为了避免这种昂贵的对象创建过程,在此期间已经开发了许多框架,它们以不同的方式专门进行资源池化。因此,可以理解的是,准备好对象具有其自身的好处,因此也应予以推广

Wrapper 类在Java中是不可变的,对吗?“是”。因此,就像字符串池一样,他们也可以拥有自己的池,对吗?“好点子”。好吧,它已经在那里。JDK提供的 Wrapper 类也以实例池的形式提供此功能,即,每个 Wrapper 类以缓存的形式存储自己类型的常用实例列表,并且在需要时可以在代码中使用它们。它有助于在程序运行时节省很多麻烦。

整数缓存演示

在Integer.java类中,有一个内部类,即IntegerCache。当您将一个新的int分配给Integer类型时,如下所示:

整数i = 10; //要么
整数i = Integer.valueOf(10);

返回一个已经创建的Integer实例,并将引用存储在i中。请注意,如果您使用新的Integer(10);那么将创建一个新的Integer类实例,并且不会显示缓存。仅当您使用Integer.valueOf()OR直接原语赋值(最终使用valueOf()函数)时,它才可用。

让我们看IntegerCache一下代码中的样子:

private static class IntegerCache
{
	private IntegerCache(){}
	static final Integer cache[] = new Integer[-(-128) + 127 + 1];
	static {
		for(int i = 0; i < cache.length; i++)
			cache[i] = new Integer(i - 128);
	}
}

这是valueOf()方法的样子:

public static Integer valueOf(int i)
{
	final int offset = 128;
	if (i >= -128 && i <= 127) // must cache
		return IntegerCache.cache[i + offset];
	}
	return new Integer(i);
}

如您所见,IntegerCache是​​静态内部类,只有在首次使用时才会被初始化。因此,第一次,由于创建了高速缓存,时间可能会稍长一些,之后将不再花费更多时间。但是,实际的好处是内存重用。

让我们来看一个工作示例:

public class IntegerCacheDemo {

	public static void main(String[] args) {

		Integer a1 = 100;
		Integer a2 = 100;
		Integer a3 = new Integer(100);

		System.out.println(a1 == a2);
		System.out.println(a1 == a3);
	}
}

Output:

true
false

第一个打印语句将打印为true;表示两个变量都引用同一实例。但是,第二个print语句会打印false,因为new Integer(..)在单独的内存位置中创建了一个新的实例,因此,如果要使用此缓存,请始终使用原始赋值来引用变量或使用valueOf()方法。

修改缓存大小

如果要存储更多实例,则可以使用运行时参数,如下所示:

-Djava.lang.Integer.IntegerCache.high = 2000

上面的语句将导致高速缓存存储从-127到1000的实例。请记住,到目前为止,没有像-Djava.lang.Integer.IntegerCache.low这样的属性。可能在将来,也可能会添加。

其他包装类

在上面的讨论中,我讨论了Integer类中的缓存,但是实际上所有包装类都提供了此功能。以免总之看到它们:

  1. java.lang.Boolean存储两个内置实例TRUE和FALSE,如果不使用new关键字,则返回它们的引用。
  2. java.lang.Character在Unicode 0和127(ascii-7 / us-ascii)之间有一个用于char的高速缓存。
  3. java.lang.Long在-128到+127之间有一个很长的缓存。
  4. java.lang.String具有字符串池的全新概念。

saigon has written 1445 articles

One thought on “Java Wrapper 类内部缓存

Leave a Reply