Core Java
My favourite Java puzzler 2 + 1 = 4
Here’s my current favourite Java puzzler. How can you get your code to do this?
1 2 3 4 | Integer b = 2 ; Integer c = 1 ; System.out.println( "b+c : " + (b+c) ); // output: 'b+c : 4' !! |
There are no tricks with Sytem.out.println() i.e. you would be able to see the same value in a debugger. Clue: You need to add a few lines of code somewhere before this in your program. Scroll down for the solution.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
01 02 03 04 05 06 07 08 09 10 11 12 | public static void main(String... args) throws Exception{ Integer a = 2 ; Field valField = a.getClass().getDeclaredField( "value" ); valField.setAccessible( true ); valField.setInt(a, 3 ); Integer b = 2 ; Integer c = 1 ; System.out.println( "b+c : " + (b+c) ); // b+c : 4 } |
As you can see (and I would encourage you to go to the source code for Integer) there is a static cache (look for the Inner class IntegerCache) where the value of the Integer is mapped to its corresponding int value. The cache will store all numbers from -128 to 127 although you can tune this using the property java.lang.Integer.IntegerCache.high
.
Reference: | My favourite Java puzzler 2 + 1 = 4 from our JCG partner Daniel Shaya at the Rational Java blog. |
This would of been really interesting if it was primitive values that were used.
Daniel, that was quite… puzzling :)
Have you read the Java Puzzlers book? There are many brain teasers in it. For example can you make this code become an infinite loop:
while (i == i + 1) {
}
Quite puzzling, huh? :)
If you’d like the answer and a few more puzzlers, I invite you to read more here: http://methodicalprogrammer.com/blog/5-puzzles-that-prove-you-need-to-read-java-puzzlers
in my case output was 3 only. i am using jdk 904