# 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界的传奇人物，如果你没有听过他的名字，也肯定看过他的书（Effective Java，Java Concurrency in Practice, Java Puzzl...
• qinjienj
• 2012年09月21日 22:42
• 4417

## 采访Java Collection的作者Joshua Bloch

• michaellufhl
• 2010年09月16日 23:25
• 2770

## Java之谜 —— 来自Neal Gafter的演讲

• renfufei
• 2013年11月20日 21:12
• 2831

## Java教父Joshua Bloch访谈

Sun公司网站登出了2007 JavaOne大会期间对Joshua Bloch的访谈——摇滚巨星Josh Bloch。 Bloch现任Google 首席Java架构师，而在此之前，他是Sun公司的杰出...
• turingbook
• 2007年06月10日 22:38
• 3932

## Joshua Bloch

• zzhangxiaoyun
• 2013年05月28日 09:20
• 458

## Joshua Bloch

早在1996年，适逢Java刚刚崭露头角，年内好事连连。先是1月份发布JDK 1.0，然后是5月底在旧金山召开首届JavaOne大会，年末又是JDK 1.1紧跟其后。正是在Java技术如火如荼、大...
• yuanfen860913
• 2010年07月22日 16:57
• 545

Google首席工程师Joshua Bloch谈如何设计优秀的API How to Design a Good API and Why it Matters Why is API Desig...
• doctor_who2004
• 2016年07月24日 19:45
• 1173

## 收藏Joshua Bloch和Neal Gafter7道谜题

在2009年的JavaOne大会上，Joshua Bloch和Neal Gafter又为我们带来的7道谜题，挺有意思的。大家不妨看看。摘自：Return of the Puzzlers: Sc...
• mmm123lmj
• 2009年08月02日 14:52
• 328

## elasticsearch-query-builder, 一款可以基于配置化以及参数绑定的ES语句构造神器

• xiaowei1118
• 2017年12月12日 17:56
• 68

## 我与 Joshua Bloch 的 email 讨论(emails between Joshua Bloch and me)

Here are some email between me and Joshua Bloch. I hope these email will do som
• jacklondon
• 2004年08月11日 14:57
• 1499

举报原因： 您举报文章：java解惑--总结--Joshua Bloch & Neal Gaffer 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)