###### java解惑--总结--Joshua Bloch & Neal Gaffer
1>谜题1：奇数性

public static boolean isOdd(int i){
return i % 2 == 1;
}

public static boolean isOdd(int i){
return i % 2 != 0;
}

2>谜题2：找零时刻

public class Change{
public static void main(String args[]){
System.out.println(2.00 - 1.10);
}
}
//打印的是0.8999999999999999

import java.math.BigDecimal;
public class Change1{
public static void main(String args[]){
System.out.println(new BigDecimal("2.00").
subtract(new BigDecimal("1.10")));
}
}
//打印出0.90

3>谜题3：长整除

public class LongDivision{
public static void main(String args[]){
final long MICROS_PER_DAY = 24 * 60 * 60 * 1000 * 1000;
final long MILLIS_PER_DAY = 24 * 60 * 60 * 1000;
System.out.println(MICROS_PER_DAY/MILLIS_PER_DAY);
}
}
//它打印的是5

public class LongDivision{
public static void main(String args[ ]){
final long MICROS_PER_DAY = 24L * 60 * 60 * 1000 * 1000;
final long MILLIS_PER_DAY = 24L * 60 * 60 * 1000;
System.out.println(MICROS_PER_DAY/MILLIS_PER_DAY);
}
}
//打印出100

4>谜题4：初级问题
System.out.println(12345+5432l);//打印出17777

5>谜题5：十六进制的趣事

public class JoyOfHex{
public static void main(String[] args){
System.out.println(
Long.toHexString(0x100000000L + 0xcafebabe));
}
}
//打印的是cafebabe

public class JoyOfHex{
public static void main(String[] args){
System.out.println(
Long.toHexString(0x100000000L + 0xcafebabeL));
}
}
//打印出1cafebabe

6>谜题6：多重转型

public class Multicast{
public static void main (String[] args){
System.out.println((int)(char)(byte) -1);
}
}
//它打印出的是65535

7>那么它会打印出什么呢？
public class CleverSwap{
public static void main(String[] args){
int x = 1984; // (0x7c0)
int y = 2001; // (0x7d1)
x^= y^= x^= y;
System.out.println("x= " + x + "; y= " + y);
}
}
//打印的是 x = 0; y = 1984

8>谜题8：Dos Equis

public class DosEquis{
public static void main(String[] args){
char x = 'X';
int i = 0;
System.out.println(true ? x : 0);
System.out.println(false ? i : x);
}
}
//它打印出来的是X88

9>谜题9：半斤

10>谜题12：ABC
public class ABC{
public static void main(String[] args){
String letters = "ABC";
char[] numbers = {'1', '2', '3'};
System.out.println(letters + " easy as " + numbers);
}
}
//ABC easy as [C@16f0472

11>总之，要确保字符\u不出现在一个合法的Unicode转义字符上下文之外，即使是在注释中也是如此。在机器生成的代码中要特别注意此问题。

12>要想将一个char数组转换成一个字符串，就要调用String.valueOf(char[])方法。例如：
char[] numbers = {'1', '2', '3'};
System.out.println(" easy as " +String.valueOf(numbers));//easy as 123;

13>在比较对象引用时，你应该优先使用equals方法而不是 == 操作符，除非你需要比较的是对象的标识而不是对象的值。

14>如果不是必要的话，请不要使用Unicode；

15>千万不要用一个return、break、continue或throw来退出一个finally语句块，并且千万不要允许将一个受检查的异常传播到一个finally语句块之外去。

16>谜题46:令人混淆的构造器案例
public class Confusing {
private Confusing(Object o) {
System.out.println("Object");
}
private Confusing(double[] dArray) {
System.out.println("double array");
}
public static void main(String[] args) {
new Confusing(null);
}
}
//double array
Java的重载解析过程是以两阶段运行的。第一阶段选取所有可获得并且可应用的方法或构造器。第二阶段在第一阶段选取的方法或构造器中选取最精确的一个。如果一个方法或构造器可以接受传递给另一个方法或构造器的任何参数，那么我们就说第一个方法比第二个方法缺乏精确性;

17>静态域由声明它的类和子类所共享同一份；

18>在任何情况下，你都务必要记住：不要在构造器中调用可覆 写的方法。在实例初始化中产生的循环将是致命的。

19>名字重用的术语表

class Base {
public void f() { }
}

class Derived extends Base {
public void f() { } // overrides Base.f()
}

class Base {
public static void f() { }
}

class Derived extends Base {
private static void f() { } // hides Base.f()
}

class CircuitBreaker {
public void f(int i)     { } // int overloading
public void f(String s) { } // String overloading
}

class WhoKnows {
static String sentence = "I don't know.";
public static woid main(String[ ] args) {
String sentence = “I know!”;   // shadows static field
System.out.println(sentence);  // prints local variable
}
}

class Belt {
private final int size;
public Belt(int size) { // Parameter shadows Belt.size
this.size = size;
}
}

public class Obscure {
static String System;  // Obscures type java.lang.System
public static void main(String[ ] args) {
// Next line won't compile: System refers to static field
System.out.println(“hello, obscure world!”);
}
}

20>本书小结：
a，long类型应加L；
b，?:操作数时，2,3操作数应使用相同的数据类型。
c，整数类型是不对称的。
d，Integer.MAX_VALUE上终止以int为索引的循环是困难的。(ps：Integer.MAX_VALUE=9223372036854775807,呵呵，够大了吧!!0)
e,如果你想让一个类不可实例化，那么就添加一个私有构造器吧。
f，char类型值只会默认地转换成int，而不是String，想把一个char的类型转换成一个字符串，应该使用String.valueOf(char)。
h，覆写了equals方法而不覆写hashCode方法可能会引发不定的行为，所以覆写了equals方法就要一并覆写hashCode方法。

#### Joshua Bloch新作《Java解惑》即将上市——大家一起来做运动，Java思维体操！

2006-01-11 23:55:00

2012-09-21 22:42:15

#### 采访Java Collection的作者Joshua Bloch

2010-09-16 23:25:00

#### Java教父Joshua Bloch访谈

2007-06-10 22:38:00

#### Effective Java 的作者Joshua Bloch 跳槽到Google了

2004-07-11 00:31:00

2016-07-24 19:45:48

#### Effective Java 第二版（英文版）by Joshua Bloch

2009年08月01日 1.14MB 下载

#### Effective Java by Joshua Bloch 第三版 PDF

2017年12月28日 1.44MB 下载

#### Common Lisp专家Peter Seibel对Google公司首席Java架构师Joshua Bloch的访谈(摘一段)

2010-12-28 13:35:00

#### 2009年的JavaOne大会上，Joshua Bloch和Neal Gafter又为我们带来的7道谜题

2009年08月14日 21KB 下载

## 不良信息举报

java解惑--总结--Joshua Bloch & Neal Gaffer