天天看點

幾個謎題,深入的了解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,列印結果是什麼?

需要了解常量折疊現象,了解什麼是常量。