《Effective Java 第三版》——第二章 创建和销毁对象
《Effective Java 第三版》——第三章 所有对象都通用的方法
《Effective Java 第三版》——第四章 类和接口
《Effective Java 第三版》——第六章 枚举和注解
《Effective Java 第三版》——第七章 Lambda 和 Stream
《Effective Java 第三版》——第九章 通用编程
package effectivejava.chapter9.item58; import java.util.*; // Same bug as NestIteration.java (but different symptom)!! - Page 213 public class DiceRolls { enum Face { ONE, TWO, THREE, FOUR, FIVE, SIX } public static void main(String[] args) { // Same bug, different symptom! Collection<Face> faces = EnumSet.allOf(Face.class); for (Iterator<Face> i = faces.iterator(); i.hasNext(); ) for (Iterator<Face> j = faces.iterator(); j.hasNext(); ) System.out.println(i.next() + " " + j.next()); System.out.println("***************************"); for (Face f1 : faces) for (Face f2 : faces) System.out.println(f1 + " " + f2); } }
/Library/Java/JavaVirtualMachines/jdk-13.0.2.jdk/Contents/Home/bin/java -Dfile.encoding=UTF-8 -classpath /Users/didi/git/effective-java-3e-source-code/bin effectivejava.chapter9.item58.DiceRolls ONE ONE TWO TWO THREE THREE FOUR FOUR FIVE FIVE SIX SIX *************************** ONE ONE ONE TWO ONE THREE ONE FOUR ONE FIVE ONE SIX TWO ONE TWO TWO TWO THREE TWO FOUR TWO FIVE TWO SIX THREE ONE THREE TWO THREE THREE THREE FOUR THREE FIVE THREE SIX FOUR ONE FOUR TWO FOUR THREE FOUR FOUR FOUR FIVE FOUR SIX FIVE ONE FIVE TWO FIVE THREE FIVE FOUR FIVE FIVE FIVE SIX SIX ONE SIX TWO SIX THREE SIX FOUR SIX FIVE SIX SIX Process finished with exit code 0
package effectivejava.chapter9.item58; import java.util.*; public class Card { private final Suit suit; private final Rank rank; // Can you spot the bug? enum Suit { CLUB, DIAMOND, HEART, SPADE } enum Rank { ACE, DEUCE, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN, JACK, QUEEN, KING } static Collection<Suit> suits = Arrays.asList(Suit.values()); static Collection<Rank> ranks = Arrays.asList(Rank.values()); Card(Suit suit, Rank rank ) { this.suit = suit; this.rank = rank; } public static void main(String[] args) { List<Card> deck = new ArrayList<>(); for (Iterator<Suit> i = suits.iterator(); i.hasNext(); ) for (Iterator<Rank> j = ranks.iterator(); j.hasNext(); ) deck.add(new Card(i.next(), j.next())); // // Preferred idiom for nested iteration on collections and arrays // for (Suit suit : suits) // for (Rank rank : ranks) // deck.add(new Card(suit, rank)); } }
/Library/Java/JavaVirtualMachines/jdk-13.0.2.jdk/Contents/Home/bin/java -Dfile.encoding=UTF-8 -classpath /Users/didi/git/effective-java-3e-source-code/bin effectivejava.chapter9.item58.Card Exception in thread "main" java.util.NoSuchElementException at java.base/java.util.Arrays$ArrayItr.next(Arrays.java:4452) at effectivejava.chapter9.item58.Card.main(Card.java:27) Process finished with exit code 1
不能遍历同时修改...
package effectivejava.chapter9.item59; import java.io.IOException; import java.io.InputStream; import java.net.URL; // Printing the contents of a URL with transferTo, added in Java 9 (Page 269) public class Curl { public static void main(String[] args) throws IOException { try (InputStream in = new URL(args[0]).openStream()) { in.transferTo(System.out); } } }
/Library/Java/JavaVirtualMachines/jdk-13.0.2.jdk/Contents/Home/bin/java -Dfile.encoding=UTF-8 -classpath /Users/didi/git/effective-java-3e-source-code/bin effectivejava.chapter9.item59.Curl http://www.baidu.com <!DOCTYPE html> <!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer><link rel=stylesheet type=text/css href=http://s1.bdstatic.com/r/www/cache/bdorz/baidu.min.css><title>百度一下,你就知道</title></head> <body link=#0000cc> <div id=wrapper> <div id=head> <div class=head_wrapper> <div class=s_form> <div class=s_form_wrapper> <div id=lg> <img hidefocus=true src=//www.baidu.com/img/bd_logo1.png width=270 height=129> </div> <form id=form name=f action=//www.baidu.com/s class=fm> <input type=hidden name=bdorz_come value=1> <input type=hidden name=ie value=utf-8> <input type=hidden name=f value=8> <input type=hidden name=rsv_bp value=1> <input type=hidden name=rsv_idx value=1> <input type=hidden name=tn value=baidu><span class="bg s_ipt_wr"><input id=kw name=wd class=s_ipt value maxlength=255 autocomplete=off autofocus></span><span class="bg s_btn_wr"><input type=submit id=su value=百度一下 class="bg s_btn"></span> </form> </div> </div> <div id=u1> <a href=http://news.baidu.com name=tj_trnews class=mnav>新闻</a> <a href=http://www.hao123.com name=tj_trhao123 class=mnav>hao123</a> <a href=http://map.baidu.com name=tj_trmap class=mnav>地图</a> <a href=http://v.baidu.com name=tj_trvideo class=mnav>视频</a> <a href=http://tieba.baidu.com name=tj_trtieba class=mnav>贴吧</a> <noscript> <a href=http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u=http%3A%2F%2Fwww.baidu.com%2f%3fbdorz_come%3d1 name=tj_login class=lb>登录</a> </noscript> <script>document.write('<a href="http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u='+ encodeURIComponent(window.location.href+ (window.location.search === "" ? "?" : "&")+ "bdorz_come=1")+ '" name="tj_login" class="lb">登录</a>');</script> <a href=//www.baidu.com/more/ name=tj_briicon class=bri style="display: block;">更多产品</a> </div> </div> </div> <div id=ftCon> <div id=ftConw> <p id=lh> <a href=http://home.baidu.com>关于百度</a> <a href=http://ir.baidu.com>About Baidu</a> </p> <p id=cp>©2017 Baidu <a href=http://www.baidu.com/duty/>使用百度前必读</a> <a href=http://jianyi.baidu.com/ class=cp-feedback>意见反馈</a> 京ICP证030173号 <img src=//www.baidu.com/img/gs.gif> </p> </div> </div> </div> </body> </html> Process finished with exit code 0
package effectivejava.chapter9.item59; import java.util.*; // Random number generation is hard! - Page 215 public class RandomBug { // Common but deeply flawed! static Random rnd = new Random(); static int random(int n) { return Math.abs(rnd.nextInt()) % n; } public static void main(String[] args) { int n = 2 * (Integer.MAX_VALUE / 3); int low = 0; for (int i = 0; i < 1000000; i++) if (random(n) < n/2) low++; System.out.println(low); } }
/Library/Java/JavaVirtualMachines/jdk-13.0.2.jdk/Contents/Home/bin/java -Dfile.encoding=UTF-8 -classpath /Users/didi/git/effective-java-3e-source-code/bin effectivejava.chapter9.item59.RandomBug 666550 Process finished with exit code 0
ThreadLocal
package effectivejava.chapter9.item61; // What does this program do? - Page 274 public class Unbelievable { static Integer i; public static void main(String[] args) { if (i == 42) System.out.println("Unbelievable"); } }
/Library/Java/JavaVirtualMachines/jdk-13.0.2.jdk/Contents/Home/bin/java -Dfile.encoding=UTF-8 -classpath /Users/didi/git/effective-java-3e-source-code/bin effectivejava.chapter9.item61.Unbelievable Exception in thread "main" java.lang.NullPointerException at effectivejava.chapter9.item61.Unbelievable.main(Unbelievable.java:8) Process finished with exit code 1
Integer i 在做 == 时自动拆箱,报 NullPointerException 错误