在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