【160期】实习面试:为什么 Java 中 1000==1000 为 false,而 100==100 为 true?

点击上方“Java精选”,选择“设为星标”

别问别人为什么,多问自己凭什么!

下方留言必回,有问必答!

每天 08:35 更新文章,每天进步一点点...

为什么 Java 中“1000==1000”为false,而“100==100为true? 这是一个挺有意思的讨论话题。

如果你运行下面的代码:

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

你会得到

false
true

基本知识:我们知道,如果两个引用指向同一个对象,用==表示它们是相等的。如果两个引用指向不同的对象,用==表示它们是不相等的,即使它们的内容相同。推荐:Java进阶学习资料

因此,后面一条语句也应该是false 。

这就是它有趣的地方了。如果你看去看 Integer.java 类,你会发现有一个内部私有类,IntegerCache.java,它缓存了从-128到127之间的所有的整数对象。

所以事情就成了,所有的小整数在内部缓存,然后当我们声明类似——

Integer c = 100;

的时候,它实际上在内部做的是:

Integer i = Integer.valueOf(100);

现在,如果我们去看valueOf()方法,我们可以看到

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

如果值的范围在-128到127之间,它就从高速缓存返回实例。

所以…

Integer c = 100, d = 100;

指向了同一个对象。

这就是为什么我们写

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

我们可以得到true。

现在你可能会问,为什么这里需要缓存?

更多面试题在公众号Java精选,回复Java面试,获取最全面试资料。

合乎逻辑的理由是,在此范围内的“小”整数使用率比大整数要高,因此,使用相同的底层对象是有价值的,可以减少潜在的内存占用。

然而,通过反射API你会误用此功能。

运行下面的代码,享受它的魅力吧

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); //
    }

来源:codeceo

http://www.codeceo.com/article/why-java-1000-100.html

公众号“Java精选”所发表内容注明来源的,版权归原出处所有(无法查证版权的或者未注明出处的均来自网络,系转载,转载的目的在于传递更多信息,版权属于原作者。如有侵权,请联系,笔者会第一时间删除处理!

------ THE END -------

精品资料,超赞福利!

>Java精选面试题<
3000+ 道面试题在线刷,最新、最全 Java 面试题!

b6954998c4822c5b3d0a821c7dc99229.png

c26b9d1cc68a1760662503b6728de4c0.png

期往精选  点击标题可跳转

【152期】美团一面:为什么选用 Hbase,Hbase 和 MySQL有啥区别?

【153期】面试官问:如何中断一个线程,谈谈具体实现?

【154期】面试官问:请你说说 B 树、B+ 树的原理及区别?

【155期】面试官问:为什么 Spring Boot 的 jar 可以直接运行?

【156期】面试官问:Redis 存储结构体信息,选 hash 还是 string?

【157期】面试官问:JDK1.8新特性如何使用 Stream API 优化代码?

【158期】Spring Boot + Redis 分布式锁:模拟 10万人的秒杀抢单

【159期】面试官问:说说 MongoDB 批量操作与 MySQL 效率对比?

文章有帮助的话,在看,转发吧!

### 关于2024年Java实习面试题目的分析 随着技术的发展,Java作为一门经典编程语言,在企业开发中的地位依然稳固。以下是基于已有资料整理的可能涉及的2024年Java实习面试题目方向。 #### 一、基础知识考察 对于Java的基础知识掌握程度通常是面试的第一步。常见的知识点包括但不限于数据类型、运算符、控制语句以及面向对象的核心概念。例如: - **== 和 equals 的区别** `==`用于比较两个变量的值是否相等,而`equals()`方法则用来判断两个对象的内容是否相同[^4]。 ```java String str1 = new String("hello"); String str2 = new String("hello"); System.out.println(str1 == str2); // false System.out.println(str1.equals(str2)); // true ``` #### 二、算法与数据结构 算法和数据结构是评估候选人逻辑思维能力的重要部分。通常会涉及到排序算法(如折半查找、插值查找、斐波那契查找)、链表操作、树遍历等内容。 #### 三、多线程与并发处理 现代应用往往需要支持高并发场景,因此对多线程的理解也是必不可少的一部分。可能会被询问到如下主题: - 如何创建线程? - synchronized关键字的作用是什么? - volatile修饰符的意义? #### 四、框架理解 (Spring) 由于Spring系列框架在Java生态系统内的广泛采用,了解其基本原理变得尤为重要。比如: - Spring IOC容器的工作机制; - AOP的概念及其应用场景; - 使用@Autowired注解时需要注意哪些事项?[^3] #### 五、实际项目经验讨论 尽管在校间缺乏真实工作环境下的实践经验,但如果参与过某些课程设计或个人项目,则可以通过这些案例展示自己的解决问题能力和学习潜力。一些小型公司更看重候选人的态度和技术热情而非具体技能水平[^2]。 --- ### 提供一段代码示例:实现简单的单例模式 这是经常出现在初级开发者面试环节的一个问题——如何正确地构建一个线程安全的单例类。 ```java public class Singleton { private static volatile Singleton instance; private Singleton(){} public static Singleton getInstance(){ if(instance == null){ synchronized(Singleton.class){ if(instance == null){ instance = new Singleton(); } } } return instance; } } ``` 以上即为懒汉式双重检查锁定版本的单例模式实现方式之一。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值