搞清楚一道关于Integer的面试题
请看题1:
public class IntegerDemo {public static void main(String[] args) {Integer a = 888;Integer b = 888;Integer c = 88;Integer d = 88;System.out.println(a == b);System.out.println(c == d);}
}
上面这道题输出:
false
true
因为Java的自动拆箱和自动封箱,那么
Integer a = 888;
就是相当于
Integer a = new Integer(888);
自然上面的变量a和b都是各自指向不同的对象引用地址。那么答案就肯定是false。
那为什么c===d就是指向同一个对象呢?
再来看看,Integer中部分源码
//具体源码部分public static Integer valueOf(int i) {//i>=-128&&i<=127if (i >= IntegerCache.low && i <= IntegerCache.high)return IntegerCache.cache[i + (-IntegerCache.low)];return new Integer(i);}//Integer的静态内部类private static class IntegerCache {static final int low = -128;static final int high;//常量数组static final Integer cache[];static {// high value may be configured by propertyint h = 127//省略无关代码....high = h;//初始化cache数组大小//cache的大小=127-(-128)+1=256cache = new Integer[(high - low) + 1];int j = low;for(int k = 0; k < cache.length; k++)//把-128到127的数字全部转换成Integer对象//并存入到cache数组中。cache[k] = new Integer(j++);} private IntegerCache() {}}
面试题2:
public class IntegerDemo {public static void main(String[] args) {Integer a = new Integer(88);test(a);System.out.println(a);}private void test(Integer integer){integer=new Integer(99);}
}
上面应该输出多少呢?
面试题3:
public class IntegerDemo {public static void main(String[] args) {Integer a = new Integer(88);a = 99;System.out.println(a);}
}
这里又将输出多少呢?
继续看源码:
public final class Integer extends Number implements Comparable<Integer> {//final修饰变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改//如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。private final int value;public Integer(int value) {this.value = value;}
}
面试题3中的a=99相当于a=new Integer(99);重新给把一个新的对象引用地址给了a,所以a变了,最后输出是99。
那么面试题2呢?
我们都知道在Java中,Java 只有值传递,只不过值传递分为:内存中数值的值传递以及内存地址数值的值传递,传递一个Integer变量参数进去,实际上是构建了一个副本,通过这个副本我们只能去修改原来Integer变量的非final成员变量(假如有的话,也可以是其他类型),上面也说了,如果去修改Integer类型的final变量,那么是会新new一个Integer变量,去覆盖这个变量副本,所以原来的Integer a变量还是原来的,仅仅是test这个方法里的副本变量变了,这么理解就清楚了。所以面试题2 输出88。
来源: Java后端技术栈
搞清楚一道关于Integer的面试题相关推荐
- 用gdb搞清楚一道union相关的面试题
题目并不是特别新鲜,不过这个题目在面试上肯定能筛选一大波人,特别是,有的题目大家看到很多次,但是每次都是简单看看,没有深入分析,结果笔试遇到差不多一样的题目时,自己又傻逼了. 搞C语言,看内存地址是一 ...
- python fun_一道神奇的Python面试题,你会吗?
原标题:一道神奇的Python面试题,你会吗? 无意间,看到这么一道Python面试题:以下代码将输出什么? def testFun: temp = [lambda x : i*x for i in ...
- 一道经典的JavaScript面试题
一道经典的JavaScript面试题 转载于:https://www.cnblogs.com/suoking/p/5227430.html
- 一道丧心病狂的java面试题
转载自 一道丧心病狂的java面试题 无意中了解到如下题目,觉得蛮好. 题目如下: public class TestSync2 implements Runnable {int b = 100; s ...
- python网络爬虫面试题,搞定这套Python爬虫面试题(面试会so easy)
搞定这套Python爬虫面试题(面试会so easy) 来源:中文源码网 浏览: 次 日期:2019年11月5日 [下载文档: 搞定这套Python爬虫面试题(面试会so easy).t ...
- 一道内存分配的面试题后续
昨天写的题目,在VC6.0上面测试一下 一道内存分配的面试题 结果发现一个问题,发现输出结果竟然没有问题,我很慌,如果这样的输出结果没有问题的话,那肯定是跟我们的理论对不上号的. 所以我只能继续调试 ...
- 一道技术美术的面试题
一道技术美术的面试题 https://zhuanlan.zhihu.com/p/27344672 一道技术美术的面试题 王滕昊 游戏开发 话题的优秀回答者 最近看越来越多的知乎小伙伴关注TA的这个 ...
- 转自知乎 知乎ID@方志宏 记一道简单的Java面试题
记一道简单的Java面试题 这可能是历史上最简单的一道Java面试题 题目很简单,完成代码,判断一个整数是否是奇数 public boolean isOdd(int i) 相信相当数量的人都在已经准备 ...
- java笔试题_一道简单的 Java 笔试题,但值得很多人反思
专注于Java领域优质技术,欢迎关注 作者:匿蟒 前言 面试别人,对我来说是一件新奇事,以前都是别人面试我.我清楚地知道,我在的地域与公司,难以吸引到中国的一流软件人才.所以,我特地调低了期望,很少问 ...
最新文章
- cpld xilinx 定义全局时钟_AutoSAR中的时钟同步机制
- 微信公众号点击菜单即可打开并登录微站的实现方法
- 一次难得的分库分表实践
- 这些名言都是有后半句的,以前都按前半句理解,太坑人!
- flash player for linux 64位,linux 64位系统下安装flash player插件
- php如何给数组取名,给表单取名可以为数组,并且可以通过php打印出来
- 算法训练 字符串编辑 java
- 城市大数据的生态模型及应用
- 2019第一季度海外市场手机出货量报告:华为、小米逆势增长
- Java 多线程编程两个简单的例子
- 深入掌握JMS(五):实战Topic 1
- 图解形态学Morphological
- 有道网页翻译chrome插件---我用过的最好的翻译插件
- 什么是网站被黑?网站被黑具体症状表现、网站被黑了怎么办
- writing idiomatic python翻译
- 迪文串口屏幕DMG10600T101_01WTR实现图片切换并和串口通讯
- 【C/C++】【面经】2022 网易互娱面经( 游戏客户端方向 )(更新:一面;二面;)
- 点击不同按钮,eachart图显示不同数据,动态的控制echarts折线的条数
- zabbix 监控下载安装
- 会议信息 | BigBrain研讨会 September 21-23, CEST, 线上