——————————————转载————————————————————————
在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,打印结果是什么?
需要了解常量折叠现象,理解什么是常量。
分析和解答可以参考
原作者的演示材料:
http://developers.sun.com/learning/javaoneonline/sessions/2009/pdf/TS-5186.pdf
或者我的分析总结:
http://blog.csdn.net/ZangXT/archive/2009/07/29/4391628.aspx