java Integer中隐藏的细节魔鬼!来自面试官的三轮暴击!
1 第一波暴击!!!
程序员比较实在,一般会说:
那就先上代码
package com.example.demo;
public class TestInteger {
public static void main(String[] args) {
Integer SmallThan127=15;
Integer anotherSmallThan127=15;
System.out.println(SmallThan127==anotherSmallThan127);
System.out.println(SmallThan127.equals(anotherSmallThan127)); Integer biggerThan127=365;
Integer anotherBiggerThan127=365;
System.out.println(anotherBiggerThan127==biggerThan127);
System.out.println(anotherBiggerThan127.equals(biggerThan127));
}
}
不卖官司,直接给出输出结果
true
true
false
true
错误的去面壁吧!!!!!!!!!!!!!!
2 第二波暴击!!!
有人会说:“这个我知道![-128,127]之间,指向已经存在的对象的引用;否则创建一个新的Integer对象”
证据呢?为什么要这样做?涉及到了什么知识点?Boolean,Byte,Short,Character,Long,Float,Double等有没有同样的情况?如果有的话,范围分别是多少?
2.1 证据很好拿,debug一下
其中:static final int low = -128;high=127(间接)
2.2 这样做的依据是什么?
源码算吗?
Integer SmallThan127=15;
Integer biggerThan127=365;
通过调用包装器的 Integer.valueOf方法实现的
/**
* Returns an {@code Integer} instance representing the specified
* {@code int} value. If a new {@code Integer} instance is not
* required, this method should generally be used in preference to
* the constructor {@link #Integer(int)}, as this method is likely
* to yield significantly better space and time performance by
* caching frequently requested values.
*
* This method will always cache values in the range -128 to 127,
* inclusive, and may cache other values outside of this range.
*
* @param i an {@code int} value.
* @return an {@code Integer} instance representing {@code i}.
* @since 1.5
*/
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
这就是传说中的装箱boxing
还是不理解,不见棺材不落泪呀!
看实现标准,官方指定的,犹如宪法
关于装箱的转换【1】
2.3 Boolean,Byte,Short,Character,Long,Float,Double这些看spec就行,还要我说吗?
3 第三波暴击!!!
public class TestInteger {
public static void main(String[] args) {
Integer SmallThan127=new Integer(15);
Integer anotherSmallThan127=new Integer(15);
System.out.println(SmallThan127==anotherSmallThan127);
System.out.println(SmallThan127.equals(anotherSmallThan127)); Integer biggerThan127=new Integer(365);
Integer anotherBiggerThan127=new Integer(365);
System.out.println(anotherBiggerThan127==biggerThan127);
System.out.println(anotherBiggerThan127.equals(biggerThan127));
}
}
请问结果是什么?
正确答案是
false
true
false
true
为什么会这样?
公布答案吧
3.1 ==的不同使用方法
==当两边都是对象的时候,会比较对象;
==当不都是对象时,会进行拆箱比较
3.2 equal时,进行值得比较,源码如下:
/**
* Compares this object to the specified object. The result is
* {@code true} if and only if the argument is not
* {@code null} and is an {@code Integer} object that
* contains the same {@code int} value as this object.
*
* @param obj the object to compare with.
* @return {@code true} if the objects are the same;
* {@code false} otherwise.
*/
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
如果能经受住上面三轮暴击,看到最后的,你有成为优秀的程序员的潜质了,恭喜你了!
参考资料
【1】https://docs.oracle.com/javase/specs/jls/se12/html/jls-5.html#jls-5.1.7
【2】https://docs.oracle.com/javase/specs/jls/se12/html/jls-15.html#jls-15.25
java Integer中隐藏的细节魔鬼!来自面试官的三轮暴击!的更多相关文章
- Java堆内存是线程共享的!面试官:你确定吗?
Java作为一种面向对象的,跨平台语言,其对象.内存等一直是比较难的知识点,所以,即使是一个Java的初学者,也一定或多或少的对JVM有一些了解.可以说,关于JVM的相关知识,基本是每个Java开发者 ...
- Java Integer中的IntegerCache小记
同事今天给我发了一个关于Java拆装箱的ppt,里面有这么一段代码 Integer c = Integer.valueOf(3); Integer d = Integer.valueOf(3); ...
- 关于java序列化中的一个细节
java序列化机制的可以参考很多资料了,最近在看的时候发现了一些问题. 1. 默认的序列化机制,很多书里讲到序列化类只序列化类名,实例变量,不会实例化类变量(static)和瞬态变量(transien ...
- 深度剖析Java的volatile实现原理,再也不怕面试官问了
上篇文章我们讲了synchronized的用法和实现原理,我们总爱说synchronized是重量级锁,volatile是轻量级锁.为什么volatile是轻量级锁,体现在哪些方面?以及volatil ...
- 面试官,不要再问我“Java虚拟机类加载机制”了
关于Java虚拟机类加载机制往往有两方面的面试题:根据程序判断输出结果和讲讲虚拟机类加载机制的流程.其实这两类题本质上都是考察面试者对Java虚拟机类加载机制的了解. 面试题试水 现在有这样一道判断程 ...
- 面试官,不要再问我“Java虚拟机类加载机制”了(转载)
关于Java虚拟机类加载机制往往有两方面的 面试题:根据程序判断输出结果和讲讲虚拟机类加载机制的流程.其实这两类题本质上都是考察面试者对Java虚拟机类加载机制的了解. 面试题试水 现在有这样一道判断 ...
- 作为Java技术面试官,我如何深挖候选人的技能
作为Java资深技术面试官,首先我感觉有必要讲解"面试官深挖问题"的动机,在了解动机的前提下,大家才能更好地准备面试.面试官为什么要在一个点上深挖?两大目的. 1 首先是通过深 ...
- 面试官,不要再问我“Java 垃圾收集器”了
如果Java虚拟机中标记清除算法.标记整理算法.复制算法.分代算法这些属于GC收集算法中的方法论,那么"GC收集器"则是这些方法论的具体实现. 在面试过程中这个深度的问题涉及的比较 ...
- Java面试官最爱问的volatile关键字
在Java的面试当中,面试官最爱问的就是volatile关键字相关的问题.经过多次面试之后,你是否思考过,为什么他们那么爱问volatile关键字相关的问题?而对于你,如果作为面试官,是否也会考虑采用 ...
随机推荐
- Linux中ps -elf和ps aux的区别
一.前言 Linux下输入命令man ps查看: 加横线是 standard syntax -- 比如ps -elf 不加横线是 BSD syntax -- 比如ps aux To see ...
- Spring Boot MVC api返回的String无法关联到视图页面
1:问题 使用 @Restcontroller 返回值定义为String 时 无法返回具体的页面 @RestController public class HelloController { @Get ...
- oracle相邻表记录交换(单双两两交换)
在博客园的博问中看到了一个这样的提问:一个表中有id和name两个字段,id是连续非空不重复的,想要交换相邻表记录的name值(单双两两交换). 另外,如果最后的单独行没有对应的下一行匹配记录的话,就 ...
- 解决root无法登陆
今天重装了一下虚拟机,用filezilla往Linux扔文件需要用root的超级权限,但是却不能建立连接,使用账号密码也无法登录root账户 鼓捣好一阵才知道,因为root权限太高了,可以针对root ...
- 基于EF的一个简单实战型分层架构
注:此博客仅适合于刚入门的Asp.net Core初学者,仅做参考. 学了3个月的Asp.net Core,将之前一个系统(http://caijt.com/it)的PHP后端用Asp.net Cor ...
- 【C#】学习笔记 abstract、virtual、interface使用的一些栗子
上
- Dynamics CRM 2015/2016新特性之三十四:有了插件日志,调试插件so easy!
关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复217或者20160330可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong. ...
- vue v-if和v-show的区别
其中v-if依赖于控制DOM节点,而v-show是依赖于控制DOM节点的display属性. 当v-show传入的值为true时,对应DOM元素的display的值为block之类的,反之为false ...
- 小程序组件化开发框架---wepy 项目创建
wepy是一个优秀的微信小程序组件化框架,突破了小程序的限制,支持了npm包加载以及组件化方案.这里就以我个人的经历讲下怎么创建wepy项目. 1.首先 在桌面(自己选定目录下)新建一个文件夹,注意需 ...
- start_udev 是不是会写磁盘头
遇到一个案例,在这里记录一下 一套Oracle 11.2.0.4 RAC环境,操作系统是RHEL 6.5,共享磁盘是通过UDEV实现RAW绑定设备名,如下 [root@rac1 opt]# ll /d ...