﻿<?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/ashutc/category/42979.html</link><description>沈阳求职（java3年以上经验）！ashutc@126.com</description><language>zh-cn</language><lastBuildDate>Wed, 20 Apr 2011 11:15:22 GMT</lastBuildDate><pubDate>Wed, 20 Apr 2011 11:15:22 GMT</pubDate><ttl>60</ttl><item><title>再谈 ：try中的return语句，在finally前执行还是在finally后执行（网上也大多是之前执行是错误的，附测试数据）</title><link>http://www.blogjava.net/ashutc/archive/2011/04/19/348559.html</link><dc:creator>西瓜</dc:creator><author>西瓜</author><pubDate>Tue, 19 Apr 2011 03:30:00 GMT</pubDate><guid>http://www.blogjava.net/ashutc/archive/2011/04/19/348559.html</guid><wfw:comment>http://www.blogjava.net/ashutc/comments/348559.html</wfw:comment><comments>http://www.blogjava.net/ashutc/archive/2011/04/19/348559.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ashutc/comments/commentRss/348559.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ashutc/services/trackbacks/348559.html</trackback:ping><description><![CDATA[首先说明下：网上大多说法（finally块会执行，并都会在return之前执行）都是错误的。
<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 />
--><span style="color: #0000FF; ">package</span><span style="color: #000000; ">&nbsp;cn.yu.test001;<br />
</span><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />
&nbsp;*&nbsp;<br />
&nbsp;*&nbsp;Created&nbsp;by&nbsp;myeclipse8.5.<br />
&nbsp;*&nbsp;User:&nbsp;</span><span style="color: #808080; ">@author</span><span style="color: #008000; ">&nbsp;yu<br />
&nbsp;*&nbsp;Time:&nbsp;2011-4-19&nbsp;<br />
&nbsp;*&nbsp;Company:&nbsp;天极传媒集团<br />
&nbsp;*&nbsp;Descripion:&nbsp;测试<br />
&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />
</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;testReturn&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;test()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">try</span><span style="color: #000000; ">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;fun1();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">catch</span><span style="color: #000000; ">&nbsp;(Exception&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">finally</span><span style="color: #000000; ">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000;">&nbsp;fun2();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;fun1()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">fun1被执行了</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">fun1的确被执行了,返回么？</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;fun2()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">fun2被执行了</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">fun2的确被执行了,返回么？</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">2</span><span style="color: #000000; ">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;main(String[]&nbsp;args)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(testReturn.test());<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</span></div>
<br />
<br />
<br />
<br />
<br />
结果：fun1被执行了<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fun1的确被执行了,返回么？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fun2被执行了<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fun2的确被执行了,返回么？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2<br />
<br />
证明什么？finally并没有在之前执行，第一个执行的还是try里面的内容但是没有立刻返回,等待执行finally，当finally返回结果后执行完毕。<br />
并不是网上大多数的说法<br />
<br />
还有要说明下 如果finally里面没有返回值，则返回try里面的返回值。<br />
<br />
<br />
<img src ="http://www.blogjava.net/ashutc/aggbug/348559.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ashutc/" target="_blank">西瓜</a> 2011-04-19 11:30 <a href="http://www.blogjava.net/ashutc/archive/2011/04/19/348559.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>分析农夫养牛问题（网上好多错的，尤其是csdn上各种说法都有）</title><link>http://www.blogjava.net/ashutc/archive/2011/04/18/348503.html</link><dc:creator>西瓜</dc:creator><author>西瓜</author><pubDate>Mon, 18 Apr 2011 08:21:00 GMT</pubDate><guid>http://www.blogjava.net/ashutc/archive/2011/04/18/348503.html</guid><wfw:comment>http://www.blogjava.net/ashutc/comments/348503.html</wfw:comment><comments>http://www.blogjava.net/ashutc/archive/2011/04/18/348503.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ashutc/comments/commentRss/348503.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ashutc/services/trackbacks/348503.html</trackback:ping><description><![CDATA[这个是特指三年后，也就是第四年（牛3岁）才可以生小牛：<br />
还有可以感觉到的是：农夫把未满月的牛抱回家试养了<br />
<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"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">package</span><span style="color: #000000; ">&nbsp;cn.yu.test;<br />
<br />
</span><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />
&nbsp;*&nbsp;一个农夫养了一头牛，三年后，这头牛每年会生出1头牛，生出来的牛三年后，又可以每年生出一头牛&#8230;&#8230;问农夫10年后有多少头牛?n年呢？（用JAVA实现）&nbsp;<br />
&nbsp;*&nbsp;Created&nbsp;by&nbsp;myeclipse8.5.<br />
&nbsp;*&nbsp;User:&nbsp;</span><span style="color: #808080; ">@author</span><span style="color: #008000; ">&nbsp;yu<br />
&nbsp;*&nbsp;Time:&nbsp;2011-4-18&nbsp;<br />
&nbsp;*&nbsp;Company:&nbsp;天极传媒集团<br />
&nbsp;*&nbsp;Descripion:<br />
&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />
</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;Cow&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;cowcount&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;CowCount(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;startYear,&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;endYear)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cowcount</span><span style="color: #000000; ">++</span><span style="color: #000000; ">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;i&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">3</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;startYear;&nbsp;i&nbsp;</span><span style="color: #000000; ">&lt;=</span><span style="color: #000000; ">&nbsp;endYear;&nbsp;i</span><span style="color: #000000; ">++</span><span style="color: #000000; ">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CowCount(i,&nbsp;endYear);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;main(String[]&nbsp;args)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;startYear</span><span style="color: #000000; ">=</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">开始年份，第一年开始</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;endYear</span><span style="color: #000000; ">=</span><span style="color: #000000; ">10</span><span style="color: #000000; ">;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">终止年份，第十年终止</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CowCount(startYear,&nbsp;endYear);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">总牛数：</span><span style="color: #000000; ">"</span><span style="color: #000000; ">+</span><span style="color: #000000; ">cowcount);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</span></div>
<br />
结果 总牛数：19<br />
<br />
分析：&nbsp; 年份&nbsp; 牛名字&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 牛年龄&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; 总数<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1年&nbsp;&nbsp; a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0岁 （刚生下来） &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; 1头<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2年&nbsp;&nbsp; a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; 1岁&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1头<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3年&nbsp;&nbsp; a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2岁&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1头<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4年&nbsp;&nbsp; a,b1 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: red;"> 3岁</span>,0岁 （增加一头） &nbsp;&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; 2头&nbsp; <br />
（这里理解吧？成年牛4岁才可以生小牛，小牛刚生下来是0岁而不是1岁）<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5年&nbsp;&nbsp; a,b1,b2 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: red;">4岁</span>，1岁 0岁 &nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; 3头<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6年&nbsp;&nbsp; a,b1,b2,b3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: red;">5岁</span>，2岁 1岁 0岁 &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp; 4头<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7年&nbsp;&nbsp; a,b1,b2,b3,b4 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: red;">6岁，3岁</span> 2岁 1岁 0岁 0岁 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6头<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8年&nbsp;&nbsp; a,b1,b2,b3,b4,b5,c1 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: red;">7岁，4岁 3岁</span> 2岁 1岁 1岁 0岁 &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9头<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9年&nbsp;&nbsp; a,b1,b2,b3,b4,b5,b6,c1,c2,d1 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: red;">8岁，5岁 4岁</span> <span style="color: red;">3岁</span> 2岁 2岁 1岁&#8230;&#8230; &nbsp;&nbsp;&nbsp;&nbsp; 13头<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10年&nbsp; a,b1,b2,b3,b4,b5,b6,b7,c1,c2,c3,d1,d2 &nbsp; &nbsp; <span style="color: red;">9岁，6岁 5岁 4岁</span> <span style="color: red;">3岁 3岁</span> 2岁&#8230;&#8230; &nbsp;&nbsp; &nbsp; 19头<br />
<br />
如果是第三年生小牛呢（也就是说牛2岁就可以生小牛）<br />
那就是网上大多数的答案 <br />
<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"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">package</span><span style="color: #000000; ">&nbsp;cn.yu.test;<br />
<br />
</span><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />
&nbsp;*&nbsp;一个农夫养了一头牛，三年后，这头牛每年会生出1头牛，生出来的牛三年后，又可以每年生出一头牛&#8230;&#8230;问农夫10年后有多少头牛?n年呢？（用JAVA实现）&nbsp;<br />
&nbsp;*&nbsp;Created&nbsp;by&nbsp;myeclipse8.5.<br />
&nbsp;*&nbsp;User:&nbsp;</span><span style="color: #808080; ">@author</span><span style="color: #008000; ">&nbsp;yu<br />
&nbsp;*&nbsp;Time:&nbsp;2011-4-18&nbsp;<br />
&nbsp;*&nbsp;Company:&nbsp;天极传媒集团<br />
&nbsp;*&nbsp;Descripion:<br />
&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />
</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;Cow&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;cowcount&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;CowCount(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;startYear,&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;endYear)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cowcount</span><span style="color: #000000; ">++</span><span style="color: #000000; ">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;i&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #000000; ">2</span><span style="color: #000000; "> </span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;startYear;&nbsp;i&nbsp;</span><span style="color: #000000; ">&lt;=</span><span style="color: #000000; ">&nbsp;endYear;&nbsp;i</span><span style="color: #000000; ">++</span><span style="color: #000000; ">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CowCount(i,&nbsp;endYear);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;main(String[]&nbsp;args)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;startYear</span><span style="color: #000000; ">=</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">开始年份，第一年开始</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;endYear</span><span style="color: #000000; ">=</span><span style="color: #000000; ">10</span><span style="color: #000000; ">;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">终止年份，第十年终止</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CowCount(startYear,&nbsp;endYear);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">总牛数：</span><span style="color: #000000; ">"</span><span style="color: #000000; ">+</span><span style="color: #000000; ">cowcount);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</span></div>
<br />
结果 总牛数：55<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<img src ="http://www.blogjava.net/ashutc/aggbug/348503.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ashutc/" target="_blank">西瓜</a> 2011-04-18 16:21 <a href="http://www.blogjava.net/ashutc/archive/2011/04/18/348503.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java23种设计模式（代码版转）</title><link>http://www.blogjava.net/ashutc/archive/2010/12/14/340667.html</link><dc:creator>西瓜</dc:creator><author>西瓜</author><pubDate>Tue, 14 Dec 2010 09:03:00 GMT</pubDate><guid>http://www.blogjava.net/ashutc/archive/2010/12/14/340667.html</guid><wfw:comment>http://www.blogjava.net/ashutc/comments/340667.html</wfw:comment><comments>http://www.blogjava.net/ashutc/archive/2010/12/14/340667.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ashutc/comments/commentRss/340667.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ashutc/services/trackbacks/340667.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->&nbsp;&nbsp;package&nbsp;&nbsp;&nbsp;lq.test;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;impor...&nbsp;&nbsp;<a href='http://www.blogjava.net/ashutc/archive/2010/12/14/340667.html'>阅读全文</a><img src ="http://www.blogjava.net/ashutc/aggbug/340667.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ashutc/" target="_blank">西瓜</a> 2010-12-14 17:03 <a href="http://www.blogjava.net/ashutc/archive/2010/12/14/340667.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>StringUtils</title><link>http://www.blogjava.net/ashutc/archive/2010/11/01/336672.html</link><dc:creator>西瓜</dc:creator><author>西瓜</author><pubDate>Mon, 01 Nov 2010 06:24:00 GMT</pubDate><guid>http://www.blogjava.net/ashutc/archive/2010/11/01/336672.html</guid><wfw:comment>http://www.blogjava.net/ashutc/comments/336672.html</wfw:comment><comments>http://www.blogjava.net/ashutc/archive/2010/11/01/336672.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ashutc/comments/commentRss/336672.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ashutc/services/trackbacks/336672.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->StringUtils&nbsp;方法的操作对象是&nbsp;java.lang.String&nbsp;类型的对象，是&nbsp;JDK&nbsp;提供的&nbsp;String&nbsp;...&nbsp;&nbsp;<a href='http://www.blogjava.net/ashutc/archive/2010/11/01/336672.html'>阅读全文</a><img src ="http://www.blogjava.net/ashutc/aggbug/336672.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ashutc/" target="_blank">西瓜</a> 2010-11-01 14:24 <a href="http://www.blogjava.net/ashutc/archive/2010/11/01/336672.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用JSON的方法</title><link>http://www.blogjava.net/ashutc/archive/2010/10/13/335022.html</link><dc:creator>西瓜</dc:creator><author>西瓜</author><pubDate>Wed, 13 Oct 2010 05:42:00 GMT</pubDate><guid>http://www.blogjava.net/ashutc/archive/2010/10/13/335022.html</guid><wfw:comment>http://www.blogjava.net/ashutc/comments/335022.html</wfw:comment><comments>http://www.blogjava.net/ashutc/archive/2010/10/13/335022.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ashutc/comments/commentRss/335022.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ashutc/services/trackbacks/335022.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: SON&nbsp;即&nbsp;JavaScript&nbsp;Object&nbsp;Natation，它是一种轻量级的数据交换格式，非常适合于服务器与&nbsp;JavaScript&nbsp;的交互。本文将快速讲解&nbsp;JSON&nbsp;格式，并通过代码示例演示如何分别在客户端和服务器端进行&nbsp;JSON&nbsp;格式数据的处理。&nbsp;Json必需的包...&nbsp;&nbsp;<a href='http://www.blogjava.net/ashutc/archive/2010/10/13/335022.html'>阅读全文</a><img src ="http://www.blogjava.net/ashutc/aggbug/335022.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ashutc/" target="_blank">西瓜</a> 2010-10-13 13:42 <a href="http://www.blogjava.net/ashutc/archive/2010/10/13/335022.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用 org.apache.commons.io.FileUtils快速读写文件</title><link>http://www.blogjava.net/ashutc/archive/2010/07/13/325933.html</link><dc:creator>西瓜</dc:creator><author>西瓜</author><pubDate>Tue, 13 Jul 2010 02:45:00 GMT</pubDate><guid>http://www.blogjava.net/ashutc/archive/2010/07/13/325933.html</guid><wfw:comment>http://www.blogjava.net/ashutc/comments/325933.html</wfw:comment><comments>http://www.blogjava.net/ashutc/archive/2010/07/13/325933.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ashutc/comments/commentRss/325933.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ashutc/services/trackbacks/325933.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 利用org.apache.commons.io.FileUtils快速读写文件http://php.11519.net/5jblog/?p=475&nbsp; StringfileName = "C://11.txt";&nbsp;&nbsp;File file = new File(fileName);&nbsp;&nbsp;StringfileContent = "...&nbsp;&nbsp;<a href='http://www.blogjava.net/ashutc/archive/2010/07/13/325933.html'>阅读全文</a><img src ="http://www.blogjava.net/ashutc/aggbug/325933.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ashutc/" target="_blank">西瓜</a> 2010-07-13 10:45 <a href="http://www.blogjava.net/ashutc/archive/2010/07/13/325933.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>算法的时间复杂度的具体步骤</title><link>http://www.blogjava.net/ashutc/archive/2009/07/24/288211.html</link><dc:creator>西瓜</dc:creator><author>西瓜</author><pubDate>Fri, 24 Jul 2009 07:03:00 GMT</pubDate><guid>http://www.blogjava.net/ashutc/archive/2009/07/24/288211.html</guid><wfw:comment>http://www.blogjava.net/ashutc/comments/288211.html</wfw:comment><comments>http://www.blogjava.net/ashutc/archive/2009/07/24/288211.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ashutc/comments/commentRss/288211.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ashutc/services/trackbacks/288211.html</trackback:ping><description><![CDATA[<p>　　⑴ 找出算法中的基本语句；</p>
<p>　　算法中执行次数最多的那条语句就是基本语句，通常是最内层循环的循环体。</p>
<p>　　⑵ 计算基本语句的执行次数的数量级；</p>
<p>　　只需计算基本语句执行次数的数量级，这就意味着只要保证基本语句执行次数的函数中的最高次幂正确即可，可以忽略所有低次幂和最高次幂的系数。这样能够简化算法分析，并且使注意力集中在最重要的一点上：增长率。</p>
<p>　　⑶ 用大&#927;记号表示算法的时间性能。</p>
<p>　　将基本语句执行次数的数量级放入大&#927;记号中。</p>
<p>　　如果算法中包含嵌套的循环，则基本语句通常是最内层的循环体，如果算法中包含并列的循环，则将并列循环的时间复杂度相加。例如：</p>
<p>　　for (i=1; i&lt;=n; i++)<br />
x++;</p>
<p>　　for (i=1; i&lt;=n; i++)<br />
for (j=1; j&lt;=n; j++)<br />
x++;</p>
<p>　　第一个for循环的时间复杂度为&#927;(n)，第二个for循环的时间复杂度为&#927;(n2)，则整个算法的时间复杂度为&#927;(n+n2)=&#927;(n2)。</p>
<p>　　常见的算法时间复杂度由小到大依次为：</p>
<p>　　&#927;(1)＜&#927;(log2n)＜&#927;(n)＜&#927;(nlog2n)＜&#927;(n2)＜&#927;(n3)＜&#8230;＜&#927;(2n)＜&#927;(n!)</p>
<p>　　&#927;(1)表示基本语句的执行次数是一个常数，一般来说，只要算法中不存在循环语句，其时间复杂度就是&#927;(1)。&#927;(log2n)、&#927;(n)、&#927;(nlog2n)、&#927;(n2)和&#927;(n3)称为多项式时间，而&#927;(2n)和&#927;(n!)称为指数时间。计算机科学家普遍认为前者是有效算法，把这类问题称为P类问题，而把后者称为NP问题。</p>
<p><span style="color: red;" twffan="done">O(1)</span><br />
<br />
Temp=i;i=j;j=temp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
<br />
以上三条单个语句的频度均为1，该程序段的执行时间是一个与问题规模n无关的常数。算法的时间复杂度为常数阶，记作T(n)=O(1)。如果算法的执行时 间不随着问题规模n的增加而增长，即使算法中有上千条语句，其执行时间也不过是一个较大的常数。此类算法的时间复杂度是O(1)。 <br />
<br />
<span style="color: red;" twffan="done">O(n^2)<br />
</span><br />
2.1. 交换i和j的内容<br />
&nbsp;&nbsp;&nbsp;&nbsp; sum=0；&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （一次）<br />
&nbsp;&nbsp;&nbsp;&nbsp; for(i=1;i&lt;=n;i++)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （n次 ）<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(j=1;j&lt;=n;j++) （n^2次 ）<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sum++；&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （n^2次 ）<br />
解：T(n)=2n^2+n+1 =O(n^2)<br />
<br />
2.2.&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp; for (i=1;i&lt;n;i++)<br />
&nbsp;&nbsp;&nbsp; { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; y=y+1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ①&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (j=0;j&lt;=(2*n);j++)&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x++;&nbsp;&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; <br />
解： 语句1的频度是n-1<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 语句2的频度是(n-1)*(2n+1)=2n^2-n-1<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f(n)=2n^2-n-1+(n-1)=2n^2-2<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 该程序的时间复杂度T(n)=O(n^2).&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<br />
<span style="color: red;" twffan="done">O(n)</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
2.3. <br />
&nbsp;&nbsp;&nbsp; a=0;<br />
&nbsp;&nbsp;&nbsp; b=1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ①<br />
&nbsp;&nbsp;&nbsp; for (i=1;i&lt;=n;i++) ②<br />
&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s=a+b;　　　　③<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b=a;　　　　　④&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a=s;　　　　　⑤<br />
&nbsp;&nbsp;&nbsp; }<br />
解： 语句1的频度：2,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 语句2的频度： n,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 语句3的频度： n-1,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 语句4的频度：n-1,&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 语句5的频度：n-1,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; T(n)=2+n+3(n-1)=4n-1=O(n).<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
<span style="color: red;" twffan="done">O(logn )<br />
</span><br />
2.4. <br />
&nbsp;&nbsp;&nbsp;&nbsp; i=1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ①<br />
&nbsp;&nbsp;&nbsp; while (i&lt;=n)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i=i*2; ②<br />
解： 语句1的频度是1,&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 设语句2的频度是f(n),&nbsp;&nbsp; 则：2^f(n)&lt;=n;f(n)&lt;=logn&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 取最大值f(n)= logn,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; T(n)=O(logn )<br />
<br />
<span style="color: red;" twffan="done">O(n^3)</span><br />
<br />
2.5. <br />
&nbsp;&nbsp;&nbsp; for(i=0;i&lt;n;i++)<br />
&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(j=0;j&lt;i;j++)&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(k=0;k&lt;j;k++)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x=x+2;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
解：当i=m, j=k的时候,内层循环的次数为k当i=m时, j 可以取 0,1,...,m-1 , 所以这里最内循环共进行了0+1+...+m-1=(m-1)m/2次所以,i从0取到n, 则循环共进行了: 0+(1-1)*1/2+...+(n-1)n/2=n(n+1)(n-1)/6所以时间复杂度为O(n^3).</p>
<img src ="http://www.blogjava.net/ashutc/aggbug/288211.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ashutc/" target="_blank">西瓜</a> 2009-07-24 15:03 <a href="http://www.blogjava.net/ashutc/archive/2009/07/24/288211.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>判断单链表是否存在环，判断两个链表是否相交问题详解(转载)</title><link>http://www.blogjava.net/ashutc/archive/2009/07/24/288205.html</link><dc:creator>西瓜</dc:creator><author>西瓜</author><pubDate>Fri, 24 Jul 2009 06:35:00 GMT</pubDate><guid>http://www.blogjava.net/ashutc/archive/2009/07/24/288205.html</guid><wfw:comment>http://www.blogjava.net/ashutc/comments/288205.html</wfw:comment><comments>http://www.blogjava.net/ashutc/archive/2009/07/24/288205.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ashutc/comments/commentRss/288205.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ashutc/services/trackbacks/288205.html</trackback:ping><description><![CDATA[<p>有一个单链表，其中可能有一个环，也就是某个节点的next指向的是链表中在它之前的节点，这样在链表的尾部形成一环。1、如何判断一个链表是不是这类链表？2、如果链表为存在环，如果找到环的入口点？扩展：判断两个单链表是否相交，如果相交，给出相交的第一个点。<br />
有一个单链表，其中可能有一个环，也就是某个节点的next指向的是链表中在它之前的节点，这样在链表的尾部形成一环。</p>
<p>问题：</p>
<p>1、如何判断一个链表是不是这类链表？<br />
2、如果链表为存在环，如果找到环的入口点？</p>
<p>解答：</p>
<p>一、判断链表是否存在环，办法为：</p>
<p>设置两个指针(fast, slow)，初始值都指向头，slow每次前进一步，fast每次前进二步，如果链表存在环，则fast必定先进入环，而slow后进入环，两个指针必定相遇。(当然，fast先行头到尾部为NULL，则为无环链表)程序如下：</p>
<p>bool IsExitsLoop(slist * head)<br />
{<br />
&nbsp;&nbsp;&nbsp; slist * slow = head ,&nbsp; * fast = head;</p>
<p>&nbsp;&nbsp;&nbsp; while&nbsp; ( fast&nbsp; &amp;&amp;&nbsp; fast -&gt; next ) <br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; slow&nbsp; =&nbsp; slow -&gt; next;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fast&nbsp; =&nbsp; fast -&gt; next -&gt; next;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if&nbsp; ( slow&nbsp; ==&nbsp; fast )&nbsp; break ;<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; return&nbsp;&nbsp; ! (fast&nbsp; ==&nbsp; NULL&nbsp; ||&nbsp; fast -&gt; next&nbsp; ==&nbsp; NULL);<br />
} <br />
二、找到环的入口点</p>
<p>当fast若与slow相遇时，slow肯定没有走遍历完链表，而fast已经在环内循环了n圈(1&lt;=n)。假设slow走了s步，则fast走了2s步（fast步数还等于s 加上在环上多转的n圈），设环长为r，则：</p>
<p>2s = s + nr<br />
s= nr</p>
<p>设整个链表长L，入口环与相遇点距离为x，起点到环入口点的距离为a。<br />
a + x = nr<br />
a + x = (n &#8211; 1)r +r = (n-1)r + L - a<br />
a = (n-1)r + (L &#8211; a &#8211; x)</p>
<p>(L &#8211; a &#8211; x)为相遇点到环入口点的距离，由此可知，从链表头到环入口点等于(n-1)循环内环+相遇点到环入口点，于是我们从链表头、与相遇点分别设一个指针，每次各走一步，两个指针必定相遇，且相遇第一点为环入口点。</p>
<p>程序描述如下：</p>
<p>slist *&nbsp; FindLoopPort(slist * head)<br />
{<br />
&nbsp;&nbsp;&nbsp; slist * slow&nbsp; =&nbsp; head,&nbsp; * fast&nbsp; =&nbsp; head;</p>
<p>&nbsp;&nbsp;&nbsp; while&nbsp; ( fast&nbsp; &amp;&amp;&nbsp; fast -&gt; next ) <br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; slow&nbsp; =&nbsp; slow -&gt; next;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fast&nbsp; =&nbsp; fast -&gt; next -&gt; next;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if&nbsp; ( slow&nbsp; ==&nbsp; fast )&nbsp; break ;<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; if&nbsp; (fast&nbsp; ==&nbsp; NULL&nbsp; ||&nbsp; fast -&gt; next&nbsp; ==&nbsp; NULL)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return&nbsp; NULL;</p>
<p>&nbsp;&nbsp;&nbsp; slow&nbsp; =&nbsp; head;<br />
&nbsp;&nbsp;&nbsp; while&nbsp; (slow&nbsp; !=&nbsp; fast)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; slow&nbsp; =&nbsp; slow -&gt; next;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fast&nbsp; =&nbsp; fast -&gt; next;<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; return&nbsp; slow;<br />
} </p>
<p>附一种易于理解的解释：</p>
<p>一种O（n）的办法就是（搞两个指针，一个每次递增一步，一个每次递增两步，如果有环的话两者必然重合，反之亦然）： <br />
关于这个解法最形象的比喻就是在操场当中跑步，速度快的会把速度慢的扣圈</p>
<p>可以证明，p2追赶上p1的时候，p1一定还没有走完一遍环路，p2也不会跨越p1多圈才追上</p>
<p>我们可以从p2和p1的位置差距来证明，p2一定会赶上p1但是不会跳过p1的</p>
<p>因为p2每次走2步，而p1走一步，所以他们之间的差距是一步一步的缩小，4，3，2，1，0 到0的时候就重合了</p>
<p>根据这个方式，可以证明，p2每次走三步以上，并不总能加快检测的速度，反而有可能判别不出有环</p>
<p>既然能够判断出是否是有环路，那改如何找到这个环路的入口呢？ </p>
<p>解法如下： 当p2按照每次2步，p1每次一步的方式走，发现p2和p1重合，确定了单向链表有环路了</p>
<p>接下来，让p2回到链表的头部，重新走，每次步长不是走2了，而是走1，那么当p1和p2再次相遇的时候，就是环路的入口了。</p>
<p>这点可以证明的：</p>
<p>在p2和p1第一次相遇的时候，假定p1走了n步骤，环路的入口是在p步的时候经过的，那么有</p>
<p>p1走的路径： p+c ＝ n；&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c为p1和p2相交点，距离环路入口的距离</p>
<p>p2走的路径： p+c+k*L = 2*n；&nbsp;&nbsp; L为环路的周长，k是整数</p>
<p>显然，如果从p+c点开始，p1再走n步骤的话，还可以回到p+c这个点</p>
<p>同时p2从头开始走的话，经过n步，也会达到p+c这点</p>
<p>显然在这个步骤当中p1和p2只有前p步骤走的路径不同，所以当p1和p2再次重合的时候，必然是在链表的环路入口点上。</p>
<p>扩展问题：</p>
<p>判断两个单链表是否相交，如果相交，给出相交的第一个点（两个链表都不存在环）。</p>
<p>比较好的方法有两个：</p>
<p>一、将其中一个链表首尾相连，检测另外一个链表是否存在环，如果存在，则两个链表相交，而检测出来的依赖环入口即为相交的第一个点。</p>
<p>二、如果两个链表相交，那个两个链表从相交点到链表结束都是相同的节点，我们可以先遍历一个链表，直到尾部，再遍历另外一个链表，如果也可以走到同样的结尾点，则两个链表相交。</p>
<p>这时我们记下两个链表length，再遍历一次，长链表节点先出发前进(lengthMax-lengthMin)步，之后两个链表同时前进，每次一步，相遇的第一点即为两个链表相交的第一个点。</p>
<p><br />
本文来自CSDN博客，转载请标明出处：http://blog.csdn.net/ssfp8762/archive/2009/07/08/4331419.aspx</p>
<img src ="http://www.blogjava.net/ashutc/aggbug/288205.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ashutc/" target="_blank">西瓜</a> 2009-07-24 14:35 <a href="http://www.blogjava.net/ashutc/archive/2009/07/24/288205.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JDK1.5新特性介绍</title><link>http://www.blogjava.net/ashutc/archive/2009/06/10/281343.html</link><dc:creator>西瓜</dc:creator><author>西瓜</author><pubDate>Wed, 10 Jun 2009 14:44:00 GMT</pubDate><guid>http://www.blogjava.net/ashutc/archive/2009/06/10/281343.html</guid><wfw:comment>http://www.blogjava.net/ashutc/comments/281343.html</wfw:comment><comments>http://www.blogjava.net/ashutc/archive/2009/06/10/281343.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ashutc/comments/commentRss/281343.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ashutc/services/trackbacks/281343.html</trackback:ping><description><![CDATA[<h1 id="artibodyTitle">&nbsp;</h1>
<div id="conauthor"><span>2004-09-11 00:05</span><span>作者：xBird</span><span>出处：Java研究组织</span><span>责任编辑：方舟</span></div>
<div class="topadbg"></div>
<p align="justify"><!--正文开始--></p>
<div id="conneirong">
<div id="artibody"><!-- Error -->
<div class="clear1"></div>
<div class="guanggao"></div>
&#8220;JDK1.5&#8221;（开发代号猛虎）的一个重要主题就是通过新增一些特性来简化开发，这些特性包括泛型，for-else　循环，自动装包/拆包，枚举，可变参数,　静态导入　。使用这些特性有助于我们编写更加清晰，精悍，安全的代码。<br />
<br />
下面我们简单介绍一下这些新特性。<br />
<br />
<strong>1.泛型(Generic)</strong><br />
<br />
C++通过模板技术可以指定集合的元素类型，而Java在1.5之前一直没有相对应的功能。一个集合可以放任何类型的对象，相应地从集合里面拿对象的时候我们也不得不对他们进行强制得类型转换。猛虎引入了泛型，它允许指定集合里元素的类型，这样你可以得到强类型在编译时刻进行类型检查的好处。<br />
<br />
<table align="center" bgcolor="#e6e4dd" border="1" bordercolor="#ffcc66" width="90%">
    <tbody>
        <tr>
            <td>Collection&lt;String&gt;　c　=　new　ArrayList();<br />
            c.add(new　Date());</td>
        </tr>
    </tbody>
</table>
<br />
编译器会给出一个错误：<br />
<br />
<table align="center" bgcolor="#e6e4dd" border="1" bordercolor="#ffcc66" width="90%">
    <tbody>
        <tr>
            <td>add(java.lang.String)　in　java.util.Collection&lt;java.lang.String&gt;　cannot　be　applied　to　(java.util.Date)</td>
        </tr>
    </tbody>
</table>
<br />
<strong>2.For-Each循环</strong><br />
<br />
For-Each循环得加入简化了集合的遍历。假设我们要遍历一个集合对其中的元素进行一些处理。典型的代码为：<br />
<br />
<table align="center" bgcolor="#e6e4dd" border="1" bordercolor="#ffcc66" width="90%">
    <tbody>
        <tr>
            <td>void　processAll(Collection　c){<br />
            for(Iterator　i=c.iterator();　i.hasNext();){<br />
            MyClass　myObject　=　(MyClass)i.next();<br />
            myObject.process();<br />
            }<br />
            }</td>
        </tr>
    </tbody>
</table>
<br />
使用For-Each循环，我们可以把代码改写成：<br />
<br />
<table align="center" bgcolor="#e6e4dd" border="1" bordercolor="#ffcc66" width="90%">
    <tbody>
        <tr>
            <td>void　processAll(Collection&lt;MyClass&gt;　c){<br />
            for　(MyClass　　myObject　:c)<br />
            myObject.process();<br />
            }</td>
        </tr>
    </tbody>
</table>
<br />
这段代码要比上面清晰许多，并且避免了强制类型转换。<br />
<br />
<strong>3.自动装包/拆包(Autoboxing/unboxing)</strong><br />
<br />
自动装包/拆包大大方便了基本类型数据和它们包装类地使用。<br />
<br />
自动装包：基本类型自动转为包装类.(int　&gt;&gt;　Integer)<br />
<br />
自动拆包：包装类自动转为基本类型.(Integer　&gt;&gt;　int)<br />
<br />
在JDK1.5之前，我们总是对集合不能存放基本类型而耿耿于怀，现在自动转换机制解决了我们的问题。<br />
<br />
<table align="center" bgcolor="#e6e4dd" border="1" bordercolor="#ffcc66" width="90%">
    <tbody>
        <tr>
            <td>int　a　=　3;<br />
            Collection　c　=　new　ArrayList();<br />
            c.add(a);//自动转换成Integer.<br />
            <br />
            Integer　b　=　new　Integer(2);<br />
            c.add(b　+　2);</td>
        </tr>
    </tbody>
</table>
<br />
这里Integer先自动转换为int进行加法运算，然后int再次转换为Integer.<br />
<br />
<strong>4.枚举(Enums)</strong><br />
<br />
JDK1.5加入了一个全新类型的&#8220;类&#8221;－枚举类型。为此JDK1.5引入了一个新关键字enmu.　我们可以这样来定义一个枚举类型。<br />
<br />
<table align="center" bgcolor="#e6e4dd" border="1" bordercolor="#ffcc66" width="90%">
    <tbody>
        <tr>
            <td>public　enum　Color<br />
            {<br />
            Red,<br />
            White,<br />
            Blue<br />
            }</td>
        </tr>
    </tbody>
</table>
<br />
然后可以这样来使用Color　myColor　=　Color.Red.<br />
<br />
枚举类型还提供了两个有用的静态方法values()和valueOf().　我们可以很方便地使用它们，例如<br />
<br />
<table align="center" bgcolor="#e6e4dd" border="1" bordercolor="#ffcc66" width="90%">
    <tbody>
        <tr>
            <td>for　(Color　c　:　Color.values())<br />
            System.out.println(c);</td>
        </tr>
    </tbody>
</table>
<br />
<strong>5.可变参数(Varargs)</strong><br />
<br />
可变参数使程序员可以声明一个接受可变数目参数的方法。注意，可变参数必须是函数声明中的最后一个参数。假设我们要写一个简单的方法打印一些对象，<br />
<br />
<table align="center" bgcolor="#e6e4dd" border="1" bordercolor="#ffcc66" width="90%">
    <tbody>
        <tr>
            <td>util.write(obj1);<br />
            util.write(obj1,obj2);<br />
            util.write(obj1,obj2,obj3);<br />
            &#8230;</td>
        </tr>
    </tbody>
</table>
<br />
在JDK1.5之前，我们可以用重载来实现，但是这样就需要写很多的重载函数，显得不是很有效。如果使用可变参数的话我们只需要一个函数就行了<br />
<br />
<table align="center" bgcolor="#e6e4dd" border="1" bordercolor="#ffcc66" width="90%">
    <tbody>
        <tr>
            <td>public　void　write(Object...　objs)　{<br />
            for　(Object　obj:　objs)<br />
            System.out.println(obj);<br />
            }</td>
        </tr>
    </tbody>
</table>
<br />
在引入可变参数以后，Java的反射包也更加方便使用了。对于c.getMethod("test",　new　Object[0]).invoke(c.newInstance(),　new　Object[0]))，现在我们可以这样写了c.getMethod("test").invoke(c.newInstance())，这样的代码比原来清楚了很多。　<br />
<br />
<strong>6.静态导入(Static　Imports)</strong><br />
<br />
要使用用静态成员（方法和变量）我们必须给出提供这个方法的类。使用静态导入可以使被导入类的所有静态变量和静态方法在当前类直接可见，使用这些静态成员无需再给出他们的类名。<br />
<br />
<table align="center" bgcolor="#e6e4dd" border="1" bordercolor="#ffcc66" width="90%">
    <tbody>
        <tr>
            <td>import　static　java.lang.Math.*;<br />
            &#8230;&#8230;.<br />
            r　=　sin(PI　*　2);　//无需再写r　=　Math.sin(Math.PI);</td>
        </tr>
    </tbody>
</table>
<br />
不过，过度使用这个特性也会一定程度上降低代码地可读性。<br />
</div>
</div>
<img src ="http://www.blogjava.net/ashutc/aggbug/281343.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ashutc/" target="_blank">西瓜</a> 2009-06-10 22:44 <a href="http://www.blogjava.net/ashutc/archive/2009/06/10/281343.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java ClassLoader机制</title><link>http://www.blogjava.net/ashutc/archive/2009/05/29/278944.html</link><dc:creator>西瓜</dc:creator><author>西瓜</author><pubDate>Fri, 29 May 2009 12:45:00 GMT</pubDate><guid>http://www.blogjava.net/ashutc/archive/2009/05/29/278944.html</guid><wfw:comment>http://www.blogjava.net/ashutc/comments/278944.html</wfw:comment><comments>http://www.blogjava.net/ashutc/archive/2009/05/29/278944.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ashutc/comments/commentRss/278944.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ashutc/services/trackbacks/278944.html</trackback:ping><description><![CDATA[当JVM（<a onclick="javascript:tagshow(event, 'Java');" href="javascript:;" target="_self"><u><strong>Java</strong></u></a>虚拟机）启动时，会形成由三个类加载器组成的初始类加载器层次结构：<br />
<br />
&nbsp; &nbsp;&nbsp; &nbsp; bootstrap classloader<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; |<br />
&nbsp; &nbsp;&nbsp; &nbsp; extension classloader<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; |<br />
&nbsp; &nbsp;&nbsp; &nbsp; system classloader<br />
<br />
bootstrap classloader －引导（也称为原始）类加载器，它负责加载Java的核心类。在Sun的JVM中，在执行java的命令中使用-Xbootclasspath选项或使用- D选项指定sun.boot.class.path系统属性值可以指定附加的类。这个加载器的是非常特殊的，它实际上不是 java.lang.ClassLoader的子类，而是由JVM自身实现的。大家可以通过执行以下代码来获得bootstrap classloader加载了那些核心类库：<br />
&nbsp; &nbsp;URL[] urls=sun.misc.Launcher.getBootstrapClassPath().getURLs();<br />
&nbsp; &nbsp;for (int i = 0; i &lt; urls.length; i++) {<br />
&nbsp; &nbsp;&nbsp;&nbsp;System.out.println(urls.toExternalform());<br />
&nbsp; &nbsp;}<br />
在我的计算机上的结果为：<br />
文件:/C:/j2sdk1.4.1_01/jre/lib/endorsed/dom.jar<br />
文件:/C:/j2sdk1.4.1_01/jre/lib/endorsed/sax.jar<br />
文件:/C:/j2sdk1.4.1_01/jre/lib/endorsed/xalan-2.3.1.jar<br />
文件:/C:/j2sdk1.4.1_01/jre/lib/endorsed/xercesImpl-2.0.0.jar<br />
文件:/C:/j2sdk1.4.1_01/jre/lib/endorsed/xml-apis.jar<br />
文件:/C:/j2sdk1.4.1_01/jre/lib/endorsed/xsltc.jar<br />
文件:/C:/j2sdk1.4.1_01/jre/lib/rt.jar<br />
文件:/C:/j2sdk1.4.1_01/jre/lib/i18n.jar<br />
文件:/C:/j2sdk1.4.1_01/jre/lib/sunrsasign.jar<br />
文件:/C:/j2sdk1.4.1_01/jre/lib/jsse.jar<br />
文件:/C:/j2sdk1.4.1_01/jre/lib/jce.jar<br />
文件:/C:/j2sdk1.4.1_01/jre/lib/charsets.jar<br />
文件:/C:/j2sdk1.4.1_01/jre/classes<br />
这时大家知道了为什么我们不需要在系统属性CLASSPATH中指定这些类库了吧，因为JVM在启动的时候就自动加载它们了。<br />
<br />
extension classloader －扩展类加载器，它负责加载JRE的扩展目录（JAVA_HOME/jre/lib/ext或者由java.ext.dirs系统属性指定的）中JAR的类包。这为引入除Java核心类以外的新功能提供了一个标准机制。因为默认的扩展目录对所有从同一个JRE中启动的JVM都是通用的，所以放入这个目录的 JAR类包对所有的JVM和system classloader都是可见的。在这个实例上调用方法getParent()总是返回空值null，因为引导加载器bootstrap classloader不是一个真正的ClassLoader实例。所以当大家执行以下代码时：<br />
&nbsp; &nbsp;System.out.println(System.getProperty("java.ext.dirs"));<br />
&nbsp; &nbsp;ClassLoader extensionClassloader=ClassLoader.getSystemClassLoader().getParent();<br />
&nbsp; &nbsp;System.out.println("the parent of extension classloader : "+extensionClassloader.getParent());<br />
结果为：<br />
C:\j2sdk1.4.1_01\jre\lib\ext<br />
the parent of extension classloader : null<br />
extension classloader是system classloader的parent，而bootstrap classloader是extension classloader的parent，但它不是一个实际的classloader，所以为null。<br />
<br />
system classloader －系统（也称为应用）类加载器，它负责在JVM被启动时，加载来自在命令java中的-classpath或者java.class.path系统属性或者 CLASSPATH*作系统属性所指定的JAR类包和类路径。总能通过静态方法ClassLoader.getSystemClassLoader()找到该类加载器。如果没有特别指定，则用户自定义的任何类加载器都将该类加载器作为它的父加载器。执行以下代码即可获得：<br />
&nbsp; &nbsp;System.out.println(System.getProperty("java.class.path"));<br />
输出结果则为用户在系统属性里面设置的CLASSPATH。<br />
classloader 加载类用的是全盘负责委托机制。所谓全盘负责，即是当一个classloader加载一个Class的时候，这个Class所依赖的和引用的所有 Class也由这个classloader负责载入，除非是显式的使用另外一个classloader载入；委托机制则是先让parent（父）类加载器 (而不是super，它与parent classloader类不是继承关系)寻找，只有在parent找不到的时候才从自己的类路径中去寻找。此外类加载还采用了cache机制，也就是如果 cache中保存了这个Class就直接返回它，如果没有才从文件中读取和转换成Class，并存入cache，这就是为什么我们修改了Class但是必须重新启动JVM才能生效的原因。<br />
<br />
<br />
每个ClassLoader加载Class的过程是：<br />
1.检测此Class是否载入过（即在cache中是否有此Class），如果有到8,如果没有到2<br />
2.如果parent classloader不存在（没有parent，那parent一定是bootstrap classloader了），到4<br />
3.请求parent classloader载入，如果成功到8，不成功到5<br />
4.请求jvm从bootstrap classloader中载入，如果成功到8<br />
5.寻找Class文件（从与此classloader相关的类路径中寻找）。如果找不到则到7.<br />
6.从文件中载入Class，到8.<br />
7.抛出ClassNotFoundException.<br />
8.返回Class.<br />
<br />
其中5.6步我们可以通过覆盖ClassLoader的findClass方法来实现自己的载入策略。甚至覆盖loadClass方法来实现自己的载入过程。<br />
<br />
类加载器的顺序是：<br />
先是bootstrap classloader，然后是extension classloader，最后才是system classloader。大家会发现加载的Class越是重要的越在靠前面。这样做的原因是出于安全性的考虑，试想如果system classloader&#8220;亲自&#8221;加载了一个具有破坏性的&#8220;java.lang.System&#8221;类的后果吧。这种委托机制保证了用户即使具有一个这样的类，也把它加入到了类路径中，但是它永远不会被载入，因为这个类总是由bootstrap classloader来加载的。大家可以执行一下以下的代码：<br />
&nbsp; &nbsp;System.out.println(System.class.getClassLoader());<br />
将会看到结果是null，这就表明java.lang.System是由bootstrap classloader加载的，因为bootstrap classloader不是一个真正的ClassLoader实例，而是由JVM实现的，正如前面已经说过的。<br />
<br />
下面就让我们来看看JVM是如何来为我们来建立类加载器的结构的：<br />
sun.misc.Launcher，顾名思义，当你执行java命令的时候，JVM会先使用bootstrap classloader载入并初始化一个Launcher，执行下来代码：<br />
&nbsp;&nbsp;System.out.println("the Launcher's classloader is "+sun.misc.Launcher.getLauncher().getClass().getClassLoader());<br />
结果为：<br />
&nbsp;&nbsp;the Launcher's classloader is null (因为是用bootstrap classloader加载,所以class loader为null)<br />
Launcher 会根据系统和命令设定初始化好class loader结构，JVM就用它来获得extension classloader和system classloader,并载入所有的需要载入的Class，最后执行java命令指定的带有静态的main方法的Class。extension classloader实际上是sun.misc.Launcher$ExtClassLoader类的一个实例，system classloader实际上是sun.misc.Launcher$AppClassLoader类的一个实例。并且都是 java.net.URLClassLoader的子类。<br />
<br />
让我们来看看Launcher初试化的过程的部分代码。<br />
<br />
Launcher的部分代码：<br />
public class Launcher&nbsp;&nbsp;{<br />
&nbsp; &nbsp;public Launcher() {<br />
&nbsp; &nbsp;&nbsp; &nbsp; ExtClassLoader extclassloader;<br />
&nbsp; &nbsp;&nbsp; &nbsp; try {<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;//初始化extension classloader<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;extclassloader = ExtClassLoader.getExtClassLoader();<br />
&nbsp; &nbsp;&nbsp; &nbsp; } catch(IOException ioexception) {<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;throw new InternalError("Could not create extension class loader");<br />
&nbsp; &nbsp;&nbsp; &nbsp; }<br />
&nbsp; &nbsp;&nbsp; &nbsp; try {<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;//初始化system classloader，parent是extension classloader<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;loader = AppClassLoader.getAppClassLoader(extclassloader);<br />
&nbsp; &nbsp;&nbsp; &nbsp; } catch(IOException ioexception1) {<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;throw new InternalError("Could not create application class loader");<br />
&nbsp; &nbsp;&nbsp; &nbsp; }<br />
&nbsp; &nbsp;&nbsp; &nbsp; //将system classloader设置成当前线程的context classloader（将在后面加以介绍）<br />
&nbsp; &nbsp;&nbsp; &nbsp; Thread.currentThread().setContextClassLoader(loader);<br />
&nbsp; &nbsp;&nbsp; &nbsp; ......<br />
&nbsp; &nbsp;}<br />
&nbsp; &nbsp;public ClassLoader getClassLoader() {<br />
&nbsp; &nbsp;&nbsp; &nbsp; //返回system classloader<br />
&nbsp; &nbsp;&nbsp; &nbsp; return loader;<br />
&nbsp; &nbsp;}<br />
}<br />
<br />
extension classloader的部分代码：<br />
static class Launcher$ExtClassLoader extends URLClassLoader {<br />
<br />
&nbsp; &nbsp;public static Launcher$ExtClassLoader getExtClassLoader()<br />
&nbsp; &nbsp;&nbsp; &nbsp; throws IOException<br />
&nbsp; &nbsp;{<br />
&nbsp; &nbsp;&nbsp; &nbsp; File afile[] = getExtDirs();<br />
&nbsp; &nbsp;&nbsp; &nbsp; return (Launcher$ExtClassLoader)AccessController.doPrivileged(new Launcher$1(afile));<br />
&nbsp; &nbsp;}<br />
&nbsp;&nbsp;private static File[] getExtDirs() {<br />
&nbsp; &nbsp;&nbsp; &nbsp; //获得系统属性&#8220;java.ext.dirs&#8221;<br />
&nbsp; &nbsp;&nbsp; &nbsp; String s = System.getProperty("java.ext.dirs");<br />
&nbsp; &nbsp;&nbsp; &nbsp; File afile[];<br />
&nbsp; &nbsp;&nbsp; &nbsp; if(s != null) {<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;StringTokenizer stringtokenizer = new StringTokenizer(s, File.pathSeparator);<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;int i = stringtokenizer.countTokens();<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;afile = new File;<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;for(int j = 0; j &lt; i; j++)<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;afile[j] = new File(stringtokenizer.nextToken());<br />
<br />
&nbsp; &nbsp;&nbsp; &nbsp; } else {<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;afile = new File[0];<br />
&nbsp; &nbsp;&nbsp; &nbsp; }<br />
&nbsp; &nbsp;&nbsp; &nbsp; return afile;<br />
&nbsp; &nbsp;}<br />
}<br />
<br />
system classloader的部分代码：<br />
static class Launcher$AppClassLoader extends URLClassLoader<br />
{<br />
<br />
&nbsp; &nbsp;public static ClassLoader getAppClassLoader(ClassLoader classloader)<br />
&nbsp; &nbsp;&nbsp; &nbsp; throws IOException<br />
&nbsp; &nbsp;{<br />
&nbsp; &nbsp;&nbsp; &nbsp; //获得系统属性&#8220;java.class.path&#8221;<br />
&nbsp; &nbsp;&nbsp; &nbsp; String s = System.getProperty("java.class.path");<br />
&nbsp; &nbsp;&nbsp; &nbsp; File afile[] = s != null ? Launcher.access$200(s) : new File[0];<br />
&nbsp; &nbsp;&nbsp; &nbsp; return (Launcher$AppClassLoader)AccessController.doPrivileged(new Launcher$2(s, afile, classloader));<br />
&nbsp; &nbsp;}<br />
}<br />
<br />
看了源代码大家就清楚了吧，extension classloader是使用系统属性&#8220;java.ext.dirs&#8221;设置类搜索路径的，并且没有parent。system classloader是使用系统属性&#8220;java.class.path&#8221;设置类搜索路径的，并且有一个parent classloader。Launcher初始化extension classloader，system classloader，并将system classloader设置成为context classloader，但是仅仅返回system classloader给JVM。<br />
<br />
这里怎么又出来一个context classloader呢？它有什么用呢？我们在建立一个线程Thread的时候，可以为这个线程通过setContextClassLoader方法来指定一个合适的classloader作为这个线程的context classloader，当此线程运行的时候，我们可以通过getContextClassLoader方法来获得此context classloader，就可以用它来载入我们所需要的Class。默认的是system classloader。利用这个特性，我们可以&#8220;打破&#8221;classloader委托机制了，父classloader可以获得当前线程的context classloader，而这个context classloader可以是它的子classloader或者<a onclick="javascript:tagshow(event, '%C6%E4%CB%FB');" href="javascript:;" target="_self"><u><strong>其他</strong></u></a>的classloader，那么父classloader就可以从其获得所需的 Class，这就打破了只能向父classloader请求的限制了。这个机制可以满足当我们的classpath是在运行时才确定,并由定制的 classloader加载的时候,由system classloader(即在jvm classpath中)加载的class可以通过context classloader获得定制的classloader并加载入特定的class(通常是抽象类和接口,定制的classloader中是其实现),例如web应用中的servlet就是用这种机制加载的.<br />
<br />
<br />
好了，现在我们了解了classloader的结构和<a onclick="javascript:tagshow(event, '%B9%A4%D7%F7');" href="javascript:;" target="_self"><u><strong>工作</strong></u></a>原理，那么我们如何实现在运行时的动态载入和更新呢？只要我们能够动态改变类搜索路径和清除classloader的cache中已经载入的Class就行了，有两个方案，一是我们继承一个classloader，覆盖loadclass方法，动态的寻找Class文件并使用defineClass方法来；另一个则非常简单实用，只要重新使用一个新的类搜索路径来new一个classloader就行了，这样即更新了类搜索路径以便来载入新的Class，也重新生成了一个空白的cache(当然,类搜索路径不一定必须更改)。噢，太好了，我们几乎不用做什么工作，java.netURLClassLoader正是一个符合我们要求的classloader！我们可以直接使用或者继承它就可以了！<br />
<br />
这是j2se1.4 API的doc中URLClassLoader的两个构造器的描述：<br />
URLClassLoader(URL[] urls)<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;Constructs a new URLClassLoader for the specified URLs using the default delegation parent ClassLoader.<br />
URLClassLoader(URL[] urls, ClassLoader parent)<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;Constructs a new URLClassLoader for the given URLs.<br />
其中URL[] urls就是我们要设置的类搜索路径，parent就是这个classloader的parent classloader，默认的是system classloader。<br />
<br />
<br />
好，现在我们能够动态的载入Class了，这样我们就可以利用newInstance方法来获得一个Object。但我们如何将此Object造型呢？可以将此Object造型成它本身的Class吗？<br />
<br />
首先让我们来分析一下java源文件的编译，运行吧！javac命令是调用&#8220;JAVA_HOME/lib/tools.jar&#8221;中的&#8220;com.sun.tools.javac.Main&#8221;的compile方法来编译：<br />
<br />
&nbsp; &nbsp;public static int compile(String as[]);<br />
<br />
&nbsp; &nbsp;public static int compile(String as[], PrintWriter printwriter);<br />
<br />
返回0表示编译成功，字符串数组as则是我们用javac命令编译时的参数，以空格划分。例如：<br />
javac -classpath c:\foo\bar.jar;. -d c:\ c:\Some.java<br />
则字符串数组as为{"-classpath","c:\\foo\\bar.jar;.","-d","c:\\","c:\\Some.java"}，如果带有PrintWriter参数，则会把编译信息出到这个指定的printWriter中。默认的输出是System.err。<br />
<br />
其中 Main是由JVM使用Launcher初始化的system classloader载入的，根据全盘负责原则，编译器在解析这个java源文件时所发现的它所依赖和引用的所有Class也将由system classloader载入，如果system classloader不能载入某个Class时，编译器将抛出一个&#8220;cannot resolve symbol&#8221;错误。<br />
<br />
所以首先编译就通不过，也就是编译器无法编译一个引用了不在CLASSPATH中的未知Class的java源文件，而由于拼写错误或者没有把所需类库放到CLASSPATH中，大家一定经常看到这个&#8220;cannot resolve symbol&#8221;这个编译错误吧！<br />
<br />
其次，就是我们把这个Class放到编译路径中，成功的进行了编译，然后在运行的时候不把它放入到CLASSPATH中而利用我们自己的 classloader来动态载入这个Class，这时候也会出现&#8220;java.lang.NoClassDefFoundError&#8221;的违例，为什么呢？<br />
<br />
我们再来分析一下，首先调用这个造型语句的可执行的Class一定是由JVM使用Launcher初始化的system classloader载入的，根据全盘负责原则，当我们进行造型的时候，JVM也会使用system classloader来尝试载入这个Class来对实例进行造型，自然在system classloader寻找不到这个Class时就会抛出&#8220;java.lang.NoClassDefFoundError&#8221;的违例。<br />
<br />
OK，现在让我们来总结一下，java文件的编译和Class的载入执行，都是使用Launcher初始化的system classloader作为类载入器的，我们无法动态的改变system classloader，更无法让JVM使用我们自己的classloader来替换system classloader，根据全盘负责原则，就限制了编译和运行时，我们无法直接显式的使用一个system classloader寻找不到的Class，即我们只能使用Java核心类库，扩展类库和CLASSPATH中的类库中的Class。<br />
<br />
还不死心！再尝试一下这种情况，我们把这个Class也放入到CLASSPATH中，让system classloader能够识别和载入。然后我们通过自己的classloader来从指定的class文件中载入这个Class（不能够委托 parent载入，因为这样会被system classloader从CLASSPATH中将其载入），然后实例化一个Object，并造型成这个Class，这样JVM也识别这个Class（因为 system classloader能够定位和载入这个Class从CLASSPATH中），载入的也不是CLASSPATH中的这个Class，而是从 CLASSPATH外动态载入的，这样总行了吧！十分不幸的是，这时会出现&#8220;java.lang.ClassCastException&#8221;违例。<br />
<br />
为什么呢？我们也来分析一下，不错，我们虽然从CLASSPATH外使用我们自己的classloader动态载入了这个Class，但将它的实例造型的时候是JVM会使用system classloader来再次载入这个Class，并尝试将使用我们的自己的classloader载入的Class的一个实例造型为system classloader载入的这个Class（另外的一个）。大家发现什么问题了吗？也就是我们尝试将从一个classloader载入的Class的一个实例造型为另外一个classloader载入的Class，虽然这两个Class的名字一样，甚至是从同一个class文件中载入。但不幸的是JVM 却认为这个两个Class是不同的，即JVM认为不同的classloader载入的相同的名字的Class（即使是从同一个class文件中载入的）是不同的！这样做的原因我想大概也是主要出于安全性考虑，这样就保证所有的核心Java类都是system classloader载入的，我们无法用自己的classloader载入的相同名字的Class的实例来替换它们的实例。<br />
<br />
看到这里，聪明的读者一定想到了该如何动态载入我们的Class，实例化，造型并调用了吧！<br />
<br />
那就是利用面向对象的基本特性之一的多形性。我们把我们动态载入的Class的实例造型成它的一个system classloader所能识别的父类就行了！这是为什么呢？我们还是要再来分析一次。当我们用我们自己的classloader来动态载入这我们只要把这个Class的时候，发现它有一个父类Class，在载入它之前JVM先会载入这个父类Class，这个父类Class是system classloader所能识别的，根据委托机制，它将由system classloader载入，然后我们的classloader再载入这个Class，创建一个实例，造型为这个父类Class，注意了，造型成这个父类 Class的时候（也就是上溯）是面向对象的java语言所允许的并且JVM也支持的，JVM就使用system classloader再次载入这个父类Class，然后将此实例造型为这个父类Class。大家可以从这个过程发现这个父类Class都是由 system classloader载入的，也就是同一个class loader载入的同一个Class，所以造型的时候不会出现任何异常。而根据多形性，调用这个父类的方法时，真正执行的是这个Class（非父类 Class）的覆盖了父类方法的方法。这些方法中也可以引用system classloader不能识别的Class，因为根据全盘负责原则，只要载入这个Class的classloader即我们自己定义的 classloader能够定位和载入这些Class就行了。<br />
<br />
这样我们就可以事先定义好一组接口或者基类并放入CLASSPATH中，然后在执行的时候动态的载入实现或者继承了这些接口或基类的子类。还不明白吗？让我们来想一想Servlet吧，web application server能够载入任何继承了Servlet的Class并正确的执行它们，不管它实际的Class是什么，就是都把它们实例化成为一个Servlet Class，然后执行Servlet的init，doPost，doGet和destroy等方法的,而不管这个Servlet是从web- inf/lib和web-inf/classes下由system classloader的子classloader(即定制的classloader)动态载入。说了这么多希望大家都明白了。在applet,ejb等容器中,都是采用了这种机制.<br />
<br />
对于以上各种情况，希望大家实际编写一些example来实验一下。<br />
<br />
最后我再说点别的， classloader虽然称为类加载器，但并不意味着只能用来加载Class，我们还可以利用它也获得图片，音频文件等资源的URL，当然，这些资源必须在CLASSPATH中的jar类库中或目录下。我们来看API的doc中关于ClassLoader的两个寻找资源和Class的方法描述吧：<br />
public URL getResource(String name)<br />
用指定的名字来查找资源，一个资源是一些能够被class代码访问的在某种程度上依赖于代码位置的数据（图片，音频，文本等等）。<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;一个资源的名字是以'/'号分隔确定资源的路径名的。<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;这个方法将先请求parent classloader搜索资源，如果没有parent，则会在内置在虚拟机中的classloader（即bootstrap classloader）的路径中搜索。如果失败，这个方法将调用findResource(String)来寻找资源。<br />
public static URL getSystemResource(String name)<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;从用来载入类的搜索路径中查找一个指定名字的资源。这个方法使用system class loader来定位资源。即相当于ClassLoader.getSystemClassLoader().getResource(name)。<br />
<br />
例如：<br />
&nbsp; &nbsp;System.out.println(ClassLoader.getSystemResource("java/lang/String.class"));<br />
的结果为：<br />
&nbsp; &nbsp;jar:文件:/C:/j2sdk1.4.1_01/jre/lib/rt.jar!/java/lang/String.class<br />
表明String.class文件在rt.jar的java/lang目录中。<br />
因此我们可以将图片等资源随同Class一同打包到jar类库中（当然，也可单独打包这些资源）并添加它们到class loader的搜索路径中，我们就可以无需关心这些资源的具体位置，让class loader来帮我们寻找了！
<img src ="http://www.blogjava.net/ashutc/aggbug/278944.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ashutc/" target="_blank">西瓜</a> 2009-05-29 20:45 <a href="http://www.blogjava.net/ashutc/archive/2009/05/29/278944.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>