首先看一段代码(使用JDK 5),如下:
public class Test {
public static void main(String[] args) {
Integer i1 = 127;
Integer i2 = 127;
if (i1 == i2)
System.out.println("Equal!");
else
System.out.println("Not equal!");
}
}
输出结果想必大家也知道,是“Equal!”。现在把i1和i2的值由127改为128看看会发生什么?结果输出“Not equal!”。
这个问题的答案看了下面的就会清楚了。
为了更容易理解问题,用Jad将上面代码反编译,如下:
import java.io.PrintStream;
public class Test
{
public Test()
{
}
public static void main(String args[])
{
Integer i1 = Integer.valueOf(128);
Integer i2 = Integer.valueOf(128);
Integer i3 = Integer.valueOf(128);
if(i1 == i2)
System.out.println("i1 == i2 is true!");
else
System.out.println("i1 == i2 is false!");
if(i1.intValue() >= i2.intValue())
System.out.println("i1 >= i2 is true!");
else
System.out.println("i1 >= i2 is false!");
if(i1 == i3)
System.out.println("i1 == i3 is true!");
else
System.out.println("i1 == i3 is false!");
}
}
从这可以看出,“Integer i1 = 127;”在JDK1.5下应该编译成了“Integer i1 = Integer.valueOf(127);”。
再看看java.lang.Integer中关于valueOf的源代码是怎样的:
public static Integer valueOf(int i) {
final int offset = 128;
if (i >= -128 && i <= 127) { // must cache
return IntegerCache.cache[i + offset]; //这个主意下,Cache 缓存了-128~127的值
}
return new Integer(i);
}
可以看出,这个值在-128到127之间,会将其cached(缓存)起来,如果多次使用的话,会节省内存和改善性能;如果不在这个范围之内,则生成一个新的Integer Object instance,这样如果进行“==”时,由于是比较两个不同的Object references,故结果是false。事实上,这个特性从JDK 1.3就存在了(以前的我不清楚) 。
确切的说,上面出现的问题实质并不是Autoboxing和Auto-Unboxing,应该是Integer类的valueOf(int i)方法,只是Autoboxing和Auto-Unboxing将这个问题掩盖了。
把Integer 换成 int 则不会出现上述情况,结果都是equal。
分享到:
相关推荐
Integer类在JDK中提供了缓存机制,用于优化Integer对象的创建和使用,特别是对于小数值。当我们在程序中创建Integer对象时,如果值在-128到127之间,Integer对象会直接从缓存池中获取或复用已存在的对象,避免了重复...
Integer类的缓存机制在Java编程中是一个重要的概念,它涉及到对象实例化、内存管理和性能优化。Integer类作为int基本类型的包装类,它的缓存机制是通过Integer#valueOf(int i)方法来实现的,该方法在Java 1.5及更高...
这是因为Integer类内部有一个缓存池,即IntegerCache,它预先创建了-128到127之间的所有Integer对象。当我们调用valueOf()方法时,如果值在这个范围内,就会从缓存池中获取对象,而不是每次都new一个新的对象。例如...
从描述中我们可以看到,对于-128到127之间的整数,`Integer`类会使用一个内部的缓存来存储这些对象,以提高性能和减少内存开销。 这是因为Java的自动装箱和拆箱机制。当我们将一个`int`值赋给`Integer`对象时,装箱...
这个方法内部有一个缓存机制,当传入的整数值在-128到127(包括两端)这个范围内时,它会从预先创建好的Integer对象缓存数组中返回一个对象,而不是每次都新建一个Integer实例。这样做是为了提高性能,因为频繁创建...
`Long`类内部有一个静态内部类`LongCache`,用于缓存-128到127之间的所有`Long`对象实例。这意味着对于这个范围内的值,每次创建`Long`对象时都会从缓存中获取已有的实例,而不会创建新的对象。 ```java private ...
在Java 5及更高版本中,`Integer`类引入了值缓存机制,主要是为了提高性能。在-128到127之间,当我们创建`Integer`对象时,会使用预先创建好的对象,而不是每次都通过`new Integer()`创建新的实例。这是通过`...
Integer类中的`valueOf(int)`方法是关键,它会根据传入的整数值决定是否使用缓存。对于-128到127之间的值,`valueOf`会从预先创建的IntegerCache缓存中获取对象,否则会创建新的Integer对象。IntegerCache是Integer...
- **缓存原理**:在Integer类中定义了一个名为`IntegerCache`的内部类。在这个内部类中,通过一个静态代码块预先创建了一个包含256个Integer对象的数组,这些对象分别对应于-128到127之间的整数。 - **使用场景**:...
9. **IntegerCache [Inner Class]**: `IntegerCache`是`Integer`类内部的一个缓存类,用于存储-128到127之间的`Integer`对象。这个缓存机制是为了提高性能,因为这些值经常被使用且重复创建是不必要的。 10. **...
在Java 9中,Integer类内部包含了一个名为IntegerCache的静态内部类,它是一个私有的缓存,用于存储-128到127之间的Integer对象。这个缓存机制的存在是为了优化性能,因为在实际应用中,这个范围内的整数对象被频繁...
`IntegerCache` 是一个内部私有静态类,它维护了一个缓存数组,用于存储-128到127之间的 `Integer` 对象。这个范围的选择是因为这些数值在Java虚拟机(JVM)中会被自动进行"装箱"(boxing)和"拆箱"(unboxing)操作...
* 内部状态:属性值由类生成时确定,不会改变 * 外部状态:属性值由参数决定,依赖传递值 * * 实现思路 * 多个位置的操作,需要相同的一些对象,此时将相同的一些对象封装进一个工厂内,创建后持久化到内存中 ...
从源码中我们可以看到,IntegerCache是一个静态内部类,它在类加载的时候就会创建并保存从-128到127的整数值的缓存对象,并将他们的引用保存在cache数组中。 现在,让我们来分析一下Integer.ValueOf()方法的使用...
`IntegerCache`类是`Integer`类的一个静态内部类,它的作用就是实现上述的缓存功能。这个类在类加载时初始化,创建-128到127之间的`Integer`对象,并将它们存储在一个数组`cache`中。当调用`valueOf(int i)`方法时,...
LRU (Least Recently Used) 算法是一种常用的缓存淘汰策略,它的核心思想是优先淘汰...在 Java 中,`LinkedHashMap` 是实现 LRU 缓存的一种高效方式,但也需要理解其内部机制,以便在面试或特定场景下进行自定义实现。
- 当 Integer 值在-128到127之间时,使用自动装箱创建的Integer对象会被缓存,因此对于相同值的Integer对象,使用 `==` 比较可能会返回 `true`。否则,即使是相等的值,也可能创建了不同的对象,导致 `==` 返回 `...
- 缓存机制涉及到IntegerCache类,该类内部维护了一个缓存数组,用于存储-128到127(包含边界值)之间的整数值。 - 当自动装箱的值在这个范围之内时,将直接返回缓存中的Integer对象,而不是创建一个新的对象,...
`IntegerCache`是一个静态内部类,它默认创建了一个包含-128到127之间的所有整数对象的数组`cache`。当`valueOf`方法接收到的参数在这个范围内时,它会直接返回数组中的相应对象。 ```java public static Integer ...