Java - 机智地让1+1的结果变成3

原出处是国外某论坛某帖子中楼主提问:如何让1+1=3?

于是出现了各种语言实现的各种机制的答案,当然其中也包括直接用字符串输出"1+1=3"...

最后被采纳的是用Java语言实现的答案。

以下是答案:

public static void main(String[] args) throws IllegalAccessException, NoSuchFieldException {
        Class cache = Integer.class.getDeclaredClasses()[0];
        Field c = cache.getDeclaredField("cache");
        c.setAccessible(true);
        Integer[] array = (Integer[]) c.get(cache);
        array[130] = array[131];
        System.out.printf("%d", 1 + 1);
}

作者解释:

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.

这样思路已经很明确了。

Integer.class.getDeclaredClasses()[0]指向IntegerCache类,其cache域在静态初始化块内进行初始化,缓存-128到127,由此可知cache[130]==2。

        static {
            // high value may be configured by property
            int h = 127;
            String integerCacheHighPropValue =
                sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
            if (integerCacheHighPropValue != null) {
                int i = parseInt(integerCacheHighPropValue);
                i = Math.max(i, 127);
                // Maximum array size is Integer.MAX_VALUE
                h = Math.min(i, Integer.MAX_VALUE - (-low));
            }
            high = h;

            cache = new Integer[(high - low) + 1];
            int j = low;
            for(int k = 0; k < cache.length; k++)
                cache[k] = new Integer(j++);
        }

看到这里便恍然大悟,几乎使用Java有一段时间的人都知道这一点,于是写出了如下代码,只可惜运行结果仍然是2:

public static void main(String[] args) throws IllegalAccessException, NoSuchFieldException {
        Class cache = Integer.class.getDeclaredClasses()[0];
        Field c = cache.getDeclaredField("cache");
        c.setAccessible(true);
        Integer[] array = (Integer[]) c.get(cache);
        array[130] = array[131];
        System.out.println(1+1);
}

问题就出在printf还是println。

参考println的方法声明,作者对于不同的基本类型都提供了overwrite,而printf并没有为基本类型提供方法。

虽说printf("%d",1+1)相当于System.out.println(String.format("%d", 1 + 1));

但问题的本质还是在于println(1+1)的结果仍是基本类型,并没有进行装箱。

即,System.out.println((Integer)1+1);的结果为3.

Java - 机智地让1+1的结果变成3

时间: 2024-10-20 22:52:05

Java - 机智地让1+1的结果变成3的相关文章

29个要点帮你完成java代码优化

通过java代码规范来优化程序,优化内存使用情况,防止内存泄露 可供程序利用的资源(内存.CPU时间.网络带宽等)是有限的,优化的目的就是让程序用尽可能少的资源完成预定的任务.优化通常包含两方面的内容:减小代码的体积,提高代码的运行效率.本文讨论的主要是如何提高代码的效率.在Java程序中,性能问题的大部分原因并不在于Java语言,而是在于程序本身.养成好的代码编写习惯非常重要,比如正确地.巧妙地运用java.lang.String类和java.util.Vector类,它能够显著地提高程序的性

java学习日记 集合框架

集合框架 有两大接口  一个是 Collection (类集 )与Map (映射): collection 下有两大接口  一个是List (列表) 另一个是Set(集合) List (列表):ArrayList 基于数组实现的动态列表    动态数组 : LinkedList 基于链表实现的列表      双向循环链表 Vector 向量   ------>stack栈           与线程相关: Set (集合) :TreeSet       通过树实现的集合  有序集合 HashSe

java代码效率优化

[转载于http://blog.163.com/user_zhaopeng/blog/static/16602270820122105731329/] 1. 尽量指定类的final修饰符 带有final修饰符的类是不可派生的. 如果指定一个类为final,则该类所有的方法都是final.Java编译器会寻找机会内联(inline)所有的 final方法(这和具体的编译器实现有关).此举能够使性能平均提高50% . 2. 尽量重用对象. 特别是String 对象的使用中,出现字符串连接情况时应用S

java代码优化总结1

java代码优化 可供程序利用的资源(内存.CPU时间.网络带宽等)是有限的,优化的目的就是让程序用尽可能少的资源完成预定的任务.优化通常包含两方面的内容:减小代码的体积,提高代码的运行效率.本文讨论的主要是如何提高代码的效率. 在Java程序中,性能问题的大部分原因并不在于Java语言,而是在于程序本身.养成好的代码编写习惯非常重要,比如正确地.巧妙地运用 java.lang.String类和java.util.Vector类,它能够显著地提高程序的性能.下面我们就来具体地分析一下这方面的问题

java实现redis缓存技术

需要jar包: jedis-2.1.0.jar commons-pool-1.6.jar 单元测试: package com.wangbingan.db; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import org.junit.Before; import org.junit.Test; import com.wangbinga.util.RedisUtil; import redis

java 代码优化

参考:http://blog.chinaunix.net/uid-11775320-id-3201162.html 可供程序利用的资源(内存.CPU时间.网络带宽等)是有限的,优化的目的就是让程序用尽可能少的资源完成预定的任务.优化通常包含两方面的内容:减小代码的体积,提高代码的运行效率. 本文讨论的主要是如何提高代码的效率. 在 Java程序中,性能问题的大部分原因并不在于Java语言,而是在于程序本身.养成好的代码编写习惯非常重要,比如正确地.巧妙地运用 java.lang.String类和

Java程序基本优化

1.尽量指定类的final修饰符,因为带有final修饰符的类是不可派生的. 2.尽量重用对象. 3.尽量使用局部变量. 4.不要重复初始化变量. 5.在Java+Oracle的应用系统开发中,Java中内嵌的SQL语句应尽量使用大写,以减轻Oracle解析器解析的负担. 6.在Java编程过程中进行数据库连接.I/O流操作时务必小心,使用完毕后应及时关闭以释放资源. 7.JVM(Java虚拟机)有自身的GC(垃圾回收机制),但并非十分机智.用户对象后手动设置成null. 8.在使用同步机制时,

Java后台工程师面试杂记——不跳不涨工资星人跳槽经历

经过接近一个月的时间,完成换工作这件“小事”,前后总计面试了多家公司,最后也没接到几个offer,不过最终总算尘埃落定,就对这个过程进行一个总结吧. 在某互联网公司工作了近一年的时间,但是频繁的业务需求和大强度的加班,无聊的工作内容以及公司就要搬家的前景,促成了自己换工作的打算,在做出这个打算之后几乎立即就和老大说了这件事情,这个举动结果有好有坏,正面意义是我请假或是懒得请假去参加面试的时候,显得没啥心理负担,负面影响就是如果短时间找不到就只能先滚犊子了.因为面试的是Java后台开发,而且是属于

[JAVA]HDU 4919 Exclusive or

题意很简单, 就是给个n, 算下面这个式子的值. 重点是n的范围:2≤n<10500. 比赛的时候 OEIS一下得到了一个公式: a[0]=a[1]=a[2]=0; n为偶数 : 2*a(n/2)+2*a(n/2-1)+4*(n/2-1); n为奇数 : 4*a((n-1)/2)+6*((n-1)/2) 然后勇敢的打了一发暴力...想也知道肯定TLE... 之后 学到了一种机智的按位算的方法 1 import java.io.*; 2 import java.util.*; 3 import j