Weitere ähnliche Inhalte Ähnlich wie Java您不知道的5件事 雷腾(l.t) (20) Java您不知道的5件事 雷腾(l.t) 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 指定位置的列表元素交换 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 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 文件名与接口名一致,且内容为一行一个实现 31. Q & A 雷腾 L.T Email:leiteng@taobao.com