<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>qqqckm</title>
    <description></description>
    <link>http://qqqckm.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>Flash控件的自动激活</title>
        <author>qqqckm</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://qqqckm.javaeye.com">qqqckm</a>&nbsp;
          链接：<a href="http://qqqckm.javaeye.com/blog/49375" style="color:red;">http://qqqckm.javaeye.com/blog/49375</a>&nbsp;
          发表时间: 2007年01月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font face="Arial">1. 在中间加入objectSwap.js<br />
</font><font face="Arial">&lt;script src='objectSwap.js' type='text/javascript'&gt;<br />
2. falsh控件部分 <font face="Arial">
<param name="flashVersion" value="8" />to the object tag<br />
</font></font><font face="Arial">具体参考见：<font face="Arial"><a href="http://blog.deconcept.com/swfobject/">http://blog.deconcept.com/swfobject/</a></font><br />
<br />
object代码如下：</font></p>
<div class="code_title">js 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-c">
    <li class="alt"><span><span class="comment">/*&nbsp;ObjectSwap&nbsp;-&nbsp;Bypasses&nbsp;the&nbsp;new&nbsp;ActiveX&nbsp;Activation&nbsp;requirement&nbsp;in&nbsp;Internet&nbsp;Explorer&nbsp;by&nbsp;swapping&nbsp;existing&nbsp;ActiveX&nbsp;objects&nbsp;on&nbsp;the&nbsp;page&nbsp;with&nbsp;the&nbsp;same&nbsp;objects.&nbsp;Can&nbsp;also&nbsp;be&nbsp;used&nbsp;for&nbsp;Flash&nbsp;version&nbsp;detection&nbsp;by&nbsp;adding&nbsp;the&nbsp;param: </span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&lt;param&nbsp;name=&quot;flashVersion&quot;&nbsp;value=&quot;8&quot;&nbsp;/&gt;&nbsp;to&nbsp;the&nbsp;object&nbsp;tag. </span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment"></span>&nbsp;</span></li>
    <li class=""><span><span class="comment">Author:&nbsp;Karina&nbsp;Steffens,&nbsp;www.neo-archaic.net </span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">Created:&nbsp;April&nbsp;2006 </span>&nbsp;</span></li>
    <li class=""><span><span class="comment">Changes&nbsp;and&nbsp;bug&nbsp;fixes:&nbsp;May&nbsp;2006 </span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">Bug&nbsp;fixes:&nbsp;June&nbsp;2006 </span>&nbsp;</span></li>
    <li class=""><span><span class="comment">Changes:&nbsp;October&nbsp;2006&nbsp;(Included&nbsp;Opera9&nbsp;and&nbsp;excluded&nbsp;IE5.5) </span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="comment">//Check&nbsp;if&nbsp;the&nbsp;browser&nbsp;is&nbsp;InternetExplorer,&nbsp;and&nbsp;if&nbsp;it&nbsp;supports&nbsp;the&nbsp;getElementById&nbsp;DOM&nbsp;method </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="keyword">var</span><span>&nbsp;ie&nbsp;=&nbsp;(document.defaultCharset&nbsp;&amp;&amp;&nbsp;document.getElementById&nbsp;&amp;&amp;&nbsp;!window.home); &nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="keyword">var</span><span>&nbsp;opera9&nbsp;=&nbsp;</span><span class="keyword">false</span><span>; &nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="keyword">if</span><span>&nbsp;(ie){ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//Check&nbsp;for&nbsp;ie&nbsp;5.5&nbsp;and&nbsp;exclude&nbsp;it&nbsp;from&nbsp;the&nbsp;script </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">var</span><span>&nbsp;ver=navigator.appVersion.split(</span><span class="string">&quot;MSIE&quot;</span><span>) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;ver=parseFloat(ver[1]) &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;ie&nbsp;=&nbsp;(ver&nbsp;&gt;=6) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>}</span><span class="keyword">else</span><span>&nbsp;</span><span class="keyword">if</span><span>&nbsp;(navigator.userAgent.indexOf(</span><span class="string">&quot;Opera&quot;</span><span>)!=-1)&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//Check&nbsp;for&nbsp;Opera9&nbsp;and&nbsp;include&nbsp;it&nbsp;in&nbsp;the&nbsp;ObjectSwap </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">var</span><span>&nbsp;versionindex=navigator.userAgent.indexOf(</span><span class="string">&quot;Opera&quot;</span><span>)+6 &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(parseInt(navigator.userAgent.charAt(versionindex))&gt;=9) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;opera9&nbsp;=&nbsp;</span><span class="keyword">true</span><span>; &nbsp;&nbsp;</span></li>
    <li class=""><span>} &nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="comment">//Perform&nbsp;ObjectSwap&nbsp;if&nbsp;the&nbsp;browser&nbsp;is&nbsp;IE&nbsp;or&nbsp;Opera&nbsp;(if&nbsp;not&nbsp;just&nbsp;check&nbsp;flashVersion) </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="keyword">var</span><span>&nbsp;oswap&nbsp;=&nbsp;(ie&nbsp;||&nbsp;opera9) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="comment">//Hide&nbsp;the&nbsp;object&nbsp;to&nbsp;prevent&nbsp;it&nbsp;from&nbsp;loading&nbsp;twice </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="keyword">if</span><span>&nbsp;(oswap){ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;document.write&nbsp;(</span><span class="string">&quot;&lt;style&nbsp;id='hideObject'&gt;&nbsp;object{display:none;}&nbsp;&lt;/style&gt;&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="comment">/*Replace&nbsp;all&nbsp;flash&nbsp;objects&nbsp;on&nbsp;the&nbsp;page&nbsp;with&nbsp;the&nbsp;same&nbsp;flash&nbsp;object,&nbsp; </span>&nbsp;</li>
    <li class=""><span><span class="comment">by&nbsp;rewriting&nbsp;the&nbsp;outerHTML&nbsp;values </span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">This&nbsp;bypasses&nbsp;the&nbsp;new&nbsp;IE&nbsp;ActiveX&nbsp;object&nbsp;activation&nbsp;issue*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>objectSwap&nbsp;=&nbsp;</span><span class="keyword">function</span><span>(){ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(!document.getElementsByTagName){ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//An&nbsp;array&nbsp;of&nbsp;ids&nbsp;for&nbsp;flash&nbsp;detection </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">var</span><span>&nbsp;stripQueue&nbsp;=&nbsp;[]; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//Get&nbsp;a&nbsp;list&nbsp;of&nbsp;all&nbsp;ActiveX&nbsp;objects </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">var</span><span>&nbsp;objects&nbsp;=&nbsp;document.getElementsByTagName('object'); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>&nbsp;(</span><span class="keyword">var</span><span>&nbsp;i=0;&nbsp;i&lt;objects.length;&nbsp;i++){&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">var</span><span>&nbsp;o&nbsp;=&nbsp;objects[i];&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">var</span><span>&nbsp;h&nbsp;=&nbsp;o.outerHTML; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//The&nbsp;outer&nbsp;html&nbsp;omits&nbsp;the&nbsp;param&nbsp;tags,&nbsp;so&nbsp;we&nbsp;must&nbsp;retrieve&nbsp;and&nbsp;insert&nbsp;these&nbsp;separately </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">var</span><span>&nbsp;params&nbsp;=&nbsp;</span><span class="string">&quot;&quot;</span><span>; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">var</span><span>&nbsp;hasFlash&nbsp;=&nbsp;</span><span class="keyword">true</span><span>; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>&nbsp;(</span><span class="keyword">var</span><span>&nbsp;j&nbsp;=&nbsp;0;&nbsp;j&lt;o.childNodes.length;&nbsp;j++)&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">var</span><span>&nbsp;p&nbsp;=&nbsp;o.childNodes[j]; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(p.tagName&nbsp;==&nbsp;</span><span class="string">&quot;PARAM&quot;</span><span>){ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//Check&nbsp;for&nbsp;version&nbsp;first&nbsp;-&nbsp;applies&nbsp;to&nbsp;all&nbsp;browsers </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//For&nbsp;this&nbsp;to&nbsp;work,&nbsp;a&nbsp;new&nbsp;param&nbsp;needs&nbsp;to&nbsp;be&nbsp;included&nbsp;in&nbsp;the&nbsp;object&nbsp;with&nbsp;the&nbsp;name&nbsp;&quot;flashVersion&quot;&nbsp;eg: </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&lt;param&nbsp;name=&quot;flashVersion&quot;&nbsp;value=&quot;7&quot;&nbsp;/&gt; </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(p.name&nbsp;==&nbsp;</span><span class="string">&quot;flashVersion&quot;</span><span>){ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hasFlash&nbsp;=&nbsp;detectFlash(p.value); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(!hasFlash){ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&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><span class="comment">//Add&nbsp;the&nbsp;objects&nbsp;id&nbsp;to&nbsp;the&nbsp;list&nbsp;(create&nbsp;a&nbsp;new&nbsp;id&nbsp;if&nbsp;there's&nbsp;isn't&nbsp;one&nbsp;already) </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;o.id&nbsp;=&nbsp;(o.id&nbsp;==&nbsp;</span><span class="string">&quot;&quot;</span><span>)&nbsp;?&nbsp;(</span><span class="string">&quot;stripFlash&quot;</span><span>+i)&nbsp;:&nbsp;o.id; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stripQueue.push(o.id); &nbsp;&nbsp;</span></li>
    <li class=""><span>&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><span class="keyword">break</span><span>; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;params&nbsp;+=&nbsp;p.outerHTML;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(!hasFlash){ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">continue</span><span>; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//Only&nbsp;target&nbsp;internet&nbsp;explorer </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(!oswap){ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">continue</span><span>; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//Avoid&nbsp;specified&nbsp;objects,&nbsp;marked&nbsp;with&nbsp;a&nbsp;&quot;noswap&quot;&nbsp;classname </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(o.className.toLowerCase().indexOf&nbsp;(</span><span class="string">&quot;noswap&quot;</span><span>)&nbsp;!=&nbsp;-1){ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">continue</span><span>; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//Get&nbsp;the&nbsp;tag&nbsp;and&nbsp;attributes&nbsp;part&nbsp;of&nbsp;the&nbsp;outer&nbsp;html&nbsp;of&nbsp;the&nbsp;object </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">var</span><span>&nbsp;tag&nbsp;=&nbsp;h.split(</span><span class="string">&quot;&gt;&quot;</span><span>)[0]&nbsp;+&nbsp;</span><span class="string">&quot;&gt;&quot;</span><span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//Add&nbsp;up&nbsp;the&nbsp;various&nbsp;bits&nbsp;that&nbsp;comprise&nbsp;the&nbsp;object: </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//The&nbsp;tag&nbsp;with&nbsp;the&nbsp;attributes,&nbsp;the&nbsp;params&nbsp;and&nbsp;it's&nbsp;inner&nbsp;html </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">var</span><span>&nbsp;newObject&nbsp;=&nbsp;tag&nbsp;+&nbsp;params&nbsp;+&nbsp;o.innerHTML&nbsp;+&nbsp;</span><span class="string">&quot;&nbsp;&lt;/OBJECT&gt;&quot;</span><span>;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//And&nbsp;rewrite&nbsp;the&nbsp;outer&nbsp;html&nbsp;of&nbsp;the&nbsp;tag&nbsp; </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;o.outerHTML&nbsp;=&nbsp;newObject; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//Strip&nbsp;flash&nbsp;objects </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(stripQueue.length)&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stripFlash(stripQueue) &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//Make&nbsp;the&nbsp;objects&nbsp;visible&nbsp;again </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(oswap){ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;document.getElementById(</span><span class="string">&quot;hideObject&quot;</span><span>).disabled&nbsp;=&nbsp;</span><span class="keyword">true</span><span>; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>detectFlash&nbsp;=&nbsp;</span><span class="keyword">function</span><span>(version){ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(navigator.plugins&nbsp;&amp;&amp;&nbsp;navigator.plugins.length){ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//Non-IE&nbsp;flash&nbsp;detection. </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">var</span><span>&nbsp;plugin&nbsp;=&nbsp;navigator.plugins[</span><span class="string">&quot;Shockwave&nbsp;Flash&quot;</span><span>]; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(plugin&nbsp;==&nbsp;undefined){ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">false</span><span>; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">var</span><span>&nbsp;ver&nbsp;=&nbsp;navigator.plugins[</span><span class="string">&quot;Shockwave&nbsp;Flash&quot;</span><span>].description.split(</span><span class="string">&quot;&nbsp;&quot;</span><span>)[2]; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;(Number(ver)&nbsp;&gt;=&nbsp;Number(version)) &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">else</span><span>&nbsp;</span><span class="keyword">if</span><span>&nbsp;(ie&nbsp;&amp;&amp;&nbsp;</span><span class="keyword">typeof</span><span>&nbsp;(ActiveXObject)&nbsp;==&nbsp;</span><span class="string">&quot;function&quot;</span><span>){ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//IE&nbsp;flash&nbsp;detection. </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</span><span>{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">var</span><span>&nbsp;flash&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;ActiveXObject(</span><span class="string">&quot;ShockwaveFlash.ShockwaveFlash.&quot;</span><span>&nbsp;+&nbsp;version); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">true</span><span>; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">catch</span><span>(e){ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">false</span><span>; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//Catchall&nbsp;-&nbsp;skip&nbsp;detection </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">true</span><span>; &nbsp;&nbsp;</span></li>
    <li class=""><span>} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="comment">//Loop&nbsp;through&nbsp;an&nbsp;array&nbsp;of&nbsp;ids&nbsp;to&nbsp;strip </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="comment">//Replace&nbsp;the&nbsp;object&nbsp;by&nbsp;a&nbsp;div&nbsp;tag&nbsp;containing&nbsp;the&nbsp;same&nbsp;innerHTML. </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="comment">//To&nbsp;display&nbsp;an&nbsp;alternative&nbsp;image,&nbsp;message&nbsp;for&nbsp;the&nbsp;user&nbsp;or&nbsp;a&nbsp;link&nbsp;to&nbsp;the&nbsp;flash&nbsp;installation&nbsp;page,&nbsp;place&nbsp;it&nbsp;inside&nbsp;the&nbsp;object&nbsp;tag.&nbsp;&nbsp; </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="comment">//For&nbsp;the&nbsp;usual&nbsp;object/embed&nbsp;pairs&nbsp;it&nbsp;needs&nbsp;to&nbsp;be&nbsp;enclosed&nbsp;in&nbsp;comments&nbsp;to&nbsp;hide&nbsp;from&nbsp;gecko&nbsp;based&nbsp;browsers. </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>stripFlash&nbsp;=&nbsp;</span><span class="keyword">function</span><span>&nbsp;(stripQueue){ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(!document.createElement){ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>&nbsp;(</span><span class="keyword">var</span><span>&nbsp;i=0;&nbsp;i&lt;stripQueue.length;&nbsp;i++){ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">var</span><span>&nbsp;o&nbsp;=&nbsp;document.getElementById(stripQueue[i]); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">var</span><span>&nbsp;newHTML&nbsp;=&nbsp;o.innerHTML;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//Strip&nbsp;the&nbsp;comments </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;newHTML&nbsp;=&nbsp;newHTML.replace(/&lt;!--\s/g,&nbsp;</span><span class="string">&quot;&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;newHTML&nbsp;=&nbsp;newHTML.replace(/\s--&gt;/g,&nbsp;</span><span class="string">&quot;&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//Neutralise&nbsp;the&nbsp;embed&nbsp;tag </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;newHTML&nbsp;=&nbsp;newHTML.replace(/&lt;embed/gi,&nbsp;</span><span class="string">&quot;&lt;span&quot;</span><span>);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//Create&nbsp;a&nbsp;new&nbsp;div&nbsp;element&nbsp;with&nbsp;properties&nbsp;from&nbsp;the&nbsp;object </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">var</span><span>&nbsp;d&nbsp;=&nbsp;document.createElement(</span><span class="string">&quot;div&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d.innerHTML&nbsp;=&nbsp;newHTML; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d.className&nbsp;=&nbsp;o.className; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d.id&nbsp;=&nbsp;o.id; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//And&nbsp;swap&nbsp;the&nbsp;object&nbsp;with&nbsp;the&nbsp;new&nbsp;div </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;o.parentNode.replaceChild(d,&nbsp;o); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="comment">//Initiate&nbsp;the&nbsp;function&nbsp;without&nbsp;conflicting&nbsp;with&nbsp;the&nbsp;window.onload&nbsp;event&nbsp;of&nbsp;any&nbsp;preceding&nbsp;scripts </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="keyword">var</span><span>&nbsp;tempFunc&nbsp;=&nbsp;window.onload; &nbsp;&nbsp;</span></li>
    <li class=""><span>window.onload&nbsp;=&nbsp;</span><span class="keyword">function</span><span>(){ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(</span><span class="keyword">typeof</span><span>&nbsp;(tempFunc)&nbsp;==&nbsp;</span><span class="string">&quot;function&quot;</span><span>){ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</span><span>{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tempFunc(); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">catch</span><span>(e){} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;objectSwap(); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
</ol>
</div>
          <br/>
          <span style="color:red;">
            <a href="http://qqqckm.javaeye.com/blog/49375#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 23 Jan 2007 10:55:07 +0800</pubDate>
        <link>http://qqqckm.javaeye.com/blog/49375</link>
        <guid>http://qqqckm.javaeye.com/blog/49375</guid>
      </item>
      <item>
        <title>用ServletJSP动态生成图像验证码（转载） </title>
        <author>qqqckm</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://qqqckm.javaeye.com">qqqckm</a>&nbsp;
          链接：<a href="http://qqqckm.javaeye.com/blog/41342" style="color:red;">http://qqqckm.javaeye.com/blog/41342</a>&nbsp;
          发表时间: 2006年12月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
           现在有不少网站在用户填写表单时，同时要求填写验证码，验证码的一个目的就是防范一些恶意的网站下载软件，这些软件能通过遍历链接而将网站的所有网页下载。还可以防止用户不经过本网站的页面而使用网站的资源。所以现在有不少网站都使用了验证码技术，验证码通常是一个在WEB服务器上生成的随机字符串，同时以某种方式保存起来，比如保存到与当前的Session中，然后在用户提交网页时与用户输入的验证比较是否一致，然而如果直接以明文的方式，还是不能防范一些功能较强的自动填写表格的软件。所以一般将验证码以图片的形式显示出来，同时可以将在图片中显示的字符串进行一些处理，比如使用旋转字符，添加背景纹理等技术以增大被软件识别的难度。下面简要介绍一下如果实现这种验证码：<br /><br />首先实现一个servlet用来生成图片（当然也可以用jsp实现）：<br /><br /><p></p><table class="ubb_code" cellspacing="1" border="0" width="90%" cellpadding="0"><tbody><tr><td>import javax.servlet.*;<br /><br />import javax.servlet.http.*;<br /><br />import java.io.*;<br /><br />import java.util.*;<br /><br />import com.sun.image.codec.jpeg.*;<br /><br />import java.awt.*;<br /><br />import com.sun.image.codec.jpeg.*;<br /><br />import java.awt.image.BufferedImage;<br /><br />import java.awt.image.DataBuffer;<br /><br />import java.awt.geom.GeneralPath;<br /><br />import javax.swing.*;<br /><br />import java.math.*;<br /><br />public class Servlet1<br /><br />extends HttpServlet {<br /><br />//Process the HTTP Get request<br /><br />public void doGet(HttpServletRequest request, HttpServletResponse response) throws<br /><br />ServletException, IOException {<br /><br />response.setContentType(CONTENT_TYPE);<br /><br />response.setContentType("image/jpeg"); //必须设置ContentType为image/jpeg<br /><br />int length = 4; //设置默认生成4个数字<br /><br />Date d = new Date();<br /><br />long lseed = d.getTime();<br /><br />java.util.Random r = new Random(lseed); //设置随机种子<br /><br />if (request.getParameter("length") != null) {<br /><br />try {<br /><br />length = Integer.parseInt(request.getParameter("length"));<br /><br />}<br /><br />catch (NumberFormatException e) {<br /><br />}<br /><br />}<br /><br />StringBuffer str = new StringBuffer();<br /><br />for (int i = 0; i &lt;length; i++) {<br /><br />str.append(r.nextInt(9)); //生成随机数字<br /><br />}<br /><br />//可以在此加入保存验证码的代码<br /><br />//创建内存图像<br /><br />BufferedImage bi = new BufferedImage(40, 16, BufferedImage.TYPE_INT_RGB);<br /><br />Graphics2D g = bi.createGraphics();<br /><br />g.clearRect(0, 0, 16, 40);<br /><br />g.setColor(Color.green.CYAN);<br /><br />g.drawString(str.toString(), 4, 12);<br /><br />try {<br /><br />//使用JPEG编码，输出到response的输出流<br /><br />JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(response.<br /><br />getOutputStream());<br /><br />JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(bi);<br /><br />param.setQuality(1.0f, false);<br /><br />encoder.setJPEGEncodeParam(param);<br /><br />encoder.encode(bi);<br /><br />}<br /><br />catch (Exception ex) {<br /><br /><br /><br />}<br /><br />} <br /><br />}</td></tr></tbody></table><p><br /><br />然后在需求显示验证码的加入以下代码就可以了<br /><br /></p><p></p><table class="ubb_code" cellspacing="1" border="0" width="90%" cellpadding="0"><tbody><tr><td>&lt;img alt="" src="/WebModule1/servlet1" width="40" height="16"/&gt;</td></tr></tbody></table><p><br /><br />将/WebModule1/servlet1替换成你用来生成验证码的servlet的全路径。<br /></p>
          <br/>
          <span style="color:red;">
            <a href="http://qqqckm.javaeye.com/blog/41342#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 16 Dec 2006 09:11:00 +0800</pubDate>
        <link>http://qqqckm.javaeye.com/blog/41342</link>
        <guid>http://qqqckm.javaeye.com/blog/41342</guid>
      </item>
      <item>
        <title>JAVA程序员面试32问(附答案)（转载） </title>
        <author>qqqckm</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://qqqckm.javaeye.com">qqqckm</a>&nbsp;
          链接：<a href="http://qqqckm.javaeye.com/blog/41343" style="color:red;">http://qqqckm.javaeye.com/blog/41343</a>&nbsp;
          发表时间: 2006年12月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          
		<p>第一，谈谈final, finally, finalize的区别。 <br />　　<br />　　第二，Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类，是否可以implements(实现)interface(接口)?<br />　　<br />　　第三，Static Nested Class 和 Inner Class的不同，说得越多越好(面试题有的很笼统)。<br />　　<br />　　第四，&amp;和&amp;&amp;的区别。<br />　　<br />　　第五，HashMap和Hashtable的区别。<br />　　<br />　　第六，Collection 和 Collections的区别。<br />　　<br />　　第七，什么时候用assert。<br />　　<br />　　第八，GC是什么? 为什么要有GC? <br />　　<br />　　第九，String s = new String("xyz");创建了几个String Object?<br />　　<br />　　第十，Math.round(11.5)等於多少? Math.round(-11.5)等於多少?<br />　　<br />　　第十一，short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?<br />　　<br />　　第十二，sleep() 和 wait() 有什么区别?<br />　　<br />　　第十三，Java有没有goto?<br />　　<br />　　第十四，数组有没有length()这个方法? String有没有length()这个方法?<br />　　<br />　　第十五，Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?<br />　　<br />　　第十六，Set里的元素是不能重复的，那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?<br />　　<br />　　第十七，给我一个你最常见到的runtime exception。<br />　　<br />　　第十八，error和exception有什么区别?<br />　　<br />　　第十九，List, Set, Map是否继承自Collection接口?<br />　　<br />　　第二十，abstract class和interface有什么区别?<br />　　<br />　　第二十一，abstract的method是否可同时是static,是否可同时是native，是否可同时是synchronized?<br />　　<br />　　第二十二，接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)?<br />　　<br />　　第二十三，启动一个线程是用run()还是start()?<br />　　<br />　　第二十四，构造器Constructor是否可被override?<br />　　<br />　　第二十五，是否可以继承String类?<br />　　<br />　　第二十六，当一个线程进入一个对象的一个synchronized方法后，其它线程是否可进入此对象的其它方法?<br />　　<br />　　第二十七，try {}里有一个return语句，那么紧跟在这个try后的finally {}里的code会不会被执行，什么时候被执行，在return前还是后?<br />　　<br />　　第二十八，编程题: 用最有效率的方法算出2乘以8等於几?<br />　　<br />　　第二十九，两个对象值相同(x.equals(y) == true)，但却可有不同的hash code，这句话对不对?<br />　　<br />　　第三十，当一个对象被当作参数传递到一个方法后，此方法可改变这个对象的属性，并可返回变化后的结果，那么这里到底是值传递还是引用传递?<br />　　<br />　　第三十一，swtich是否能作用在byte上，是否能作用在long上，是否能作用在String上?<br />　　<br />　　第三十二，编程题: 写一个Singleton出来。</p>
		<p>
		</p>
		<p>＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝</p>
		<p>以下是答案：</p>
		<p>＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝</p>
		<p>第一，谈谈final, finally, finalize的区别。<br />　　final—修饰符（关键字）如果一个类被声明为final，意味着它不能再派生出新的子类，不能作为父类被继承。因此一个类不能既被声明为 abstract的，又被声明为final的。将变量或方法声明为final，可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给定初值，而在以后的引用中只能读取，不可修改。被声明为final的方法也同样只能使用，不能重载<br />　　finally—再异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常，那么相匹配的 catch 子句就会执行，然后控制就会进入 finally 块（如果有的话）。<br />　　finalize—方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的，因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。<br />　　<br />　　第二，Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类，是否可以implements(实现)interface(接口)?<br />　　匿名的内部类是没有名字的内部类。不能extends(继承) 其它类，但一个内部类可以作为一个接口，由另一个内部类实现。<br />　　<br />　　第三，Static Nested Class 和 Inner Class的不同，说得越多越好(面试题有的很笼统)。<br />　　Nested Class （一般是C++的说法），Inner Class (一般是JAVA的说法)。Java内部类与C++嵌套类最大的不同就在于是否有指向外部的引用上。具体可见http: //www.frontfree.net/articles/services/view.asp?id=704&amp;page=1<br />　　注： 静态内部类（Inner Class）意味着1创建一个static内部类的对象，不需要一个外部类对象，2不能从一个static内部类的一个对象访问一个外部类对象<br />　　Hashtable继承自Dictionary类，而HashMap是Java1.2引进的Map interface的一个实现 </p>
		<p>　　HashMap允许将null作为一个entry的key或者value，而Hashtable不允许 </p>
		<p>　　还有就是，HashMap把Hashtable的contains方法去掉了，改成containsvalue和containsKey。因为contains方法容易让人引起误解。 </p>
		<p>　　最大的不同是，Hashtable的方法是Synchronize的，而HashMap不是，在 <br />多个线程访问Hashtable时，不需要自己为它的方法实现同步，而HashMap <br />就必须为之提供外同步。<br />　　第四，&amp;和&amp;&amp;的区别。<br />　　&amp;是位运算符。&amp;&amp;是布尔逻辑运算符。<br />　　<br />　　第五，HashMap和Hashtable的区别。<br />　　都属于Map接口的类，实现了将惟一键映射到特定的值上。<br />　　HashMap 类没有分类或者排序。它允许一个 null 键和多个 null 值。 <br />　　Hashtable 类似于 HashMap，但是不允许 null 键和 null 值。它也比 HashMap 慢，因为它是同步的。<br />　　Hashtable继承自Dictionary类，而HashMap是Java1.2引进的Map interface的一个实现 </p>
		<p>　　还有就是，HashMap把Hashtable的contains方法去掉了，改成containsvalue和containsKey。因为contains方法容易让人引起误解。 </p>
		<p>　　最大的不同是，Hashtable的方法是Synchronize的，而HashMap不是，在 <br />多个线程访问Hashtable时，不需要自己为它的方法实现同步，而HashMap <br />就必须为之提供外同步。 </p>
		<p>　　第六，Collection 和 Collections的区别。<br />　　Collections是个java.util下的类，它包含有各种有关集合操作的静态方法。<br />　　Collection是个java.util下的接口，它是各种集合结构的父接口.<br />　　第七，什么时候用assert。<br />　　断言是一个包含布尔表达式的语句，在执行这个语句时假定该表达式为 true。如果表达式计算为 false，那么系统会报告一个 Asserti<i>onError</i>。它用于调试目的： <br />　　assert(a &gt; 0); // throws an Asserti<i>onError</i> if a &lt;= 0 <br />　　断言可以有两种形式： <br />　　assert Expression1 ; <br />　　assert Expression1 : Expression2 ; <br />　　Expression1 应该总是产生一个布尔值。 <br />　　Expression2 可以是得出一个值的任意表达式。这个值用于生成显示更多调试信息的 String 消息。<br />　　断言在默认情况下是禁用的。要在编译时启用断言，需要使用 source 1.4 标记： <br />　　javac -source 1.4 Test.java<br />　　要在运行时启用断言，可使用 -enableassertions 或者 -ea 标记。 <br />　　要在运行时选择禁用断言，可使用 -da 或者 -disableassertions 标记。 <br />　　要系统类中启用断言，可使用 -esa 或者 -dsa 标记。还可以在包的基础上启用或者禁用断言。 <br />　　可以在预计正常情况下不会到达的任何位置上放置断言。断言可以用于验证传递给私有方法的参数。不过，断言不应该用于验证传递给公有方法的参数，因为不管是否启用了断言，公有方法都必须检查其参数。不过，既可以在公有方法中，也可以在非公有方法中利用断言测试后置条件。另外，断言不应该以任何方式改变程序的状态。 <br />　　<br />　　<br />　　第八，GC是什么? 为什么要有GC? (基础)。<br />　　GC是垃圾收集器。Java 程序员不用担心内存管理，因为垃圾收集器会自动进行管理。要请求垃圾收集，可以调用下面的方法之一： <br />　　System.gc()<br />　　Runtime.getRuntime().gc()<br />　　<br />　　第九，String s = new String("xyz");创建了几个String Object?<br />　　两个对象，一个是“xyx”,一个是指向“xyx”的引用对象s。<br />　　<br />　　第十，Math.round(11.5)等於多少? Math.round(-11.5)等於多少?<br />　　Math.round(11.5)返回（long）12，Math.round(-11.5)返回（long）-11;<br />　　<br />　　第十一，short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?<br />　　short s1 = 1; s1 = s1 + 1;有错，s1是short型，s1+1是int型,不能显式转化为short型。可修改为s1 =(short)(s1 + 1) 。short s1 = 1; s1 += 1正确。<br />　　<br />　　第十二，sleep() 和 wait() 有什么区别? 搞线程的最爱<br />　　sleep()方法是使线程停止一段时间的方法。在sleep 时间间隔期满后，线程不一定立即恢复执行。这是因为在那个时刻，其它线程可能正在运行而且没有被调度为放弃执行，除非(a)“醒来”的线程具有更高的优先级<br />　　(b)正在运行的线程因为其它原因而阻塞。<br />　　wait()是线程交互时，如果线程对一个同步对象x 发出一个wait()调用，该线程会暂停执行，被调对象进入等待状态，直到被唤醒或等待时间到。<br />　　第十三，Java有没有goto?<br />　　Goto—java中的保留字，现在没有在java中使用。<br />　　<br />　　第十四，数组有没有length()这个方法? String有没有length()这个方法？<br />　　数组没有length()这个方法，有length的属性。<br />　　String有有length()这个方法。<br />　　<br />　　第十五，Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?<br />　　方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现，重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数，我们说该方法被重写 (Overriding)。子类的对象使用这个方法时，将调用子类中的定义，对它而言，父类中的定义如同被“屏蔽”了。如果在一个类中定义了多个同名的方法，它们或有不同的参数个数或有不同的参数类型，则称为方法的重载(Overloading)。Overloaded的方法是可以改变返回值的类型。<br />　　<br />　　第十六，Set里的元素是不能重复的，那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?<br />　　Set里的元素是不能重复的，那么用iterator()方法来区分重复与否。equals()是判读两个Set是否相等。<br />　　equals()和==方法决定引用值是否指向同一对象equals()在类中被覆盖，为的是当两个分离的对象的内容和类型相配的话，返回真值。<br />　　<br />　　第十七，给我一个你最常见到的runtime exception。<br />　　ArithmeticException, ArrayStoreException, BufferOverflowException, BufferUnderflowException, CannotRedoException, CannotUndoException, ClassCastException, CMMException, ConcurrentModificationException, DOMException, EmptyStackException, IllegalArgumentException, IllegalMonitorStateException, IllegalPathStateException, IllegalStateException, <br />　　ImagingOpException, IndexOutOfBoundsException, MissingResourceException, NegativeArraySizeException, NoSuchElementException, NullPointerException, ProfileDataException, ProviderException, RasterFormatException, SecurityException, SystemException, UndeclaredThrowableException, UnmodifiableSetException, UnsupportedOperationException<br />　　<br />　　第十八，error和exception有什么区别?<br />　　error 表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况。<br />　　exception 表示一种设计或实现问题。也就是说，它表示如果程序运行正常，从不会发生的情况。<br />　　第十九，List, Set, Map是否继承自Collection接口?<br />　　List，Set是<br />　　<br />　　Map不是<br />　　<br />　　第二十，abstract class和interface有什么区别?<br />　　声明方法的存在而不去实现它的类被叫做抽象类（abstract class），它用于要创建一个体现某些基本行为的类，并为该类声明方法，但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量，其类型是一个抽象类，并让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。Abstract 类的子类为它们父类中的所有抽象方法提供实现，否则它们也是抽象类为。取而代之，在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。<br />　　接口（interface）是抽象类的变体。在接口中，所有方法都是抽象的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽象的，没有一个有程序体。接口只可以定义static final成员变量。接口的实现与子类相似，除了该实现类不能从接口定义中继承行为。当类实现特殊接口时，它定义（即将程序体给予）所有这种接口的方法。然后，它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类，它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换，instanceof 运算符可以用来决定某对象的类是否实现了接口。<br />　　<br />　　第二十一，abstract的method是否可同时是static,是否可同时是native，是否可同时是synchronized?<br />　　都不能<br />　　<br />　　第二十二，接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)?<br />　　接口可以继承接口。抽象类可以实现(implements)接口，抽象类是否可继承实体类，但前提是实体类必须有明确的构造函数。<br />　　<br />　　第二十三，启动一个线程是用run()还是start()?<br />　　启动一个线程是调用start()方法，使线程所代表的虚拟处理机处于可运行状态，这意味着它可以由JVM调度并执行。这并不意味着线程就会立即运行。run()方法可以产生必须退出的标志来停止一个线程。<br />　　第二十四，构造器Constructor是否可被override?<br />　　构造器Constructor不能被继承，因此不能重写Overriding，但可以被重载Overloading。<br />　　<br />　　第二十五，是否可以继承String类?<br />　　String类是final类故不可以继承。<br />　　<br />　　第二十六，当一个线程进入一个对象的一个synchronized方法后，其它线程是否可进入此对象的其它方法?<br />　　不能，一个对象的一个synchronized方法只能由一个线程访问。<br />　　<br />　　第二十七，try {}里有一个return语句，那么紧跟在这个try后的finally {}里的code会不会被执行，什么时候被执行，在return前还是后?<br />　　会执行，在return前执行。<br />　　<br />　　<br />　　第二十八，编程题: 用最有效率的方法算出2乘以8等於几?<br />　　有C背景的程序员特别喜欢问这种问题。<br />　　<br />　　2 &lt;&lt; 3<br />　　<br />　　第二十九，两个对象值相同(x.equals(y) == true)，但却可有不同的hash code，这句话对不对?<br />　　不对，有相同的hash code。<br />　　<br />　　第三十，当一个对象被当作参数传递到一个方法后，此方法可改变这个对象的属性，并可返回变化后的结果，那么这里到底是值传递还是引用传递? <br />　　是值传递。Java 编程语言只由值传递参数。当一个对象实例作为一个参数被传递到方法中时，参数的值就是对该对象的引用。对象的内容可以在被调用的方法中改变，但对象的引用是永远不会改变的。<br />　　<br />　　<br />　　第三十一，swtich是否能作用在byte上，是否能作用在long上，是否能作用在String上?<br />　　switch（expr1）中，expr1是一个整数表达式。因此传递给 switch 和 case 语句的参数应该是 int、 short、 char 或者 byte。long,string 都不能作用于swtich。<br />　　第三十二，编程题: 写一个Singleton出来。<br />　　Singleton模式主要作用是保证在Java应用程序中，一个类Class只有一个实例存在。<br />　　一般Singleton模式通常有几种种形式:<br />　　第一种形式: 定义一个类，它的构造函数为private的，它有一个static的private的该类变量，在类初始化时实例话，通过一个public的getInstance方法获取对它的引用,继而调用其中的方法。<br />　　public class Singleton {<br />　　private Singleton(){}<br />　　//在自己内部定义自己一个实例，是不是很奇怪？<br />　　//注意这是private 只供内部调用<br />　　private static Singleton instance = new Singleton();<br />　　//这里提供了一个供外部访问本class的静态方法，可以直接访问 <br />　　public static Singleton getInstance() {<br />　　return instance; <br />　　} <br />　　} <br />　　第二种形式: <br />　　public class Singleton { <br />　　private static Singleton instance = null;<br />　　public static synchronized Singleton getInstance() {<br />　　//这个方法比上面有所改进，不用每次都进行生成对象，只是第一次 <br />　　//使用时生成实例，提高了效率！<br />　　if (instance==null)<br />　　instance＝new Singleton();<br />　　return instance; } <br />　　} <br />　　其他形式:<br />　　定义一个类，它的构造函数为private的，所有方法为static的。<br />　　一般认为第一种形式要更加安全 <br />＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝</p>
		<p>以下是PCOnline的网友评论：<a href="http://cmt.pconline.com.cn/topic.jsp?id=115964&amp;reverse=1"><font color="#000080">http://cmt.pconline.com.cn/topic.jsp?id=115964&amp;reverse=1</font></a></p>
		<p>
		</p>
		<table cellspacing="0" border="0" align="center" width="760" cellpadding="0">
				<tbody>
						<tr>
								<td>
										<table cellspacing="0" border="0" bgcolor="#efefef" width="760" cellpadding="4" style="BORDER-TOP: #cccccc 1px solid; BORDER-BOTTOM: #cccccc 1px solid">
												<tbody>
														<tr>
																<td align="right" width="26">
																		<font color="#000080">
																				<img src="http://www.pconline.com.cn/images/comment/team2.gif" height="20" alt="" width="20" />
																		</font>
																</td>
																<td width="100%">
																		<b>
																				<font color="#ff0000">
																						<a name="16" id="16">
																						</a>16</font>
																		</b>
																		<font color="#000000">楼</font>
																		<font color="#008000">匿名</font> 发表于：2005-01-06 11:47:56 </td>
																<td nowrap="" align="right">
																		<a href="http://cmt.pconline.com.cn/回复" onclick="fmComment.content.focus(); fmComment.content.value='回复 16 楼(匿名)： '; fmComment.content.onchange(); return false">
																				<img src="http://www.pconline.com.cn/images/comment/reply_a.gif" border="0" height="18" alt="回复此贴" width="45" />
																		</a>
																		<a href="javascript:vote(987911,1)" title="支持一下">
																				<img src="http://www.pconline.com.cn/images/comment/1+.gif" border="0" height="20" alt="" width="20" />
																		</a>
																		<span id="support987911">
																				<font size="2">0</font>
																		</span>
																		<a href="javascript:vote(987911,-1)" title="反对！">
																				<img src="http://www.pconline.com.cn/images/comment/1-.gif" border="0" height="20" alt="" width="20" />
																		</a>
																		<span id="oppose987911">
																				<font size="2">0</font>
																		</span>
																</td>
														</tr>
												</tbody>
										</table>
										<table cellspacing="0" border="0" width="760" cellpadding="4">
												<tbody>
														<tr>
																<td bgcolor="#ffffff" width="28"> </td>
																<td class="sfont" bgcolor="#ffffff" width="716" style="WORD-BREAK: break-all; WORD-WRAP: break-word">以下答案有问题:  <br />"第二十六，当一个线程进入一个对象的一个synchronized方法后，其它线程是否可进入此对象的其它方法? <br />不能，一个对象的一个synchronized方法只能由一个线程访问。" <br />如果另一个方法没有实现synchronized则可以被其他线程访问. <br /><br /><br /></td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<table cellspacing="0" border="0" align="center" width="760" cellpadding="0">
				<tbody>
						<tr>
								<td>
										<table cellspacing="0" border="0" bgcolor="#efefef" width="760" cellpadding="4" style="BORDER-TOP: #cccccc 1px solid; BORDER-BOTTOM: #cccccc 1px solid">
												<tbody>
														<tr>
																<td align="right" width="26">
																		<img src="http://www.pconline.com.cn/images/comment/team2.gif" height="20" alt="" width="20" />
																</td>
																<td width="100%">
																		<b>
																				<font color="#ff0000">
																						<a name="20" id="20">
																						</a>20</font>
																		</b>
																		<font color="#000000">楼</font>
																		<font color="#008000">?</font> 发表于：2005-01-10 21:06:23 </td>
																<td nowrap="" align="right">
																		<a href="http://cmt.pconline.com.cn/回复" onclick="fmComment.content.focus(); fmComment.content.value='回复 20 楼(?)： '; fmComment.content.onchange(); return false">
																				<img src="http://www.pconline.com.cn/images/comment/reply_a.gif" border="0" height="18" alt="回复此贴" width="45" />
																		</a>
																		<a href="javascript:vote(10007736,1)" title="支持一下">
																				<img src="http://www.pconline.com.cn/images/comment/1+.gif" border="0" height="20" alt="" width="20" />
																		</a>
																		<span id="support10007736">
																				<font size="2">1</font>
																		</span>
																		<a href="javascript:vote(10007736,-1)" title="反对！">
																				<img src="http://www.pconline.com.cn/images/comment/1-.gif" border="0" height="20" alt="" width="20" />
																		</a>
																		<span id="oppose10007736">
																				<font size="2">0</font>
																		</span>
																</td>
														</tr>
												</tbody>
										</table>
										<table cellspacing="0" border="0" width="760" cellpadding="4">
												<tbody>
														<tr>
																<td bgcolor="#ffffff" width="28"> </td>
																<td class="sfont" bgcolor="#ffffff" width="716" style="WORD-BREAK: break-all; WORD-WRAP: break-word">计算 2 * 8 最快的方法显然是 return 16;</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<table cellspacing="0" border="0" align="center" width="760" cellpadding="0">
				<tbody>
						<tr>
								<td>
										<table cellspacing="0" border="0" bgcolor="#efefef" width="760" cellpadding="4" style="BORDER-TOP: #cccccc 1px solid; BORDER-BOTTOM: #cccccc 1px solid">
												<tbody>
														<tr>
																<td align="right" width="26">
																		<img src="http://www.pconline.com.cn/images/comment/team2.gif" height="20" alt="" width="20" />
																</td>
																<td width="100%">
																		<b>
																				<font color="#ff0000">
																						<a name="21" id="21">
																						</a>21</font>
																		</b>
																		<font color="#000000">楼</font>
																		<font color="#008000">撒旦卢</font> 发表于：2005-01-13 10:46:01 <img src="http://www.pconline.com.cn/images/comment/031.gif" alt="" /></td>
																<td nowrap="" align="right">
																		<a href="http://cmt.pconline.com.cn/回复" onclick="fmComment.content.focus(); fmComment.content.value='回复 21 楼(撒旦卢)： '; fmComment.content.onchange(); return false">
																				<img src="http://www.pconline.com.cn/images/comment/reply_a.gif" border="0" height="18" alt="回复此贴" width="45" />
																		</a>
																		<a href="javascript:vote(10015248,1)" title="支持一下">
																				<img src="http://www.pconline.com.cn/images/comment/1+.gif" border="0" height="20" alt="" width="20" />
																		</a>
																		<span id="support10015248">
																				<font size="2">0</font>
																		</span>
																		<a href="javascript:vote(10015248,-1)" title="反对！">
																				<img src="http://www.pconline.com.cn/images/comment/1-.gif" border="0" height="20" alt="" width="20" />
																		</a>
																		<span id="oppose10015248">
																				<font size="2">0</font>
																		</span>
																</td>
														</tr>
												</tbody>
										</table>
										<table cellspacing="0" border="0" width="760" cellpadding="4">
												<tbody>
														<tr>
																<td bgcolor="#ffffff" width="28"> </td>
																<td class="sfont" bgcolor="#ffffff" width="716" style="WORD-BREAK: break-all; WORD-WRAP: break-word">    有没有好好研究过Java虚拟机规范呀？ <br />    我不用试就知道 2&lt;&lt;3的速度要比2×8速度慢。测试结果也是这样的。Java1.4 已经把乘除法优化了。</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<table cellspacing="0" border="0" align="center" width="760" cellpadding="0">
				<tbody>
						<tr>
								<td>
										<table cellspacing="0" border="0" bgcolor="#efefef" width="760" cellpadding="4" style="BORDER-TOP: #cccccc 1px solid; BORDER-BOTTOM: #cccccc 1px solid">
												<tbody>
														<tr>
																<td align="right" width="26">
																		<img src="http://www.pconline.com.cn/images/comment/team2.gif" height="20" alt="" width="20" />
																</td>
																<td width="100%">
																		<b>
																				<font color="#ff0000">
																						<a name="26" id="26">
																						</a>26</font>
																		</b>
																		<font color="#000000">楼</font>
																		<font color="#008000">wht</font> 发表于：2005-02-17 11:46:04 </td>
																<td nowrap="" align="right">
																		<a href="http://cmt.pconline.com.cn/回复" onclick="fmComment.content.focus(); fmComment.content.value='回复 26 楼(wht)： '; fmComment.content.onchange(); return false">
																				<img src="http://www.pconline.com.cn/images/comment/reply_a.gif" border="0" height="18" alt="回复此贴" width="45" />
																		</a>
																		<a href="javascript:vote(10217916,1)" title="支持一下">
																				<img src="http://www.pconline.com.cn/images/comment/1+.gif" border="0" height="20" alt="" width="20" />
																		</a>
																		<span id="support10217916">
																				<font size="2">0</font>
																		</span>
																		<a href="javascript:vote(10217916,-1)" title="反对！">
																				<img src="http://www.pconline.com.cn/images/comment/1-.gif" border="0" height="20" alt="" width="20" />
																		</a>
																		<span id="oppose10217916">
																				<font size="2">0</font>
																		</span>
																</td>
														</tr>
												</tbody>
										</table>
										<table cellspacing="0" border="0" width="760" cellpadding="4">
												<tbody>
														<tr>
																<td bgcolor="#ffffff" width="28"> </td>
																<td class="sfont" bgcolor="#ffffff" width="716" style="WORD-BREAK: break-all; WORD-WRAP: break-word">回复 21 楼(撒旦卢)：再怎么优化,+-运算都要变成移位和与或,这是由芯片决定得.</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<table cellspacing="0" border="0" align="center" width="760" cellpadding="0">
				<tbody>
						<tr>
								<td>
								</td>
						</tr>
				</tbody>
		</table>
		<table cellspacing="0" border="0" align="center" width="760" cellpadding="0">
				<tbody>
						<tr>
								<td>
										<table cellspacing="0" border="0" bgcolor="#efefef" width="760" cellpadding="4" style="BORDER-TOP: #cccccc 1px solid; BORDER-BOTTOM: #cccccc 1px solid">
												<tbody>
														<tr>
																<td align="right" width="26">
																		<img src="http://www.pconline.com.cn/images/comment/team2.gif" height="20" alt="" width="20" />
																</td>
																<td width="100%">
																		<b>
																				<font color="#ff0000">
																						<a name="28" id="28">
																						</a>28</font>
																		</b>
																		<font color="#000000">楼</font>
																		<font color="#008000">PracticalJava</font> 发表于：2005-03-05 14:32:50 </td>
																<td nowrap="" align="right">
																		<a href="http://cmt.pconline.com.cn/回复" onclick="fmComment.content.focus(); fmComment.content.value='回复 28 楼(PracticalJava)： '; fmComment.content.onchange(); return false">
																				<img src="http://www.pconline.com.cn/images/comment/reply_a.gif" border="0" height="18" alt="回复此贴" width="45" />
																		</a>
																		<a href="javascript:vote(10334495,1)" title="支持一下">
																				<img src="http://www.pconline.com.cn/images/comment/1+.gif" border="0" height="20" alt="" width="20" />
																		</a>
																		<span id="support10334495">
																				<font size="2">0</font>
																		</span>
																		<a href="javascript:vote(10334495,-1)" title="反对！">
																				<img src="http://www.pconline.com.cn/images/comment/1-.gif" border="0" height="20" alt="" width="20" />
																		</a>
																		<span id="oppose10334495">
																				<font size="2">0</font>
																		</span>
																</td>
														</tr>
												</tbody>
										</table>
										<table cellspacing="0" border="0" width="760" cellpadding="4">
												<tbody>
														<tr>
																<td bgcolor="#ffffff" width="28"> </td>
																<td class="sfont" bgcolor="#ffffff" width="716" style="WORD-BREAK: break-all; WORD-WRAP: break-word">对，22楼主说得对，第二十六题的确有问题，答案是错的。应该是能执行该对象的其他方法。因为synchornized只要获得的是不同对象作为的机锁，就可以运行一个被synchornized的方法。</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<table cellspacing="0" border="0" align="center" width="760" cellpadding="0">
				<tbody>
						<tr>
								<td>
										<table cellspacing="0" border="0" bgcolor="#efefef" width="760" cellpadding="4" style="BORDER-TOP: #cccccc 1px solid; BORDER-BOTTOM: #cccccc 1px solid">
												<tbody>
														<tr>
																<td align="right" width="26">
																		<img src="http://www.pconline.com.cn/images/comment/team2.gif" height="20" alt="" width="20" />
																</td>
																<td width="100%">
																		<b>
																				<font color="#ff0000">
																						<a name="30" id="30">
																						</a>30</font>
																		</b>
																		<font color="#000000">楼</font>
																		<font color="#008000">zhuzhou</font> 发表于：2005-03-10 15:35:44 </td>
																<td nowrap="" align="right">
																		<a href="http://cmt.pconline.com.cn/回复" onclick="fmComment.content.focus(); fmComment.content.value='回复 30 楼(zhuzhou)： '; fmComment.content.onchange(); return false">
																				<img src="http://www.pconline.com.cn/images/comment/reply_a.gif" border="0" height="18" alt="回复此贴" width="45" />
																		</a>
																		<a href="javascript:vote(10369431,1)" title="支持一下">
																				<img src="http://www.pconline.com.cn/images/comment/1+.gif" border="0" height="20" alt="" width="20" />
																		</a>
																		<span id="support10369431">
																				<font size="2">1</font>
																		</span>
																		<a href="javascript:vote(10369431,-1)" title="反对！">
																				<img src="http://www.pconline.com.cn/images/comment/1-.gif" border="0" height="20" alt="" width="20" />
																		</a>
																		<span id="oppose10369431">
																				<font size="2">0</font>
																		</span>
																</td>
														</tr>
												</tbody>
										</table>
										<table cellspacing="0" border="0" width="760" cellpadding="4">
												<tbody>
														<tr>
																<td bgcolor="#ffffff" width="28"> </td>
																<td class="sfont" bgcolor="#ffffff" width="716" style="WORD-BREAK: break-all; WORD-WRAP: break-word">测试代码如下: <br />        long t1 =0; <br />        long t2 =0; <br />        int k = 2; <br />        int m = 3; <br />        int n = 0; <br />        int max = 100000000; <br /><br />        t1 = new Date().getTime(); <br />        for(int i=0;i&lt;max;i++)  <br />            n = k^m; <br />        t2 = new Date().getTime(); <br />        System.out.println("采用乘方花了 "+(t2-t1)+" 秒"); <br />         <br />//        t1 = new Date().getTime(); <br />//        for(int i=0;i&lt;max;i++)  <br />//            n = k*k*k; <br />//        t2 = new Date().getTime(); <br />//        System.out.println("采用连乘花了 "+(t2-t1)+" 秒"); <br />         <br />//        t1 = new Date().getTime(); <br />//        for(int i=0;i&lt;max;i++)  <br />//            n = k&lt;&lt;m; <br />//        t2 = new Date().getTime(); <br />//        System.out.println("采用移位花了 "+(t2-t1)+" 秒"); <br /><br />测试的时候只开放其中一段代码 <br />结果如下: <br />乘方 移位 连乘 <br />1亿次 <br />机器甲 219 375 422 <br />机器甲 235 375 422 <br />机器甲 219 375 422 <br />机器甲 219 391 438 <br />机器甲 234 375 422 <br />1亿次 <br />机器乙 281 297 297 <br />机器乙 281 297 277 <br />机器乙 282 312 296 <br />机器乙 297 297 297 <br />机器乙 281 312 297 <br />机器乙 282 296 312 <br />10亿次 <br />机器乙 2796 3015 2985 <br />机器乙 2813 3079 2985 <br />机器乙 2812 3109 3062 <br />机器乙 2812 3016 3000 <br />机器乙 2812 3031 2985 <br /><br />好像移位不够快哦<br /><br /><span id="Anthem_Comments.ascx_ltlComments__"><span id="Comments.ascx_ltlComments"><br /><div id="comments"><h3></h3><div class="post"><div class="postTitle"><a href="http://blog.csdn.net/flyjimi/archive/2006/01/06/572038.aspx#251716" title="permalink: Lortab"><font color="#000080">#</font></a> <a name="251716"> </a>Buy Lortab 发表于2006-11-22 21:30:00  IP: 81.95.146.*</div><div class="postText">TrackBack来自<a href="http://lortab-lortab.tripod.com/lortab/"><font color="#000080">《Lortab》</font></a>：<br /><br />add bookmarks...</div></div><br /><div class="post"><div class="postTitle"><a href="http://blog.csdn.net/flyjimi/archive/2006/01/06/572038.aspx#410974" title="permalink: 回复：变态级JAVA程序员面试32问(附答案)（转载）"><font color="#000080">#</font></a> <a name="410974"> </a>fz 发表于2006-01-07 00:59:00  IP: 172.16.13.*</div><div class="postText">26题如果改成synchronise 整个object lock 不是一个方法的话答案就对了</div></div><br /><div class="post"><div class="postTitle"><a href="http://blog.csdn.net/flyjimi/archive/2006/01/06/572038.aspx#411047" title="permalink: 回复：变态级JAVA程序员面试32问(附答案)（转载）"><font color="#000080">#</font></a> <a name="411047"> </a>fxbird 发表于2006-01-07 10:08:00  IP: 221.201.179.*</div><div class="postText">出现了n回了，不要现发了</div></div><br /><div class="post"><div class="postTitle"><a href="http://blog.csdn.net/flyjimi/archive/2006/01/06/572038.aspx#411107" title="permalink: 回复：变态级JAVA程序员面试32问(附答案)（转载）"><font color="#000080">#</font></a> <a name="411107"> </a>noname 发表于2006-01-07 11:42:00  IP: 202.114.2.*</div><div class="postText">30楼楼主： <br />不要想当然好不好！你这样测试完全没有意义的。你的循环主体花的时间远远没有循环变量跟新和条件判断用的时间多。</div></div><br /><div class="post"><div class="postTitle"><a href="http://blog.csdn.net/flyjimi/archive/2006/01/06/572038.aspx#411119" title="permalink: 回复：变态级JAVA程序员面试32问(附答案)（转载）"><font color="#000080">#</font></a> <a name="411119"> </a>anonymous 发表于2006-01-07 16:24:00  IP: 10.130.13.*</div><div class="postText">只有文章题目称得上变态</div></div><br /><div class="post"><div class="postTitle"><a href="http://blog.csdn.net/flyjimi/archive/2006/01/06/572038.aspx#411182" title="permalink: 回复：变态级JAVA程序员面试32问(附答案)（转载）"><font color="#000080">#</font></a> <a name="411182"> </a>elwin_lee@hotmail.com 发表于2006-01-08 12:05:00  IP: 221.217.10.*</div><div class="postText">fz 概念错误 <br /><br />public void synchronized hello(){ <br /><br />} <br />等价于 <br />public void hello(){ <br />synchronized (this) { <br /><br />} <br />} <br />同步方法与同步对象并没有区别</div></div><br /><div class="post"><div class="postTitle"><a href="http://blog.csdn.net/flyjimi/archive/2006/01/06/572038.aspx#411251" title="permalink: 回复：变态级JAVA程序员面试32问(附答案)（转载）"><font color="#000080">#</font></a> <a name="411251"> </a>第2题好像也不对 发表于2006-01-07 19:06:00  IP: 221.219.175.*</div><div class="postText">public class A { <br /><br />public A() { <br />super(); <br />A a=new A(){ <br />@Override <br />public String toString() { <br />// TODO Auto-generated method stub <br />return super.toString(); <br />} <br />}; <br />} <br />} <br />这里的匿名内部类a 继承了A的方法，并override了 toString() </div></div><br /><div class="post"><div class="postTitle"><a href="http://blog.csdn.net/flyjimi/archive/2006/01/06/572038.aspx#411261" title="permalink: 回复：变态级JAVA程序员面试32问(附答案)（转载）"><font color="#000080">#</font></a> <a name="411261"> </a><a href="http://blog.csdn.net/zhengyun_ustc/" rel="nofollow" target="_blank"><font color="#000080">zhengyun_ustc</font></a> 发表于2006-01-08 18:59:00  IP: 61.49.113.*</div><div class="postText">比较正常和初级的面试问题而已</div></div><br /><div class="post"><div class="postTitle"><a href="http://blog.csdn.net/flyjimi/archive/2006/01/06/572038.aspx#411279" title="permalink: 回复：变态级JAVA程序员面试32问(附答案)（转载）"><font color="#000080">#</font></a> <a name="411279"> </a>fengw 发表于2006-01-08 19:58:00  IP: 219.238.119.*</div><div class="postText">晕，这篇文章没什么，但答案比较害人啊，看得时间要注意了，有些答案是错误的……</div></div><br /><div class="post"><div class="postTitle"><a href="http://blog.csdn.net/flyjimi/archive/2006/01/06/572038.aspx#411370" title="permalink: 回复：变态级JAVA程序员面试32问(附答案)（转载）"><font color="#000080">#</font></a> <a name="411370"> </a>kiki 发表于2006-01-08 16:30:00  IP: 202.120.224.*</div><div class="postText">这些问题一点也不变态</div></div><br /><div class="post"><div class="postTitle"><a href="http://blog.csdn.net/flyjimi/archive/2006/01/06/572038.aspx#411385" title="permalink: 回复：变态级JAVA程序员面试32问(附答案)（转载）"><font color="#000080">#</font></a> <a name="411385"> </a>寒风 发表于2006-01-09 11:46:00  IP: 210.22.158.*</div><div class="postText">第二十九，两个对象值相同(x.equals(y) == true)，但却可有不同的hash code，这句话对不对? <br />　　不对，有相同的hash code。 <br /><br />可以有不同的hash code啊, 看类的hashCode()的实现方法拉. 缺省的是用Object类的hashCode方法, 返回该对象的内存地址.</div></div><br /><div class="post"><div class="postTitle"><a href="http://blog.csdn.net/flyjimi/archive/2006/01/06/572038.aspx#411448" title="permalink: 回复：变态级JAVA程序员面试32问(附答案)（转载）"><font color="#000080">#</font></a> <a name="411448"> </a>乱说一起 发表于2006-01-09 15:09:00  IP: 210.21.228.*</div><div class="postText">这些都是蛮重要的东西了,怎么是变态呢!!!!!!!!!!!!</div></div><br /><div class="post"><div class="postTitle"><a href="http://blog.csdn.net/flyjimi/archive/2006/01/06/572038.aspx#411471" title="permalink: 回复：变态级JAVA程序员面试32问(附答案)（转载）"><font color="#000080">#</font></a> <a name="411471"> </a>wf 发表于2006-01-09 10:17:00  IP: 202.101.47.*</div><div class="postText">这些好像都是基础问题啊。。。。</div></div><br /><div class="post"><div class="postTitle"><a href="http://blog.csdn.net/flyjimi/archive/2006/01/06/572038.aspx#411491" title="permalink: 回复：变态级JAVA程序员面试32问(附答案)（转载）"><font color="#000080">#</font></a> <a name="411491"> </a><a href="http://blog.csdn.net/flyjimi/archive/2006/01/06/572038.aspx" rel="nofollow" target="_blank"><font color="#000080">误人啊</font></a> 发表于2006-01-09 13:32:00  IP: 61.152.132.*</div><div class="postText">好多答案是错误的</div></div><br /><div class="post"><div class="postTitle"><a href="http://blog.csdn.net/flyjimi/archive/2006/01/06/572038.aspx#411499" title="permalink: 回复：变态级JAVA程序员面试32问(附答案)（转载）"><font color="#000080">#</font></a> <a name="411499"> </a><a href="http://blog.csdn.net/zhaoqiubo/" rel="nofollow" target="_blank"><font color="#000080">赵小刀</font></a> 发表于2006-01-09 13:53:00  IP: 218.25.24.*</div><div class="postText">CSDN干吗总拿出N年前的东西呢？</div></div><br /><div class="post"><div class="postTitle"><a href="http://blog.csdn.net/flyjimi/archive/2006/01/06/572038.aspx#411842" title="permalink: 回复：JAVA程序员面试32问(附答案)（转载）"><font color="#000080">#</font></a> <a name="411842"> </a>flyjimi 发表于2006-01-11 12:49:00  IP: 221.237.182.*</div><div class="postText">语法细节跟常用的包，题目是网上的</div></div><br /></div></span></span><script language="javascript"><![CDATA[
ad_width=468;
ad_height=60;
adcss=2;
unionuser=19;
ad_type='j';
count=5; 
]]&gt;</script><script src="http://tagegg.csdn.net/showads.js" language="javascript" type="text/javascript"></script><script src="http://tagegg.csdn.net/a.aspx?action=displayad&amp;unionuser=19&amp;unionurl=http%3A%2F%2Fblog.csdn.net%2Fflyjimi%2Farchive%2F2006%2F01%2F06%2F572038.aspx&amp;adcss=2&amp;ad_type=j&amp;width=468&amp;height=60&amp;ad_color=&amp;ad_color_border=&amp;count=5" language="JavaScript1.1"></script><br /><br /><br /><br /></td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>

          <br/>
          <span style="color:red;">
            <a href="http://qqqckm.javaeye.com/blog/41343#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 14 Dec 2006 20:35:00 +0800</pubDate>
        <link>http://qqqckm.javaeye.com/blog/41343</link>
        <guid>http://qqqckm.javaeye.com/blog/41343</guid>
      </item>
      <item>
        <title>java中四种操作xml方式的比较(转载) </title>
        <author>qqqckm</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://qqqckm.javaeye.com">qqqckm</a>&nbsp;
          链接：<a href="http://qqqckm.javaeye.com/blog/41344" style="color:red;">http://qqqckm.javaeye.com/blog/41344</a>&nbsp;
          发表时间: 2006年12月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>1. 介绍</p>
<p>1）DOM(JAXP&nbsp;Crimson解析器) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DOM是用与平台和语言无关的方式表示<a href="http://dev.21tx.com/web/xml/" target="_blank"><font color="#3366cc">XML</font></a>文档的官方W3C标准。DOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构，然后才能做任何工作。由于它是基于信息层次的，因而DOM被认为是基于树或基于对象的。DOM以及广义的基于树的处理具有几个优点。首先，由于树在内存中是持久的，因此可以修改它以便应用程序能对数据和结构作出更改。它还可以在任何时候在树中上下导航，而不是像SAX那样是一次性的处理。DOM使用起来也要简单得多。</p>
<p>2）SAX</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SAX处理的优点非常类似于流媒体的优点。分析能够立即开始，而不是等待所有的数据被处理。而且，由于应用程序只是在读取数据时检查数据，因此不需要将数据存储在内存中。这对于大型文档来说是个巨大的优点。事实上，应用程序甚至不必解析整个文档；它可以在某个条件得到满足时停止解析。一般来说，SAX还比它的替代者DOM快许多。 <br />
&nbsp;　　选择DOM还是选择SAX？ 对于需要自己编写代码来处理XML文档的开发人员来说，&nbsp; 选择DOM还是SAX解析模型是一个非常重要的设计决策。 DOM采用建立树形结构的方式访问XML文档，而SAX采用的事件模型。 <br />
<br />
　　DOM解析器把XML文档转化为一个包含其内容的树，并可以对树进行遍历。用DOM解析模型的优点是编程容易，开发人员只需要调用建树的指令，然后利用navigation&nbsp;APIs访问所需的树节点来完成任务。可以很容易的添加和修改树中的元素。然而由于使用DOM解析器的时候需要处理整个XML文档，所以对性能和内存的要求比较高，尤其是遇到很大的XML文件的时候。由于它的遍历能力，DOM解析器常用于XML文档需要频繁的改变的服务中。 <br />
<br />
　　SAX解析器采用了基于事件的模型，它在解析XML文档的时候可以触发一系列的事件，当发现给定的tag的时候，它可以激活一个回调方法，告诉该方法制定的标签已经找到。SAX对内存的要求通常会比较低，因为它让开发人员自己来决定所要处理的tag。特别是当开发人员只需要处理文档中所包含的部分数据时，SAX这种扩展能力得到了更好的体现。但用SAX解析器的时候编码工作会比较困难，而且很难同时访问同一个文档中的多处不同数据。 </p>
<p>3）JDOM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<a href="http://www.jdom.org/"><font color="#3366cc">http://www.jdom.org</font></a></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JDOM的目的是成为<a href="http://dev.21tx.com/java/" target="_blank"><font color="#3366cc">Java</font></a>特定文档模型，它简化与XML的交互并且比使用DOM实现更快。由于是第一个Java特定模型，JDOM一直得到大力推广和促进。正在考虑通过&ldquo;Java规范请求JSR-102&rdquo;将它最终用作&ldquo;Java标准扩展&rdquo;。从2000年初就已经开始了JDOM开发。 </p>
<p>　　JDOM与DOM主要有两方面不同。首先，JDOM仅使用具体类而不使用接口。这在某些方面简化了API，但是也限制了灵活性。第二，API大量使用了Collections类，简化了那些已经熟悉这些类的Java开发者的使用。 </p>
<p>　　JDOM文档声明其目的是&ldquo;使用20%(或更少)的精力解决80%(或更多)Java/XML问题&rdquo;(根据学习曲线假定为20%)。JDOM对于大多数Java/XML应用程序来说当然是有用的，并且大多数开发者发现API比DOM容易理解得多。JDOM还包括对程序行为的相当广泛检查以防止用户做任何在XML中无意义的事。然而，它仍需要您充分理解XML以便做一些超出基本的工作(或者甚至理解某些情况下的错误)。这也许是比学习DOM或JDOM接口都更有意义的工作。 </p>
<p>　　JDOM自身不包含解析器。它通常使用SAX2解析器来解析和验证输入XML文档(尽管它还可以将以前构造的DOM表示作为输入)。它包含一些转换器以将JDOM表示输出成SAX2事件流、DOM模型或XML文本文档。JDOM是在Apache许可证变体下发布的开放<a href="http://www.21tx.com/src/" target="_blank"><font color="#3366cc">源码</font></a>。</p>
<p>4）DOM4J&nbsp;<a href="http://dom4j.sourceforge.net/"><font color="#3366cc">http://dom4j.sourceforge.net</font></a>&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 虽然DOM4J代表了完全独立的开发结果，但最初，它是JDOM的一种智能分支。它合并了许多超出基本XML文档表示的功能，包括集成的XPath支持、XML Schema支持以及用于大文档或流化文档的基于事件的处理。它还提供了构建文档表示的选项，它通过DOM4J API和标准DOM接口具有并行访问功能。从2000下半年开始，它就一直处于开发之中。 </p>
<p>　　为支持所有这些功能，DOM4J使用接口和抽象基本类方法。DOM4J大量使用了API中的Collections类，但是在许多情况下，它还提供一些替代方法以允许更好的性能或更直接的编码方法。直接好处是，虽然DOM4J付出了更复杂的API的代价，但是它提供了比JDOM大得多的灵活性。 </p>
<p>　　在添加灵活性、XPath集成和对大文档处理的目标时，DOM4J的目标与JDOM是一样的：针对Java开发者的易用性和直观操作。它还致力于成为比JDOM更完整的<a href="http://dev.21tx.com/corp/solution/" target="_blank"><font color="#3366cc">解决方案</font></a>，实现在本质上处理所有Java/XML问题的目标。在完成该目标时，它比JDOM更少强调防止不正确的应用程序行为。 </p>
<p>　　DOM4J是一个非常非常优秀的Java XML API，具有性能优异、功能强大和极端易用使用的特点，同时它也是一个开放源代码的软件。如今你可以看到越来越多的Java软件都在使用DOM4J来读写XML，特别值得一提的是连Sun的JAXM也在用DOM4J。 <br />
</p>
<p>2.. 比较</p>
<p>1）DOM4J性能最好，连Sun的JAXM也在用DOM4J。目前许多开源项目中大量采用DOM4J，例如大名鼎鼎的<a href="http://dev.21tx.com/java/struts/" target="_blank"><font color="#3366cc">Hibernate</font></a>也用DOM4J来读取XML配置文件。如果不考虑可移植性，那就采用DOM4J.</p>
<p>2）JDOM和DOM在性能测试时表现不佳，在测试10M文档时内存溢出。在小文档情况下还值得考虑使用DOM和JDOM。虽然JDOM的开发者已经说明他们期望在正式发行版前专注性能问题，但是从性能观点来看，它确实没有值得推荐之处。另外，DOM仍是一个非常好的选择。DOM实现广泛应用于多种编程语言。它还是许多其它与XML相关的标准的基础，因为它正式获得W3C推荐(与基于非标准的Java模型相对)，所以在某些类型的项目中可能也需要它(如在<a href="http://dev.21tx.com/web/javascript/" target="_blank"><font color="#3366cc">JavaScript</font></a>中使用DOM)。</p>
<p>3）SAX表现较好，这要依赖于它特定的解析方式－事件<a href="http://drivers.21tx.com/" target="_blank"><font color="#3366cc">驱动</font></a>。一个SAX检测即将到来的XML流，但并没有载入到内存(当然当XML流被读入时，会有部分文档暂时隐藏在内存中)。</p>
<p>3. 四种xml操作方式的基本使用方法</p>
<p>xml文件：</p>
<p>＜?xml version=&quot;1.0&quot; encoding=&quot;GB2312&quot;?＞<br />
＜RESULT＞<br />
&nbsp;&nbsp;&nbsp; ＜VALUE＞ <br />
　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ＜NO＞A1234＜/NO＞ <br />
　　&nbsp;&nbsp;&nbsp;&nbsp; ＜ADDR＞四川省XX县XX镇XX路X段XX号＜/ADDR＞<br />
&nbsp;&nbsp;&nbsp; ＜/VALUE＞<br />
&nbsp;&nbsp;&nbsp; ＜VALUE＞ <br />
　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ＜NO＞B1234＜/NO＞ <br />
　&nbsp;&nbsp;&nbsp;&nbsp; 　＜ADDR＞四川省XX市XX乡XX村XX组＜/ADDR＞<br />
&nbsp;&nbsp;&nbsp; ＜/VALUE＞<br />
＜/RESULT＞ </p>
<p>1）DOM</p>
<p>import java.io.*;<br />
import java.util.*;<br />
import org.w3c.dom.*;<br />
import javax.xml.parsers.*; </p>
<p>public class MyXMLReader{ <br />
　public static void main(String arge[]){ </p>
<p>　　long lasting =System.currentTimeMillis(); <br />
　　try{&nbsp; <br />
　　　File f=new File(&quot;data_10k.xml&quot;); <br />
　　　DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance(); <br />
　　　DocumentBuilder builder=factory.newDocumentBuilder(); <br />
　　　Document doc = builder.parse(f); <br />
　　　NodeList nl = doc.getElementsByTagName(&quot;VALUE&quot;); <br />
　　　for (int i=0;i＜nl.getLength();i++){ <br />
　　　　System.out.print(&quot;车牌号码:&quot; + doc.getElementsByTagName(&quot;NO&quot;).item(i).getFirstChild().getNodeValue()); <br />
　　　　System.out.println(&quot;车主地址:&quot; + doc.getElementsByTagName(&quot;ADDR&quot;).item(i).getFirstChild().getNodeValue()); <br />
　 　} <br />
　　}catch(Exception e){ <br />
　　　e.printStackTrace(); <br />
} </p>
<p>2）SAX</p>
<p>import org.xml.sax.*;<br />
import org.xml.sax.helpers.*;<br />
import javax.xml.parsers.*; </p>
<p>public class MyXMLReader extends DefaultHandler { </p>
<p>　java.util.Stack tags = new java.util.Stack(); <br />
　public MyXMLReader() { <br />
　　super();<br />
&nbsp;&nbsp; } </p>
<p>　public static void main(String args[]) { <br />
　　long lasting = System.currentTimeMillis(); <br />
　　try { <br />
　　　SAXParserFactory sf = SAXParserFactory.newInstance(); <br />
　　　SAXParser sp = sf.newSAXParser(); <br />
　　　MyXMLReader reader = new MyXMLReader(); <br />
　　　sp.parse(new InputSource(&quot;data_10k.xml&quot;), reader); <br />
　　} catch (Exception e) { <br />
　　　e.printStackTrace(); <br />
　　} </p>
<p>　　System.out.println(&quot;运行时间：&quot; + (System.currentTimeMillis() - lasting) + &quot;毫秒&quot;);} <br />
　　public void characters(char ch[], int start, int length) throws SAXException { <br />
　　String tag = (String) tags.peek(); <br />
　　if (tag.equals(&quot;NO&quot;)) {&nbsp; <br />
　　　System.out.print(&quot;车牌号码：&quot; + new String(ch, start, length));<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; if (tag.equals(&quot;ADDR&quot;)) { <br />
　　System.out.println(&quot;地址:&quot; + new String(ch, start, length));<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp; } </p>
<p>　　public void startElement(String uri,String localName,String qName,Attributes attrs) { <br />
　　tags.push(qName);}<br />
}&nbsp; </p>
<p>3） JDOM</p>
<p>import java.io.*;<br />
import java.util.*;<br />
import org.jdom.*;<br />
import org.jdom.input.*; </p>
<p>public class MyXMLReader { </p>
<p>　public static void main(String arge[]) { <br />
　　long lasting = System.currentTimeMillis(); <br />
　　try { <br />
　　　SAXBuilder builder = new SAXBuilder();&nbsp; <br />
　　　Document doc = builder.build(new File(&quot;data_10k.xml&quot;));&nbsp; <br />
　　　Element foo = doc.getRootElement();&nbsp; <br />
　　　List allChildren = foo.getChildren();&nbsp; <br />
　　　for(int i=0;i＜allChildren.size();i++) {&nbsp; <br />
　　　　System.out.print(&quot;车牌号码:&quot; + ((Element)allChildren.get(i)).getChild(&quot;NO&quot;).getText()); <br />
　　　　System.out.println(&quot;车主地址:&quot; + ((Element)allChildren.get(i)).getChild(&quot;ADDR&quot;).getText()); <br />
　　　} <br />
　　} catch (Exception e) { <br />
　　　e.printStackTrace(); <br />
} </p>
<p>}</p>
<p>4）DOM4J</p>
<p>import java.io.*;<br />
import java.util.*;<br />
import org.dom4j.*;<br />
import org.dom4j.io.*; </p>
<p>public class MyXMLReader { </p>
<p>　public static void main(String arge[]) { <br />
　　long lasting = System.currentTimeMillis(); <br />
　　try { <br />
　　　File f = new File(&quot;data_10k.xml&quot;); <br />
　　　SAXReader reader = new SAXReader(); <br />
　　　Document doc = reader.read(f); <br />
　　　Element root = doc.getRootElement(); <br />
　　　Element foo; <br />
　　　for (Iterator i = root.elementIterator(&quot;VALUE&quot;); i.hasNext();) { <br />
　　　　foo = (Element) i.next(); <br />
　　　　System.out.print(&quot;车牌号码:&quot; + foo.elementText(&quot;NO&quot;)); <br />
　　　　System.out.println(&quot;车主地址:&quot; + foo.elementText(&quot;ADDR&quot;)); <br />
　　　} <br />
　　} catch (Exception e) { <br />
　　　e.printStackTrace(); <br />
&nbsp;&nbsp;&nbsp; } <br />
}</p>
          <br/>
          <span style="color:red;">
            <a href="http://qqqckm.javaeye.com/blog/41344#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 14 Dec 2006 20:28:00 +0800</pubDate>
        <link>http://qqqckm.javaeye.com/blog/41344</link>
        <guid>http://qqqckm.javaeye.com/blog/41344</guid>
      </item>
      <item>
        <title>《JAVA编程思想2》笔记</title>
        <author>qqqckm</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://qqqckm.javaeye.com">qqqckm</a>&nbsp;
          链接：<a href="http://qqqckm.javaeye.com/blog/41345" style="color:red;">http://qqqckm.javaeye.com/blog/41345</a>&nbsp;
          发表时间: 2006年12月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p class="MsoNormal" align="center" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center"><strong><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">第</span> </strong><strong><span lang="EN-US" style="FONT-SIZE: 12pt">1</span> </strong><strong><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">章</span> </strong><strong><span style="FONT-SIZE: 12pt"></span></strong><strong><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对象入门</span> </strong><strong><span lang="EN-US" style="FONT-SIZE: 12pt"><o:p></o:p></span></strong></p>
<p class="MsoNormal" align="left" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">Smalltalk </span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">的五大基本特征</span> <span lang="EN-US" style="FONT-SIZE: 10pt; mso-font-kerning: 0pt"><o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">(1) </span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">所有东西都是对象</span> <span lang="EN-US" style="FONT-SIZE: 10pt; mso-font-kerning: 0pt"><o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">(2) </span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">每个程序都是一大堆对象的组合；通过消息的传递一个对象可告诉另一个对象该做什么</span> <span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt"><o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">(3) </span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">每个对象都有自己的存储空间可容纳其他对象，换句话说，通过封装一个现有的对象还可生成一个新对象</span> <span lang="EN-US" style="FONT-SIZE: 10pt; mso-font-kerning: 0pt"><o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">(4) </span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">每个对象都有一种类型</span> <span lang="EN-US" style="FONT-SIZE: 10pt; mso-font-kerning: 0pt"><o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">(5) </span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">同一类所有对象都能接收相同的消息</span> <span lang="EN-US" style="FONT-SIZE: 10pt; mso-font-kerning: 0pt"><o:p></o:p></span></p>
<p class="MsoNormal" align="center" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center"><strong><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">第</span> </strong><strong><span lang="EN-US" style="FONT-SIZE: 12pt">2</span> </strong><strong><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">章</span> </strong><strong><span style="FONT-SIZE: 12pt"></span></strong><strong><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">万事万物皆对象</span> </strong><strong><span lang="EN-US" style="FONT-SIZE: 12pt"><o:p></o:p></span></strong></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一．所有对象都必须由你建立</span> </p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">1</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">．</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">存储在哪里</span> </p>
<p class="MsoNormal" align="left" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none"><span lang="EN-US">1) </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">寄存器：我们在程序中无法控制；</span> <span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">速度最快</span> <span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">，</span> <span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">数据位于处理器的内部</span> </p>
<p class="MsoNormal" align="left" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none"><span lang="EN-US">2) stack</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">：存放基本类型的数据和对象的</span> <span lang="EN-US">reference</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，但对象本身不存放在</span> <span lang="EN-US">stack</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中，而是存放在</span> <span lang="EN-US">Heap</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中；位于</span> <span lang="EN-US">RAM</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中；处理器通过</span> <span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">堆栈指针访问，下移创建新内存，上移释放内存</span> </p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">3) Heap</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">：存放用</span> <span lang="EN-US">new</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">产生的数据</span> </p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">4) Static storage</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">：存放在对象中用</span> <span lang="EN-US">static</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">定义的静态成员</span> </p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">5) Constant storage</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">：存放常量；需严格保护的常量，可考虑放入</span> <span lang="EN-US">ROM</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中</span> </p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">6) NON-RAM</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">：硬盘等永久存储空间</span> </p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">2</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">．</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">特例：基本型别</span> </p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">基本类型数据存放在</span> <span lang="EN-US">Stack</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中，存放的是数据。而产生对象时，只把对象的</span> <span lang="EN-US">reference</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">存放在</span> <span lang="EN-US">stack</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中，用于指向某个对象，对象本身存放在</span> <span lang="EN-US">Heap</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中。</span> </p>
<p class="MsoNormal" align="left" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">Java </span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">提供了两个类，专门用于进行高精度运算</span> <span lang="EN-US" style="mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">BigInteger </span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">和</span> <span lang="EN-US" style="mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">BigDecimal</span> </p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">3</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">．</span> <span lang="EN-US">Java</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中的数组</span> </p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">当你产生某个存储对象的数组时，真正产生的其实是存储</span> <span lang="EN-US">reference</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的数组。引数组建立后，其中的每一个</span> <span lang="EN-US">reference</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">都会被自动设为</span> <span lang="EN-US">null</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，表示&ldquo;不指向任何对象&rdquo;。</span> </p>
<p class="MsoNormal" align="left" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none"><span lang="EN-US">4</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">．</span> <span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">作用域 </span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">Scope</span> <span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt"><o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none"><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">作用域是由花括号的位置决定的。需要说明的是，在<span lang="EN-US">java中，如下代码是不允许的。</span></span> <span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt"><o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none"><span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">{<o:p></o:p></span> </p>
<p class="MsoNormal" align="left" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none"><span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">int x = 12;<o:p></o:p></span> </p>
<p class="MsoNormal" align="left" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none"><span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">{<o:p></o:p></span> </p>
<p class="MsoNormal" align="left" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left; mso-layout-grid-align: none"><span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">int x = 96; /* illegal */<o:p></o:p></span> </p>
<p class="MsoNormal" align="left" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none"><span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">}<o:p></o:p></span> </p>
<p class="MsoNormal" align="left" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none"><span lang="EN-US" style="FONT-SIZE: 11pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">}<o:p></o:p></span> </p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">二．建立新的数据型别：</span> <span lang="EN-US">Class</span> </p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">1</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">．</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">数据成员和函数</span> </p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">1.1 </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">基本成员的缺省值</span> </p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">1</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">当</span> <span lang="EN-US">class</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的某个成员属于基本型别时，即使你没有为它提供初值，</span> <span lang="EN-US">Java</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">仍保证它有一个缺省值。</span> </p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">2</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">只有当变量身份是</span> <span lang="EN-US">class</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">内的成员时，</span> <span lang="EN-US">Java</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">才保证为该变量提供初值。</span> </p>
<p class="MsoNormal" align="left" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">＊：浮点型数默认的是</span> <span lang="EN-US">double</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">型</span> <span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><o:p></o:p></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">三．函数（</span> <span lang="EN-US">Mehtods</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">），引数（</span> <span lang="EN-US">arguments</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">），返回值（</span> <span lang="EN-US">return values</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）</span> </p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">1</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">．</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">引数列</span> </p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">当引数传递的是对象时，传递的是对象的</span> <span lang="EN-US">reference</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span> </p>
<p class="MsoNormal" align="left" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">＊：</span> <span lang="EN-US">packcage</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的命名</span> <span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">以小写字母为标准；</span> <span lang="EN-US" style="mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">Java</span> <span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">的设计者鼓励程序员反转使用自己的</span> <span lang="EN-US" style="mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">Internet </span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">域名，因为它们肯定是独一无二的。</span> <span lang="EN-US" style="FONT-SIZE: 10pt; mso-font-kerning: 0pt"><o:p></o:p></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">四．开始构建<span lang="EN-US">Java 程序<o:p></o:p></span></span> </p>
<p class="MsoNormal" align="left" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none"><span lang="EN-US" style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">import java.util.*;注意*只能包含当前目录下的所有类不能包含子目录中的类。<o:p></o:p></span> </p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">五．注解用内嵌式文档</span> </p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">Java</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">提供两种注解风格：</span> <span lang="EN-US">/*XXXX*/</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span> <span lang="EN-US">//XXXX </span></p>
<p class="MsoNormal" align="left" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">javadoc</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">：</span> <span lang="EN-US" style="mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">/** </span><span lang="EN-US" style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;</span> </span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">*/</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">；</span> <span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">两种方式来使用</span> <span lang="EN-US" style="mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">javadoc</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">：</span> <span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">嵌入的</span> <span lang="EN-US" style="mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">HTML </span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">或 使用文档标记</span> <span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt"><o:p></o:p></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">文档标记</span> <span lang="EN-US">Doc tags </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是一些以</span> <span lang="EN-US">@ </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">开头的命令，置于注释行的起始处，但最前头的</span> <span lang="EN-US">* </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">会被忽略。</span> </p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">@see</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">采用超链接的形式指向其他文档。后面跟上：类名、完整类名或者完整类名</span> <span lang="EN-US">#</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法名；</span> </p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">@version </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">版本信息</span> </p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">@author </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">作者信息</span> </p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">@since</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是从该代码的哪个版本开始启用</span> </p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">@param </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">参数名</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">说明</span> </p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">@return </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">说明</span> </p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">@throws </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">完整类名</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">说明</span> </p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">@deprecated</span> </p>
<p class="MsoNormal" align="center" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center"><strong><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">第</span> </strong><strong><span lang="EN-US" style="FONT-SIZE: 12pt">3</span> </strong><strong><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">章</span> </strong><strong><span style="FONT-SIZE: 12pt"></span></strong><strong><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">控制程序流程</span> </strong><strong><span lang="EN-US" style="FONT-SIZE: 12pt"><o:p></o:p></span></strong></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l8 level1 lfo1; tab-stops: list 21.0pt"><span lang="EN-US" style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一．</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">使用</span> <span lang="EN-US">Java</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">运算符</span> </p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">1.</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">函数引数如果为对象类型，是传递引用的</span> </p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">2.</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">关系运算符</span> </p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">1.</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">当对两个对象运用关系运算符进行比较时，比较的是</span> <span lang="EN-US">object reference</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，如：</span> </p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">Integer n1 = new Integer(3);</span> </p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">Integer n2 = new Integer(3);</span> </p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">System.out.println(n1==n2);</span> </p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">结果为</span> <span lang="EN-US">false</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，因为两个</span> <span lang="EN-US">object reference</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">（</span> <span lang="EN-US">n1</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span> <span lang="EN-US">n2</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）值是不同的</span> </p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">2</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）</span> <span lang="EN-US">quals()</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的缺省行为也是拿</span> <span lang="EN-US">reference</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">来比较。不过</span> <span lang="EN-US">Java</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中的</span> <span lang="EN-US">class</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">大多覆写了</span> <span lang="EN-US">equals</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法，如：</span> </p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">Integer n1 = new Integer(3);</span> </p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">Integer n2 = new Integer(3);</span> </p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">System.out.println(n1.quals(n2));//</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">值为</span> <span lang="EN-US">true</span> </p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">2</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">．</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">逻辑运算符</span> </p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">1</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">只能将</span> <span la