﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-勤加练习，必能得心应手！不期速成，日拱一卒 ！-随笔分类-JAVA</title><link>http://www.blogjava.net/ldwblog/category/38803.html</link><description>态度决定一切</description><language>zh-cn</language><lastBuildDate>Tue, 07 Jan 2020 10:49:22 GMT</lastBuildDate><pubDate>Tue, 07 Jan 2020 10:49:22 GMT</pubDate><ttl>60</ttl><item><title>个人公众号「Java爱好者社区」高质量原创文章持续输出，欢迎各位小主关注</title><link>http://www.blogjava.net/ldwblog/archive/2019/10/30/434887.html</link><dc:creator>David1228</dc:creator><author>David1228</author><pubDate>Wed, 30 Oct 2019 06:10:00 GMT</pubDate><guid>http://www.blogjava.net/ldwblog/archive/2019/10/30/434887.html</guid><wfw:comment>http://www.blogjava.net/ldwblog/comments/434887.html</wfw:comment><comments>http://www.blogjava.net/ldwblog/archive/2019/10/30/434887.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ldwblog/comments/commentRss/434887.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ldwblog/services/trackbacks/434887.html</trackback:ping><description><![CDATA[blogjava网站与博客园合并了，对blogjava还是有感情的。<br />并且blogjava网站发布的文章是在博客园首页看不到的。<br />blogjava网站首页能看到，你可以点击标题进入可以看到图片二维码信息。<br /><br /><strong style="color: red; font-size: 14pt;">Java爱好者社区</strong><br />公众号内容简介：<br /><p><span style="background-color: yellow; color: red;">专注于分享Java后端相关技术、老司机实战干货，不限于JVM、并发、设计模式、性能优化、分布式&amp;微服务、云原生、大数据相关主题。</span><br style="color: red;" /><span style="background-color: yellow; color: red;">希望关注的你停下脚步，定有所收获。</span><br style="color: red;" /><br />以前的个人博客内容不好迁移，所以我打算根据自己的多年经验，不断整理输出有价值的内容。<br />目前公众号内容有关于<span style="background-color: yellow; color: red;">SpringCloud（微服务框架）、Skywalking（APM监控调用链）、JVM（GC分析、内存泄漏分析）、并发编程</span>相关原创实战文章已出炉。<br /><br />最近刚开始已经有不少小伙伴关注了，期待能有幸搜索到本博客的同学，可以扫码关注一下，不胜感激。<br />大家有任何技术、职场、面试上的问题都可以与我交流。<br /><br /><span style="background-color: yellow;"><strong>方式一：</strong></span><span style="color: red; background-color: yellow;"><strong>扫码以下公众号二维码：</strong></span><br /><img src="http://www.blogjava.net/images/blogjava_net/ldwblog/Java%E7%88%B1%E5%A5%BD%E8%80%85%E7%A4%BE%E5%8C%BA%E4%BA%8C%E7%BB%B4%E7%A0%81.png" border="0" alt="" /><br /><br />方式二：<span style="color: red;">在微信上直接搜索：&nbsp;</span><span style="color: red; background-color: yellow;">javatech_cbo</span><br /><br />感谢各位小伙伴的支持，后续会在该公众号上输出大量的有价值的实战干货 ，期待与你一同进步与成长。<br /></p><img src ="http://www.blogjava.net/ldwblog/aggbug/434887.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ldwblog/" target="_blank">David1228</a> 2019-10-30 14:10 <a href="http://www.blogjava.net/ldwblog/archive/2019/10/30/434887.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]Linux与JVM的内存关系分析</title><link>http://www.blogjava.net/ldwblog/archive/2017/09/04/432799.html</link><dc:creator>David1228</dc:creator><author>David1228</author><pubDate>Mon, 04 Sep 2017 08:33:00 GMT</pubDate><guid>http://www.blogjava.net/ldwblog/archive/2017/09/04/432799.html</guid><wfw:comment>http://www.blogjava.net/ldwblog/comments/432799.html</wfw:comment><comments>http://www.blogjava.net/ldwblog/archive/2017/09/04/432799.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ldwblog/comments/commentRss/432799.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ldwblog/services/trackbacks/432799.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.blogjava.net/ldwblog/archive/2017/09/04/432799.html'>阅读全文</a><img src ="http://www.blogjava.net/ldwblog/aggbug/432799.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ldwblog/" target="_blank">David1228</a> 2017-09-04 16:33 <a href="http://www.blogjava.net/ldwblog/archive/2017/09/04/432799.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java IO与NIO技术体系分析</title><link>http://www.blogjava.net/ldwblog/archive/2017/08/02/432714.html</link><dc:creator>David1228</dc:creator><author>David1228</author><pubDate>Wed, 02 Aug 2017 03:41:00 GMT</pubDate><guid>http://www.blogjava.net/ldwblog/archive/2017/08/02/432714.html</guid><wfw:comment>http://www.blogjava.net/ldwblog/comments/432714.html</wfw:comment><comments>http://www.blogjava.net/ldwblog/archive/2017/08/02/432714.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ldwblog/comments/commentRss/432714.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ldwblog/services/trackbacks/432714.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.blogjava.net/ldwblog/archive/2017/08/02/432714.html'>阅读全文</a><img src ="http://www.blogjava.net/ldwblog/aggbug/432714.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ldwblog/" target="_blank">David1228</a> 2017-08-02 11:41 <a href="http://www.blogjava.net/ldwblog/archive/2017/08/02/432714.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Elasticsearch服务重启故障解决过程</title><link>http://www.blogjava.net/ldwblog/archive/2017/07/24/432681.html</link><dc:creator>David1228</dc:creator><author>David1228</author><pubDate>Mon, 24 Jul 2017 11:10:00 GMT</pubDate><guid>http://www.blogjava.net/ldwblog/archive/2017/07/24/432681.html</guid><wfw:comment>http://www.blogjava.net/ldwblog/comments/432681.html</wfw:comment><comments>http://www.blogjava.net/ldwblog/archive/2017/07/24/432681.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ldwblog/comments/commentRss/432681.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ldwblog/services/trackbacks/432681.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.blogjava.net/ldwblog/archive/2017/07/24/432681.html'>阅读全文</a><img src ="http://www.blogjava.net/ldwblog/aggbug/432681.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ldwblog/" target="_blank">David1228</a> 2017-07-24 19:10 <a href="http://www.blogjava.net/ldwblog/archive/2017/07/24/432681.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA应用CPU占用100%|内存泄漏分析总结</title><link>http://www.blogjava.net/ldwblog/archive/2016/12/22/432166.html</link><dc:creator>David1228</dc:creator><author>David1228</author><pubDate>Thu, 22 Dec 2016 15:01:00 GMT</pubDate><guid>http://www.blogjava.net/ldwblog/archive/2016/12/22/432166.html</guid><wfw:comment>http://www.blogjava.net/ldwblog/comments/432166.html</wfw:comment><comments>http://www.blogjava.net/ldwblog/archive/2016/12/22/432166.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/ldwblog/comments/commentRss/432166.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ldwblog/services/trackbacks/432166.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.blogjava.net/ldwblog/archive/2016/12/22/432166.html'>阅读全文</a><img src ="http://www.blogjava.net/ldwblog/aggbug/432166.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ldwblog/" target="_blank">David1228</a> 2016-12-22 23:01 <a href="http://www.blogjava.net/ldwblog/archive/2016/12/22/432166.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CPU利用率100%定位过程</title><link>http://www.blogjava.net/ldwblog/archive/2016/11/04/431955.html</link><dc:creator>David1228</dc:creator><author>David1228</author><pubDate>Fri, 04 Nov 2016 15:44:00 GMT</pubDate><guid>http://www.blogjava.net/ldwblog/archive/2016/11/04/431955.html</guid><wfw:comment>http://www.blogjava.net/ldwblog/comments/431955.html</wfw:comment><comments>http://www.blogjava.net/ldwblog/archive/2016/11/04/431955.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ldwblog/comments/commentRss/431955.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ldwblog/services/trackbacks/431955.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.blogjava.net/ldwblog/archive/2016/11/04/431955.html'>阅读全文</a><img src ="http://www.blogjava.net/ldwblog/aggbug/431955.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ldwblog/" target="_blank">David1228</a> 2016-11-04 23:44 <a href="http://www.blogjava.net/ldwblog/archive/2016/11/04/431955.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jstack Dump 日志文件中的线程状态</title><link>http://www.blogjava.net/ldwblog/archive/2016/07/28/431364.html</link><dc:creator>David1228</dc:creator><author>David1228</author><pubDate>Thu, 28 Jul 2016 09:57:00 GMT</pubDate><guid>http://www.blogjava.net/ldwblog/archive/2016/07/28/431364.html</guid><wfw:comment>http://www.blogjava.net/ldwblog/comments/431364.html</wfw:comment><comments>http://www.blogjava.net/ldwblog/archive/2016/07/28/431364.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ldwblog/comments/commentRss/431364.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ldwblog/services/trackbacks/431364.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.blogjava.net/ldwblog/archive/2016/07/28/431364.html'>阅读全文</a><img src ="http://www.blogjava.net/ldwblog/aggbug/431364.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ldwblog/" target="_blank">David1228</a> 2016-07-28 17:57 <a href="http://www.blogjava.net/ldwblog/archive/2016/07/28/431364.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转] JVM调优总结 + jstat 分析</title><link>http://www.blogjava.net/ldwblog/archive/2016/01/03/428906.html</link><dc:creator>David1228</dc:creator><author>David1228</author><pubDate>Sun, 03 Jan 2016 15:26:00 GMT</pubDate><guid>http://www.blogjava.net/ldwblog/archive/2016/01/03/428906.html</guid><wfw:comment>http://www.blogjava.net/ldwblog/comments/428906.html</wfw:comment><comments>http://www.blogjava.net/ldwblog/archive/2016/01/03/428906.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/ldwblog/comments/commentRss/428906.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ldwblog/services/trackbacks/428906.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: JVM调优总结 + jstat 分析jstat -gccause pid 1 每格1毫秒输出结果jstat -gccause pid 2000 每格2秒输出结果不断的在屏幕打印出结果&nbsp;&nbsp;S0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;S1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;E&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n...&nbsp;&nbsp;<a href='http://www.blogjava.net/ldwblog/archive/2016/01/03/428906.html'>阅读全文</a><img src ="http://www.blogjava.net/ldwblog/aggbug/428906.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ldwblog/" target="_blank">David1228</a> 2016-01-03 23:26 <a href="http://www.blogjava.net/ldwblog/archive/2016/01/03/428906.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Thrift RPC框架介绍</title><link>http://www.blogjava.net/ldwblog/archive/2014/12/03/421011.html</link><dc:creator>David1228</dc:creator><author>David1228</author><pubDate>Wed, 03 Dec 2014 15:56:00 GMT</pubDate><guid>http://www.blogjava.net/ldwblog/archive/2014/12/03/421011.html</guid><wfw:comment>http://www.blogjava.net/ldwblog/comments/421011.html</wfw:comment><comments>http://www.blogjava.net/ldwblog/archive/2014/12/03/421011.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ldwblog/comments/commentRss/421011.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ldwblog/services/trackbacks/421011.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.blogjava.net/ldwblog/archive/2014/12/03/421011.html'>阅读全文</a><img src ="http://www.blogjava.net/ldwblog/aggbug/421011.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ldwblog/" target="_blank">David1228</a> 2014-12-03 23:56 <a href="http://www.blogjava.net/ldwblog/archive/2014/12/03/421011.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Maven及Nexus私服搭建</title><link>http://www.blogjava.net/ldwblog/archive/2013/11/19/406529.html</link><dc:creator>David1228</dc:creator><author>David1228</author><pubDate>Tue, 19 Nov 2013 03:48:00 GMT</pubDate><guid>http://www.blogjava.net/ldwblog/archive/2013/11/19/406529.html</guid><wfw:comment>http://www.blogjava.net/ldwblog/comments/406529.html</wfw:comment><comments>http://www.blogjava.net/ldwblog/archive/2013/11/19/406529.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/ldwblog/comments/commentRss/406529.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ldwblog/services/trackbacks/406529.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.blogjava.net/ldwblog/archive/2013/11/19/406529.html'>阅读全文</a><img src ="http://www.blogjava.net/ldwblog/aggbug/406529.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ldwblog/" target="_blank">David1228</a> 2013-11-19 11:48 <a href="http://www.blogjava.net/ldwblog/archive/2013/11/19/406529.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>源代码分析之HashMap</title><link>http://www.blogjava.net/ldwblog/archive/2013/11/18/406488.html</link><dc:creator>David1228</dc:creator><author>David1228</author><pubDate>Mon, 18 Nov 2013 10:01:00 GMT</pubDate><guid>http://www.blogjava.net/ldwblog/archive/2013/11/18/406488.html</guid><wfw:comment>http://www.blogjava.net/ldwblog/comments/406488.html</wfw:comment><comments>http://www.blogjava.net/ldwblog/archive/2013/11/18/406488.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/ldwblog/comments/commentRss/406488.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ldwblog/services/trackbacks/406488.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.blogjava.net/ldwblog/archive/2013/11/18/406488.html'>阅读全文</a><img src ="http://www.blogjava.net/ldwblog/aggbug/406488.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ldwblog/" target="_blank">David1228</a> 2013-11-18 18:01 <a href="http://www.blogjava.net/ldwblog/archive/2013/11/18/406488.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>分享一道Java面试题</title><link>http://www.blogjava.net/ldwblog/archive/2013/10/31/405857.html</link><dc:creator>David1228</dc:creator><author>David1228</author><pubDate>Thu, 31 Oct 2013 09:32:00 GMT</pubDate><guid>http://www.blogjava.net/ldwblog/archive/2013/10/31/405857.html</guid><wfw:comment>http://www.blogjava.net/ldwblog/comments/405857.html</wfw:comment><comments>http://www.blogjava.net/ldwblog/archive/2013/10/31/405857.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ldwblog/comments/commentRss/405857.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ldwblog/services/trackbacks/405857.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.blogjava.net/ldwblog/archive/2013/10/31/405857.html'>阅读全文</a><img src ="http://www.blogjava.net/ldwblog/aggbug/405857.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ldwblog/" target="_blank">David1228</a> 2013-10-31 17:32 <a href="http://www.blogjava.net/ldwblog/archive/2013/10/31/405857.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>详解Java GC的工作原理+Minor GC、FullGC</title><link>http://www.blogjava.net/ldwblog/archive/2013/07/24/401919.html</link><dc:creator>David1228</dc:creator><author>David1228</author><pubDate>Wed, 24 Jul 2013 08:11:00 GMT</pubDate><guid>http://www.blogjava.net/ldwblog/archive/2013/07/24/401919.html</guid><wfw:comment>http://www.blogjava.net/ldwblog/comments/401919.html</wfw:comment><comments>http://www.blogjava.net/ldwblog/archive/2013/07/24/401919.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ldwblog/comments/commentRss/401919.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ldwblog/services/trackbacks/401919.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.blogjava.net/ldwblog/archive/2013/07/24/401919.html'>阅读全文</a><img src ="http://www.blogjava.net/ldwblog/aggbug/401919.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ldwblog/" target="_blank">David1228</a> 2013-07-24 16:11 <a href="http://www.blogjava.net/ldwblog/archive/2013/07/24/401919.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>（转）定时且周期性的任务研究I--Timer ---- 任务研究II--ScheduledThreadPoolExecutor</title><link>http://www.blogjava.net/ldwblog/archive/2013/03/18/396615.html</link><dc:creator>David1228</dc:creator><author>David1228</author><pubDate>Mon, 18 Mar 2013 10:58:00 GMT</pubDate><guid>http://www.blogjava.net/ldwblog/archive/2013/03/18/396615.html</guid><wfw:comment>http://www.blogjava.net/ldwblog/comments/396615.html</wfw:comment><comments>http://www.blogjava.net/ldwblog/archive/2013/03/18/396615.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ldwblog/comments/commentRss/396615.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ldwblog/services/trackbacks/396615.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: jdk并发部分，如果英文理解有点小难，可以参考http://www.yiibai.com/java6/java/util/concurrent/package-summary.html本篇转自：http://victorzhzh.iteye.com/blog/1011635很多时候我们希望任务可以定时的周期性的执行，在最初的JAVA工具类库中，通过Timer可以实现定时的周期性的需求，但是有一定的...&nbsp;&nbsp;<a href='http://www.blogjava.net/ldwblog/archive/2013/03/18/396615.html'>阅读全文</a><img src ="http://www.blogjava.net/ldwblog/aggbug/396615.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ldwblog/" target="_blank">David1228</a> 2013-03-18 18:58 <a href="http://www.blogjava.net/ldwblog/archive/2013/03/18/396615.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计模式之Composite模式</title><link>http://www.blogjava.net/ldwblog/archive/2012/10/12/389470.html</link><dc:creator>David1228</dc:creator><author>David1228</author><pubDate>Fri, 12 Oct 2012 08:20:00 GMT</pubDate><guid>http://www.blogjava.net/ldwblog/archive/2012/10/12/389470.html</guid><wfw:comment>http://www.blogjava.net/ldwblog/comments/389470.html</wfw:comment><comments>http://www.blogjava.net/ldwblog/archive/2012/10/12/389470.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ldwblog/comments/commentRss/389470.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ldwblog/services/trackbacks/389470.html</trackback:ping><description><![CDATA[<small style="font-family: serif; line-height: normal; background-color: #ffffff; ">假设您今天要开发一个动画编辑程式，动画由影格（Frame）组成，数个影格组合为动画清单，动画清单也可以由其它已完成的动画清单组成，也可以在动画清单与清单之间加入个别影格。无论是影格或动画清单都可以播放，而动画清单负责的就是组合影格或动画清单，所以可以这么设计：<br /><br /><br /><img alt="" src="http://caterpillar.onlyfun.net/Gossip/DesignPattern/images/Composite-1.jpg" style="width: 593px; height: 307px; " /><br /><br /></small><small style="font-family: serif; line-height: normal; background-color: #ffffff; ">对于Frame而言，Playlist是一个容器，然而Playlist也实作Playable，所以它也可以播放，您可以进一步地将Playlist组合至另一个Playlist中，以形成更长的播放清单。以Java实现的话。<br /></small><small style="font-family: serif; line-height: normal; background-color: #ffffff; "><small>以Java實現的話。<br /></small><pre style="color: #333333; border: 1px solid #777777; background-color: #eeeeee; margin: 3px 25px; padding: 0px 10px; font-size: small; line-height: 17px; width: auto; font-family: 'Courier New', Courier, monospace; ">import java.util.*;<br /><br />interface Playable {<br />    void play();<br />}<br /><br />class Frame implements Playable {<br />    private String image;<br />    Frame(String image) {<br />        this.image = image;<br />    }<br />    public void play() {<br />        System.out.println("播放 " + image);<br />    }<br />}<br /><br />class Playlist implements Playable {<br />    private List&lt;Playable&gt; list = new ArrayList&lt;Playable&gt;();<br />    public void add(Playable playable) {<br />        list.add(playable);<br />    }<br />    public void play() {<br />        for(Playable playable : list) {<br />            playable.play();<br />        }<br />    }<br />}<br /><br />public class Main {<br />    public static void main(String[] args) {<br />        Frame logo = new Frame("片頭 LOGO");<br />        <br />        Playlist playlist1 = new Playlist();<br />        playlist1.add(new Frame("Duke 左揮手"));<br />        playlist1.add(new Frame("Duke 右揮手"));<br />        <br />        Playlist playlist2 = new Playlist();<br />        playlist2.add(new Frame("Duke 走左腳"));<br />        playlist2.add(new Frame("Duke 走右腳"));<br />        <br />        Playlist all = new Playlist();<br />        all.add(logo);<br />        all.add(playlist1);<br />        all.add(playlist2);<br />        <br />        all.play();<br />    }<br />}</pre><small></small><small><br />以Python實現的話：<br /></small><pre style="color: #333333; border: 1px solid #777777; background-color: #eeeeee; margin: 3px 25px; padding: 0px 10px; font-size: small; line-height: 17px; width: auto; font-family: 'Courier New', Courier, monospace; ">class Frame:<br />    def __init__(self, image):<br />        self.image = image<br />    def play(self):<br />        print("播放 " + self.image)<br /><br />class Playlist:<br />    def __init__(self):<br />        self.list = []<br />    def add(self, playable):<br />        self.list.append(playable);<br />    def play(self):<br />        for playable in self.list:<br />            playable.play()<br />            <br />logo = Frame("片頭 LOGO")<br />        <br />playlist1 = Playlist()<br />playlist1.add(Frame("Duke 左揮手"))<br />playlist1.add(Frame("Duke 右揮手"))<br />        <br />playlist2 = Playlist()<br />playlist2.add(Frame("Duke 走左腳"))<br />playlist2.add(Frame("Duke 走右腳"))<br />        <br />all = Playlist()<br />all.add(logo)<br />all.add(playlist1)<br />all.add(playlist2)<br /><br /></pre><span style="background-color: #eeeeee; color: #333333; font-family: 'Courier New', Courier, monospace; font-size: small; line-height: 17px; ">all.play();</span>以UML来表示Composite模式的结构：<br /><img alt="" src="http://caterpillar.onlyfun.net/Gossip/DesignPattern/images/Composite-2.jpg" style="width: 556px; height: 329px; " /><br /><br /></small><small style="font-family: serif; line-height: normal; background-color: #ffffff; "><br />具有层次性或组合性的物件可以使用Composite模式，像是电路元件、视窗元件等，使用Composite模式可以大大减低这些元件设计的复杂度，以Java标准API中AWT视窗元件为例，</small><small style="font-family: serif; line-height: normal; background-color: #ffffff; ">Component上有个paint()方法，可以进行元件的绘制，</small><small style="font-family: serif; line-height: normal; background-color: #ffffff; ">Container可以容纳Component（如Button、Label等），而Container继承Component，所以Container也可以容纳Container，这也是Composite模式的实际例子：<br /><img alt="" src="http://caterpillar.onlyfun.net/Gossip/DesignPattern/images/Composite-3.jpg" style="width: 627px; height: 237px; " /></small>&nbsp;<br /><br />from ：&nbsp;<a href="http://caterpillar.onlyfun.net/Gossip/index.html">http://caterpillar.onlyfun.net/Gossip/index.html</a>&nbsp;<br /><br /><br /><br /><img src ="http://www.blogjava.net/ldwblog/aggbug/389470.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ldwblog/" target="_blank">David1228</a> 2012-10-12 16:20 <a href="http://www.blogjava.net/ldwblog/archive/2012/10/12/389470.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Queue</title><link>http://www.blogjava.net/ldwblog/archive/2012/03/19/372191.html</link><dc:creator>David1228</dc:creator><author>David1228</author><pubDate>Mon, 19 Mar 2012 06:45:00 GMT</pubDate><guid>http://www.blogjava.net/ldwblog/archive/2012/03/19/372191.html</guid><wfw:comment>http://www.blogjava.net/ldwblog/comments/372191.html</wfw:comment><comments>http://www.blogjava.net/ldwblog/archive/2012/03/19/372191.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ldwblog/comments/commentRss/372191.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ldwblog/services/trackbacks/372191.html</trackback:ping><description><![CDATA[<div><p>在Set中有一个排序的集合SortedSet，用来保存按照自然顺序排列的对象。Queue中同样引入了一个支持排序的FIFO模型。</p> <h4><a href="../../xylz/archive/2010/07/21/326723.html">并发队列与Queue简介</a>   中介绍了，PriorityQueue和PriorityBlockingQueue就是支持排序的Queue。显然一个支持阻塞的排序Queue要比一 个非线程安全的Queue实现起来要复杂的多，因此下面只介绍PriorityBlockingQueue，至于PriorityQueue只需要去掉 Blocking功能就基本相同了。</h4> <p>&nbsp;转自: http://www.blogjava.net/xylz/archive/2010/07/30/327582.htm</p> <p><strong>排序的BlockingQueue &#8212; PriorityBlockingQueue</strong></p> <p>先简单介绍下PriorityQueue，因为PriorityBlockingQueue内部就是通过PriorityQueue适配实现的，只不过通过锁进行同步和阻塞而已。</p> <p>PriorityQueue是一个数组实现的，是一个二叉树的实现，这个二叉树的任意一个节点都比其子节点要小，这样顶点就是最小的节点。每一个元 素或者节点要么本身是可比较的（Comparable），或者队列本身带有一个比较器（Comparator&lt;? super  E&gt;），所有元素就是靠比较自身的大小来确定顺序的。而数组中顶点就是数组的第0个元素，因此出队列的话总是取第0个元素。对于第0个元素，其子节 点是第1个元素和第2个元素，对于第1个元素，其子元素又是第3/4个元素，以此类推，第i个元素的父节点就是(i-1)/2。这样任意一个元素加入队列 就从其父节点(i-1)/2开始比较，一旦新节点比父节点小就交换两个节点，然后继续比较新节点与其新的父节点。知道所有节点都是按照父节点一定比子节点 小的顺序排列。这是一个有点复杂的算法，此处不再讨论更多的细节。不管是删除还是查找，我们只需要了解的顶点（索引为0的元素）总是最小的。</p> <p>特别需要说明的是PriorityQueue是一个无界的队列，也就是说一旦元素的个数达到了数组的大小，那么就将数组扩大50%，这样这个数组就是无穷大的。当然了如果达到了整数的最大值就会得到一个OutOfMemoryError，这个是由逻辑保证的。</p> <p>&nbsp;</p> <p>对于PriorityBlockingQueue而言，由于是无界的，因此就只有非空的信号，也就是说只有take()才能阻塞，put是永远不会阻塞（除非达到Integer.MAX_VALUE直到抛出一个OutOfMemoryError异常）。</p> <p>只有take()操作的时候才可能因为队列为空而挂起。同时其它需要操作队列变化和大小的只需要使用独占锁ReentrantLock就可以了，非常方便。需要说明的是PriorityBlockingQueue采用了一个公平的锁。</p> <p>&nbsp;</p> <p>总的来说PriorityBlockingQueue 不是一个FIFO的队列，而是一个有序的队列，这个队列总是取&#8220;自然顺序&#8221;最小的对象，同时又是一个只能出队列阻塞的BlockingQueue，对于入队列却不是阻塞的。所有操作都是线程安全的。</p> <p>&nbsp;</p> <p><strong>直接交换的BlockingQueue &#8212; SynchronousQueue</strong></p> <p>&nbsp;</p> <p>这是一个很有意思的阻塞队列，其中每个插入操作必须等待另一个线程的移除操作，同样任何一个移除操作都等待另一个线程的插入操作。因此此队列内部其 实没有任何一个元素，或者说容量是0，严格说并不是一种容器。由于队列没有容量，因此不能调用peek操作，因为只有移除元素时才有元素。</p> <p>一个没有容量的并发队列有什么用了？或者说存在的意义是什么？</p> <p>SynchronousQueue  的实现非常复杂，当然了如果真要去分析还是能够得到一些经验的，但是前面分析了过多的结构后，发现越来越陷于数据结构与算法里面了。我的初衷是通过研究并 发实现的原理来更好的利用并发来最大限度的利用可用资源。所以在后面的章节中尽可能的少研究数据结构和算法，但是为了弄清楚里面的原理，必不可免的会涉及 到一些这方面的知识，希望后面能够适可而止。</p> <p>再回到话题。SynchronousQueue  内部没有容量，但是由于一个插入操作总是对应一个移除操作，反过来同样需要满足。那么一个元素就不会再SynchronousQueue  里面长时间停留，一旦有了插入线程和移除线程，元素很快就从插入线程移交给移除线程。也就是说这更像是一种信道（管道），资源从一个方向快速传递到另一方 向。</p> <p>需要特别说明的是，尽管元素在SynchronousQueue 内部不会&#8220;停留&#8221;，但是并不意味之SynchronousQueue  内部没有队列。实际上SynchronousQueue  维护者线程队列，也就是插入线程或者移除线程在不同时存在的时候就会有线程队列。既然有队列，同样就有公平性和非公平性特性，公平性保证正在等待的插入线 程或者移除线程以FIFO的顺序传递资源。</p> <p>显然这是一种快速传递元素的方式，也就是说在这种情况下元素总是以最快的方式从插入着（生产者）传递给移除着（消费者），这在多任务队列中是最快处理任务的方式。在线程池的相关章节中还会更多的提到此特性。</p> <p>&nbsp;</p> <p>事实上在《<a href="../../xylz/archive/2010/07/21/326723.html">并发队列与Queue简介</a>》 中介绍了还有一种BlockingQueue的实现DelayQueue，它描述的是一种延时队列。这个队列的特性是，队列中的元素都要延迟时间（超时时 间），只有一个元素达到了延时时间才能出队列，也就是说每次从队列中获取的元素总是最先到达延时的元素。这种队列的场景就是计划任务。比如以前要完成计划 任务，很有可能是使用Timer/TimerTask，这是一种循环检测的方式，也就是在循环里面遍历所有元素总是检测元素是否满足条件，一旦满足条件就 执行相关任务。显然这中方式浪费了很多的检测工作，因为大多数时间总是在进行无谓的检测。而DelayQueue  却能避免这种无谓的检测。在线程池的计划任务部分还有更加详细的讨论此队列实现。</p> <p>&nbsp;</p> <p>下面就对常见的BlockingQueue进行小节下，这里不包括双向的队列，尽管ConcurrentLinkedQueue不是可阻塞的Queue，但是这里还是将其放在一起进行对比。</p> <p>&nbsp;</p> <p><a href="../../images/blogjava_net/xylz/WindowsLiveWriter/JavaConcurrency23part8BlockingQueue3_1086D/image_2.png"><img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="并发队列比较" alt="并发队列比较" src="../../images/blogjava_net/xylz/WindowsLiveWriter/JavaConcurrency23part8BlockingQueue3_1086D/image_thumb.png" width="601" border="0" height="721" /></a> </p> <p>如果不需要阻塞队列，优先选择ConcurrentLinkedQueue；如果需要阻塞队列，队列大小固定优先选择 ArrayBlockingQueue，队列大小不固定优先选择LinkedBlockingQueue；如果需要对队列进行排序，选择 PriorityBlockingQueue；如果需要一个快速交换的队列，选择SynchronousQueue；如果需要对队列中的元素进行延时操 作，则选择DelayQueue。</p></div><img src ="http://www.blogjava.net/ldwblog/aggbug/372191.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ldwblog/" target="_blank">David1228</a> 2012-03-19 14:45 <a href="http://www.blogjava.net/ldwblog/archive/2012/03/19/372191.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>public static void main(String[] args){}函数诠释</title><link>http://www.blogjava.net/ldwblog/archive/2010/08/30/330301.html</link><dc:creator>David1228</dc:creator><author>David1228</author><pubDate>Mon, 30 Aug 2010 08:15:00 GMT</pubDate><guid>http://www.blogjava.net/ldwblog/archive/2010/08/30/330301.html</guid><wfw:comment>http://www.blogjava.net/ldwblog/comments/330301.html</wfw:comment><comments>http://www.blogjava.net/ldwblog/archive/2010/08/30/330301.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ldwblog/comments/commentRss/330301.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ldwblog/services/trackbacks/330301.html</trackback:ping><description><![CDATA[主函数的一般写法如下：
<p>　　public static void main(String[] args){&#8230;}</p>
<p>　　下面分别解释这些关键字的作用：</p>
<p>　　（1）public关键字，这个好理解，声明主函数为public就是告诉其他的类可以访问这个函数。</p>
<p>　　（2）static关键字，告知编译器main函数是一个静态函数。也就是说main函数中的代码是存储在静态存储区的，即当定义了类以后这段代码就已经存在了。如果main()方法没有使用static修饰符，那么编译不会出错，但是如果你试图执行该程序将会报错，提示main()方法不存在。因为包含main()的类并没有实例化（即没有这个类的对象），所以其main()方法也不会存。而使用static修饰符则表示该方法是静态的，不需要实例化即可使用。</p>
<p>　　（3）void关键字表明main()的返回值是无类型。</p>
<p>　　**（4）参数String[] args，这是本文的重点。</p>
<p>　　第一、程序使用者可以在命令行状态下向某个类传递参数。看下面的例子：</p>
<p>　　public class ArgsDemo {</p>
<p>　　public static void main(String[] args) {</p>
<p>　　String str = new String();</p>
<p>　　for (int i = 0; i &lt; args.length; i++) {</p>
<p>　　System.out.println(args[i]);</p>
<p>　　str += args[i];</p>
<p>　　}</p>
<p>　　System.out.println(str);</p>
<p>　　}</p>
<p>　　}</p>
<p>　　使用javac ArgsDemo.java命令生成ArgsDemo.class文件；然后使用&#8220;java ArgsDemo 参数一 参数二 参数三 &#8230;&#8221;的格式向ArgsDemo类传递参数。该示例程序将首先输出参数，然后输出所有参数的和。比如java ArgsDemo a b c,将得到这样的输出：</p>
<p>　　a</p>
<p>　　b</p>
<p>　　c</p>
<p>　　abc</p>
<p>　　需要注意的是，如果这里的循环条件不是i &lt;args.length，而是i &lt;5，则在命令行中输入的参数必须是5个，否则将会报错，错误类型为：</p>
<p>　　Exception in thread &#8220;main&#8221; java.lang.ArrayIndexOutOfBoundException:3</p>
<p>　　at ArgsDemo.main(ArgsDemo.java:5)</p>
<p>　　第二、可以在另一个类中向包含main()的类传递参数，如下例：</p>
<p>　　public class A {</p>
<p>　　public static void main(String[] args)</p>
<p>　　{</p>
<p>　　for(int i=0;i &lt;args.length;i++)</p>
<p>　　System.out.println(args[i]);</p>
<p>　　}</p>
<p>　　}</p>
<p>　　public class B {</p>
<p>　　public static void main(String[] args)</p>
<p>　　{</p>
<p>　　c = new A();</p>
<p>　　String[] b = {"111","222","333"};</p>
<p>　　c.main(b);</p>
<p>　　}</p>
<p>　　}</p>
<p>　　首先定义一个class A，在A中定义一个main()函数，在该函数中输出参数args。然后定义一个classB，在B中初始化一个A的实例c，然后向c传递参数，并且调用c的main方法打印出传入的参数值。输出结果如下：</p>
<p>　　111</p>
<p>　　222</p>
<p>　　333</p>
<p>　　由于main()函数是静态函数，即不需要实例化也能使用，所以B使用下面的写法也能完成相同的功能：</p>
<p>　　public class B {</p>
<p>　　public static void main(String[] args)</p>
<p>　　{</p>
<p>　　//A c = new A();</p>
<p>　　String[] b = {"111","222","333"};</p>
<p>　　A.main(b);</p>
<p>　　}</p>
<p>　　}</p>
<p>　　总结：参数args的主要作用是为程序使用者在命令行状态下与程序交互提供了一种手段。此外在其他类中直接使用main()函数，并传递参数也是可行的，虽然这种方法不太常用，但毕竟为我们提供了一种选择。</p>
<img src ="http://www.blogjava.net/ldwblog/aggbug/330301.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ldwblog/" target="_blank">David1228</a> 2010-08-30 16:15 <a href="http://www.blogjava.net/ldwblog/archive/2010/08/30/330301.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>获取执行时间段的工作日和周末.....</title><link>http://www.blogjava.net/ldwblog/archive/2010/08/30/330271.html</link><dc:creator>David1228</dc:creator><author>David1228</author><pubDate>Mon, 30 Aug 2010 05:52:00 GMT</pubDate><guid>http://www.blogjava.net/ldwblog/archive/2010/08/30/330271.html</guid><wfw:comment>http://www.blogjava.net/ldwblog/comments/330271.html</wfw:comment><comments>http://www.blogjava.net/ldwblog/archive/2010/08/30/330271.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ldwblog/comments/commentRss/330271.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ldwblog/services/trackbacks/330271.html</trackback:ping><description><![CDATA[/**<br />
&nbsp; * 获取指定日期之间的所有日期list&nbsp;工作日和周末<br />
&nbsp; * @param start<br />
&nbsp; * @param end<br />
&nbsp; * @return List&lt;List&gt;<br />
&nbsp; */<br />
&nbsp;private&nbsp; Map getDaysMap(Date start,Date end){<br />
&nbsp;&nbsp;Map rsmap = new HashMap();<br />
&nbsp;&nbsp;List gzrList = new ArrayList();//工作日<br />
&nbsp;&nbsp;List zmList = new ArrayList();//周末<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;long ldays = 0;<br />
&nbsp;&nbsp;if(start!=null &amp;&amp; end!=null){<br />
&nbsp;&nbsp;&nbsp;Calendar c = Calendar.getInstance(); <br />
&nbsp;&nbsp;&nbsp;c.setTime(start);<br />
&nbsp;&nbsp;&nbsp;c.set(Calendar.HOUR_OF_DAY, 0);<br />
&nbsp;&nbsp;&nbsp;c.set(Calendar.MINUTE, 0);<br />
&nbsp;&nbsp;&nbsp;c.set(Calendar.SECOND, 0);<br />
&nbsp;&nbsp;&nbsp;c.set(Calendar.MILLISECOND, 0);<br />
&nbsp;&nbsp;&nbsp;start = c.getTime();<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;//<br />
&nbsp;&nbsp;&nbsp;c.setTime(end);<br />
&nbsp;&nbsp;&nbsp;c.set(Calendar.HOUR_OF_DAY, 23);<br />
&nbsp;&nbsp;&nbsp;c.set(Calendar.MINUTE, 59);<br />
&nbsp;&nbsp;&nbsp;c.set(Calendar.SECOND, 59);<br />
&nbsp;&nbsp;&nbsp;c.set(Calendar.MILLISECOND, 999);<br />
&nbsp;&nbsp;&nbsp;end = c.getTime();<br />
&nbsp;&nbsp;&nbsp;DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");<br />
&nbsp;&nbsp;&nbsp;if(start.getTime()&lt;=end.getTime()){<br />
&nbsp;&nbsp;&nbsp;&nbsp;//判断相隔的天数<br />
&nbsp;&nbsp;&nbsp;&nbsp;ldays = (end.getTime()-start.getTime())/(1000*24*60*60) + 1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;for(int i=0;i&lt;ldays;i++)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Date d = getNextDay(start,i);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String str = df.format(d);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.print(str);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c.setTime(d);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int dw = c.get(Calendar.DAY_OF_WEEK);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(dw==Calendar.SUNDAY || dw==Calendar.SATURDAY){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zmList.add(transToStr(d));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(" 周末");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gzrList.add(transToStr(d));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(" 工作日");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;rsmap.put("1", gzrList);<br />
&nbsp;&nbsp;rsmap.put("2", zmList);<br />
&nbsp;&nbsp;return rsmap;<br />
&nbsp;}
<img src ="http://www.blogjava.net/ldwblog/aggbug/330271.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ldwblog/" target="_blank">David1228</a> 2010-08-30 13:52 <a href="http://www.blogjava.net/ldwblog/archive/2010/08/30/330271.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>查找2个有序整数数组的合集</title><link>http://www.blogjava.net/ldwblog/archive/2010/08/23/329636.html</link><dc:creator>David1228</dc:creator><author>David1228</author><pubDate>Mon, 23 Aug 2010 03:37:00 GMT</pubDate><guid>http://www.blogjava.net/ldwblog/archive/2010/08/23/329636.html</guid><wfw:comment>http://www.blogjava.net/ldwblog/comments/329636.html</wfw:comment><comments>http://www.blogjava.net/ldwblog/archive/2010/08/23/329636.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ldwblog/comments/commentRss/329636.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ldwblog/services/trackbacks/329636.html</trackback:ping><description><![CDATA[<ol class="dp-j">
    <li class="alt"><span><span class="comment"><span style="color: #0000ff"><span id="span1282534580015"><span><span class="comment"><span>&nbsp;
    <ol class="dp-j">
        <li class="alt"><span class="comment">/** &nbsp;</span></li>
        <li class=""><span class="comment">&nbsp;*&nbsp;查找2个有序整数数组的合集 &nbsp;</span></li>
        <li class="alt"><span class="comment">&nbsp;*&nbsp; &nbsp;</span></li>
        <li class=""><span class="comment">&nbsp;*&nbsp;@author&nbsp;Java人(javaren.org) &nbsp;</span></li>
        <li class="alt"><span class="comment">&nbsp;*/&nbsp;&nbsp;</span></li>
        <li class=""><span class="keyword">public</span>&nbsp;<span class="keyword">class</span>&nbsp;TestRetainAll&nbsp;{ &nbsp;&nbsp;</span></li>
        <li class="alt">&nbsp;&nbsp;<span class="keyword">public</span>&nbsp;<span class="keyword">static</span>&nbsp;<span class="keyword">void</span>&nbsp;main(String[]&nbsp;args)&nbsp;{ &nbsp;&nbsp;</span></li>
        <li class="">&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">int</span>[]&nbsp;a&nbsp;=&nbsp;{&nbsp;<span class="number">1</span>,&nbsp;<span class="number">5</span>,&nbsp;<span class="number">8</span>,&nbsp;<span class="number">10</span>,&nbsp;<span class="number">14</span>,&nbsp;<span class="number">15</span>,&nbsp;<span class="number">17</span>,&nbsp;<span class="number">18</span>,&nbsp;<span class="number">20</span>,&nbsp;<span class="number">22</span>,&nbsp;<span class="number">24</span>,&nbsp;<span class="number">25</span>,&nbsp;<span class="number">28</span>&nbsp;}; &nbsp;&nbsp;</span></li>
        <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">int</span>&nbsp;b[]&nbsp;=&nbsp;{&nbsp;<span class="number">2</span>,&nbsp;<span class="number">4</span>,&nbsp;<span class="number">6</span>,&nbsp;<span class="number">8</span>,&nbsp;<span class="number">10</span>,&nbsp;<span class="number">12</span>&nbsp;}; &nbsp;&nbsp;</span></li>
        <li class="">&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">int</span>&nbsp;i&nbsp;=&nbsp;<span class="number">0</span>; &nbsp;&nbsp;</span></li>
        <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">int</span>&nbsp;j&nbsp;=&nbsp;<span class="number">0</span>; &nbsp;&nbsp;</span></li>
        <li class="">&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">while</span>&nbsp;(i&nbsp;&lt;&nbsp;a.length&nbsp;&amp;&amp;&nbsp;j&nbsp;&lt;&nbsp;b.length)&nbsp;{ &nbsp;&nbsp;</span></li>
        <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span>&nbsp;(a[i]&nbsp;&lt;&nbsp;b[j])&nbsp;{ &nbsp;&nbsp;</span></li>
        <li class="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i++; &nbsp;&nbsp;</li>
        <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span class="keyword">else</span>&nbsp;<span class="keyword">if</span>&nbsp;(a[i]&nbsp;==&nbsp;b[j])&nbsp;{ &nbsp;&nbsp;</span></li>
        <li class="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(a[i]); &nbsp;&nbsp;</li>
        <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i++; &nbsp;&nbsp;</li>
        <li class="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;j++; &nbsp;&nbsp;</li>
        <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span class="keyword">else</span>&nbsp;{ &nbsp;&nbsp;</span></li>
        <li class="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;j++; &nbsp;&nbsp;</li>
        <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</li>
        <li class="">&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</li>
        <li class="alt">&nbsp;&nbsp;} &nbsp;&nbsp;</li>
        <li class="">}&nbsp;&nbsp;</li>
    </ol>
    </span></span></span>~</span></span></span></span></li>
</ol>
<img src ="http://www.blogjava.net/ldwblog/aggbug/329636.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ldwblog/" target="_blank">David1228</a> 2010-08-23 11:37 <a href="http://www.blogjava.net/ldwblog/archive/2010/08/23/329636.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> JVM沙箱&amp;框架</title><link>http://www.blogjava.net/ldwblog/archive/2010/08/17/329074.html</link><dc:creator>David1228</dc:creator><author>David1228</author><pubDate>Tue, 17 Aug 2010 02:35:00 GMT</pubDate><guid>http://www.blogjava.net/ldwblog/archive/2010/08/17/329074.html</guid><wfw:comment>http://www.blogjava.net/ldwblog/comments/329074.html</wfw:comment><comments>http://www.blogjava.net/ldwblog/archive/2010/08/17/329074.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ldwblog/comments/commentRss/329074.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ldwblog/services/trackbacks/329074.html</trackback:ping><description><![CDATA[<div class="t_msgfont" id="postmessage_216532"><font face="Arial"><font color="#0000ff">RMI罗唆得太多了，实在是尽力想把它说清楚，希望对大家有帮助。最后的最后，给大家简单讲一下JVM框架，我们叫做Java沙箱。Java沙箱的基本组件如下：<br />
a) 类装载器结构<br />
b) class文件检验器<br />
c) 内置于Java虚拟机的安全特性<br />
d) 安全管理器及Java API<br />
<br />
其中类装载器在3个方面对Java沙箱起作用：<br />
a. 它防止恶意代码去干涉善意的代码<br />
b. 它守护了被信任的类库边界<br />
c. 它将代码归入保护域，确定了代码可以进行哪些操作<br />
<br />
虚拟机为不同的类加载器载入的类提供不同的命名空间，命名空间由一系列唯一的名称组成，每一个被装载的类将有一个名字，这个命名空间是由Java虚拟机为每一个类装载器维护的，它们互相之间甚至不可见。<br />
<br />
我们常说的包（package）是在Java虚拟机第2版的规范第一次出现，正确定义是由同一个类装载器装载的、属于同一个包、多个类型的集合。类装载器采用的机制是双亲委派模式。具体的加载器框架我在Java杂谈（一）中已经解释过了，当时说最外层的加载器是AppClassLoader，其实算上网络层的话AppClassLoader也可以作为parent，还有更外层的加载器URLClassLoader。为了防止恶意攻击由URL加载进来的类文件我们当然需要分不同的访问命名空间，并且制定最安全的加载次序，简单来说就是两点：<br />
<br />
a. 从最内层JVM自带类加载器开始加载，外层恶意同名类得不到先加载而无法使用<br />
b. 由于严格通过包来区分了访问域，外层恶意的类通过内置代码也无法获得权限访问到内层类，破坏代码就自然无法生效。<br />
<br />
附：关于Java的平台无关性，有一个例子可以很明显的说明这个特性：<br />
一般来说，C或C++中的int占位宽度是根据目标平台的字长来决定的，这就意味着针对不同的平台编译同一个C++程序在运行时会有不同的行为。然而对于 Java中的int都是32位的二进制补码标识的有符号整数，而float都是遵守IEEE 754浮点标准的32位浮点数。<br />
<br />
PS: 这个小弟最近也没时间继续研究下去了，只是想抛砖引玉的提供给大家一个初步认识JVM的印象。有机会了解一下JVM的内部结构对今后做Java开发是很有好处的。</font></font></div>
<img src ="http://www.blogjava.net/ldwblog/aggbug/329074.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ldwblog/" target="_blank">David1228</a> 2010-08-17 10:35 <a href="http://www.blogjava.net/ldwblog/archive/2010/08/17/329074.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java中的RMI机制</title><link>http://www.blogjava.net/ldwblog/archive/2010/08/17/329072.html</link><dc:creator>David1228</dc:creator><author>David1228</author><pubDate>Tue, 17 Aug 2010 02:30:00 GMT</pubDate><guid>http://www.blogjava.net/ldwblog/archive/2010/08/17/329072.html</guid><wfw:comment>http://www.blogjava.net/ldwblog/comments/329072.html</wfw:comment><comments>http://www.blogjava.net/ldwblog/archive/2010/08/17/329072.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ldwblog/comments/commentRss/329072.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ldwblog/services/trackbacks/329072.html</trackback:ping><description><![CDATA[RMI的全称是远程方法调用，相信不少朋友都听说过，基本的思路可以用一个经典比方来解释：A计算机想要计算一个两个数的加法，但A自己做不了，于是叫另外一台计算机B帮忙，B有计算加法的功能，A调用它就像调用这个功能是自己的一样方便。这个就叫做远程方法调用了。<br />
<br />
远程方法调用是EJB实现的支柱，建立分布式应用的核心思想。这个很好理解，再拿上面的计算加法例子，A只知道去call计算机B的方法，自己并没有B的那些功能，所以A计算机端就无法看到B执行这段功能的过程和代码，因为看都看不到，所以既没有机会窃取也没有机会去改动方法代码。EJB正式基于这样的思想来完成它的任务的。当简单的加法变成复杂的数据库操作和电子商务交易应用的时候，这样的安全性和分布式应用的便利性就表现出来优势了。<br />
<br />
好了，回到细节上，要如何实现远程方法调用呢？我希望大家学习任何技术的时候可以试着依赖自己的下意识判断，只要你的想法是合理健壮的，那么很可能实际上它就是这么做的，毕竟真理都蕴藏在平凡的生活细节中。这样只要带着一些薄弱的Java基础来思考RMI，其实也可以想出个大概来。<br />
<br />
a) 需要有一个服务器角色，它拥有真正的功能代码方法。例如B，它提供加法服务<br />
b) 如果想远程使用B的功能，需要知道B的IP地址<br />
c) 如果想远程使用B的功能，还需要知道B中那个特定服务的名字<br />
<br />
我们很自然可以想到这些，虽然不完善，但已经很接近正确的做法了。实际上RMI要得以实现还得意于Java一个很重要的特性，就是Java反射机制。我们需要知道服务的名字，但又必须隐藏实现的代码，如何去做呢？答案就是：接口！<br />
举个例子：<br />
public interface Person(){<br />
public void sayHello();<br />
}<br />
<br />
Public class PersonImplA implements Person{<br />
public PersonImplA(){}<br />
<br />
public void sayHello(){ System.out.println(&#8220;Hello!&#8221;);}<br />
}<br />
<br />
Public class PersonImplB implements Person{<br />
public PersonImplB(){}<br />
<br />
public void sayHello(){ System.out.println(&#8220;Nice to meet you!&#8221;);}<br />
}<br />
<br />
客户端：Person p = Naming.lookup(&#8220;PersonService&#8221;);<br />
p.sayHello();<br />
<br />
就这几段代码就包含了几乎所有的实现技术，大家相信么？客户端请求一个say hello服务，服务器运行时接到这个请求，利用Java反射机制的Class.newInstance()返回一个对象，但客户端不知道服务器返回的是 ImplA还是ImplB，它接受用的参数签名是Person，它知道实现了Person接口的对象一定有sayHello()方法，这就意味着客户端并不知道服务器真正如何去实现的，但它通过了解Person接口明确了它要用的服务方法名字叫做sayHello()。<br />
<br />
如此类推，服务器只需要暴露自己的接口出来供客户端，所有客户端就可以自己选择需要的服务。这就像餐馆只要拿出自己的菜单出来让客户选择，就可以在后台厨房一道道的按需做出来，它怎么做的通常是不让客户知道的！（祖传菜谱吧，^_^）<br />
<br />
最后一点是我调用lookup，查找一个叫PersonService名字的对象，服务器只要看到这个名字，在自己的目录（相当于电话簿）中找到对应的对象名字提供服务就可以了，这个目录就叫做JNDI (Java命名与目录接口），相信大家也听过的。<br />
<br />
有兴趣的朋友不妨自己做个RMI的应用，很多前辈的博客中有简单的例子。提示一下利用Jdk的bin目录中rmi.exe和 rmiregistry.exe两个命令就可以自己建起一个服务器，提供远程服务。因为例子很容易找，我就不自己举例子了！<br />
<img src ="http://www.blogjava.net/ldwblog/aggbug/329072.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ldwblog/" target="_blank">David1228</a> 2010-08-17 10:30 <a href="http://www.blogjava.net/ldwblog/archive/2010/08/17/329072.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java关于XML的解析</title><link>http://www.blogjava.net/ldwblog/archive/2010/08/17/329069.html</link><dc:creator>David1228</dc:creator><author>David1228</author><pubDate>Tue, 17 Aug 2010 02:15:00 GMT</pubDate><guid>http://www.blogjava.net/ldwblog/archive/2010/08/17/329069.html</guid><wfw:comment>http://www.blogjava.net/ldwblog/comments/329069.html</wfw:comment><comments>http://www.blogjava.net/ldwblog/archive/2010/08/17/329069.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ldwblog/comments/commentRss/329069.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ldwblog/services/trackbacks/329069.html</trackback:ping><description><![CDATA[相信大家对XML都不陌生，含义是可扩展标记语言。本身它也就是一个数据的载体以树状表现形式出现。后来慢慢的数据变成了信息，区别是信息可以包括可变的状态从而针对程序硬编码的做法变革为针对统一接口硬编码而可变状态作为信息进入了XML中存储。这样改变状态实现扩展的唯一工作是在XML中添加一段文本信息就可以了，代码不需要改动也不需要重新编译。这个灵活性是XML诞生时候谁也没想到的。<br />
<br />
当然，如果接口要能提取XML中配置的信息就需要程序能解析规范的XML文件，Java中当然要提高包对这个行为进行有利支持。笔者打算讲到的两个包是 org.w3c.dom和javax.xml.parsers和。（大家可以浏览一下这些包中间的接口和类定义）<br />
<br />
Javax.xml.parsers包很简单，没有接口，两个工厂配两个解析器。显然解析XML是有两种方式的：DOM解析和SAX解析。本质上并没有谁好谁不好，只是实现的思想不一样罢了。给一个XML文件的例子：<br />
&lt;?xml version=&#8221;1.0&#8221; encoding=&#8221;UTF-8&#8221; &gt;<br />
&lt;root &gt;<br />
&lt;child name=&#8221;Kitty&#8221; &gt;<br />
A Cat<br />
&lt;/child &gt;<br />
&lt;/root &gt;<br />
<br />
所谓DOM解析的思路是把整个树状图存入内存中，需要那个节点只需要在树上搜索就可以读到节点的属性，内容等，这样的好处是所有节点皆在内存可以反复搜索重复使用，缺点是需要消耗相应的内存空间。<br />
<br />
自然SAX解析的思路就是为了克服DOM的缺点，以事件触发为基本思路，顺序的搜索下来，碰到了Element之前触发什么事件，碰到之后做什么动作。由于需要自己来写触发事件的处理方案，所以需要借助另外一个自定义的Handler，处于org.xml.sax.helpers包中。它的优点当然是不用整个包都读入内存，缺点也是只能顺序搜索，走完一遍就得重来。<br />
<br />
大家很容易就能猜到，接触到的J2ee框架用的是哪一种，显然是DOM。因为类似Struts，Hibernate框架配置文件毕竟是很小的一部分配置信息，而且需要频繁搜索来读取，当然会采用DOM方式（其实SAX内部也是用DOM采用的结构来存储节点信息的）。现在无论用什么框架，还真难发现使用 SAX来解析XML的技术了，如果哪位仁兄知道，请让笔者也学习学习。<br />
<br />
既然解析方式有了，那么就需要有解析的存储位置。不知道大家是否发现org.w3c.dom这个包是没有实现类全部都是接口的。这里笔者想说一下Java 如何对XML解析是Jdk应该考虑的事，是它的责任。而w3c组织是维护定义XML标准的组织，所以一个XML结构是怎么样的由w3c说了算，它不关心 Java如何去实现，于是乎规定了所有XML存储的结构应该遵循的规则，这就是org.w3c.dom里全部的接口目的所在。在笔者看来，简单理解接口的概念就是实现者必须遵守的原则。<br />
<br />
整个XML对应的结构叫Document、子元素对应的叫做Element、还有节点相关的Node、NodeList、Text、Entity、 CharacterData、CDATASection等接口，它们都可以在XML的语法中间找到相对应的含义。由于这里不是讲解XML基本语法，就不多介绍了。如果大家感兴趣，笔者也可以专门写一篇关于XML的语法规则帖与大家分享一下。<br />
<br />
2． Java Swing<br />
Swing是一个让人又爱又恨的东西，可爱之处在于上手很容易，较AWT比起来Swing提供的界面功能更加强大，可恨之处在于编复杂的界面工作量实在是巨大。笔者写过超过3000行的Swing界面，感觉用户体验还不是那么优秀。最近又写过超过6000行的，由于功能模块多了，整体效果还只是一般般。体会最深的就一个字：累! 所以大家现在都陆续不怎么用Swing在真正开发的项目上了，太多界面技术可以取代它了。笔者去写也是迫于无奈组里面大家都没写过，我不入地域谁入？<br />
<br />
尽管Swing慢慢的在被人忽略，特别是随着B/S慢慢的在淹没C/S，笔者倒是很愿意站出来为Swing正身。每一项技术的掌握绝不是为了流行时尚跟风。真正喜欢Java的朋友们还是应该好好体会一下Swing，相信在校的很多学生也很多在学习它。很可能从Jdk 1.1、1.2走过来的很多大学老师可能是最不熟悉它的。<br />
Swing提供了一组轻组件统称为JComponent，它们与AWT组件的最大区别是JComponent全部都是Container，而 Container的特点是里面可以装载别的组件。在Swing组件中无论是JButton、JLabel、JPanel、JList等都可以再装入任何其他组件。好处是程序员可以对Swing组件实现&#8220;再开发&#8221;，针对特定需求构建自己的按钮、标签、画板、列表之类的特定组件。<br />
<br />
有轻自然就有重，那么轻组件和重组件区别是？重组件表现出来的形态因操作系统不同而异，轻组件是Swing自己提供GUI，在跨平台的时候最大程度的保持一致。<br />
那么在编程的时候要注意一些什么呢？笔者谈谈自己的几点经验：<br />
<br />
a. 明确一个概念，只有Frame组件才可以单独显示的，也许有人会说JOptionPane里面的静态方法就实现了单独窗口出现，但追寻源代码会发现其实现实出来的Dialog也需要依托一个Frame窗体，如果没有指定就会默认产生一个然后装载这个Dialog显示出来。<br />
<br />
b. JFrame是由这么几部分组成：<br />
最底下一层JRootPane，上面是glassPane (一个JPanel)和layeredPane (一个JLayeredPane)，而layeredPane又由contentPane(一个JPanel)和menuBar构成。我们的组件都是加在 contentPane上，而背景图片只能加在layeredPane上面。至于glassPane是一个透明的覆盖了contentPane的一层，在特定效果中将被利用到来记录鼠标坐标或掩饰组件。<br />
<br />
c. 为了增强用户体验，我们会在一些按钮上添加快捷键，但Swing里面通常只能识别键盘的Alt键，要加入其他的快捷键，必须自己实现一个ActionListener。<br />
<br />
d. 通过setLayout(null)可以使得所有组件以setBounds()的四个参数来精确定位各自的大小、位置，但不推荐使用，因为好的编程风格不应该在Swing代码中硬编码具体数字，所有的数字应该以常数的形式统一存在一个静态无实例资源类文件中。这个静态无实例类统一负责Swing界面的风格，包括字体和颜色都应该包括进去。<br />
<br />
e. 好的界面设计有一条Golden Rule: 用户不用任何手册通过少数尝试就能学会使用软件。所以尽量把按钮以菜单的形式（不管是右键菜单还是窗体自带顶部菜单）呈现给顾客，除非是频繁点击的按钮才有必要直接呈现在界面中。<br />
<br />
其实Swing的功能是相当强大的，只是现在应用不广泛，专门去研究大概是要花不少时间的。笔者在各网站论坛浏览关于Swing的技巧文章还是比较可信的，自己所学非常有限，各人体会对Swing各个组件的掌握就是一个实践积累的过程。笔者只用到过以上这些，所以只能谈谈部分想法，还望大家见谅！ 
<img src ="http://www.blogjava.net/ldwblog/aggbug/329069.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ldwblog/" target="_blank">David1228</a> 2010-08-17 10:15 <a href="http://www.blogjava.net/ldwblog/archive/2010/08/17/329069.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于Java的多线程编程</title><link>http://www.blogjava.net/ldwblog/archive/2010/08/17/329063.html</link><dc:creator>David1228</dc:creator><author>David1228</author><pubDate>Tue, 17 Aug 2010 01:48:00 GMT</pubDate><guid>http://www.blogjava.net/ldwblog/archive/2010/08/17/329063.html</guid><wfw:comment>http://www.blogjava.net/ldwblog/comments/329063.html</wfw:comment><comments>http://www.blogjava.net/ldwblog/archive/2010/08/17/329063.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ldwblog/comments/commentRss/329063.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ldwblog/services/trackbacks/329063.html</trackback:ping><description><![CDATA[关于Java的线程，初学或者接触不深的大概也能知道一些基本概念，同时又会很迷惑线程到底是怎么回事？如果有人认为自己已经懂了不妨来回答下面的问题：<br />
a. A对象实现Runnable接口，A.start()运行后所谓的线程对象是谁？是A么？<br />
b. 线程的wait()、notify()方法到底是做什么时候用的，什么时候用？<br />
c. 为什么线程的suspend方法会被标注过时，不推荐再使用，线程还能挂起么？<br />
d. 为了同步我们会对线程方法声明Synchronized来加锁在对象上，那么如果父类的f()方法加了Synchronized，子类重写f()方法必须也加Synchronized么？如果子类的f()方法重写时声明Synchronized并调用super.f()，那么子类对象上到底有几把锁呢？会因为竞争产生死锁么？<br />
<br />
呵呵，各位能回答上来几道呢？如果这些都能答上来，说明对线程的概念还是满清晰的，虽说还远远不能算精通。笔者这里一一做回答，碍于篇幅的原因，笔者尽量说得简介一点，如果大家有疑惑的欢迎一起讨论。<br />
<br />
首先第一点，线程跟对象完全是两回事，虽然我们也常说线程对象。但当你用run()和start()来启动一个线程之后，线程其实跟这个继承了 Thread或实现了Runnable的对象已经没有关系了，对象只能算内存中可用资源而对象的方法只能算内存正文区可以执行的代码段而已。既然是资源和代码段，另外一个线程当然也可以去访问，main函数执行就至少会启动两个线程，一个我们称之为主线程，还一个是垃圾收集器的线程，主线程结束就意味着程序结束，可垃圾收集器线程很可能正在工作。<br />
<br />
第二点，wait()和sleep()类似，都是让线程处于阻塞状态暂停一段时间，不同之处在于wait会释放当前线程占有的所有的锁，而 sleep不会。我们知道获得锁的唯一方法是进入了Synchronized保护代码段，所以大家会发现只有Synchronized方法中才会出现 wait，直接写会给警告没有获得当前对象的锁。所以notify跟wait配合使用，notify会重新把锁还给阻塞的线程重而使其继续执行，当有多个对象wait了，notify不能确定唤醒哪一个，必经锁只有一把，所以一般用notifyAll()来让它们自己根据优先级等竞争那唯一的一把锁，竞争到的线程执行，其他线程只要继续wait。<br />
<br />
从前Java允许在一个线程之外把线程挂起，即调用suspend方法，这样的操作是极不安全的。根据面向对象的思想每个对象必须对自己的行为负责，而对自己的权力进行封装。如果任何外步对象都能使线程被挂起而阻塞的话，程序往往会出现混乱导致崩溃，所以这样的方法自然是被毙掉了啦。<br />
<br />
最后一个问题比较有意思，首先回答的是子类重写f()方法可以加Synchronized也可以不加，如果加了而且还内部调用了super.f ()的话理论上是应该对同一对象加两把锁的，因为每次调用Synchronized方法都要加一把，调用子类的f首先就加了一把，进入方法内部调用父类的 f又要加一把，加两把不是互斥的么？那么调父类f加锁不就必须永远等待已经加的锁释放而造成死锁么？实际上是不会的，这个机制叫重进入，当父类的f方法试图在本对象上再加一把锁的时候，因为当前线程拥有这个对象的锁，也可以理解为开启它的钥匙，所以同一个线程在同一对象上还没释放之前加第二次锁是不会出问题的，这个锁其实根本就没有加，它有了钥匙，不管加几把还是可以进入锁保护的代码段，畅通无阻，所以叫重进入，我们可以简单认为第二把锁没有加上去。<br />
<br />
总而言之，Synchronized的本质是不让其他线程在同一对象上再加一把锁。 
<img src ="http://www.blogjava.net/ldwblog/aggbug/329063.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ldwblog/" target="_blank">David1228</a> 2010-08-17 09:48 <a href="http://www.blogjava.net/ldwblog/archive/2010/08/17/329063.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于jdk和jre??</title><link>http://www.blogjava.net/ldwblog/archive/2010/08/16/328987.html</link><dc:creator>David1228</dc:creator><author>David1228</author><pubDate>Mon, 16 Aug 2010 06:39:00 GMT</pubDate><guid>http://www.blogjava.net/ldwblog/archive/2010/08/16/328987.html</guid><wfw:comment>http://www.blogjava.net/ldwblog/comments/328987.html</wfw:comment><comments>http://www.blogjava.net/ldwblog/archive/2010/08/16/328987.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ldwblog/comments/commentRss/328987.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ldwblog/services/trackbacks/328987.html</trackback:ping><description><![CDATA[<br />
大家肯定在安装JDK的时候会有选择是否安装单独的jre，一般都会一起安装，我也建议大家这样做。因为这样更能帮助大家弄清楚它们的区别：<br />
<br />
Jre 是java runtime environment, 是java程序的运行环境。既然是运行，当然要包含jvm，也就是大家熟悉的虚拟机啦，还有所有java类库的class文件，都在lib目录下打包成了jar。大家可以自己验证。至于在windows上的虚拟机是哪个文件呢？学过MFC的都知道什么是dll文件吧，那么大家看看jre/bin/client里面是不是有一个jvm.dll呢？那就是虚拟机。<br />
<br />
Jdk 是java development kit，是java的开发工具包，里面包含了各种类库和工具。当然也包括了另外一个Jre. 那么为什么要包括另外一个Jre呢？而且jdk/jre/bin同时有client和server两个文件夹下都包含一个jvm.dll。说明是有两个虚拟机的。这一点不知道大家是否注意到了呢？<br />
<br />
相信大家都知道jdk的bin下有各种java程序需要用到的命令，与jre的bin目录最明显的区别就是jdk下才有javac，这一点很好理解，因为 jre只是一个运行环境而已。与开发无关，正因为如此，具备开发功能的jdk自己的jre下才会同时有client性质的jvm和server性质的 jvm， 而仅仅作为运行环境的jre下只需要client性质的jvm.dll就够了。<br />
<br />
记得在环境变量path中设置jdk/bin路径麽？这应该是大家学习Java的第一步吧，老师会告诉大家不设置的话javac和java是用不了的。确实jdk/bin目录下包含了所有的命令。可是有没有人想过我们用的java命令并不是 jdk/bin目录下的而是jre/bin目录下的呢？不信可以做一个实验，大家可以把jdk/bin目录下的java.exe剪切到别的地方再运行 java程序，发现了什么？一切OK！<br />
<br />
那么有人会问了？我明明没有设置jre/bin目录到环境变量中啊？<br />
<br />
试想一下如果java为了提供给大多数人使用，他们是不需要jdk做开发的，只需要jre能让java程序跑起来就可以了，那么每个客户还需要手动去设置环境变量多麻烦啊？所以安装jre的时候安装程序自动帮你把jre的java.exe添加到了系统变量中，验证的方法很简单，大家看到了系统环境变量的 path最前面有&#8220;%SystemRoot%\system32;%SystemRoot%;&#8221;这样的配置，那么再去Windows/system32下面去看看吧，发现了什么？有一个java.exe。<br />
<br />
如果强行能够把jdk/bin挪到system32变量前面，当然也可以迫使使用jdk/jre里面的java，不过除非有必要，我不建议大家这么做。使用单独的jre跑java程序也算是客户环境下的一种测试。<br />
<br />
这下大家应该更清楚jdk和jre内部的一些联系和区别了吧？<br />
<br />
PS: 其实还有满多感想可以总结的，一次写多了怕大家扔砖头砸死我，怪我太罗唆。大家应该更加踏实更加务实的去做一些研究并互相分享心得，大方向和太前沿的技术讨论是必要的但最好不要太多，毕竟自己基础都还没打好，什么都讲最新版本其实是进步的一大障碍！<br />
<img src ="http://www.blogjava.net/ldwblog/aggbug/328987.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ldwblog/" target="_blank">David1228</a> 2010-08-16 14:39 <a href="http://www.blogjava.net/ldwblog/archive/2010/08/16/328987.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA对List的排序</title><link>http://www.blogjava.net/ldwblog/archive/2010/08/11/328547.html</link><dc:creator>David1228</dc:creator><author>David1228</author><pubDate>Wed, 11 Aug 2010 08:15:00 GMT</pubDate><guid>http://www.blogjava.net/ldwblog/archive/2010/08/11/328547.html</guid><wfw:comment>http://www.blogjava.net/ldwblog/comments/328547.html</wfw:comment><comments>http://www.blogjava.net/ldwblog/archive/2010/08/11/328547.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ldwblog/comments/commentRss/328547.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ldwblog/services/trackbacks/328547.html</trackback:ping><description><![CDATA[Collections.sort(list, new Comparator&lt;TCmsFormDTO&gt;()<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;public int compare(TCmsFormDTO o1, TCmsFormDTO o2)<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;return new BeanComparator().compare(o1.getName(), o2.getName());<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;});
<img src ="http://www.blogjava.net/ldwblog/aggbug/328547.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ldwblog/" target="_blank">David1228</a> 2010-08-11 16:15 <a href="http://www.blogjava.net/ldwblog/archive/2010/08/11/328547.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java之LinkedList链表测试</title><link>http://www.blogjava.net/ldwblog/archive/2009/08/18/291587.html</link><dc:creator>David1228</dc:creator><author>David1228</author><pubDate>Tue, 18 Aug 2009 00:33:00 GMT</pubDate><guid>http://www.blogjava.net/ldwblog/archive/2009/08/18/291587.html</guid><description><![CDATA[<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all">&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #339966;">// 如果想通过iterator进行集合的添加、删除、修改操作，可以使用java.util.ListIterator接口，该接口实现了java.util.Iterator接口，同时还增加了一些额外的方法，方便使用，如add、remove、set、nextIndex(调用next方法返回元素的索引值，int类型)、previousIndex(调用previous方法返回元素的索引值，int类型)。&nbsp;</span><br />&nbsp; &nbsp; &nbsp; &nbsp; List&lt;String&gt;&nbsp;staff&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;LinkedList&lt;String&gt;();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;staff.add("Amy");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;staff.add("Bob");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;staff.add("Carl");<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;删除方法很特殊，真正删除的是iter左边的元素,&nbsp;类似于退格键。</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ListIterator&lt;String&gt;&nbsp;iter&nbsp;=&nbsp;staff.listIterator();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iter.next();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iter.remove();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;遍历.</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(Iterator&lt;String&gt;&nbsp;iterator&nbsp;=&nbsp;staff.iterator();&nbsp;iterator.hasNext();)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;s&nbsp;=&nbsp;(String)&nbsp;iterator.next();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("--------------&gt;"&nbsp;+&nbsp;s);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</div><br /><div>ConcurrentModificationException异常什么时候会发生？</div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->List&lt;String&gt;&nbsp;staff&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;LinkedList&lt;String&gt;();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;staff.add("Amy");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;staff.add("Bob");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;staff.add("Carl");<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;ConcurrentModificationException异常什么时候会发生？</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ListIterator&lt;String&gt;&nbsp;iter&nbsp;=&nbsp;staff.listIterator();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ListIterator&lt;String&gt;&nbsp;iter2&nbsp;=&nbsp;staff.listIterator();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;当有多个iterator对同一个list迭代，如果有迭代器对list进行了诸如add或remove的操作时，则另一个迭代器会发生该异常。<br />&nbsp; &nbsp; &nbsp; &nbsp; // 因为iterator会负责检测所他自己的索引变化跟所迭代集合的变化是否是一致的，如果不一致就会抛出</span><span style="color: #008000;">ConcurrentModificationException异常。</span><br /><span style="color: #008000; ">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;如果有进行set方法的操作，则不会发生该异常。</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iter.add("yyy");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iter.remove();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iter2.next();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;按顺序添加到集合中.</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(Iterator&lt;String&gt;&nbsp;iterator&nbsp;=&nbsp;staff.iterator();&nbsp;iterator.hasNext();)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;s&nbsp;=&nbsp;(String)&nbsp;iterator.next();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("--------------&gt;"&nbsp;+&nbsp;s);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</div><br />Java之LinkedList集合结合listIterator的使用案例:<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><span style="color: #0000ff;">package</span>&nbsp;com.javacore;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.util.Iterator;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.util.LinkedList;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.util.List;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.util.ListIterator;<br /><br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;LinkedListTest3&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;main(String[]&nbsp;args)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&lt;String&gt;&nbsp;a&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;LinkedList&lt;String&gt;();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a.add("a-Amy");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a.add("a-Bob");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a.add("a-Carl");<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&lt;String&gt;&nbsp;b&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;LinkedList&lt;String&gt;();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b.add("b-xxx");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b.add("b-yyy");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b.add("b-zzz");<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ListIterator&lt;String&gt;&nbsp;aIter&nbsp;=&nbsp;a.listIterator();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Iterator&lt;String&gt;&nbsp;bIter&nbsp;=&nbsp;b.iterator();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;将b集合插入/合并到a集合中</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;(bIter.hasNext())&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(aIter.hasNext())&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;aIter.next();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;aIter.add(bIter.next());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;输出a集合</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(a);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;从b中删除第二个元素</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bIter&nbsp;=&nbsp;b.iterator();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;(bIter.hasNext())&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bIter.next();&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;跳过第一个元素</span><span style="color: #008000; "><br /></span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(bIter.hasNext())&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bIter.next();&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;跳过下一个元素</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bIter.remove();&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;删除那个元素</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;输出b集合</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(b);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;删除集合b</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a.removeAll(b);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(a);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</div><img src ="http://www.blogjava.net/ldwblog/aggbug/291587.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ldwblog/" target="_blank">David1228</a> 2009-08-18 08:33 <a href="http://www.blogjava.net/ldwblog/archive/2009/08/18/291587.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>继承对序列化的影响</title><link>http://www.blogjava.net/ldwblog/archive/2009/04/05/263979.html</link><dc:creator>David1228</dc:creator><author>David1228</author><pubDate>Sun, 05 Apr 2009 04:13:00 GMT</pubDate><guid>http://www.blogjava.net/ldwblog/archive/2009/04/05/263979.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;只有注册用户登录后才能阅读该文。<a href='http://www.blogjava.net/ldwblog/archive/2009/04/05/263979.html'>阅读全文</a><img src ="http://www.blogjava.net/ldwblog/aggbug/263979.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ldwblog/" target="_blank">David1228</a> 2009-04-05 12:13 <a href="http://www.blogjava.net/ldwblog/archive/2009/04/05/263979.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>