Java 类型,值比较
Java Type, Value comparison
我想看看 Java 中某些类型的真实性 table。
而且我无法理解第一个 returns 正确和下面一个错误?
public class CompareTypes{
public static void main(String[] args){
// -------------------------------------
Integer AA = 12;
Integer BB = 12;
System.out.println( AA == BB ); // true
// -------------------------------------
Integer a = 128;
Integer b = 128;
System.out.println( a == b ); // false
}
}
您看到的是自动装箱的产物。
Integer
个对象具有不同的对象 ID,这意味着两个不同的 Integer
个对象对于 ==
将是 false
。但是,valueOf
方法缓存了 Integer
对象的前 127 个值。当您通过其 valueOf 静态工厂在 -128 和 +127 之间创建一个 Integer
时,您将获得完全相同的对象。当您创建一个值 >= 128 的对象时,您每次都会得到一个全新的对象,具有不同的 ID,因此不会直观地响应 ==
调用。
自动装箱使用 valueOf
方法进行自动装箱,这就是为什么从 int
个小于 128 的字面量创建为 Integer
个对象的对象引用起作用的原因。但是,创建两个 Integer
个值为 128 的对象的行创建了两个不同的对象。
这个故事的寓意是
- 尝试对值类型使用
.equals()
- 注意不要混淆文字类型和盒装类型。
https://blogs.oracle.com/darcy/entry/boxing_and_caches_integer_valueof
我想看看 Java 中某些类型的真实性 table。
而且我无法理解第一个 returns 正确和下面一个错误?
public class CompareTypes{
public static void main(String[] args){
// -------------------------------------
Integer AA = 12;
Integer BB = 12;
System.out.println( AA == BB ); // true
// -------------------------------------
Integer a = 128;
Integer b = 128;
System.out.println( a == b ); // false
}
}
您看到的是自动装箱的产物。
Integer
个对象具有不同的对象 ID,这意味着两个不同的 Integer
个对象对于 ==
将是 false
。但是,valueOf
方法缓存了 Integer
对象的前 127 个值。当您通过其 valueOf 静态工厂在 -128 和 +127 之间创建一个 Integer
时,您将获得完全相同的对象。当您创建一个值 >= 128 的对象时,您每次都会得到一个全新的对象,具有不同的 ID,因此不会直观地响应 ==
调用。
自动装箱使用 valueOf
方法进行自动装箱,这就是为什么从 int
个小于 128 的字面量创建为 Integer
个对象的对象引用起作用的原因。但是,创建两个 Integer
个值为 128 的对象的行创建了两个不同的对象。
这个故事的寓意是
- 尝试对值类型使用
.equals()
- 注意不要混淆文字类型和盒装类型。
https://blogs.oracle.com/darcy/entry/boxing_and_caches_integer_valueof