Java 整数缓存
先决条件:Java 内部类|Java 中的原始数据类型|Java 中的自动装箱
Java 不仅是一种语言,更是一种技术。Java 有明确定义的标准。在本文中,我们将讨论整数缓存。这个特性是在 Java 5 中引入的,目的是改善内存管理。让我们首先看一下示例代码,以更好地理解这种行为。之后,我们将讨论为什么要实现这一点。
在下面给出的程序中,您将清楚地理解逻辑,并看到如何初始化变量 a 和 b,以及 Java 如何在整数缓存中保存变量值。之后,您将看到-128 到 127 范围内的实例。此整数缓存仅在自动装箱时有效,这意味着从基元类型到对象引用的转换称为自动装箱。
让我们考虑下面给出的 java 代码输出示例:
例:
Java 语言(一种计算机语言,尤用于创建网站)
import java.io.*;
class GFG {
public static void main(String[] args)
{
// Initializing variable a and b.
// Java keeps a integer cache of integer
// instances in range of -128 to 127.
// Integer Cache works only on autoboxing.
// Conversion from primitive type to object
// reference is called autoboxing.
// In range declaration (-128 to 127) then
// object reference will be same.
Integer a = 9;
Integer b = 9;
// Then it will be true because both value of
// a and b will point to the same object reference.
if (a == b)
{
System.out.println("a==b");
}
else {
System.out.println("a!=b");
}
// Not in range declaration (-128 to 127) then
// then object reference will not be same in this
// case.
Integer x = 396;
Integer y = 396;
// Then it will be false because both value of
// a and b will point to the different different
// memory location.
if (x == y) {
System.out.println("x==y");
}
else
{
System.out.println("x!=y");
}
}
}
输出:
a==b
x!=y
在这里,我们预期如果条件部分,两者都应该运行。因为我们都知道在 java 中== compare reference 和 equals()比较数据。但在这种情况下,行为并不像预期的那样。我们已经看到了意想不到的产出。
Java 整数缓存实现:
在 Java 5 中,引入了一个新特性来节省内存并提高整数类型对象处理的性能。整数对象在内部缓存,并通过相同的引用对象重用。
- 这适用于–128 到+127 范围内的整数值。
- 这种整数缓存只在自动装箱时有效。当使用构造函数生成整数对象时,它们不会被缓存。
汽车兴:
这相当于按如下方式使用()的值:
Integer a=10; // this is autoboxing
Integer b==new Integer(40); // under the hood
英特尔高速缓存类:
IntegerCache 是一个私有的、静态的和内部的 Java 类。由于 Java 维护标准,这也被很好地记录下来,并给出了完整的信息。下面给出了英特尔高速缓存的内部实现。现在,您将在 java 中看到 IntegerCache 的内部实现逻辑。
在下面给定的程序中,var0、var1、var2、var3 和高表示检查英特尔高速缓存值的范围,通过检查,您还可以看到英特尔高速缓存的范围值,因此该类用于-128 到 127 之间的值的高速缓存。
它将帮助您检查任何对象引用值。如果值在范围声明中,那么两个值的对象引用将是相同的,如果它不在范围声明中,那么对象引用将是不同的。所以,如果你将比较值,即使它是相同的,这可能是偶然的,你已经采取了超出范围的值,那么,在这种情况下,两个值,即使它将是相同的,但将返回假意味着它不相等,因为对于两个值,对象引用将是不同的。
Java 语言(一种计算机语言,尤用于创建网站)
// A program demonstrate IntegerCache
// implementation in Java.
// This is how IntegerCache class works.
private static class IntegerCache {
// Method and variable declaration.
static final int low = -128;
static final int high;
static final Integer[] cache;
private IntegerCache() {}
static
{
// Range value from -128 to 127
int var0 = 127;
String var1 = VM.getSavedProperty(
"java.lang.Integer.IntegerCache.high");
int var2;
// Check if var1 value is null or not.
if (var1 != null) {
// For exception case
try {
var2 = Integer.parseInt(var1);
var2 = Math.max(var2, 127);
var0 = Math.min(var2, 2147483518);
}
catch (NumberFormatException var4) {
}
}
high = var0;
// High range for IntegerCache
cache = new Integer[high - -128 + 1];
var2 = -128;
// defining var3 values using loop.
for (int var3 = 0; var3 < cache.length; ++var3) {
cache[var3] = new Integer(var2++);
}
assert high >= 127;
}
}
以上互联网缓存类说明:
- 代码清楚地表明,该类用于缓存-128 到 127 之间的值。可以通过使用参数-XX: AutoBoxCacheMax=size 来修改高值 127。
特征:
- 它为您提供了根据我们的应用程序用例调整性能的灵活性。
- 它为您提供了从–128 到 127 之间选择数字的特定范围。
- 整数缓存使您能够缓存其他对象,例如字节、短、长等。
版权属于:月萌API www.moonapi.com,转载请注明出处