以下内容转自:http://www.open-open.com/news/view/b70d9

-------------------------------------------------------------

Write a program that makes 2 + 2 = 5,看到这个题目,感觉很新颖,第一个答案就是用Java实现的。用上了Java中的整型实例池的概念。以前只看到过实例池导致两个对象的指针相同的问题,即

Integer a = new Integer(2);
Integer b = new Integer(2);
System.out.print(a == b);

上面的代码最终输出的是true,按照Java对象的申请原则来说,这里应该是false才对。正是因为JVM在实现的时候,默认生成了一些 Integer对象的实例,当需要的实例是池子中已经存在的数值时,直接返回已经生成的对象的引用,不必新构造对象。这样可以极大减少实例数目和程序运行 性能。

而这个题目是将池子中的对象的内容进行了修改,最终使得取回的实例的值发生了改变。这样其实很危险的,如果在正式运行程序的业务代码之前,做这个修改,那么整个程序的运行逻辑将产生混乱。

import java.lang.reflect.Field;public class Main {public static void main(String[] args) throws Exception {Class cache = Integer.class.getDeclaredClasses()[0];Field c = cache.getDeclaredField("cache");c.setAccessible(true);Integer[] array = (Integer[]) c.get(cache);array[132] = array[133];System.out.printf("%d",2 + 2);}
}

上面是具体的代码,最终输出的结果为5,作者给出的解释为:

You need to change it even deeper than you can typically access. Note that this is designed for Java 6 with no funky parameters passed in on the JVM that would otherwise change the IntegerCache.
Deep within the Integer class is a Flyweight of Integers. This is an array of Integers from −128 to +127. cache[132] is the spot where 4 would normally be. Set it to 5.

利用缓存的读写接口,将4这个实例的缓存对象的指针改为指向5的实例对象了,这样,当应用程序取出4时,实际上返回的是5的引用,打印出来的也就是5了。

转载于:https://www.cnblogs.com/GYoungBean/p/3767871.html

[转]如何编程实现 2 + 2 = 5?相关推荐

  1. C++核心编程(一)

    C++ 核心编程 本系类列博客都是根据黑马的C++视频做的笔记. 本阶段主要针对C++面向对象编程技术做详细记录,探讨C++中的核心和精髓. 1.内存分区模型 C++程序在执行时,将内存大方向划分为4 ...

  2. 【Spring】面向切面编程AOP

    AOP基础 什么是AOP [废话解释]在软件业,AOP全称Aspect Oriented Programming 即:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AO ...

  3. python编程问题--第二次

    本质上grp 是一个dataframe 后面接一个[] 得到 series 两个[] 得到dataframe Groupby 如果后面放as_index=False 后面就能连续添加了 不加的话  同 ...

  4. OpenCL编程详细解析与实例

    OpenCL编程详细解析与实例 C语言与OpenCL的编程示例比较 参考链接: https://www.zhihu.com/people/wujianming_110117/posts 先以图像旋转的 ...

  5. C语言与OpenCL的编程示例比较

    C语言与OpenCL的编程示例比较 OpenCL支持数据并行,任务并行编程,同时支持两种模式的混合.对于同步 OpenCL支持同一工作组内工作项的同步和命令队列中处于同一个上下文中的 命令的同步. 在 ...

  6. LLVM一些编程语法语义特性

    LLVM一些编程语法语义特性 High Level Structure Module Structure LLVM 程序由Module's组成,每个 's 是输入程序的一个翻译单元.每个模块由函数.全 ...

  7. Structured Streaming编程 Programming Guide

    Structured Streaming编程 Programming Guide • Overview • Quick Example • Programming Model o Basic Conc ...

  8. TensorFlow编程结构

    TensorFlow编程结构 TensorFlow 与其他编程语言非常不同. 首先通过将程序分为两个独立的部分,构建任何拟创建神经网络的蓝图,包括计算图的定义及其执行.起初这对于传统程序员来说看起来很 ...

  9. MindSpore API编程概述

    MindSpore API编程概述 总体架构 MindSpore是一个全场景深度学习框架,旨在实现易开发.高效执行.全场景覆盖三大目标,其中易开发表现为API友好.调试难度低,高效执行包括计算效率.数 ...

  10. GPU编程和流式多处理器(二)

    GPU编程和流式多处理器(二) 2. 整数支持 SM具有32位整数运算的完整补充. • 加法运算符的可选否定加法 • 乘法与乘法加法 • 整数除法 • 逻辑运算 • 条件码操作 • to/from浮点 ...

最新文章

  1. 30岁前挣够500万
  2. 全球有多少 C/C++ 程序员?Java 和 Python 又有多少?
  3. iOS开发学习之MapKit - 获得在MapView(地图)中显示多个标记的区域(MKCoordinateRegion)...
  4. 面试 .NET 开发​,为什么也要考算法?​
  5. C++模板的一些基础知识
  6. 根据Ping(ICMP协议)得到TTL并分析
  7. charCode与keyCode的区别
  8. 祛除光盘上的小划痕/光盘的工作原理/光盘的正确使用方法
  9. 《Python核心编程》第二版第八章练习题答案 第三部分
  10. 尚硅谷JVM笔记(宋红康主讲)
  11. 微信小程序 生成二维码
  12. nx518j最新android,努比亚 NX518J 开启USB调试模式
  13. HTML上下左右布局
  14. Edge浏览器如何关闭金山毒霸安全主页.
  15. python+opencv填充图像不规则区域:fillPoly和fillConvexPoly区别、半透明填充方法
  16. 服务器ubuntu系统调节亮度,Ubuntu系统下调节屏幕亮度的两种Linux命令
  17. word2016 上次启动时失败以安全模式能够解决该问题【office专业版】
  18. 苹果12轻点背面不灵敏如何解决
  19. 【练习】搜狗搜索界面
  20. 【2017今日头条】头条校招(JAVA)

热门文章

  1. 如何在Mac上添加密码提示?
  2. CES现场直击 AI让你现场获得虚拟双胞胎
  3. 由浅入深,汇编语言详解与二进制漏洞初阶
  4. ASP.NET:返回按钮的解决方案摸索
  5. Android存储(1)-- 你还在乱用Android存储嘛!!!
  6. 配置Nginx不同域名访问不同项目
  7. Bash脚本15分钟进阶教程-转
  8. saltstack安装使用
  9. cisco3745做Easy ×××
  10. win2003 ent 64 + mssql ent 64