【原创】【推荐阅读: 9 个太阳才能照到的地方】Java 解惑:陷阱、缺陷、犄角旮旯案例
Java Puzzles是Effective Java作者Joshua J. Bloch写的一本关于Java语言中的一些“陷阱”相关的书本文是基于对网友回答的内容进行整理的结果,属于原创,转载时请注明出处,谢谢
Java 解惑:陷阱、缺陷、犄角旮旯案例【旮旯:9个太阳才能照到的地方】
Java™ Puzzlers: Traps, Pitfalls, and Corner Cases
豆瓣书评【http://book.】
C陷阱与缺陷
C Traps and Pitfalls
豆瓣书评【http://book.】
这样的书是告诫程序员【不该做什么的书】,
在看完告诉程序员【应该做什么】的《Java核心技术》或者《Java编程思想》之后,
正式书写代码之前,
值得认真阅读
没读这本书之前____,读了这本书之后____。
我最喜欢这样的书评了……
我自己的真实感觉:
没读这本书之前,觉得自己Java没啥不会的了,
读了这本书之后,觉得后背都是冷汗……
下面是具体的一个例子:
对于下面的描述,大家应该都比较熟悉了……
在Java语言里:
1)对于对象来讲(String,Integer等大写字母开头的类型所定义的对象),除了去判断是否为空(null)可以使用==以及!=以外,尽可能的使用equals来判断值是否相等
2)基本数据类型(char,int等小写字母开头的类型)可以使用==和!=进行安全的判断
但是,关于下面程序的输出,可能就有点儿耐人寻味了……
程序代码:
public class Example { public static void main(String[] args) { // 错误、危险的书写方法 Integer a100 = 100; Integer b100 = 100; System.out.println("a100 == b100:" + (a100 == b100)); Integer a155 = 155; Integer b155 = 155; System.out.println("a155 == b155:" + (a155 == b155)); System.out.println("new Integer(0) == new Integer(0):" + (new Integer(0) == new Integer(0))); Integer i = new Integer(0); Integer j = new Integer(0); if (i <= j && j <= i && i != j) { System.out.println("不可思议的走到了这里"); } else { System.out.println("不可思议的居然没走到这里"); } // 正确、安全的书写方法 System.out.println("a100.equals(b100):" + (a100.equals(b100))); System.out.println("a155.equals(b155):" + (a155.equals(b155))); System.out.println("new Integer(0).equals(new Integer(0)):" + (new Integer(0).equals(new Integer(0)))); } }
输出:【用Ctrl+A查看】
a100 == b100:true
a155 == b155:false
new Integer(0) == new Integer(0):false
不可思议的走到了这里
a100.equals(b100):true
a155.equals(b155):true
new Integer(0).equals(new Integer(0)):true
其中【不可思议的走到了这里】和【什么东西又黑又白又红】一样,
颠覆了大多数程序员的常识……
而【new Integer(0) == new Integer(0):false】
又打破了【-127-128 之间的每个值都建立了一个对应的Integer 对象】的神话……
这次的谜题可以参考《Java 解惑》的【Puzzle 32: Curse of Looper】