博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[转]如何编程实现 2 + 2 = 5?
阅读量:4692 次
发布时间:2019-06-09

本文共 1394 字,大约阅读时间需要 4 分钟。

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

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

,看到这个题目,感觉很新颖,第一个答案就是用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

你可能感兴趣的文章
JS等比例缩小图片尺寸
查看>>
解决Robot Framework运行时没有Log的方案
查看>>
AS3.0实例学习 熟悉新的事件机制和addChild的运用
查看>>
总结的几个cocoapods的几个常见问题
查看>>
「HDU6583 Typewriter」 - 后缀自动机
查看>>
密码框input不允许输入汉字,只可输入数字和字母等
查看>>
【2000*】【Codeforces Round #518 (Div. 1) [Thanks, Mail.Ru!] B】Multihedgehog
查看>>
【9108】模拟数学计算器
查看>>
日留存、周留存、月留存,究竟怎样才能让更多的用户留下来?
查看>>
Handler
查看>>
Redis应用场景
查看>>
非常可乐 HDU1495
查看>>
记录linq.js神器之gorup by 多个字段的方法
查看>>
luogu4360 锯木厂选址 (斜率优化dp)
查看>>
bzoj4571/luogu3293 美味 (主席树+贪心)
查看>>
mysql数据库下载和创建
查看>>
iPhone OS平台:丰富的可能性
查看>>
Codeforces 463D Gargari and Permutations(求k个序列的LCS)
查看>>
Dedecms之SQL语句修改和调用数据总结
查看>>
遍历Panel1中所有label控件的Text
查看>>