﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-Raymond-随笔分类-Java</title><link>http://www.blogjava.net/raymondchen625/category/6966.html</link><description>Java笔记</description><language>zh-cn</language><lastBuildDate>Fri, 02 Mar 2007 20:22:42 GMT</lastBuildDate><pubDate>Fri, 02 Mar 2007 20:22:42 GMT</pubDate><ttl>60</ttl><item><title>不同方法遍历列表的时间效率</title><link>http://www.blogjava.net/raymondchen625/archive/2006/03/03/33423.html</link><dc:creator>Raymond的Java笔记</dc:creator><author>Raymond的Java笔记</author><pubDate>Fri, 03 Mar 2006 04:00:00 GMT</pubDate><guid>http://www.blogjava.net/raymondchen625/archive/2006/03/03/33423.html</guid><wfw:comment>http://www.blogjava.net/raymondchen625/comments/33423.html</wfw:comment><comments>http://www.blogjava.net/raymondchen625/archive/2006/03/03/33423.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/raymondchen625/comments/commentRss/33423.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/raymondchen625/services/trackbacks/33423.html</trackback:ping><description><![CDATA[在Java高效编程里面看到变量一个ArrayList的时候，有两种方式：<BR>假设a是个ArrayList<BR><BR>1、 for (int i=0;i&lt;a.size();i++) {<BR>2、 for (int i=0,n=a.size();i&lt;n;i++) {<BR><BR>带着点怀疑我做了一下试验，的确是方法2快一点的，估计是a.size()方法里面花费了一点多余的时间。后来我想到jdk 1.5开始还有一种遍历的for/each方法，我做了一下比较，结果有点惊讶。<BR><BR>源程序如下<BR><BR>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><SPAN style="COLOR: #008080">&nbsp;1</SPAN><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #0000ff">import</SPAN><SPAN style="COLOR: #000000">&nbsp;java.util.ArrayList;<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;2</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><BR></SPAN><SPAN style="COLOR: #008080">&nbsp;3</SPAN><SPAN style="COLOR: #000000"><IMG id=Codehighlighter1_59_781_Open_Image onclick="this.style.display='none'; Codehighlighter1_59_781_Open_Text.style.display='none'; Codehighlighter1_59_781_Closed_Image.style.display='inline'; Codehighlighter1_59_781_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_59_781_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_59_781_Closed_Text.style.display='none'; Codehighlighter1_59_781_Open_Image.style.display='inline'; Codehighlighter1_59_781_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000">&nbsp;ProfileArrayList&nbsp;</SPAN><SPAN id=Codehighlighter1_59_781_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_59_781_Open_Text><SPAN style="COLOR: #000000">{<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;4</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR></SPAN><SPAN style="COLOR: #008080">&nbsp;5</SPAN><SPAN style="COLOR: #000000"><IMG id=Codehighlighter1_103_354_Open_Image onclick="this.style.display='none'; Codehighlighter1_103_354_Open_Text.style.display='none'; Codehighlighter1_103_354_Closed_Image.style.display='inline'; Codehighlighter1_103_354_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_103_354_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_103_354_Closed_Text.style.display='none'; Codehighlighter1_103_354_Open_Image.style.display='inline'; Codehighlighter1_103_354_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">static</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;main(String[]&nbsp;args)&nbsp;</SPAN><SPAN id=Codehighlighter1_103_354_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_103_354_Open_Text><SPAN style="COLOR: #000000">{<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;6</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;ArrayList</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">String</SPAN><SPAN style="COLOR: #000000">&gt;</SPAN><SPAN style="COLOR: #000000">&nbsp;s</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;ArrayList</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">String</SPAN><SPAN style="COLOR: #000000">&gt;</SPAN><SPAN style="COLOR: #000000">();<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;7</SPAN><SPAN style="COLOR: #000000"><IMG id=Codehighlighter1_184_234_Open_Image onclick="this.style.display='none'; Codehighlighter1_184_234_Open_Text.style.display='none'; Codehighlighter1_184_234_Closed_Image.style.display='inline'; Codehighlighter1_184_234_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_184_234_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_184_234_Closed_Text.style.display='none'; Codehighlighter1_184_234_Open_Image.style.display='inline'; Codehighlighter1_184_234_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">for</SPAN><SPAN style="COLOR: #000000">&nbsp;(</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;i</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">;i</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">15000</SPAN><SPAN style="COLOR: #000000">;i</SPAN><SPAN style="COLOR: #000000">++</SPAN><SPAN style="COLOR: #000000">)&nbsp;</SPAN><SPAN id=Codehighlighter1_184_234_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_184_234_Open_Text><SPAN style="COLOR: #000000">{<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;8</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s.add(</SPAN><SPAN style="COLOR: #000000">""</SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000">System.currentTimeMillis());<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;9</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #008080">10</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">Start&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR></SPAN><SPAN style="COLOR: #008080">11</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;testOne(s);<BR></SPAN><SPAN style="COLOR: #008080">12</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;testTwo(s);<BR></SPAN><SPAN style="COLOR: #008080">13</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;testThree(s);<BR></SPAN><SPAN style="COLOR: #008080">14</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">End&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR></SPAN><SPAN style="COLOR: #008080">15</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #008080">16</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">17</SPAN><SPAN style="COLOR: #000000"><IMG id=Codehighlighter1_410_511_Open_Image onclick="this.style.display='none'; Codehighlighter1_410_511_Open_Text.style.display='none'; Codehighlighter1_410_511_Closed_Image.style.display='inline'; Codehighlighter1_410_511_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_410_511_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_410_511_Closed_Text.style.display='none'; Codehighlighter1_410_511_Open_Image.style.display='inline'; Codehighlighter1_410_511_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">private</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">static</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;testOne(ArrayList</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">String</SPAN><SPAN style="COLOR: #000000">&gt;</SPAN><SPAN style="COLOR: #000000">&nbsp;a)&nbsp;</SPAN><SPAN id=Codehighlighter1_410_511_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_410_511_Open_Text><SPAN style="COLOR: #000000">{<BR></SPAN><SPAN style="COLOR: #008080">18</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;j</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">;String&nbsp;s</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #0000ff">null</SPAN><SPAN style="COLOR: #000000">;<BR></SPAN><SPAN style="COLOR: #008080">19</SPAN><SPAN style="COLOR: #000000"><IMG id=Codehighlighter1_472_507_Open_Image onclick="this.style.display='none'; Codehighlighter1_472_507_Open_Text.style.display='none'; Codehighlighter1_472_507_Closed_Image.style.display='inline'; Codehighlighter1_472_507_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_472_507_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_472_507_Closed_Text.style.display='none'; Codehighlighter1_472_507_Open_Image.style.display='inline'; Codehighlighter1_472_507_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">for</SPAN><SPAN style="COLOR: #000000">&nbsp;(</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;i</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">;i</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">a.size();i</SPAN><SPAN style="COLOR: #000000">++</SPAN><SPAN style="COLOR: #000000">)&nbsp;</SPAN><SPAN id=Codehighlighter1_472_507_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_472_507_Open_Text><SPAN style="COLOR: #000000">{<BR></SPAN><SPAN style="COLOR: #008080">20</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">a.get(i);<BR></SPAN><SPAN style="COLOR: #008080">21</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;j</SPAN><SPAN style="COLOR: #000000">++</SPAN><SPAN style="COLOR: #000000">;<BR></SPAN><SPAN style="COLOR: #008080">22</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #008080">23</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #008080">24</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">25</SPAN><SPAN style="COLOR: #000000"><IMG id=Codehighlighter1_565_675_Open_Image onclick="this.style.display='none'; Codehighlighter1_565_675_Open_Text.style.display='none'; Codehighlighter1_565_675_Closed_Image.style.display='inline'; Codehighlighter1_565_675_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_565_675_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_565_675_Closed_Text.style.display='none'; Codehighlighter1_565_675_Open_Image.style.display='inline'; Codehighlighter1_565_675_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">private</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">static</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;testTwo(ArrayList</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">String</SPAN><SPAN style="COLOR: #000000">&gt;</SPAN><SPAN style="COLOR: #000000">&nbsp;a)&nbsp;</SPAN><SPAN id=Codehighlighter1_565_675_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_565_675_Open_Text><SPAN style="COLOR: #000000">{<BR></SPAN><SPAN style="COLOR: #008080">26</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;j</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">;<BR></SPAN><SPAN style="COLOR: #008080">27</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;s</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #0000ff">null</SPAN><SPAN style="COLOR: #000000">;<BR></SPAN><SPAN style="COLOR: #008080">28</SPAN><SPAN style="COLOR: #000000"><IMG id=Codehighlighter1_636_671_Open_Image onclick="this.style.display='none'; Codehighlighter1_636_671_Open_Text.style.display='none'; Codehighlighter1_636_671_Closed_Image.style.display='inline'; Codehighlighter1_636_671_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_636_671_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_636_671_Closed_Text.style.display='none'; Codehighlighter1_636_671_Open_Image.style.display='inline'; Codehighlighter1_636_671_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">for</SPAN><SPAN style="COLOR: #000000">&nbsp;(</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;i</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">,n</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">a.size();i</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">n;i</SPAN><SPAN style="COLOR: #000000">++</SPAN><SPAN style="COLOR: #000000">)&nbsp;</SPAN><SPAN id=Codehighlighter1_636_671_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_636_671_Open_Text><SPAN style="COLOR: #000000">{<BR></SPAN><SPAN style="COLOR: #008080">29</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">a.get(i);<BR></SPAN><SPAN style="COLOR: #008080">30</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;j</SPAN><SPAN style="COLOR: #000000">++</SPAN><SPAN style="COLOR: #000000">;<BR></SPAN><SPAN style="COLOR: #008080">31</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #008080">32</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #008080">33</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR></SPAN><SPAN style="COLOR: #008080">34</SPAN><SPAN style="COLOR: #000000"><IMG id=Codehighlighter1_729_778_Open_Image onclick="this.style.display='none'; Codehighlighter1_729_778_Open_Text.style.display='none'; Codehighlighter1_729_778_Closed_Image.style.display='inline'; Codehighlighter1_729_778_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_729_778_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_729_778_Closed_Text.style.display='none'; Codehighlighter1_729_778_Open_Image.style.display='inline'; Codehighlighter1_729_778_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">private</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">static</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;testThree(ArrayList</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">String</SPAN><SPAN style="COLOR: #000000">&gt;</SPAN><SPAN style="COLOR: #000000">&nbsp;a)&nbsp;</SPAN><SPAN id=Codehighlighter1_729_778_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_729_778_Open_Text><SPAN style="COLOR: #000000">{<BR></SPAN><SPAN style="COLOR: #008080">35</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;j</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">;<BR></SPAN><SPAN style="COLOR: #008080">36</SPAN><SPAN style="COLOR: #000000"><IMG id=Codehighlighter1_763_776_Open_Image onclick="this.style.display='none'; Codehighlighter1_763_776_Open_Text.style.display='none'; Codehighlighter1_763_776_Closed_Image.style.display='inline'; Codehighlighter1_763_776_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_763_776_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_763_776_Closed_Text.style.display='none'; Codehighlighter1_763_776_Open_Image.style.display='inline'; Codehighlighter1_763_776_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">for</SPAN><SPAN style="COLOR: #000000">&nbsp;(String&nbsp;s&nbsp;:&nbsp;a)&nbsp;</SPAN><SPAN id=Codehighlighter1_763_776_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_763_776_Open_Text><SPAN style="COLOR: #000000">{<BR></SPAN><SPAN style="COLOR: #008080">37</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;j</SPAN><SPAN style="COLOR: #000000">++</SPAN><SPAN style="COLOR: #000000">;<BR></SPAN><SPAN style="COLOR: #008080">38</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #008080">39</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #008080">40</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR></SPAN><SPAN style="COLOR: #008080">41</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #008080">42</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN></DIV>
<P>通过Profiling工具看结果：<BR>方法&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 运行时间<BR>testOne&nbsp;&nbsp; 0.055764<BR>testTwo&nbsp; 0.043821<BR>testThres 0.132451<BR><BR>也就是说，jdk 1.5的for/each循环是最慢的。有点不相信。开头觉得是因为赋值造成的，但后来在另两个方法里面加上赋值语句，依然是for/each最慢。比较有趣的结果。<BR><BR>从代码清晰角度，用for/each消耗多一点点时间似乎也无所谓。但是，另两种代码也不见得“不清晰”，呵呵。看着办了。</P><img src ="http://www.blogjava.net/raymondchen625/aggbug/33423.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/raymondchen625/" target="_blank">Raymond的Java笔记</a> 2006-03-03 12:00 <a href="http://www.blogjava.net/raymondchen625/archive/2006/03/03/33423.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用JMeter进行压力测试</title><link>http://www.blogjava.net/raymondchen625/archive/2006/03/01/32965.html</link><dc:creator>Raymond的Java笔记</dc:creator><author>Raymond的Java笔记</author><pubDate>Wed, 01 Mar 2006 02:04:00 GMT</pubDate><guid>http://www.blogjava.net/raymondchen625/archive/2006/03/01/32965.html</guid><wfw:comment>http://www.blogjava.net/raymondchen625/comments/32965.html</wfw:comment><comments>http://www.blogjava.net/raymondchen625/archive/2006/03/01/32965.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/raymondchen625/comments/commentRss/32965.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/raymondchen625/services/trackbacks/32965.html</trackback:ping><description><![CDATA[<BR>JMeter是apache的jakarta上面的项目，用于软件的压力测试（Load Test），不但可以对HTTP，也可以对数据库（通过JDBC）、FTP、Web Service、Java 对象等等进行压力测试。<BR><BR>项目地址：http://jakarta.apache.org/jmeter<BR><BR>使用： 运行bin目录下的jmeterw.bat，运行jmeter.bat也可以，不过就会有一个命令窗口显示。<BR><BR>要提醒一下的是jmeter根据当前系统的locale显示菜单的语言，为了方便想设置回英文的话，可以修改jmeter.properties文件，设置language=en&nbsp; （我下载的2.1.1版本把“退出”误译为“推出”，怎么看都不顺眼 <IMG height=19 src="http://www.blogjava.net/Emoticons/teeth_smile.gif" width=19 border=0>）<BR><BR>使用：<BR><BR>JMeter的测试计划（Test Plan）呈树状结构，树里面有多种元素类型，树状结构的元素之间有的是有继承关系的（其原理有点类似log4j）。下面简述一下元素类型：<BR><BR>1、<STRONG><FONT face=Arial color=#000000>ThreadGroup<BR></FONT></STRONG>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 顾名思义就是线程组，测试必须有一个ThreadGroup元素作为基础（否则就没有测试线程在跑了），这个元素可以配置跑多少个线程、每个线程循环多少次，所有线程数的总启动时间（Ramp-up period）等等。<BR><BR>2、<STRONG>Controller<BR></STRONG>&nbsp;&nbsp;&nbsp;&nbsp; 包括Logical Controller和Sampler，前者用来作一些逻辑上的控制，例如轮换、条件、循环等等。Sampler就是真正“干活”的“取样器”，例如“HTTP Request”，就是拿来执行一个HTTP请求的。<BR><BR>3、<STRONG>Listener<BR></STRONG>&nbsp;&nbsp;&nbsp; Listener对请求过程进行监听，可以简单理解为获取结果的东东。例如Simple Data Writer，可以把结果写到一个文本文件里（其实所有Listener都可以写数据到文件里），还有View Results in Table，就是把结果显示在表格里。<BR><BR>4、 <STRONG>Timer<BR></STRONG>&nbsp;&nbsp;&nbsp;<STRONG> </STRONG>用来控制执行流程中的时间延迟等功能。<BR><BR>5、 <STRONG>Assertion<BR></STRONG>&nbsp;&nbsp;&nbsp; 断言，加到Sampler里面可以对返回的结果进行判断，例如判断HTTP返回结果里面是否含有某个字符串。如果断言为真，JMeter会标记请求为成功，否则标记为失败。<BR><BR>6、 <FONT face=Arial color=#000000><STRONG>Configuration Element<BR>&nbsp;&nbsp;&nbsp; </STRONG>配置用的元素，很有用。由于测试计划是树状和有继承关系的，可以在高层次指定一个Configuration Element，低层次的相关Sampler如果没有显式地指定配置，就继承高层次的配置信息。（跟log4j很像吧？）<BR><BR>7、 <FONT color=#000000><STRONG>Pre-Processor/Post-Processor Elements</STRONG> <BR>&nbsp;&nbsp; 用来在Sampler运行前和运行后作一些预处理和后处理工作的。例如动态修改请求的参数（预处理），从返回信息里面提取信息（后处理）等等。<BR><BR>举例：要做一个最简单的HTTP压力测试： 用10个线程访问一个URL，每个线程访问100次。<BR>做法：<BR>1、 在Test Plan下面加一个Thread Group，配置里面，线程数填10，循环次数填100<BR>2、 在Thread Group下面加一个HTTP Request，这是一个Sampler，在它的配置里面填写主机信息，端口、协议、路径、参数等信息<BR>3、 在HTTP Request下面加一个View Results in Table，如果你想把记录记到文件，则填写文件路径。<BR>4、 保存一些这个Test Plan，就可以选择Run菜单下面的Run来运行了。直到Run菜单项从灰色变回黑色，就表示运行完了。在View Results in Table下面，你可以看到运行结果。<BR><BR>关于元素的详细描述可以参考<A href="http://jakarta.apache.org/jmeter/usermanual/test_plan.html">官方文档</A>。<BR><BR>JMeter功能很丰富的，还有很强的扩展能力，而且又是免费，值得研究使用。</FONT></FONT><img src ="http://www.blogjava.net/raymondchen625/aggbug/32965.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/raymondchen625/" target="_blank">Raymond的Java笔记</a> 2006-03-01 10:04 <a href="http://www.blogjava.net/raymondchen625/archive/2006/03/01/32965.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用TPTP和eclipse进行Profiling（剖析）－简介</title><link>http://www.blogjava.net/raymondchen625/archive/2006/02/27/32637.html</link><dc:creator>Raymond的Java笔记</dc:creator><author>Raymond的Java笔记</author><pubDate>Mon, 27 Feb 2006 06:14:00 GMT</pubDate><guid>http://www.blogjava.net/raymondchen625/archive/2006/02/27/32637.html</guid><wfw:comment>http://www.blogjava.net/raymondchen625/comments/32637.html</wfw:comment><comments>http://www.blogjava.net/raymondchen625/archive/2006/02/27/32637.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/raymondchen625/comments/commentRss/32637.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/raymondchen625/services/trackbacks/32637.html</trackback:ping><description><![CDATA[<P>本文只作很简要介绍，可视作备忘参考。<BR><BR>TPTP是eclipse官方的profiling插件，初步使用下感觉功能强大。<BR><BR>下载安装： 在<A href="http://www.eclipse.org/tptp/">http://www.eclipse.org/tptp/</A>下载，我选择All－Runtime，然后像其它插件一样解压到eclipse的目录，然后允许eclipse -clean来刷新一把。<BR><BR>使用：&nbsp;<BR>&nbsp;&nbsp;&nbsp;常用的profiling简单来讲就对程序运行进行记录，然后从数据中分析哪些方法运行时间长，哪些对象吃内存多，哪些类的实例多等等。一个比较好的使用入门sample在这里： <A href="http://www.eclipse.org/tptp/home/documents/tutorials/profilingtool/profilingexample_32.html">http://www.eclipse.org/tptp/home/documents/tutorials/profilingtool/profilingexample_32.html</A>&nbsp;我就不罗嗦了。<BR><BR>值得多讲的是Remote Profiling，就是远程剖析。实现的原理是在远程机器上运行一个代理进程，要被远程剖析的程序或者Application Server启动的时候加一个JVM参数来识别这个代理进程，两者相互作用，代理就可以把收集到的信息发给在远程的一方（就是运行着eclipse的一方）。<BR><BR>因此要实现Remote Profiling，还要在目标机器上装一个agent。 --&gt;<BR><BR>下载安装：<A href="http://www.eclipse.org/tptp/home/downloads/drops/TPTP-4.0.1.html">http://www.eclipse.org/tptp/home/downloads/drops/TPTP-4.0.1.html</A>　选择对应操作系统的<FONT color=#000000><STRONG>Agent Controller</STRONG>下载，选择Runtime即可。<BR><BR>下载后，阅读依照getting_started.html的说明来安装即可，这里简述一下：<BR>1、 把它的bin目录放到PATH里面<BR>2、 运行一下SetConfig来设置参数，注意如果想让除本地localhost意外所以机器都访问的话，要注意设置Network Access Mode，默认是localhost的。<BR>3、 运行RAStart来启动代理（Linux下）<BR>4、 服务器端程序（例如tomcat）启动的JVM参数里面加入-XrunpiAgent:server=enabled即可（还有其它参数值参见文档）<BR>5、 然后就可以在远程用eclipse来启动一个Profiling进程来attach到这个agent controller了。效果和在eclipse里面直接profile应用程序一样。<BR><BR></FONT></P><img src ="http://www.blogjava.net/raymondchen625/aggbug/32637.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/raymondchen625/" target="_blank">Raymond的Java笔记</a> 2006-02-27 14:14 <a href="http://www.blogjava.net/raymondchen625/archive/2006/02/27/32637.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Volatile Fields</title><link>http://www.blogjava.net/raymondchen625/archive/2006/02/19/31476.html</link><dc:creator>Raymond的Java笔记</dc:creator><author>Raymond的Java笔记</author><pubDate>Sun, 19 Feb 2006 07:58:00 GMT</pubDate><guid>http://www.blogjava.net/raymondchen625/archive/2006/02/19/31476.html</guid><wfw:comment>http://www.blogjava.net/raymondchen625/comments/31476.html</wfw:comment><comments>http://www.blogjava.net/raymondchen625/archive/2006/02/19/31476.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/raymondchen625/comments/commentRss/31476.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/raymondchen625/services/trackbacks/31476.html</trackback:ping><description><![CDATA[<H4 class=docSection2Title><FONT style="BACKGROUND-COLOR: #316ac5" color=#ffffff>Volatile</FONT> Fields</H4><A name=ch01index219></A><A name=ch01index220></A><A name=ch01index221></A><A name=ch01index222></A>
<P class=docText>Sometimes, it seems excessive to pay the cost of synchronization just to read or write an instance field or two. After all, what can go wrong? Unfortunately, with modern processors and compilers, there is plenty of room for error:<A name=ch01index223></A></P>
<UL>
<LI>
<P class=docList>Computers with multiple processors can temporarily hold memory values in registers or local memory caches. As a consequence, threads running in different processors may see different values for the same memory location!</P>
<LI>
<P class=docList>Compilers can reorder instructions for maximum throughput. Compilers won't choose an ordering that changes the meaning of the code, but they make the assumption that memory values are only changed when there are explicit instructions in the code. However, a memory value can be changed by another thread!</P></LI></UL>
<P class=docText>If you use locks to protect code that can be accessed by multiple threads, then you won't have these problems. Compilers are required to respect locks by flushing local caches as necessary and not inappropriately reordering instructions. The details are explained in the Java Memory Model and Thread Specification developed by JSR 133 (see <A class=docLink href="http://www.jcp.org/en/jsr/detail?id=133" target=_blank>http://www.jcp.org/en/jsr/detail?id=133</A>). Much of the specification is highly complex and technical, but the document also contains a number of clearly explained examples. A more accessible overview article by Brian Goetz is available at <A class=docLink href="http://www-106.ibm.com/developerworks/java/library/j-jtp02244.html" target=_blank>http://www-106.ibm.com/developerworks/java/library/j-jtp02244.html</A>.<A name=ch01index224></A><A name=ch01index225></A><A name=ch01index226></A></P><A name=ch01note17></A>
<DIV class=docNote>
<P class=docNoteTitle>NOTE</P>
<P>
<TABLE cellSpacing=0 cellPadding=1 width="90%" border=0>
<TBODY>
<TR>
<TD vAlign=top width=60><IMG height=41 alt="" src="mk:@MSITStore:D:\ebooks\Core%20Java%202%20Volume%202\Prentice%20Hall%20PTR%20-%20Core%20Java%202%20Volume%20II%207th%20Edition.chm::/0131118269/images/0131118269/graphics/note_icon.gif;380137" width=40 align=left border=0></TD>
<TD vAlign=top>
<P class=docText>Brian Goetz coined the following "synchronization motto": "If you write a variable which may next be read by another thread, or you read a variable which may have last been written by another thread, you must use synchronization."<A name=ch01index227></A></P></TD></TR></TBODY></TABLE></P></DIV><BR>
<P class=docText>The <TT><FONT style="BACKGROUND-COLOR: #316ac5" color=#ffffff>volatile</FONT></TT> keyword offers a lock-free mechanism for synchronizing access to an instance field. If you declare a field as <TT><FONT style="BACKGROUND-COLOR: #316ac5" color=#ffffff>volatile</FONT></TT>, then the compiler and the virtual machine take into account that the field may be concurrently updated by another thread.<A name=ch01index228></A><A name=ch01index229></A></P>
<P class=docText>For example, suppose an object has a <TT>boolean</TT> flag <TT>done</TT> that is set by one thread and queried by another thread. You have two choices:</P>
<DIV style="FONT-WEIGHT: bold">
<OL class=docList type=1>
<LI>
<DIV style="FONT-WEIGHT: normal">
<P class=docList>Use a lock, for example:</P><PRE>public <SPAN class=docEmphStrong>synchronized</SPAN> boolean isDone() { return done; }
private boolean done;
</PRE><BR>
<P class=docList>(This approach has a potential drawback: the <TT>isDone</TT> method can block if another thread has locked the object.)</P></DIV>
<LI>
<DIV style="FONT-WEIGHT: normal">
<P class=docList>Declare the field as <TT><FONT style="BACKGROUND-COLOR: #316ac5" color=#ffffff>volatile</FONT></TT>:</P><PRE>public boolean isDone() { return done; }
private <SPAN class=docEmphStrong><FONT style="BACKGROUND-COLOR: #316ac5" color=#ffffff>volatile</FONT></SPAN> boolean done;
</PRE><BR></DIV></LI></OL></DIV>
<P class=docText>Of course, accessing a <FONT style="BACKGROUND-COLOR: #316ac5" color=#ffffff>volatile</FONT> variable will be slower than accessing a regular variablethat is the price to pay for thread safety.</P><A name=ch01note18></A>
<DIV class=docNote>
<P class=docNoteTitle>NOTE</P>
<P>
<TABLE cellSpacing=0 cellPadding=1 width="90%" border=0>
<TBODY>
<TR>
<TD vAlign=top width=60><IMG height=41 alt="" src="mk:@MSITStore:D:\ebooks\Core%20Java%202%20Volume%202\Prentice%20Hall%20PTR%20-%20Core%20Java%202%20Volume%20II%207th%20Edition.chm::/0131118269/images/0131118269/graphics/note_icon.gif;380137" width=40 align=left border=0></TD>
<TD vAlign=top>
<P class=docText>Prior to JDK 5.0, the semantics of <TT><FONT style="BACKGROUND-COLOR: #316ac5" color=#ffffff>volatile</FONT></TT> were rather permissive. The language designers attempted to give implementors leeway in optimizing the performance of code that uses <FONT style="BACKGROUND-COLOR: #316ac5" color=#ffffff>volatile</FONT> fields. However, the old specification was so complex that implementors didn't always follow it, and it allowed confusing and undesirable behavior, such as immutable objects that weren't truly immutable.</P></TD></TR></TBODY></TABLE></P></DIV><BR>
<P class=docText>In summary, concurrent access to a field is safe in these three conditions:<A name=ch01index230></A><A name=ch01index231></A><A name=ch01index232></A><A name=ch01index233></A></P>
<UL>
<LI>
<P class=docList>The field is <TT><FONT style="BACKGROUND-COLOR: #316ac5" color=#ffffff>volatile</FONT></TT>.</P>
<LI>
<P class=docList>The field is <TT>final</TT>, and it is accessed after the constructor has completed.</P>
<LI>
<P class=docList>The field access is protected by a lock.</P></LI></UL><img src ="http://www.blogjava.net/raymondchen625/aggbug/31476.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/raymondchen625/" target="_blank">Raymond的Java笔记</a> 2006-02-19 15:58 <a href="http://www.blogjava.net/raymondchen625/archive/2006/02/19/31476.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在lucene实现按关键字出现次数排序的列表</title><link>http://www.blogjava.net/raymondchen625/archive/2006/02/04/29526.html</link><dc:creator>Raymond的Java笔记</dc:creator><author>Raymond的Java笔记</author><pubDate>Sat, 04 Feb 2006 06:26:00 GMT</pubDate><guid>http://www.blogjava.net/raymondchen625/archive/2006/02/04/29526.html</guid><wfw:comment>http://www.blogjava.net/raymondchen625/comments/29526.html</wfw:comment><comments>http://www.blogjava.net/raymondchen625/archive/2006/02/04/29526.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/raymondchen625/comments/commentRss/29526.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/raymondchen625/services/trackbacks/29526.html</trackback:ping><description><![CDATA[需求： 在lucene索引中建立了很多关键字的索引，想获得一个当前用户的关键字列表，并且每个关键字还带有使用了多少次的信息。<BR><BR>解决方法：<BR>使用自定义的HitCollector对象，代码如下 
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #0000ff">import</SPAN><SPAN style="COLOR: #000000">&nbsp;java.io.IOException;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">import</SPAN><SPAN style="COLOR: #000000">&nbsp;java.util.ArrayList;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">import</SPAN><SPAN style="COLOR: #000000">&nbsp;java.util.Collections;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">import</SPAN><SPAN style="COLOR: #000000">&nbsp;java.util.HashMap;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">import</SPAN><SPAN style="COLOR: #000000">&nbsp;java.util.Iterator;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">import</SPAN><SPAN style="COLOR: #000000">&nbsp;java.util.Set;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">import</SPAN><SPAN style="COLOR: #000000">&nbsp;org.apache.lucene.document.Document;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">import</SPAN><SPAN style="COLOR: #000000">&nbsp;org.apache.lucene.search.HitCollector;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">import</SPAN><SPAN style="COLOR: #000000">&nbsp;org.apache.lucene.search.IndexSearcher;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><BR><IMG id=Codehighlighter1_347_1561_Open_Image onclick="this.style.display='none'; Codehighlighter1_347_1561_Open_Text.style.display='none'; Codehighlighter1_347_1561_Closed_Image.style.display='inline'; Codehighlighter1_347_1561_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_347_1561_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_347_1561_Closed_Text.style.display='none'; Codehighlighter1_347_1561_Open_Image.style.display='inline'; Codehighlighter1_347_1561_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000">&nbsp;TagCollector&nbsp;</SPAN><SPAN style="COLOR: #0000ff">extends</SPAN><SPAN style="COLOR: #000000">&nbsp;HitCollector&nbsp;</SPAN><SPAN id=Codehighlighter1_347_1561_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_347_1561_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">private</SPAN><SPAN style="COLOR: #000000">&nbsp;IndexSearcher&nbsp;searcher;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">private</SPAN><SPAN style="COLOR: #000000">&nbsp;HashMap</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">String,Integer</SPAN><SPAN style="COLOR: #000000">&gt;</SPAN><SPAN style="COLOR: #000000">&nbsp;tagList</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;HashMap</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">String,Integer</SPAN><SPAN style="COLOR: #000000">&gt;</SPAN><SPAN style="COLOR: #000000">();<BR><IMG id=Codehighlighter1_499_528_Open_Image onclick="this.style.display='none'; Codehighlighter1_499_528_Open_Text.style.display='none'; Codehighlighter1_499_528_Closed_Image.style.display='inline'; Codehighlighter1_499_528_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_499_528_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_499_528_Closed_Text.style.display='none'; Codehighlighter1_499_528_Open_Image.style.display='inline'; Codehighlighter1_499_528_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;TagCollector(IndexSearcher&nbsp;searcher)&nbsp;</SPAN><SPAN id=Codehighlighter1_499_528_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_499_528_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">this</SPAN><SPAN style="COLOR: #000000">.searcher</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">searcher;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;@Override<BR><IMG id=Codehighlighter1_586_847_Open_Image onclick="this.style.display='none'; Codehighlighter1_586_847_Open_Text.style.display='none'; Codehighlighter1_586_847_Closed_Image.style.display='inline'; Codehighlighter1_586_847_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_586_847_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_586_847_Closed_Text.style.display='none'; Codehighlighter1_586_847_Open_Image.style.display='inline'; Codehighlighter1_586_847_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;collect(</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;docID,&nbsp;</SPAN><SPAN style="COLOR: #0000ff">float</SPAN><SPAN style="COLOR: #000000">&nbsp;score)&nbsp;</SPAN><SPAN id=Codehighlighter1_586_847_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_586_847_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG id=Codehighlighter1_594_791_Open_Image onclick="this.style.display='none'; Codehighlighter1_594_791_Open_Text.style.display='none'; Codehighlighter1_594_791_Closed_Image.style.display='inline'; Codehighlighter1_594_791_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_594_791_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_594_791_Closed_Text.style.display='none'; Codehighlighter1_594_791_Open_Image.style.display='inline'; Codehighlighter1_594_791_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">try</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN id=Codehighlighter1_594_791_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_594_791_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Document&nbsp;doc</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">searcher.doc(docID);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String[]&nbsp;tagValues</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">doc.getValues(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">tag</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><IMG id=Codehighlighter1_701_787_Open_Image onclick="this.style.display='none'; Codehighlighter1_701_787_Open_Text.style.display='none'; Codehighlighter1_701_787_Closed_Image.style.display='inline'; Codehighlighter1_701_787_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_701_787_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_701_787_Closed_Text.style.display='none'; Codehighlighter1_701_787_Open_Image.style.display='inline'; Codehighlighter1_701_787_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">&nbsp;(tagValues</SPAN><SPAN style="COLOR: #000000">!=</SPAN><SPAN style="COLOR: #0000ff">null</SPAN><SPAN style="COLOR: #000000">)&nbsp;</SPAN><SPAN id=Codehighlighter1_701_787_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_701_787_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG id=Codehighlighter1_744_782_Open_Image onclick="this.style.display='none'; Codehighlighter1_744_782_Open_Text.style.display='none'; Codehighlighter1_744_782_Closed_Image.style.display='inline'; Codehighlighter1_744_782_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_744_782_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_744_782_Closed_Text.style.display='none'; Codehighlighter1_744_782_Open_Image.style.display='inline'; Codehighlighter1_744_782_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">for</SPAN><SPAN style="COLOR: #000000">&nbsp;(</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;i</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">;i</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">tagValues.length;i</SPAN><SPAN style="COLOR: #000000">++</SPAN><SPAN style="COLOR: #000000">)&nbsp;</SPAN><SPAN id=Codehighlighter1_744_782_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_744_782_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addTagCount(tagValues[i]);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG id=Codehighlighter1_815_843_Open_Image onclick="this.style.display='none'; Codehighlighter1_815_843_Open_Text.style.display='none'; Codehighlighter1_815_843_Closed_Image.style.display='inline'; Codehighlighter1_815_843_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_815_843_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_815_843_Closed_Text.style.display='none'; Codehighlighter1_815_843_Open_Image.style.display='inline'; Codehighlighter1_815_843_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">catch</SPAN><SPAN style="COLOR: #000000">&nbsp;(IOException&nbsp;e)&nbsp;</SPAN><SPAN id=Codehighlighter1_815_843_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_815_843_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<BR><IMG id=Codehighlighter1_893_1025_Open_Image onclick="this.style.display='none'; Codehighlighter1_893_1025_Open_Text.style.display='none'; Codehighlighter1_893_1025_Closed_Image.style.display='inline'; Codehighlighter1_893_1025_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_893_1025_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_893_1025_Closed_Text.style.display='none'; Codehighlighter1_893_1025_Open_Image.style.display='inline'; Codehighlighter1_893_1025_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">private</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;addTagCount(String&nbsp;tagName)&nbsp;</SPAN><SPAN id=Codehighlighter1_893_1025_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_893_1025_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;count</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">1</SPAN><SPAN style="COLOR: #000000">;<BR><IMG id=Codehighlighter1_946_992_Open_Image onclick="this.style.display='none'; Codehighlighter1_946_992_Open_Text.style.display='none'; Codehighlighter1_946_992_Closed_Image.style.display='inline'; Codehighlighter1_946_992_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_946_992_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_946_992_Closed_Text.style.display='none'; Codehighlighter1_946_992_Open_Image.style.display='inline'; Codehighlighter1_946_992_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">&nbsp;(tagList.containsKey(tagName))&nbsp;</SPAN><SPAN id=Codehighlighter1_946_992_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_946_992_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">(Integer)tagList.get(tagName)</SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000">1</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tagList.put(tagName,count);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<BR><IMG id=Codehighlighter1_1074_1095_Open_Image onclick="this.style.display='none'; Codehighlighter1_1074_1095_Open_Text.style.display='none'; Codehighlighter1_1074_1095_Closed_Image.style.display='inline'; Codehighlighter1_1074_1095_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_1074_1095_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1074_1095_Closed_Text.style.display='none'; Codehighlighter1_1074_1095_Open_Image.style.display='inline'; Codehighlighter1_1074_1095_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;HashMap</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">String,Integer</SPAN><SPAN style="COLOR: #000000">&gt;</SPAN><SPAN style="COLOR: #000000">&nbsp;getTagList()&nbsp;</SPAN><SPAN id=Codehighlighter1_1074_1095_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_1074_1095_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000">&nbsp;tagList;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;@SuppressWarnings(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">unchecked</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">)<BR><IMG id=Codehighlighter1_1197_1556_Open_Image onclick="this.style.display='none'; Codehighlighter1_1197_1556_Open_Text.style.display='none'; Codehighlighter1_1197_1556_Closed_Image.style.display='inline'; Codehighlighter1_1197_1556_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_1197_1556_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1197_1556_Closed_Text.style.display='none'; Codehighlighter1_1197_1556_Open_Image.style.display='inline'; Codehighlighter1_1197_1556_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;ArrayList</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">TagSummary</SPAN><SPAN style="COLOR: #000000">&gt;</SPAN><SPAN style="COLOR: #000000">&nbsp;getSortedTagList(</SPAN><SPAN style="COLOR: #0000ff">boolean</SPAN><SPAN style="COLOR: #000000">&nbsp;ascending)&nbsp;</SPAN><SPAN id=Codehighlighter1_1197_1556_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_1197_1556_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ArrayList</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">TagSummary</SPAN><SPAN style="COLOR: #000000">&gt;</SPAN><SPAN style="COLOR: #000000">&nbsp;list</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;ArrayList</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">TagSummary</SPAN><SPAN style="COLOR: #000000">&gt;</SPAN><SPAN style="COLOR: #000000">();<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Iterator&nbsp;keyIterator</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">tagList.keySet().iterator();<BR><IMG id=Codehighlighter1_1341_1458_Open_Image onclick="this.style.display='none'; Codehighlighter1_1341_1458_Open_Text.style.display='none'; Codehighlighter1_1341_1458_Closed_Image.style.display='inline'; Codehighlighter1_1341_1458_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_1341_1458_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1341_1458_Closed_Text.style.display='none'; Codehighlighter1_1341_1458_Open_Image.style.display='inline'; Codehighlighter1_1341_1458_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">while</SPAN><SPAN style="COLOR: #000000">&nbsp;(keyIterator.hasNext())&nbsp;</SPAN><SPAN id=Codehighlighter1_1341_1458_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_1341_1458_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;key</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">(String)keyIterator.next();<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;value</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">tagList.get(key);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list.add(</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;TagSummary(key,value));<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Collections.sort(list);<BR><IMG id=Codehighlighter1_1504_1538_Open_Image onclick="this.style.display='none'; Codehighlighter1_1504_1538_Open_Text.style.display='none'; Codehighlighter1_1504_1538_Closed_Image.style.display='inline'; Codehighlighter1_1504_1538_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_1504_1538_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1504_1538_Closed_Text.style.display='none'; Codehighlighter1_1504_1538_Open_Image.style.display='inline'; Codehighlighter1_1504_1538_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">&nbsp;(</SPAN><SPAN style="COLOR: #000000">!</SPAN><SPAN style="COLOR: #000000">ascending)&nbsp;</SPAN><SPAN id=Codehighlighter1_1504_1538_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_1504_1538_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Collections.reverse(list);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000">&nbsp;list;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN></DIV>功能说明： 每个搜索到的hits，都会调用这个方法的collect方法，因此可以在这个对象当中放一个HashMap，累计记录每个关键字得到的次数。<BR><BR>排序部分用另外的一个TagSummary类来获得，这里就不详细给出了。<BR><BR>问题： 这是一个直观的方法，但是相信频繁调用这样的方法会造成服务器的严重负担。可以考虑一下用缓存的方法，在没有关键字未曾发生改变之前，只在第一次调用这样的方法，之后把结果缓存在数据表或者内存当中。有更新的时候，通过版本号对比以决定是否需要更新。<img src ="http://www.blogjava.net/raymondchen625/aggbug/29526.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/raymondchen625/" target="_blank">Raymond的Java笔记</a> 2006-02-04 14:26 <a href="http://www.blogjava.net/raymondchen625/archive/2006/02/04/29526.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Resin + Struts 的中文乱码问题解决</title><link>http://www.blogjava.net/raymondchen625/archive/2006/01/19/28708.html</link><dc:creator>Raymond的Java笔记</dc:creator><author>Raymond的Java笔记</author><pubDate>Thu, 19 Jan 2006 15:28:00 GMT</pubDate><guid>http://www.blogjava.net/raymondchen625/archive/2006/01/19/28708.html</guid><wfw:comment>http://www.blogjava.net/raymondchen625/comments/28708.html</wfw:comment><comments>http://www.blogjava.net/raymondchen625/archive/2006/01/19/28708.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/raymondchen625/comments/commentRss/28708.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/raymondchen625/services/trackbacks/28708.html</trackback:ping><description><![CDATA[问题：<BR>使用Struts的ActionForm接收到的中文全部是乱码，例如提交过去的“测试”字符串，得到的是“??????è????”。开头以为是传统的encoding识别的问题，但是用各种编码重新构造得到的byte[]数组，依然无法得到正确的中文。但是如果用普通的jsp来接收form的数据，中文是完全正常的。<BR>我开始觉得是struts的流程当中，错误地使用了编码，以至最后得到的结果完全乱了。搜索了好多文章，总算找到一个比较接近的。<BR>解决方法：<BR>定义一个filter，filter只做一件事情，就是：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;request.setCharacterEncoding("UTF-8");<BR>在web.xml的filter mapping里,设定和struts的action同样的mapping。<BR><BR>解释： Filter最先拦截web请求，在这里设置了正确的CharacterEncoding，接下来各个处理的组件就不会搞错了。在没有Filter的情况下，我的resin服务器上获得的是null，估计struts不同的处理组件对null的解释和处理不太一致，导致错误的产生。<BR><BR>要注意我所有页面都是UTF-8编码，所以在filter里面定义了UTF-8，如果是其它的编码，这里应该相应改一下。<img src ="http://www.blogjava.net/raymondchen625/aggbug/28708.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/raymondchen625/" target="_blank">Raymond的Java笔记</a> 2006-01-19 23:28 <a href="http://www.blogjava.net/raymondchen625/archive/2006/01/19/28708.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java判定字符是否中文</title><link>http://www.blogjava.net/raymondchen625/archive/2006/01/17/28293.html</link><dc:creator>Raymond的Java笔记</dc:creator><author>Raymond的Java笔记</author><pubDate>Tue, 17 Jan 2006 04:09:00 GMT</pubDate><guid>http://www.blogjava.net/raymondchen625/archive/2006/01/17/28293.html</guid><wfw:comment>http://www.blogjava.net/raymondchen625/comments/28293.html</wfw:comment><comments>http://www.blogjava.net/raymondchen625/archive/2006/01/17/28293.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/raymondchen625/comments/commentRss/28293.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/raymondchen625/services/trackbacks/28293.html</trackback:ping><description><![CDATA[判断一个字符是否中文，今天查API找到一个方法，代码如下：&nbsp;&nbsp;&nbsp;<BR><BR><BR>&nbsp;&nbsp; System.out.println(Character.UnicodeBlock.of('琴'));<BR>&nbsp;&nbsp; System.out.println(Character.UnicodeBlock.of('j'));<BR>&nbsp;&nbsp; System.out.println(Character.UnicodeBlock.of(3267));<BR><BR>运行结果：<BR>CJK_UNIFIED_IDEOGRAPHS<BR>BASIC_LATIN<BR>KANNADA<BR><BR>其实不完全够用，因为如果得到“CJK_UNIFIED_IDEOGRAPHS”，还可能是日文或者韩文。不过对我的需求是足够了。如果要准确判断中文，去查一下unicode代码就可以了。<BR><BR><img src ="http://www.blogjava.net/raymondchen625/aggbug/28293.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/raymondchen625/" target="_blank">Raymond的Java笔记</a> 2006-01-17 12:09 <a href="http://www.blogjava.net/raymondchen625/archive/2006/01/17/28293.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>实现队列的JavaScript对象</title><link>http://www.blogjava.net/raymondchen625/archive/2006/01/16/28205.html</link><dc:creator>Raymond的Java笔记</dc:creator><author>Raymond的Java笔记</author><pubDate>Mon, 16 Jan 2006 07:52:00 GMT</pubDate><guid>http://www.blogjava.net/raymondchen625/archive/2006/01/16/28205.html</guid><wfw:comment>http://www.blogjava.net/raymondchen625/comments/28205.html</wfw:comment><comments>http://www.blogjava.net/raymondchen625/archive/2006/01/16/28205.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/raymondchen625/comments/commentRss/28205.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/raymondchen625/services/trackbacks/28205.html</trackback:ping><description><![CDATA[function Queue(size) {<BR>&nbsp;this.size=size;<BR>&nbsp;this.data=new Array();<BR>&nbsp;this.add=function(ele) {<BR>&nbsp;&nbsp;if (this.data.length&lt;this.size) {<BR>&nbsp;&nbsp;&nbsp;this.data[this.data.length]=ele;<BR>&nbsp;&nbsp;} else {<BR>&nbsp;&nbsp;&nbsp;this.data.shift();<BR>&nbsp;&nbsp;&nbsp;this.data[this.data.length]=ele;<BR>&nbsp;&nbsp;}<BR>&nbsp;};<BR>&nbsp;this.getData=function() {<BR>&nbsp;&nbsp;return this.data;<BR>&nbsp;};<BR>&nbsp;this.toCookieValue=function(delimiter) {<BR>&nbsp;&nbsp;var result='';<BR>&nbsp;&nbsp;for (var i=0;i&lt;this.data.length ;i++ )<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;if(i==0) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;result=escape(this.data[i]);<BR>&nbsp;&nbsp;&nbsp;} else {<BR>&nbsp;&nbsp;&nbsp;&nbsp;result+=delimiter+escape(this.data[i]);<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;return result;<BR>&nbsp;};<BR>}<BR><img src ="http://www.blogjava.net/raymondchen625/aggbug/28205.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/raymondchen625/" target="_blank">Raymond的Java笔记</a> 2006-01-16 15:52 <a href="http://www.blogjava.net/raymondchen625/archive/2006/01/16/28205.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Resin 编译的奇怪问题解决</title><link>http://www.blogjava.net/raymondchen625/archive/2006/01/13/27945.html</link><dc:creator>Raymond的Java笔记</dc:creator><author>Raymond的Java笔记</author><pubDate>Fri, 13 Jan 2006 08:05:00 GMT</pubDate><guid>http://www.blogjava.net/raymondchen625/archive/2006/01/13/27945.html</guid><wfw:comment>http://www.blogjava.net/raymondchen625/comments/27945.html</wfw:comment><comments>http://www.blogjava.net/raymondchen625/archive/2006/01/13/27945.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/raymondchen625/comments/commentRss/27945.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/raymondchen625/services/trackbacks/27945.html</trackback:ping><description><![CDATA[使用Resin 3.0开发，很奇怪Eclipse在启动了remote debug，然后加断点的时候说我的类没有加行号。我找遍了选项，明明是加了行号的呀。甚至我在一个必定会走过的类前面加个log打出来，路照走了，居然在console不见log。百思不得其解，快崩溃之前。终于想起了临时目录。<BR><BR>Resin默认总是在WEB-INF下面生成work和tmp目录，是放jsp编译而成的类的。我把这两个目录删除了。一切正常，断点也可以加了。<BR><BR>原因： 应该是resin在判断类是否需要重新编译时有点问题，对于我jsp里面有使用到的类发生变化以后，调用它的jsp文件没有重新编译。导致类文件不更新，连带就出了一堆古怪的错误。<BR><BR>下次记住了，有问题，先删临时目录！<img src ="http://www.blogjava.net/raymondchen625/aggbug/27945.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/raymondchen625/" target="_blank">Raymond的Java笔记</a> 2006-01-13 16:05 <a href="http://www.blogjava.net/raymondchen625/archive/2006/01/13/27945.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>