`

奇怪的Java题:为什么1000 == 1000返回为False,而100 == 100会返回为True?

阅读更多

这是我们今天要讨论的话题,因为我觉得它非常的有趣。

如果你运行如下代码:

1
2
3
4
Integer a = 1000, b = 1000
System.out.println(a == b);//1
Integer c = 100, d = 100
System.out.println(c == d);//2

你会得到以下运行结果:

1
2
false
true

我们知道,如果两个引用指向同一个对象,那么==就成立;反之,如果两个引用指向的不是同一个对象,那么==就不成立,即便两个引用的内容是一样的。因此,结果就会出现false。

这是非常有趣的地方。如果你查看Integer.java类,你会找到IntegerCache.java这个内部私有类,它为-128到127之间的所有整数对象提供缓存。

这个东西为那些数值比较小的整数提供内部缓存,当进行如此声明时:

1
Integer c = 100;

它的内部就是这样的:

1
Integer i = Integer.valueOf(100);

如果我们观察valueOf()类函数,我们可以看到

1
2
3
4
5
public static Integer valueOf(int i) {
      if (i >= IntegerCache.low && i
          return IntegerCache.cache[i + (-IntegerCache.low)];
      return new Integer(i);
    }

如果值在-128到127之间,它就会返回该缓存的实例。

因此。。。

1
Integer c = 100, d = 100;

两者指向同样的对象。

这就是为什么这段代码的结果为true了:

1
System.out.println(c == d);

现在你可能会问,为什么会为-128到127之间的所有整数设置缓存?

这是因为在这个范围内的小数值整数在日常生活中的使用频率要比其它的大得多,多次使用相同的底层对象这一特性可以通过该设置进行有效的内存优化。你可以使用reflection API任意使用这个功能。

运行下面的这段代码,你就会明白它的神奇所在了。

1
2
3
4
5
6
7
8
9
10
11
12
13
public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
  
      Class cache = Integer.class.getDeclaredClasses()[0]; //1
      Field myCache = cache.getDeclaredField("cache"); //2
      myCache.setAccessible(true);//3
  
      Integer[] newCache = (Integer[]) myCache.get(cache); //4
      newCache[132] = newCache[133]; //5
  
      int a = 2;
      int b = a + a;
      System.out.printf("%d + %d = %d", a, a, b); //
    }

 

本文翻译自dzone.com,由回忆和感动翻译,本文第一地址

2
1
分享到:
评论
3 楼 account.redsun.xp 2016-02-23  
博主,这个是有java相关规范要求的还是只是特定的实现,换一个实现就可能有不同的结果?
2 楼 yybing110 2016-02-22  
   
1 楼 小鱼不爱水 2016-02-22  
[size=x-large]127以下是int值,以上要new Integer(1000);[/size]

相关推荐

    回复:Java迷题:等于,还是不等于?

    然而,如果你尝试比较一个非NULL对象和NULL,"=="会返回false,除非两个都是NULL: ```java String str1 = "Hello"; System.out.println(str1 == null); // 输出:false,因为str1已赋值 ``` 此外,"!="可以用来...

    matlab练习题(附答案)

    ### MATLAB练习题解析 #### 一、填空题解析 **题目描述:** 根据给定的MATLAB代码,填写相应的运行结果。 1. **设有程序:** \[ A=[1,2,3,4;6,-5,6,3];B=[2,4,5,7];A1=A(:,[1 3 4]);A2=A(1,[2,3]). \] - **...

    JS中的==运算: [”] == false —true

    根据图1,需要将布尔类型转为数字类型,而false转为数字的结果是0,所以表达式变为: [”] == 0 两个操作数变成了对象类型、数字类型。根据图1,需要将对象类型转为原始类型: 首先调用[].valueOf(),由于数组的...

    Java17道面试题及答案

    那问题来了,两个相同值的 String 对象,为什么返回的是 true?代码如下: String s1 = new String("阿莫"); String s2 = new String("阿莫"); System.out.println(s1.equals(s2));//true 同样的,当我们进入 ...

    某大学往年期末考试题:Java考试(含答案).docx

    12. **自动导入java.lang包**:Java程序确实会自动导入`java.lang`包,其中包含了Object类等基础类,第二题的判断题答案为true。 13. **构造方法**:构造方法的名称必须与类名相同,第三题的判断题答案为false。 ...

    java面试题集锦 java面试题集锦

    例如,两个字符串对象即使内容相同,如果是在不同的内存位置创建的,`==`会返回`false`,而`equals`会返回`true`。 3. **equals 的源码分析** 默认情况下,所有类都继承自Object类,其`equals`方法定义如下: ```...

    JAVA练习题(for循环练习题等)

    ### JAVA练习题知识点详解 #### 1. 斐波那契数列 通过`for`循环打印斐波那契数列的前100项。斐波那契数列定义为:第一项与第二项均为1,后续每一项都是前两项之和(如1, 1, 2, 3, 5, 8, 13, 21...)。 ```java int...

    jdbc:mysql://localhost:3306/webshopping?useUnicode=truecharacterEncoding=UTF-8

    当设置为true时,意味着在传输数据时会考虑Unicode编码。 **characterEncoding=UTF-8** 参数: 这个参数指定了字符编码格式为UTF-8。UTF-8是一种广泛使用的Unicode编码,支持大部分世界语言,并且与Web标准兼容。在...

    java中的比较运算符== 与 equals()方法 ..doc

    ### Java中的比较运算符==与equals()方法 在Java编程语言中,经常需要对变量进行比较,这涉及到了两种常见的比较方式:`==`运算符和`equals()`方法。这两种方式有着本质的区别,并且适用于不同类型的数据。下面将...

    可配置阴影颜色和投影方向的CardView

    根据Android原生CardView源码进行修改封装,新增加十个属性,分别控制四个边和四...默认四边四角投影为显示,配置为false不显示 为true显示。cardShadowStartColor:阴影起始颜色。 cardShadowEndColor:阴影结束颜色。

    javascript中的相等操作符(==与===区别).docx

    - 示例:`1 === 1` 返回 `true`,`1 === 1.0` 返回 `true`(整数与浮点数视为相等),`1 === 1.2` 返回 `false`。 4. **特殊类型的比较**: - `null` 和 `undefined` 只有在自身之间比较时才返回 `true`。 - ...

    Java复习题 (2).pdf

    `由于`i且`m,`i>j`为`false`,但`m为`true`,因此`k`会自增1,`k`的值变为`10`。 以上内容涵盖了Java的基本语法、数据类型、运算符、条件判断、流程控制等多个方面,是Java程序员必备的基础知识。通过理解和掌握...

    2021年java面试题集锦.docx

    那问题来了,两个相同值的 String 对象,为什么返回的是 true?代码如下: String s1 = new String("老王"); String s2 = new String("老王"); System.out.println(s1.equals(s2)); // true 同样的,当我们进入 ...

    位字段:n布尔值= 1整数,保存列和迁移

    例如,true-false-false = 1,false-true-false = 2,true-false-true = 5(1,2,4,8,..) class User < ActiveRecord xss=removed> :seller , 2 => :insane , 4 => :sensibleenduser = User . new ( seller : true...

    android源码-漂亮的qq界面

    android:background="@drawable/option" android:clickable="true" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="13.0dip" android:layout_...

    JS字符串false转boolean的方法(推荐)

    在JavaScript中,将字符串"false"转换为布尔值false并不是一个简单的隐式转换,因为JavaScript会把字符串"false"视作一个真值。针对这个特定问题,我们需要一个明确的方法来确保字符串"false"能被正确转换成布尔的...

    经典的Java基础面试题集锦

    Java 基础面试题是评估开发者对Java语言掌握程度的重要方式。以下是对这些问题的详细解答: 1. **main 方法声明为 private**: 如果 main 方法被声明为 private,程序仍然可以正常编译,因为Java编译器并不检查...

    java中equals和==的区别

    当使用字面量创建 String 对象时,Java 会首先在字符串缓冲池中寻找具有相同值的对象,如果找到,则返回该对象的引用;否则,创建一个新的 String 对象。 在第一个例子中,我们创建了两个 String 对象 s1 和 s2,...

    Python算法题源代码-LeetCode(力扣)-搜索二维矩阵

    力扣热题Python源代码 题目74. 搜索二维矩阵 给你一个满足下述两条属性的 m x n 整数矩阵: 每行中的整数从左到右按非严格递增顺序排列。 每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target ,如果 ...

    java中equals和==的区别.pdf

    在这里,`s1 == s2`返回`false`,因为它们是两个不同的对象实例,而`s1.equals(s2)`返回`true`,因为它们的内容相同。 2. **对于非字符串对象**: - `==`仍然比较对象的内存地址,即引用是否相同。 - 如果一个类...

Global site tag (gtag.js) - Google Analytics