1加1在什么情况下等于3
来源:互联网 发布:linux 卸载驱动模块 编辑:程序博客网 时间:2024/05/17 04:59
通过Java代码可以实现1+1=3,先看代码
package com.shendd.test;import java.lang.reflect.Field;public class IntegerTest {public static void main(String[] args) {changeCache();int a = 1;System.out.printf("%d + %d = %d", a, a, a + a);}private static void changeCache() {try {Class<?> cache = Integer.class.getDeclaredClasses()[0];Field myCache = cache.getDeclaredField("cache");myCache.setAccessible(true);Integer[] newCache = (Integer[]) myCache.get(cache);newCache[130] = newCache[131];} catch (Exception e) {e.printStackTrace();}}}就是上面这段代码可以输出:1+1=3,不相信的同学可以亲自验证一下,如果不对,笔者愿终身搬砖,从此不再踏入IT界半步。
那么问题来了为什么1+1=3了呢?且听笔者详细道来...
在看一段代码:
Integer a = 127, b = 127;Integer a1 = 128, b1 = 128;System.out.println(a == b);System.out.println(a1 == b1);相信这段代码大家都会认为很简单,但是答案却不一样,有人会说输出true true,有人会说输出false false,然而,结果却是true false。为什么呢?
基本知识:==比较的是对象是否相等,如果两个引用指向同一个对象则==比较为true,否者为false,即使他们的内容相同。也就是说,上面的代码a和b指向的是同一对象,
a1和b1不是同一个对象,这是为什么呢?在看一段代码:
/** * Returns a <tt>Integer</tt> instance representing the specified * <tt>int</tt> value. * If a new <tt>Integer</tt> 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. * * @param i an <code>int</code> value. * @return a <tt>Integer</tt> instance representing <tt>i</tt>. * @since 1.5 */ public static Integer valueOf(int i) { if(i >= -128 && i <= IntegerCache.high) return IntegerCache.cache[i + 128]; else return new Integer(i); }
这是Integer类的valueOf源码,由以上这段代码可以看出,当int值在-128到127之间的情况下,Integer直接返回IntegerCache类中存的值,该类是一个内部的私有类,它缓存了
-128到127之间所有的整数对象。所以问题就清晰了:Integer a = 127的时候,a存的就是IntegerCache类中返回来的内存中的地址,而Integer a1 = 128的时候,a1存的则是在
内存中新开辟的一个空间地址。也就是说如果值得范围在-128到127之间,它就从高速缓存返回实例。
现在你应该就知道为什么1+1=3了吧?
1 0
- 1加1在什么情况下等于3
- iOS 闭包中的[weak self]在什么情况下需要使用,什么情况下可以不加?
- ssm什么情况下必须加@Repository,什么情况下不用加@Repository
- 小弟连连在岭下等接 水浒传
- java 面试题之1+1在什么情况下不等于2 ?
- 访问action的时候什么情况下加.do
- 什么情况下需要加extern "C",通俗易懂
- 多线程编程中什么情况下需要加 volatile?
- 经常在类名那有错,修改后,经常加了private static final long serialVersionUID = 1L; 这个是什么意思,加了有什么用?
- 在什么情况下用new
- 静态类在什么情况下使用
- 《在什么情况下创建扩展点》
- 索引在什么情况下失去作用
- 复合索引在什么情况下使用
- IVM在什么情况下可以使用
- @responsebody一般在什么情况下使用
- properties配置文件在什么情况下不起作用
- layoutSubviews在什么情况下调用
- Lesson 3: Hidden faces removal (z buffer)
- C# winform form之间传值(本人亲测)(2)
- MFC Edit Control 鼠标离开编辑框时显示消息
- 深度卷积网络CNN与图像语义分割
- 单例模式与双重检测
- 1加1在什么情况下等于3
- 输入adb shell 时 提示error: more than one device and emulator
- reverse linked list II
- hdu4758Walk Through Squares【AC自动机+dp】
- eclipse黑色高亮主题下载和配置
- DedeCms arclist调用tag标签
- AngularJS简介
- 基于OpenWrt的Wol(wake on lan)远程唤醒
- Win10如何用文件检查器检查修复系统的受损文件?Win10修复受损文件的技巧