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

Más contenido relacionado

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

Java program in_action
Java program in_actionJava program in_action
Java program in_actionmysqlops
 
Java program in_action_20110727-撒迦
Java program in_action_20110727-撒迦Java program in_action_20110727-撒迦
Java program in_action_20110727-撒迦chenjianxing
 
如何開發Thread Safe的Java Web程式
如何開發Thread Safe的Java Web程式如何開發Thread Safe的Java Web程式
如何開發Thread Safe的Java Web程式Ying-Chun Cheng
 
Servlet & JSP 教學手冊第二版 - 第 6 章:使用 JSP
Servlet & JSP 教學手冊第二版 - 第 6 章:使用 JSPServlet & JSP 教學手冊第二版 - 第 6 章:使用 JSP
Servlet & JSP 教學手冊第二版 - 第 6 章:使用 JSPJustin Lin
 
如何在 Java App 中導入 Scala
如何在 Java App 中導入 Scala如何在 Java App 中導入 Scala
如何在 Java App 中導入 Scalajavatwo2011
 
Java trouble shooting
Java trouble shootingJava trouble shooting
Java trouble shootingMin Zhou
 
千呼萬喚始出來的Java SE 7
千呼萬喚始出來的Java SE 7千呼萬喚始出來的Java SE 7
千呼萬喚始出來的Java SE 7javatwo2011
 
Jvm分享20101228
Jvm分享20101228Jvm分享20101228
Jvm分享20101228lunfu zhong
 
北京圣思园深入Java虚拟机 class loader
北京圣思园深入Java虚拟机 class loader北京圣思园深入Java虚拟机 class loader
北京圣思园深入Java虚拟机 class loaderMedivh2011
 
漫谈php和java
漫谈php和java漫谈php和java
漫谈php和javasulong
 
Spring boot 简介
Spring boot 简介Spring boot 简介
Spring boot 简介宇帆 盛
 
[WebConf Taiwan 2023] 一份 Zend Engine 外帶!透過 Micro 讓一次打包、多處運行變得可能
[WebConf Taiwan 2023] 一份 Zend Engine 外帶!透過 Micro 讓一次打包、多處運行變得可能[WebConf Taiwan 2023] 一份 Zend Engine 外帶!透過 Micro 讓一次打包、多處運行變得可能
[WebConf Taiwan 2023] 一份 Zend Engine 外帶!透過 Micro 讓一次打包、多處運行變得可能Shengyou Fan
 
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型裕波 周
 
Model 設定與 Seeding
Model 設定與 SeedingModel 設定與 Seeding
Model 設定與 SeedingShengyou Fan
 
Model 設定與 Seeding
Model 設定與 SeedingModel 設定與 Seeding
Model 設定與 SeedingShengyou Fan
 
jsp基础速成精华讲解
jsp基础速成精华讲解jsp基础速成精华讲解
jsp基础速成精华讲解wensheng wei
 

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

Java program in_action
Java program in_actionJava program in_action
Java program in_action
 
Java program in_action_20110727-撒迦
Java program in_action_20110727-撒迦Java program in_action_20110727-撒迦
Java program in_action_20110727-撒迦
 
如何開發Thread Safe的Java Web程式
如何開發Thread Safe的Java Web程式如何開發Thread Safe的Java Web程式
如何開發Thread Safe的Java Web程式
 
Servlet & JSP 教學手冊第二版 - 第 6 章:使用 JSP
Servlet & JSP 教學手冊第二版 - 第 6 章:使用 JSPServlet & JSP 教學手冊第二版 - 第 6 章:使用 JSP
Servlet & JSP 教學手冊第二版 - 第 6 章:使用 JSP
 
驗證與訊息
驗證與訊息驗證與訊息
驗證與訊息
 
驗證與訊息
驗證與訊息驗證與訊息
驗證與訊息
 
如何在 Java App 中導入 Scala
如何在 Java App 中導入 Scala如何在 Java App 中導入 Scala
如何在 Java App 中導入 Scala
 
Java trouble shooting
Java trouble shootingJava trouble shooting
Java trouble shooting
 
千呼萬喚始出來的Java SE 7
千呼萬喚始出來的Java SE 7千呼萬喚始出來的Java SE 7
千呼萬喚始出來的Java SE 7
 
Jvm分享20101228
Jvm分享20101228Jvm分享20101228
Jvm分享20101228
 
北京圣思园深入Java虚拟机 class loader
北京圣思园深入Java虚拟机 class loader北京圣思园深入Java虚拟机 class loader
北京圣思园深入Java虚拟机 class loader
 
Class loader
Class loaderClass loader
Class loader
 
漫谈php和java
漫谈php和java漫谈php和java
漫谈php和java
 
Spring boot 简介
Spring boot 简介Spring boot 简介
Spring boot 简介
 
[WebConf Taiwan 2023] 一份 Zend Engine 外帶!透過 Micro 讓一次打包、多處運行變得可能
[WebConf Taiwan 2023] 一份 Zend Engine 外帶!透過 Micro 讓一次打包、多處運行變得可能[WebConf Taiwan 2023] 一份 Zend Engine 外帶!透過 Micro 讓一次打包、多處運行變得可能
[WebConf Taiwan 2023] 一份 Zend Engine 外帶!透過 Micro 讓一次打包、多處運行變得可能
 
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
 
Model 設定與 Seeding
Model 設定與 SeedingModel 設定與 Seeding
Model 設定與 Seeding
 
Model 設定與 Seeding
Model 設定與 SeedingModel 設定與 Seeding
Model 設定與 Seeding
 
Route 機制
Route 機制Route 機制
Route 機制
 
jsp基础速成精华讲解
jsp基础速成精华讲解jsp基础速成精华讲解
jsp基础速成精华讲解
 

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

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