有趣的Java小代码

  在2009年的JavaOne大会上,Joshua Bloch和Neal Gafter又为我们带来的7道谜题,挺有意思的。大家不妨看看。
摘自:
Return of the Puzzlers: Schlock and Awe
Joshua Bloch, Google, Inc.; Neal Gafter, Microsoft
http://developers.sun.com/learning/javaoneonline/sessions/2009/pdf/TS-5186.pdf
1.Life's Persistent Questions

Java code
   
   
public class SimpleQuestion { static boolean yesOrNo(String s) { s = s.toLowerCase(); if (s.equals( " yes " ) || s.equals( " y " ) || s.equals( " t " )) { s = " true " ; } return Boolean.getBoolean(s); } public static void main(String[] args) { System.out.println(yesOrNo( " true " ) + " " + yesOrNo( " Yes " )); } }


问题:程序打印什么?
如果熟悉Boolean.getBoolean()这个方法的话,应该不会出错。方法的功能参考文档。

2.Instruments of Tortue

Java code
   
   
import java.util.Arrays; import java.util.Collection; import java.util.HashSet; public class InstrumentedHashSet < E > extends HashSet < E > { private int addCount = 0 ; @Override public boolean add(E e){ addCount ++ ; return super .add(e); } @Override public boolean addAll(Collection <? extends E > c){ addCount += c.size(); return super .addAll(c); } public static void main(String[] args) { InstrumentedHashSet < String > s = new InstrumentedHashSet < String > (); s.addAll(Arrays.asList( " Accordion " , " Banjo " , " Kazoo " )); System.out.println(s.addCount); } }


问题:打印结果是什么?

这个看第一遍可能会出错,不过也算容易理解。

3.Iterator Titillator

Java code
   
   
import java.util.Iterator; import java.util.NoSuchElementException; public abstract class AbstractIterator < T > implements Iterator < T > { T next = nextElement(); public boolean hasNext() { return next != null ; } public T next() { if (next == null ) { throw new NoSuchElementException(); } T result = next; next = nextElement(); return result; } public void remove() { throw new UnsupportedOperationException(); } protected abstract T nextElement(); private static Iterator < Character > test( final String s) { return new AbstractIterator < Character > () { private int cursor = 0 ; protected Character nextElement() { return cursor == s.length() ? null : s.charAt(cursor ++ ); } }; } public static void main(String[] args) { for (Iterator < Character > i = test( " OPS " ); i.hasNext();) { System.out.print(i.next()); } } }


问题:输出结果是什么?

理解如何正确的设计Iterator。

4.Search for the One

Java code
   
   
import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; public class Searching { public static void main(String[] args) { String[] strings = { " 0 " , " 1 " , " 2 " , " 3 " , " 4 " , " 5 " }; List < Integer > integers = new ArrayList < Integer > (); for (String s : strings){ integers.add(Integer.valueOf(s)); } System.out.println(Collections.binarySearch(integers, 1 ,cmp)); } static Comparator < Integer > cmp = new Comparator < Integer > (){ public int compare(Integer i,Integer j){ return i < j ?- 1 :(i == j ? 0 : 1 ); } }; }


问题:打印结果是什么?

如果看过《Java Puzzlers》这本书的话应该容易发现问题。

5.Cogito Ergo Sum

Java code
   
   
import java.util.LinkedHashMap; import java.util.Map; public enum RomanNumeral { I( 1 ), V( 5 ), X( 10 ), L( 50 ), C( 100 ), D( 500 ), M( 1000 ); private static Map < Integer, RomanNumeral > map = new LinkedHashMap < Integer, RomanNumeral > (); public final int val; RomanNumeral( int val) { this .val = val; storeInMap(); } private void storeInMap() { map.put(val, this ); } public static RomanNumeral fromInt( int val) { return map.get(val); } public static void main(String[] args) { int sum = 0 ; for ( int i = 0 ; i < 1000 ; i ++ ) { if (fromInt(i) != null ) { sum += i; } } System.out.println(sum); } }


问题:打印结果是什么?

如果理解java加载类和创建对象的顺序的话这个问题容易理解。

6.Thread Friendly

Java code
   
   
public class ThreadFriendly { ThreadLocal < Value > threadLocalPart = new ThreadLocal < Value > (); class Value{ final int i; Value( int i){ this .i = i; } } ThreadFriendly setThreadVal( int i){ threadLocalPart.set( new Value(i)); return this ; } int getThreadVal(){ return threadLocalPart.get().i; } public static void main(String[] args) { int sum = 0 ; for ( int i = - 500000 ;i <= 500000 ;i ++ ){ sum += new ThreadFriendly().setThreadVal(i).getThreadVal(); } System.out.println(sum); } }


问题:打印结果是什么?

理解内部类和ThreadLocal。

7.When Words Collide

Java code
   
   
public class PrintWords { public static void main(String[] args) { System.out.println( Words.FIRST + " " + Words.SECOND + " " + Words.THIRD ); } } public class Words{ public static final String FIRST = " the " ; public static final String SECOND = null ; public static final String THIRD = " set " ; }


编译PrintWords.java文件。
修改Words.java文件为

Java code
   
   
public class Words{ public static final String FIRST = " physics " ; public static final String SECOND = " chemistry " ; public static final String THIRD = " biology " ; }


问题:再次编译运行PrintWords.java,打印结果是什么?

需要了解常量折叠现象,理解什么是常量。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值