几个谜题,深入的了解java解决思路

几个谜题,深入的了解java在2009年的JavaOne大会上,Joshua Bloch和Neal Gafter又为我们带来的7道谜题,挺有

几个谜题,深入的了解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,打印结果是什么?

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

[解决办法]
mark学习
[解决办法]
正真考验了java的功底,很不错的
[解决办法]
5555555555555555
crying...
[解决办法]
收藏了。
[解决办法]
收藏~
[解决办法]
嗯,确实是有深度
第一题

getBoolean(String name)
当且仅当以参数命名的系统属性存在,且等于 "true" 串时,返回为 true。

这样写的话,返回true了
Java code
    public static void main(String[] args) {        Properties   p   =   System.getProperties();           p.setProperty("test",   "true");           System.out.println("Boolean.getBoolean():"   +   Boolean.getBoolean("test"));    } 


[解决办法]
我是接分的。。。
[解决办法]
新手,一个不会
[解决办法]
啊呀!真不错列
[解决办法]

探讨
嗯,确实是有深度
第一题

getBoolean(String name)
当且仅当以参数命名的系统属性存在,且等于 "true" 串时,返回为 true。

这样写的话,返回true了
Java codepublicstaticvoid main(String[] args) {
Properties p= System.getProperties();
p.setProperty("test","true");
System.out.println("Boolean.getBoolean():"+ Boolean.getBoolean("test"));
}

[解决办法]
正在学习中,先给顶一下。
[解决办法]
接分,基本不会。。。。
[解决办法]
探讨
引用:
别人都知道Boolean.getBoolean(s)查看的是系统变量值。
不知道的飘过,很多东西都需要用到去现查文档。

[解决办法]
《Java Puzzlers》没有看过,不过我估计问题出在i==j上。
[解决办法]
学习了 看了几个问题 觉得都是对JAVA中容易忽视的问题但是又比较显眼的问题的考察把
通常这种情况在自己实践的过程种中会慢慢积累,每次遇到一个去翻翻书看看,牢记, 做成自己的DEMO 
用处很大的,我时新手,象这种“偏”的小知识点,我每次遇到我都收集做成DEMO
[解决办法]
第7题是啥意思啊??
为啥重新编译 PrintWords 输出没有变化??这个可以使用 常量堆叠来理解;因为 PrintWords.class 此时存放的是 the null set.

但重新 编译 Words 为啥能够使得 PrintWords的执行结果产生变化啊??此时 PrintWords.class 根本没有任何变化的(因为俺一直用UltraEdit打开着,没有任何更新提示).
[解决办法]
1


3

不错
[解决办法]
探讨
别人都知道Boolean.getBoolean(s)查看的是系统变量值。

[解决办法]
第一题
false false
第7题
the chemistry set



[解决办法]
七个题都作了一遍, 很有收获。现在还没有看题解,说一下我的看法。每个题目我都没有答对。
第1题:这个题没意思,反正我没有这样用过Boolean,不知大伙用过每。
第2题:多态,陷阱题目
第3题:明知道输出的是OOPS,但是还是不知道怎么输出的,debug了半天,因为用了匿名内部类和泛型,也不好调试,但最后还是想明白了:先初始化父类成员next. 调用了子类的nextElement方法,虽然nextElement更改了子类的成员cursor,但是在紧接着初始化子类成员的时候,cursor又还原了。
给个例子解释一下这个问题:
public abstract class Test {
int a = change();
public abstract int change();
}
//----------
public class Test1 extends Test{
int b = 111;
public int change() {
b = 333;
return 456;//a
}
public void change1(){
b = 888;
}
public static void main(String[] args){
Test1 t = new Test1();
System.out.println(t.b);
t.change1();
System.out.println(t.b);
}
}

第4题:愣是没看明白,直到看到大家的提示;不过倒是了解了一下Collections的binarySearch方法。
第5题:枚举的, 没看。
第6题:以前写过Hibernate SessionFactory,所以了解一点ThreadLocal. i=500000会出错.i=5000似乎可以.
第7题:不了解有什么变化.