收藏Joshua Bloch和Neal Gafter7道谜题


    在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 codepublicclass SimpleQuestion {staticboolean yesOrNo(String s) {
        s= s.toLowerCase();if (s.equals("yes")|| s.equals("y")|| s.equals("t")) {
            s="true";
        }return Boolean.getBoolean(s);
    }publicstaticvoid main(String[] args) {
        System.out.println(yesOrNo("true")+""+ yesOrNo("Yes"));
    }
}
问题:程序打印什么?
如果熟悉Boolean.getBoolean()这个方法的话,应该不会出错。方法的功能参考文档。

2.Instruments of Tortue
Java codeimport java.util.Arrays;import java.util.Collection;import java.util.HashSet;publicclass InstrumentedHashSet<E>extends HashSet<E> {privateint addCount=0;
    @Overridepublicboolean add(E e){
        addCount++;returnsuper.add(e);
    }

    @Overridepublicboolean addAll(Collection<?extends E> c){
        addCount+= c.size();returnsuper.addAll(c);
    }publicstaticvoid 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 codeimport java.util.Iterator;import java.util.NoSuchElementException;publicabstractclass AbstractIterator<T>implements Iterator<T> {

    T next= nextElement();publicboolean hasNext() {return next!=null;
    }public T next() {if (next==null) {thrownew NoSuchElementException();
        }
        T result= next;
        next= nextElement();return result;
    }publicvoid remove() {thrownew UnsupportedOperationException();
    }protectedabstract T nextElement();privatestatic Iterator<Character> test(final String s) {returnnew AbstractIterator<Character>() {privateint cursor=0;protected Character nextElement() {return cursor== s.length()?null : s.charAt(cursor++);
            }
        };
    }publicstaticvoid main(String[] args) {for (Iterator<Character> i= test("OPS"); i.hasNext();) {
            System.out.print(i.next());
        }
    }
}
问题:输出结果是什么?

理解如何正确的设计Iterator。

4.Search for the One
Java codeimport java.util.ArrayList;import java.util.Collections;import java.util.Comparator;import java.util.List;publicclass Searching {publicstaticvoid 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>(){publicint compare(Integer i,Integer j){return i<j?-1:(i==j?0:1);
        }
    };
}
问题:打印结果是什么?

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

5.Cogito Ergo Sum
Java codeimport java.util.LinkedHashMap;import java.util.Map;publicenum RomanNumeral {

    I(1), V(5), X(10), L(50), C(100), D(500), M(1000);privatestatic Map<Integer, RomanNumeral> map=new LinkedHashMap<Integer, RomanNumeral>();publicfinalint val;

    RomanNumeral(int val) {this.val= val;
        storeInMap();
    }privatevoid storeInMap() {
        map.put(val,this);
    }publicstatic RomanNumeral fromInt(int val) {return map.get(val);
    }publicstaticvoid 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 codepublicclass ThreadFriendly {
    ThreadLocal<Value> threadLocalPart=new ThreadLocal<Value>();class Value{finalint i;
        Value(int i){this.i= i;
        }
    }
   
    ThreadFriendly setThreadVal(int i){
        threadLocalPart.set(new Value(i));returnthis;
    }int getThreadVal(){return threadLocalPart.get().i;
    }publicstaticvoid 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 codepublicclass PrintWords {publicstaticvoid main(String[] args) {
        System.out.println(
            Words.FIRST+""+ Words.SECOND+""+ Words.THIRD
        );
    }
}publicclass Words{publicstaticfinal String FIRST="the";publicstaticfinal String SECOND=null;publicstaticfinal String THIRD="set";
}
编译PrintWords.java文件。
修改Words.java文件为
Java codepublicclass Words{publicstaticfinal String FIRST="physics";publicstaticfinal String SECOND="chemistry";publicstaticfinal String THIRD="biology";
}
问题:再次编译运行PrintWords.java,打印结果是什么?

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

 

 

分析和解答可以参考
原作者的演示材料:
http://developers.sun.com/learning/javaoneonline/sessions/2009/pdf/TS-5186.pdf
或者我的分析总结:
http://blog.csdn.net/ZangXT/archive/2009/07/29/4391628.aspx

收藏于csdn论坛:

http://topic.csdn.net/u/20090729/17/e1ea6275-8f7a-4b5c-af97-c0db404f4bc0.html?64814#replyachor

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值