Java 您不知道的5件事<br />雷腾 L.T  - leiteng@taobao.com<br />搜索算法与技术 – 搜索应用团队<br />
搞Java那么多年了,还有哪些是我不知道的?<br />Java 您不知道的5件事<br />http://www.ibm.com/developerworks/cn/views/java/libraryview.jsp?search_by=%...
Java 您不知道的5件事<br />Java对象序列化 API<br />Java Collections API - Part I & Part II<br />Java Concurrent - Part I & Part II<br /...
一、Java 对象序列化 API<br />1)序列化允许重构<br />序列化允许类变种<br />serialVersionUID根据方法名、字段名、字段类型和getter&setter方法等计算<br />变种类之间serialVersi...
一、Java 对象序列化 API<br />2)序列化并不安全<br />序列化二进制格式编写在文档中,且完全可逆<br />序列化允许“hook” 序列化过程,提供 writeObject<br />3)序列化数据可被签名和密封<br />使...
一、Java 对象序列化 API<br />4)序列化可将代理放在流中<br />只序列化核心元素,通过它派生或找到类中其他字段<br />为原始类提供用writeReplace方法<br />反序列化提供readResolve方法<br />...
二、Java Collections API -Part I<br />1)Collections 比数组好<br />Java数组是鉴于初期性能问题,不再具有性能优势<br />转换为字符串,数据需要迭代,Collections有toStri...
二、Java Collections API -Part I<br />2)迭代的效率较低<br />在此情况下,迭代存在很大的缺点:<br />每次add或remove元素后,需要重新调整集合;<br />每次加锁操作的过程,存在并发困境<b...
二、 Java Collections API -Part I<br />3)用For Each遍历Iterable<br />Java 5之前:<br />Iterator;<br />next();<br />hasNext();<br /...
二、 Java Collections API -Part I<br />4)经典算法与定制算法<br />binarySearch折半查找算法<br />frequency		返回集合中等于指定对象的元素数<br />max			返回集合最大...
二、 Java Collections API –Part I<br />5)扩展Collections API<br />
三、 Java Collections API -Part II<br />1)List不同于数组<br />ArrayList不仅仅是数组的替代品<br />固定位置add或remove,集合与数组的行为不同<br />2)令人惊讶的Iter...
三、 Java Collections API -Part II<br />3)并非所有 Iterable都来自集合<br />Iterable定义了可迭代的接口(迭代模式)<br />任意类实现了Iterable就可以做迭代<br />4)警...
三、 Java Collections API -Part II<br />5) equals与 Comparable<br />Sorted Collection类型<br />不使用 equals() 比较对象<br />使用 Compar...
四、 Java Concurrent – Part I<br />1)TimeUnit<br />TimeUnit包括所有时间单位<br />能处理几乎所有的时间范围类型<br />时间转换更容易<br />2)CopyOnWriteArray...
四、 Java Concurrent – Part I<br />3)BlockingQueue<br />FIFO(先入先出)顺序存储<br />满队列add或空队列remove会导致调用阻塞<br />阻塞方法支持timeout参数<br ...
四、 Java Concurrent – Part I<br />5)SynchronousQueue<br />同步阻塞队列<br />不具有任何容量<br />读写相互触发<br />等价于ArrayBlockingQueue<String...
五、 Java Concurrent – Part II<br />1)Semaphore<br />信号量(one time one in)<br />acquire获取信号量<br />release释放信号量<br />可一次acquir...
五、 Java Concurrent – Part II<br />3)Executor<br />Executor创建新线程的抽象<br />Executors创建线程池工厂方法<br />newFixedThreadPool(num)<br...
五、 Java Concurrent – Part II<br />4)ScheduledExecutorServices<br />确定的时间间隔或在特定时间执行给定的任务<br />不用担心线程<br />不用担心取消心跳<br />不用明...
六、 Java jar<br />1)jar可执行<br />可在MANIFEST.MF中指定要执行的main<br />Jar需在classpath中<br />2)jar可包含依赖关系信息<br />-jar 选项将覆盖 –classpat...
六、 Java jar<br />3)jar可被隐式引用<br />Classpath隐式引用lib/ext下的所有jar包<br />4)Java 6允许类路径通配符<br />Java 6引入了类路径通配符,lib/*<br />5) ja...
七、 Java性能监控 - Jconsole/VisualVM<br />1)分析参数<br />-Dcom.sun.management.jmxremote<br />Jconsole有性能开销<br />2)远程链接进程<br />serv...
七、 Java性能监控 - Jconsole/VisualVM<br />4)创建离线分析堆存储<br />Jconsole和VisualVM可保存Java环境快照<br />Mbeans -> management  -> HotSpotDi...
八、Java性能监控 – jps/jstat/jstack/jmap/jhat<br />1)jps<br />VMID和OS识别的进程pid不一定相同<br />jps类似与UNIX的ps<br />jps返回Java进程的VMID<br /...
八、Java性能监控 – jps/jstat/jstack/jmap/jhat<br />3)jstack<br />查看进程当前堆栈信息<br />4)jmap<br />jmap –histo<br />对进程堆进行拍照,并可转存到文件<b...
九、JVM命令行标志<br />1)DisableExplicitGC<br />显式GC比常规GC昂贵N个数量级<br />2)HeapDumpOnOutOfMemoryError<br />JVM 消亡之际捕获堆的转储快照<br />使用j...
十、Scripting API<br />1)jrunscript<br />执行JavaScript脚本<br />非浏览器环境<br />2)js访问Java对象<br />Runtime.exec启动进程<br />直接调用Java对象<...
十一、Java常用工具<br />1)StAX<br />SAX是一个大型的状态机<br />DOM一次载入整个文档<br />可建立需要的对象模型,而不需要处理标准DOM<br />可随时建立模型,而不必等到解析器回调<br />2)Serv...
十一、Java常用工具<br />3)Scanner<br />轻量快速<br />不使用正则表达式<br />4)Timer<br />定期或延时执行任务<br />方便简单,可守护<br />5)JavaSound<br />javax.s...
Q & A<br />雷腾 L.T<br />Email:leiteng@taobao.com<br />
Upcoming SlideShare
Loading in …5
×

Java您不知道的5件事 雷腾(l.t)

1,627 views

Published on

Java您不知道的5件事

Published in: Technology
2 Comments
4 Likes
Statistics
Notes
  • good,
    pls refer to this page:
    http://www.ibm.com/developerworks/cn/java/j-5things/

    and this page:
    http://www.douban.com/group/topic/17568035/
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • very good
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
No Downloads
Views
Total views
1,627
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
0
Comments
2
Likes
4
Embeds 0
No embeds

No notes for slide

Java您不知道的5件事 雷腾(l.t)

  1. 1. Java 您不知道的5件事<br />雷腾 L.T - leiteng@taobao.com<br />搜索算法与技术 – 搜索应用团队<br />
  2. 2. 搞Java那么多年了,还有哪些是我不知道的?<br />Java 您不知道的5件事<br />http://www.ibm.com/developerworks/cn/views/java/libraryview.jsp?search_by=%E6%82%A8%E4%B8%8D%E7%9F%A5%E9%81%93%E7%9A%84+5+%E4%BB%B6%E4%BA%8B<br />
  3. 3. Java 您不知道的5件事<br />Java对象序列化 API<br />Java Collections API - Part I & Part II<br />Java Concurrent - Part I & Part II<br />Java jar<br />Java 性能监控 <br />Java JVM参数<br />Java Scripting API<br />Java Tools<br />
  4. 4. 一、Java 对象序列化 API<br />1)序列化允许重构<br />序列化允许类变种<br />serialVersionUID根据方法名、字段名、字段类型和getter&setter方法等计算<br />变种类之间serialVersionUID必须相同才能反序列化<br />变种类之间反序列化,逻辑与BeanUtils一致<br />
  5. 5. 一、Java 对象序列化 API<br />2)序列化并不安全<br />序列化二进制格式编写在文档中,且完全可逆<br />序列化允许“hook” 序列化过程,提供 writeObject<br />3)序列化数据可被签名和密封<br />使用 writeObject和 readObject<br />使用SealedObject和/或SignedObject<br />
  6. 6. 一、Java 对象序列化 API<br />4)序列化可将代理放在流中<br />只序列化核心元素,通过它派生或找到类中其他字段<br />为原始类提供用writeReplace方法<br />反序列化提供readResolve方法<br />5)信任,但要验证<br />实现ObjectInputValidation接口,覆盖validateObject方法<br />验证有误,抛出InvalidObjectException<br />
  7. 7. 二、Java Collections API -Part I<br />1)Collections 比数组好<br />Java数组是鉴于初期性能问题,不再具有性能优势<br />转换为字符串,数据需要迭代,Collections有toString<br />使用Arrays.asList转换数组<br />List<String> list = Arrays.asList(values)<br />Arrays.asList返回的List是不可修改的<br />Arrays.asList可使用String…参数<br />
  8. 8. 二、Java Collections API -Part I<br />2)迭代的效率较低<br />在此情况下,迭代存在很大的缺点:<br />每次add或remove元素后,需要重新调整集合;<br />每次加锁操作的过程,存在并发困境<br />当add或remove操作时,其他存取集合线程会竞争<br />使用addAll和removeAll<br />
  9. 9. 二、 Java Collections API -Part I<br />3)用For Each遍历Iterable<br />Java 5之前:<br />Iterator;<br />next();<br />hasNext();<br />Java 5后<br />For Each;<br />Iterable;<br />Iterator<String> iterator = list.iterator();<br />while(iterator.hasNext()){<br /> String item=iterator.next();<br />System.out.println(item);<br />}<br />for(String each:list){<br />System.out.println(each);<br />}<br />
  10. 10. 二、 Java Collections API -Part I<br />4)经典算法与定制算法<br />binarySearch折半查找算法<br />frequency 返回集合中等于指定对象的元素数<br />max 返回集合最大元素<br />min 返回集合最小元素<br />reverse 列表反序<br />rotate 根据指定距离,移动列表<br />shuffle 使用随机源更改序列<br />sort 列表排序<br />swap 指定位置的列表元素交换<br />
  11. 11. 二、 Java Collections API –Part I<br />5)扩展Collections API<br />
  12. 12. 三、 Java Collections API -Part II<br />1)List不同于数组<br />ArrayList不仅仅是数组的替代品<br />固定位置add或remove,集合与数组的行为不同<br />2)令人惊讶的Iterator<br />Iterator可以比For Each做得更多<br />Iterator支持从源集合中安全地删除对象<br />ListIterator,支持在迭代期间add或remove ,并可双向滚动<br />
  13. 13. 三、 Java Collections API -Part II<br />3)并非所有 Iterable都来自集合<br />Iterable定义了可迭代的接口(迭代模式)<br />任意类实现了Iterable就可以做迭代<br />4)警惕可变的 hashCode<br />Map的实现在内部使用哈希表对key-value对做快速查找<br />永远不要将可变对象类型用作 HashMap的键<br />
  14. 14. 三、 Java Collections API -Part II<br />5) equals与 Comparable<br />Sorted Collection类型<br />不使用 equals() 比较对象<br />使用 Comparator/Comparable 的 compare 或 compareTo<br />
  15. 15. 四、 Java Concurrent – Part I<br />1)TimeUnit<br />TimeUnit包括所有时间单位<br />能处理几乎所有的时间范围类型<br />时间转换更容易<br />2)CopyOnWriteArrayList<br />ArrayList易变操作需要同步<br />ArrayList的线程安全变体<br />易变操作(add,remove)复制全新的数组实现<br />
  16. 16. 四、 Java Concurrent – Part I<br />3)BlockingQueue<br />FIFO(先入先出)顺序存储<br />满队列add或空队列remove会导致调用阻塞<br />阻塞方法支持timeout参数<br />4)ConcurrentMap<br />HashMap不同步非线程安全<br />HashTable整个hash表加锁<br />ConcurrentMap分桶,局部加锁<br />ConcurrentMap读写可并发<br />
  17. 17. 四、 Java Concurrent – Part I<br />5)SynchronousQueue<br />同步阻塞队列<br />不具有任何容量<br />读写相互触发<br />等价于ArrayBlockingQueue<String>(1, true);<br />
  18. 18. 五、 Java Concurrent – Part II<br />1)Semaphore<br />信号量(one time one in)<br />acquire获取信号量<br />release释放信号量<br />可一次acquire或release指定数量的信号量<br />2)CountDownLatch<br />倒数计数的锁,模拟阀门<br />CountDownLatch (1), 开/关锁存器,或入口<br />CountDownLatch (N), 完成N项操作之前一直等待<br />
  19. 19. 五、 Java Concurrent – Part II<br />3)Executor<br />Executor创建新线程的抽象<br />Executors创建线程池工厂方法<br />newFixedThreadPool(num)<br />newCachedThreadPool<br />newCachedThreadPool<br />newScheduledThreadPool(size)<br />ExecutorService接受一组任务并返回结果列表<br />Callable,Future返回结果<br />CompletionService内部维护BlockingQueue,任务没有完成,take()阻塞<br />
  20. 20. 五、 Java Concurrent – Part II<br />4)ScheduledExecutorServices<br />确定的时间间隔或在特定时间执行给定的任务<br />不用担心线程<br />不用担心取消心跳<br />不用明确地将线程标记为前台或后台<br />5)Timeout<br />超时值<br />监控锁定<br />
  21. 21. 六、 Java jar<br />1)jar可执行<br />可在MANIFEST.MF中指定要执行的main<br />Jar需在classpath中<br />2)jar可包含依赖关系信息<br />-jar 选项将覆盖 –classpath<br />有依赖时,需重定义-classpath<br />
  22. 22. 六、 Java jar<br />3)jar可被隐式引用<br />Classpath隐式引用lib/ext下的所有jar包<br />4)Java 6允许类路径通配符<br />Java 6引入了类路径通配符,lib/*<br />5) jar有的不只是代码<br />Jar中还可以包含配置、资源文件<br />
  23. 23. 七、 Java性能监控 - Jconsole/VisualVM<br />1)分析参数<br />-Dcom.sun.management.jmxremote<br />Jconsole有性能开销<br />2)远程链接进程<br />service:jmx:rmi:///jndi/rmi://yourapp:port/jmxrmi<br />3)跟踪统计<br />Memory:监控JVM垃圾收集器的堆<br />Threads:监控JVM当前线程数<br />Classes:观察JVM已加载类的总数<br />
  24. 24. 七、 Java性能监控 - Jconsole/VisualVM<br />4)创建离线分析堆存储<br />Jconsole和VisualVM可保存Java环境快照<br />Mbeans -> management -> HotSpotDiagnostic -> Operations -> dumpHeap中输入文件名<br />5)Jconsole并不高深<br />Jconsole基于POJO<br />可以定制监控程序<br />
  25. 25. 八、Java性能监控 – jps/jstat/jstack/jmap/jhat<br />1)jps<br />VMID和OS识别的进程pid不一定相同<br />jps类似与UNIX的ps<br />jps返回Java进程的VMID<br />2)jstat<br />jstat收集统计数据<br />常用选项<br />-class -compiler <br />-gc –gccapacity -gccause<br />-gcnew -gcnewcapacity<br />-gcold -gcoldcapacity<br />-gcpermcapacity -gcutil<br />-printcompilation<br />
  26. 26. 八、Java性能监控 – jps/jstat/jstack/jmap/jhat<br />3)jstack<br />查看进程当前堆栈信息<br />4)jmap<br />jmap –histo<br />对进程堆进行拍照,并可转存到文件<br />5)jhat<br />可以用来分析堆的二进制文件<br />HTTP/HTML 服务器<br />支持OQL(对象查询语言)<br />
  27. 27. 九、JVM命令行标志<br />1)DisableExplicitGC<br />显式GC比常规GC昂贵N个数量级<br />2)HeapDumpOnOutOfMemoryError<br />JVM 消亡之际捕获堆的转储快照<br />使用jhat分析<br />3)bootclasspath<br />扩展同名类库的引入<br />4)verbose<br />诊断参数:gc,class,jni<br />5) -Xloggc<br />GC日志输出到文件<br />
  28. 28. 十、Scripting API<br />1)jrunscript<br />执行JavaScript脚本<br />非浏览器环境<br />2)js访问Java对象<br />Runtime.exec启动进程<br />直接调用Java对象<br />3)Java访问js<br />ScriptEngineManager<br />4)Java对象绑定到js命名空间<br />Bindings 接口<br />5)编译脚本<br />CompiledScript实例<br />
  29. 29. 十一、Java常用工具<br />1)StAX<br />SAX是一个大型的状态机<br />DOM一次载入整个文档<br />可建立需要的对象模型,而不需要处理标准DOM<br />可随时建立模型,而不必等到解析器回调<br />2)ServiceLoader<br />可将create和use组件分开<br />比spring容器更轻量<br />配置META-INF/services/IPersonalServant<br />文件名与接口名一致,且内容为一行一个实现<br />
  30. 30. 十一、Java常用工具<br />3)Scanner<br />轻量快速<br />不使用正则表达式<br />4)Timer<br />定期或延时执行任务<br />方便简单,可守护<br />5)JavaSound<br />javax.sound, 音频核心接口<br />MIDI/WAV格式<br />
  31. 31. Q & A<br />雷腾 L.T<br />Email:leiteng@taobao.com<br />

×