<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>borball</title>
    <description></description>
    <link>http://borball.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>第一次私活经历(1)</title>
        <author>borball</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://borball.javaeye.com">borball</a>&nbsp;
          链接：<a href="http://borball.javaeye.com/blog/207369" style="color:red;">http://borball.javaeye.com/blog/207369</a>&nbsp;
          发表时间: 2008年06月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;&nbsp;07年11月份，朋友介绍了一个项目给我，于是相当于做了人生中的第一个私活。<br />
&nbsp;&nbsp;我和朋友（D）还有一个服装店老板（下面称谓Z）在一个烧烤店第一次见面，当时已经很晚了，大概晚上11点多，边吃边了，<br />
之前也没多少准备，就问烧烤店老板要了一张纸一支笔在那个比较油腻的桌子上开始了需求调研。<br />
&nbsp;&nbsp;感觉Z对目前店铺经营的方式不是很满意，目前他们基本上还处于人工开单，人工计算利润和库存管理阶段，最多加一些网上下载的<br />
辅助型的工具。随着店面扩大，分店扩张，她感觉越来越力不从心，每年因为认为错误的库存丢失或者压货都在一个无法想象的程度，<br />
如果不马上改变，就没有办法继续扩大经营，并且可能损失越来越多。我的第一感觉是这就是个简单的进销存系统，应该不难实现，于是就<br />
答应接手做这个东西。<br />
&nbsp;&nbsp;随后的一段时间又继续和他们的经理(Y)继续做了一些沟通，他们希望保留现在的一些营业模式，他们的营业模式有很多特别之处，这里举几个例子。<br />
&nbsp;&nbsp;1.他们进货渠道很多，大部分衣服没有条码，有条码的基本上也没有按照规则来做，如果由系统同意管理的话，需要重新制定条码规则，<br />
&nbsp;&nbsp;&nbsp;并且提供打印条码的功能。<br />
&nbsp;&nbsp;2.他们自己的员工需要在条码里面看到进货价和卖出价。<br />
&nbsp;&nbsp;3.如果商品价格大于100，则实际付钱时候减免10元，小于100，减免5元。<br />
&nbsp;&nbsp;4.他们有3家分店，分店之间可以互相调仓。<br />
&nbsp;&nbsp;5.退货需要审批。<br />
&nbsp;&nbsp;6.收银时候如果是熟客可能还有一次减免，减免总额多于10元（不包含3里面的减免）也需要审批。</p>
<p>&nbsp;&nbsp;洗澡了，待续<br />
&nbsp;</p>

          <br/><br/>
          <span style="color:red;">
            <a href="http://borball.javaeye.com/blog/207369#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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, 19 Jun 2008 22:37:00 +0800</pubDate>
        <link>http://borball.javaeye.com/blog/207369</link>
        <guid>http://borball.javaeye.com/blog/207369</guid>
      </item>
      <item>
        <title>was的一些概念与操作(2)</title>
        <author>borball</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://borball.javaeye.com">borball</a>&nbsp;
          链接：<a href="http://borball.javaeye.com/blog/207370" style="color:red;">http://borball.javaeye.com/blog/207370</a>&nbsp;
          发表时间: 2008年06月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>如何新建was集群？<br />
<br />
需求:有4台机器,IP分别是192.168.0.10,192.168.0.11,192.168.0.12,192.168.0.13;分别编号为1,2,3,4机器. <br />
&nbsp;&nbsp; 每台机器上有4个server. 3号机器作为部署管理器(DM)</p>
<p>实施:<br />
&nbsp;&nbsp; 1. 在每台机器上建profile.<br />
&nbsp;&nbsp; 机器3:dm类型的,建立方式前面有描述.<br />
&nbsp;&nbsp; 机器1-4:每台机器上要1个或者4个managed类型的profile.<br />
&nbsp;&nbsp; 1个还是4个,可以根据自己情况来定,如果是1个的话,改Node下面需要4个server.如果是4个话,则每个Node下面只需一个server.<br />
&nbsp;&nbsp; 区别不是很大<br />
&nbsp;&nbsp; 2.启动DM节点<br />
&nbsp;&nbsp; ./startManager.sh<br />
&nbsp;&nbsp; 3. 将各个Node加入DM管理,前面也有描述<br />
&nbsp;&nbsp; 在每个profile下面执行 ./addNode 192.168.0.12(3号机IP) 8879<br />
&nbsp;&nbsp; 4.启动各个Node Agent<br />
&nbsp;&nbsp; ./startNode.sh<br />
&nbsp;&nbsp; 5.之后可以登陆到DM的控制台:http://192.168.0.12:9060/ibm/console/secure/logon.do<br />
&nbsp;&nbsp; 6.在控制台上可以新建集群,或者在新建app server什么的.<br />
&nbsp;&nbsp; 7.如果需要的话,需要新建web server,方法比较简单,基本上摸索一下就会了.<br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp; 之后一个was集群就差不多可以使用了</p>
<p>调整参数:<br />
&nbsp;&nbsp; 有几个参数可能需要调整:<br />
&nbsp;&nbsp; 1.web server的max client<br />
&nbsp;&nbsp; 2.web container的线程数<br />
&nbsp;&nbsp; 3.app server的初始和最大堆大小<br />
&nbsp;&nbsp; 4.连接池连接数等<br />
&nbsp;&nbsp; 这几个也是一般性能调优时候需要特别注意的地方.&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp; <br />
&nbsp;&nbsp;</p>

          <br/><br/>
          <span style="color:red;">
            <a href="http://borball.javaeye.com/blog/207370#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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, 19 Jun 2008 22:06:00 +0800</pubDate>
        <link>http://borball.javaeye.com/blog/207370</link>
        <guid>http://borball.javaeye.com/blog/207370</guid>
      </item>
      <item>
        <title>was的一些概念与操作(1)</title>
        <author>borball</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://borball.javaeye.com">borball</a>&nbsp;
          链接：<a href="http://borball.javaeye.com/blog/207371" style="color:red;">http://borball.javaeye.com/blog/207371</a>&nbsp;
          发表时间: 2008年06月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>闲来无事,随便记录了一下was部署管理的一些东西,以免以后忘记.有描述不准的地方,还请专家指正.</p>
<p>1.概要文件(profile)<br />
&nbsp;6.0以后才有的profile,目的是将用户数据和WAS本身的文件分开,这样可以定义多个profile,每个profile相当于一个用户,相当于提供了多用户的支持.<br />
&nbsp;profile命令说明:<br />
&nbsp;新建:<br />
&nbsp;wasprofile.sh -create <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -profileName profile_name <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -profilePath fully_qualified_profile_path <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -templatePath template_path <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -nodeName node_name <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -cellName cell_name <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -hostName host_name <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -server&nbsp; iSeries_server_name<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [-startingPort starting_port | -portsFile filepath]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -winserviceCheck true | false<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -winserviceAccountType specifieduser | localsystem<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -winserviceUserName yourusername<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -winservicePassword yourpassword<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -winserviceStartupType manual | automatic | disabled<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [-debug] <br />
&nbsp;列出现有的概要文件：<br />
&nbsp;# ./wasprofile.sh -listProfiles <br />
&nbsp;删除概要文件：<br />
&nbsp;# ./wasprofile.sh -delete <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -profileName profile_name | -profilePath profile_path <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [-debug]</p>
<p>&nbsp;从路径获取现有概要文件的名称：<br />
&nbsp;# ./wasprofile.sh -getName <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -profilePath profile_path <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [-debug] <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;从名称获取现有概要文件的路径：<br />
&nbsp;# ./wasprofile.sh -getPath <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -profileName profile_name <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [-debug] <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;检查概要文件注册表的完整性：<br />
&nbsp;# ./wasprofile.sh -validateRegistry <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [-debug] <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;检查概要文件注册表的完整性，除去未找到的概要文件：<br />
&nbsp;# ./wasprofile.sh -validateAndUpdateRegistry <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [-backup file_name] <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [-debug]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;举例:<br />
&nbsp;<br />
&nbsp;./wasprofile.sh \<br />
&nbsp;-create -profileName test4sop \<br />
&nbsp;-profilePath /websphere/AppServer/profiles/test4sop \<br />
&nbsp;-templatePath /websphere/AppServer/profileTemplates/default \<br />
&nbsp;-nodeName test4sopnode \<br />
&nbsp;-cellName test4sopcell \<br />
&nbsp;-hostName S2_E_YZ_JKCS</p>
<p>&nbsp;./wasprofile.sh -delete -profileName test4sop&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;<br />
&nbsp;集群profile:<br />
&nbsp;如果应用比较简单,只需要一个server就可以了,新建一default型的profile之后,之后就可以在控制台上做应用部署之类的.<br />
&nbsp;<br />
&nbsp;应用比较复杂时需要构建集群,集群的profile和普通的点不同.<br />
&nbsp;不同在于:<br />
&nbsp;&nbsp;-templatePath /websphere/AppServer/profileTemplates/default \&nbsp; <br />
&nbsp;如果参数是default,说明是普通的单server,<br />
&nbsp;如果是managed,说明该profile是托管的. <br />
&nbsp;如果是dmgr,说明该profile是dm(部署管理器)类型的.<br />
&nbsp;将managed的profile加入dmgr管理需要用命令:<br />
&nbsp;./addMode.sh IP(dm的IP) 8879(如果没有更改的话)<br />
&nbsp;移出的命令:<br />
&nbsp;./removeNode.sh<br />
&nbsp;之后启动DM和Node,就可以在控制台上做集群搭建之类的操作了,此时控制台地址是dm的地址,端口默认是9060.<br />
&nbsp;<br />
2.Cell,Node,Server<br />
&nbsp;Cell是个分组的概念,Cell下面可以有多个Node.<br />
&nbsp;Node相当于一个或者一组server的分组.Node不能跨物理机器.一个Node下面可以有多个server.<br />
&nbsp;Server是实际的处理单元,一个server就是一个J2EE容器.<br />
&nbsp;Node和profile比较类似,基本上等同,不过Node是管理上使用的,profile起基础配置作用,一个profile相当于一个node.<br />
&nbsp;DM是通过Node agent来管理各个server实例的.<br />
</p> 
          <br/><br/>
          <span style="color:red;">
            <a href="http://borball.javaeye.com/blog/207371#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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>Tue, 17 Jun 2008 17:19:00 +0800</pubDate>
        <link>http://borball.javaeye.com/blog/207371</link>
        <guid>http://borball.javaeye.com/blog/207371</guid>
      </item>
      <item>
        <title>1.11 DateUtils.truncate() </title>
        <author>borball</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://borball.javaeye.com">borball</a>&nbsp;
          链接：<a href="http://borball.javaeye.com/blog/207372" style="color:red;">http://borball.javaeye.com/blog/207372</a>&nbsp;
          发表时间: 2006年03月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <font size="2"><font face="Courier New"><font color="#ff0000">Truncating Date Objects</font>(不知如何翻译,<img src="/Emoticons/QQ/11.gif" border="0" height="20" width="20" />)，使用<font size="3"> <tt><font color="#0000ff">DateUtils.truncate()</font></tt></font></font><a name="jakartackbk-CHP-1-ITERM-1886"></a><font face="Courier New"><font color="#0000ff"><font size="3"> </font><br /></font>直接看例子吧<br /></font>
<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: #0000ff"><font face="Courier New">import</font></span><font face="Courier New"><span style="COLOR: #000000">&nbsp;org.apache.commons.lang.time.DateUtils;<br /></span><span style="COLOR: #0000ff">import</span></font><font face="Courier New"><span style="COLOR: #000000">&nbsp;org.apache.commons.lang.time.FastDateFormat;<br /></span><span style="COLOR: #0000ff">import</span></font><font face="Courier New"><span style="COLOR: #000000">&nbsp;org.apache.commons.lang.time.DateFormatUtils;<br /><br />FastDateFormat&nbsp;dtFormat&nbsp;</span><span style="COLOR: #000000">=</span></font><font face="Courier New"><span style="COLOR: #000000">&nbsp;DateFormatUtils.ISO_DATETIME_FORMAT;<br /><br />Date&nbsp;now&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span></font><font face="Courier New"><span style="COLOR: #000000">&nbsp;Date(&nbsp;);<br /><br />Date&nbsp;truncatedMonth&nbsp;</span><span style="COLOR: #000000">=</span></font><font face="Courier New"><span style="COLOR: #000000">&nbsp;DateUtils.truncate(&nbsp;now,&nbsp;Calendar.MONTH&nbsp;);<br />Date&nbsp;truncatedHour&nbsp;</span><span style="COLOR: #000000">=</span></font><font face="Courier New"><span style="COLOR: #000000">&nbsp;DateUtils.truncate(&nbsp;now,&nbsp;Calendar.HOUR&nbsp;);&nbsp;<br /><br />System.out.println(&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Now:&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">+</span></font><font face="Courier New"><span style="COLOR: #000000">&nbsp;dtFormat.format(&nbsp;now&nbsp;)&nbsp;);<br />System.out.println(&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Truncated&nbsp;Month:&nbsp;</span><span style="COLOR: #000000">"</span></font><font face="Courier New"><span style="COLOR: #000000">&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">+</span></font><font face="Courier New"><span style="COLOR: #000000">&nbsp;dtFormat.format(&nbsp;truncatedMonth&nbsp;)&nbsp;);<br />System.out.println(&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Truncated&nbsp;Hour:&nbsp;</span><span style="COLOR: #000000">"</span></font><font face="Courier New"><span style="COLOR: #000000">&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">+</span></font><span style="COLOR: #000000"><font face="Courier New">&nbsp;dtFormat.format(&nbsp;truncatedHour&nbsp;)&nbsp;);<br /></font></span></div>
<p><br /><font face="Courier New">输出为：Now: 2006-03-08T15:19:23<br /></font><font face="Courier New">Truncated Month: 2006-03-01T00:00:00<br /></font><font face="Courier New">Truncated Hour: 2006-03-08T15:00:00<br /><br />由例子可以得知DateUtils.truncate()相当于舍弃我们不关心的Date fields。如某Date需要truncate到hour，则hour以后的fields如Calender.MINUTE,Calender.SECOND和Calender.MILLISECOND都将被舍弃。</font></p></font>
          <br/><br/>
          <span style="color:red;">
            <a href="http://borball.javaeye.com/blog/207372#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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>Wed, 08 Mar 2006 15:17:00 +0800</pubDate>
        <link>http://borball.javaeye.com/blog/207372</link>
        <guid>http://borball.javaeye.com/blog/207372</guid>
      </item>
      <item>
        <title>1.10 DateUtils.round() </title>
        <author>borball</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://borball.javaeye.com">borball</a>&nbsp;
          链接：<a href="http://borball.javaeye.com/blog/207373" style="color:red;">http://borball.javaeye.com/blog/207373</a>&nbsp;
          发表时间: 2006年03月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <font color="#ff0000"><font size="2">日期取整（日期精度调节，如调节至秒/分等）<br /></font><font color="#000000"><font size="2">问题提出：日期取整<br />解决方法：使用DateUtils。<font face="Courier New">DateUtils.round()</font></font><a name="jakartackbk-CHP-1-ITERM-1881"></a><font size="2" face="Courier New"> </font><a name="jakartackbk-CHP-1-ITERM-1882"></a><font size="2" face="Courier New">can round to almost every&nbsp;Calender field,&nbsp;包括Calender.YEAR,Calendar.SECOND,Calendar.MINUTE,Calendar.HOUR,Calendar.DAY_OF_MONTH,Calendar.MONTH.<br />使用举例：<br /><font color="#ff0000">&nbsp;</font> 
<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: #0000ff">import</span><span style="COLOR: #000000">&nbsp;org.apache.commons.lang.time.FastDateFormat;<br /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&nbsp;org.apache.commons.lang.time.DateFormatUtils;<br /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&nbsp;org.apache.commons.lang.time.DateUtils;<br /><br />FastDateFormat&nbsp;dtFormat&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;DateFormatUtils.ISO_DATETIME_FORMAT;<br /><br />Date&nbsp;now&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;Date(&nbsp;);<br /><br />Date&nbsp;nearestHour&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;DateUtils.round(&nbsp;now,&nbsp;Calendar.HOUR&nbsp;);<br />Date&nbsp;nearestDay&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;DateUtils.round(&nbsp;now,&nbsp;Calendar.DAY_OF_MONTH&nbsp;);<br />Date&nbsp;nearestYear&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;DateUtils.round(&nbsp;now,&nbsp;Calendar.YEAR&nbsp;);<br /><br />System.out.println(&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Now:&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;dtFormat.format(&nbsp;now&nbsp;)&nbsp;);<br />System.out.println(&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Nearest&nbsp;Hour:&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;dtFormat.format(&nbsp;nearestHour&nbsp;)&nbsp;);<br />System.out.println(&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Nearest&nbsp;Day:&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;dtFormat.format(&nbsp;nearestDay&nbsp;)&nbsp;);<br />System.out.println(&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Nearest&nbsp;Year:&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;dtFormat.format(&nbsp;nearestYear&nbsp;)&nbsp;);</span></div><br />DateUtils.round()相当于数学中的四舍五入法取整，而DateUtils.truncate()相当与去余法取整。</font></font></font>
          <br/><br/>
          <span style="color:red;">
            <a href="http://borball.javaeye.com/blog/207373#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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>Wed, 08 Mar 2006 14:55:00 +0800</pubDate>
        <link>http://borball.javaeye.com/blog/207373</link>
        <guid>http://borball.javaeye.com/blog/207373</guid>
      </item>
      <item>
        <title>1.9 FastDateFormat,DateFormatUtils</title>
        <author>borball</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://borball.javaeye.com">borball</a>&nbsp;
          链接：<a href="http://borball.javaeye.com/blog/207374" style="color:red;">http://borball.javaeye.com/blog/207374</a>&nbsp;
          发表时间: 2006年03月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font color="#ff0000"><font size="2">格式化日期<br /></font></font><font color="#000000"><font size="2">问题提出：</font></font><font size="2"><font face="Courier New">SimpleDateFormat是非线程安全的，而您又需要一个ISO格式的日期。<br /></font><font face="Times New Roman">解决方法：使用</font><font face="Courier New">FastDateFormat或者使用DateFormatUtils提供的静态FastDateFormat实例，它提供了一些格式化日期的线程安全的方法。<br /></font></font><font face="Times New Roman">使用举例：<br /></font></p>
<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="/Images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;Date&nbsp;now&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;Date();<br /><img src="/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;isoDT&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;DateFormatUtils.ISO_DATETIME_TIME_ZONE_FORMAT.format(now);<br /><img src="/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">It&nbsp;is&nbsp;currently:&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;isoDT);</span></div><font size="2">结果为It is currently: 2006-03-08T10:44:29+08:00<br />如果您想使用传统的格式化类型，可以用</font><font face="Courier New"><font size="2">FastDateFormat来代替SimpleDateFormat，<br /></font>
<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"><font size="2"><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;create&nbsp;a&nbsp;formatter&nbsp;that&nbsp;simply&nbsp;prints&nbsp;the&nbsp;year&nbsp;and&nbsp;month</span></font><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000"><br /><font size="2">FastDateFormat&nbsp;formatter&nbsp;</font></span><span style="COLOR: #000000"><font size="2">=</font></span><font size="2"><span style="COLOR: #000000">&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;FastDateFormat(&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">yyyy-mm</span><span style="COLOR: #000000">"</span></font><font size="2"><span style="COLOR: #000000">,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TimeZone.getDefault(&nbsp;),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Locale.getDefault(&nbsp;)&nbsp;);<br /><br />String&nbsp;output&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;formatter.format(&nbsp;</span><span style="COLOR: #0000ff">new</span></font><span style="COLOR: #000000"><font size="2">&nbsp;Date(&nbsp;)&nbsp;);<br /><br />System.out.println(output);<br /></font></span></div><font size="2">在最新的版本中FastDateFormat的构造函数已经改为protected，统一使用getInstance()来获取FastDateFormat实例,上述的输出为2006-03.<br />Discussion:In fact, you should be aware that none of the Sun formatting classes are thread-safe.</font><font size="3"> </font><font size="2">以下是DateFormatUtils里面提供的Static date/time formats。<br />
<table rules="all" cellspacing="0" border="1" cellpadding="4" width="56%">
<thead>
<tr>
<th class="thead">
<p class="docText">Name</p></th>
<th class="thead">
<p class="docText">Format</p></th></tr></thead>
<tbody>
<tr>
<td class="docTableCell">
<p class="docText"><tt>ISO_DATE_FORMAT</tt></p></td>
<td class="docTableCell">
<p class="docText"><tt>yyyy-MM-dd"2004-01-02</tt>"</p></td></tr>
<tr>
<td class="docTableCell">
<p class="docText"><tt>ISO_DATE_TIME_ZONE_FORMAT</tt></p></td>
<td class="docTableCell">
<p class="docText"><tt>yyyy-MM-ddZZ"2004-01-02-07:00</tt>"</p></td></tr>
<tr>
<td class="docTableCell">
<p class="docText"><tt>ISO_DATETIME_FORMAT</tt></p></td>
<td class="docTableCell">
<p class="docText"><tt>yyyy-MM-dd'T'HH:mm:ss"2004-01-02T23:22:12</tt>"</p></td></tr>
<tr>
<td class="docTableCell">
<p class="docText"><tt>ISO_DATETIME_TIME_ZONE_FORMAT</tt></p></td>
<td class="docTableCell">
<p class="docText"><tt>yyyy-MM-dd'T'HH:mm:ssZZ"2004-01-02T21:13:45-07:00</tt>"</p></td></tr>
<tr>
<td class="docTableCell">
<p class="docText"><tt>ISO_TIME_FORMAT</tt></p></td>
<td class="docTableCell">
<p class="docText">'<tt>T'HH:mm:ss"T04:23:22</tt>"</p></td></tr>
<tr>
<td class="docTableCell">
<p class="docText"><tt>ISO_TIME_NO_T_FORMAT</tt></p></td>
<td class="docTableCell">
<p class="docText"><tt>HH:mm:ss"05:12:34</tt>"</p></td></tr>
<tr>
<td class="docTableCell">
<p class="docText"><tt>ISO_TIME_NO_T_TIME_ZONE_FORMAT</tt></p></td>
<td class="docTableCell">
<p class="docText"><tt>HH:mm:ssZZ"12:32:22-07:00</tt>"</p></td></tr>
<tr>
<td class="docTableCell">
<p class="docText"><tt>ISO_TIME_TIME_ZONE_FORMAT</tt></p></td>
<td class="docTableCell">
<p class="docText">'<tt>T'HH:mm:ssZZ"T18:23:22-07:00</tt>"</p></td></tr>
<tr>
<td class="docTableCell">
<p class="docText"><tt>SMTP_DATETIME_FORMAT</tt></p></td>
<td class="docTableCell">
<p class="docText"><tt>EEE, dd MMM yyyy HH:mm:ss Z"Wed, 01 Feb 2004 20:03:01 CST</tt>"</p></td></tr></tbody></table></font></font>
          <br/><br/>
          <span style="color:red;">
            <a href="http://borball.javaeye.com/blog/207374#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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>Wed, 08 Mar 2006 11:38:00 +0800</pubDate>
        <link>http://borball.javaeye.com/blog/207374</link>
        <guid>http://borball.javaeye.com/blog/207374</guid>
      </item>
      <item>
        <title>1.8 ArrayUtils.toMap() </title>
        <author>borball</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://borball.javaeye.com">borball</a>&nbsp;
          链接：<a href="http://borball.javaeye.com/blog/207375" style="color:red;">http://borball.javaeye.com/blog/207375</a>&nbsp;
          发表时间: 2006年03月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <font size="2" color="#ff0000">从多维数组里构造一个map<br /><font color="#000000">问题提出：需要构造一个和数组等价的map<br />解决方法：使用<font face="Courier New">ArrayUtils.toMap()</font><a name="jakartackbk-CHP-1-ITERM-1863"></a><font size="3"> </font><font size="2">方法构造一个和二维数组(<font face="Courier New">object[]</font>)等价的map。<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: #0000ff">import</span><span style="COLOR: #000000">&nbsp;org.apache.commons.lang.ArrayUtils;<br /><br />Object[]&nbsp;weightArray&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;Object[][]&nbsp;{&nbsp;{</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">H</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;,&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;Double(&nbsp;</span><span style="COLOR: #000000">1.007</span><span style="COLOR: #000000">)},<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">He</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;Double(&nbsp;</span><span style="COLOR: #000000">4.002</span><span style="COLOR: #000000">)},<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Li</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;Double(&nbsp;</span><span style="COLOR: #000000">6.941</span><span style="COLOR: #000000">)},<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Be</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;Double(&nbsp;</span><span style="COLOR: #000000">9.012</span><span style="COLOR: #000000">)},<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">B</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;Double(</span><span style="COLOR: #000000">10.811</span><span style="COLOR: #000000">)},<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">C</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;Double(</span><span style="COLOR: #000000">12.010</span><span style="COLOR: #000000">)},<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">N</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;Double(</span><span style="COLOR: #000000">14.007</span><span style="COLOR: #000000">)},<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">O</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;Double(</span><span style="COLOR: #000000">15.999</span><span style="COLOR: #000000">)},<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">F</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;Double(</span><span style="COLOR: #000000">18.998</span><span style="COLOR: #000000">)},<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Ne</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;Double(</span><span style="COLOR: #000000">20.180</span><span style="COLOR: #000000">)}&nbsp;};<br /><br /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Create&nbsp;a&nbsp;Map&nbsp;mapping&nbsp;colors.</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">Map&nbsp;weights&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;ArrayUtils.toMap(&nbsp;weightArray&nbsp;);<br /><br />Double&nbsp;hydrogenWeight&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;map.get(&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">H</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;);<br /></span></div></font></font></font><br /><font size="2">Discussion：<font face="Courier New">ArrayUtils.toMap()</font><a name="jakartackbk-CHP-1-ITERM-1865"></a> 避免了反复调用put()方法去实现一个map，<font face="Courier New">ArrayUtils.toMap()</font><a name="jakartackbk-CHP-1-ITERM-1865"></a> 会把<font face="Courier New">object[][]中每个元素(object[])的第一个元素当成key，第二个元素当成value.</font></font>
          <br/><br/>
          <span style="color:red;">
            <a href="http://borball.javaeye.com/blog/207375#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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>Wed, 08 Mar 2006 10:05:00 +0800</pubDate>
        <link>http://borball.javaeye.com/blog/207375</link>
        <guid>http://borball.javaeye.com/blog/207375</guid>
      </item>
      <item>
        <title>1.6 ArrayUtils.toObject()和ArrayUtils.toPrimitive()</title>
        <author>borball</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://borball.javaeye.com">borball</a>&nbsp;
          链接：<a href="http://borball.javaeye.com/blog/207376" style="color:red;">http://borball.javaeye.com/blog/207376</a>&nbsp;
          发表时间: 2006年03月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <font color="#ff0000"><font size="2">在对象数组(Object Arraysand )和基本类型数组(Primitive Arrays)间转换<br /></font><font color="#000000"><font size="2">问题提出：需要在对象数组和基本类型数组间进行转换<br />解决方法：使用<font face="Courier New">ArrayUtils.toObject()和ArrayUtils.toPrimitive()方法。<br /></font><font face="Times New Roman">使用举例：<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: #0000ff">import</span><span style="COLOR: #000000">&nbsp;org.apache.commons.lang.ArrayUtils;<br /><br /></span><span style="COLOR: #0000ff">long</span><span style="COLOR: #000000">[]&nbsp;primitiveArray&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">long</span><span style="COLOR: #000000">[]&nbsp;{&nbsp;</span><span style="COLOR: #000000">12</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">100</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">2929</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">3323</span><span style="COLOR: #000000">&nbsp;};<br />Long[]&nbsp;objectArray&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;ArrayUtils.toObject(&nbsp;primitiveArray&nbsp;);<br /><br />Double[]&nbsp;doubleObjects&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;Double[]&nbsp;{&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;Double(&nbsp;</span><span style="COLOR: #000000">3.22</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">5.222</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">3.221</span><span style="COLOR: #000000">&nbsp;)&nbsp;};<br /><br /></span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">[]&nbsp;doublePrimitives&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;ArrayUtils.toPrimitive(&nbsp;doubleObject&nbsp;);</span></div><br />Discussion：考虑以下场景：假设一个外部系统期望我们提供一个以Double对象为元素的List，而我们内部系统只有一个double[],以下代码可以使两者达到匹配。<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: #008000">//</span><span style="COLOR: #008000">&nbsp;Assume&nbsp;that&nbsp;temps&nbsp;is&nbsp;a&nbsp;4000&nbsp;element&nbsp;double[]</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">[]&nbsp;temps&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;readTemps(&nbsp;);<br /><br /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Turn&nbsp;the&nbsp;double[]&nbsp;into&nbsp;an&nbsp;array&nbsp;of&nbsp;Double&nbsp;objects</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">Double[]&nbsp;objectArray&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;ArrayUtils.toObject(&nbsp;temps&nbsp;);<br />List&nbsp;inputList&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;Arrays.asList(&nbsp;objectArray&nbsp;);<br /><br /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Assume&nbsp;that&nbsp;some&nbsp;process&nbsp;returns&nbsp;results&nbsp;as&nbsp;a&nbsp;List&nbsp;of&nbsp;Double&nbsp;<br /><br /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;objects</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">List&nbsp;outputList&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;externalLib.complexCalculation(&nbsp;inputList&nbsp;);<br /><br /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Transform&nbsp;this&nbsp;List&nbsp;of&nbsp;doubles&nbsp;to&nbsp;an&nbsp;array&nbsp;of&nbsp;double&nbsp;primitives</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">Double[]&nbsp;resultObjArray&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;(Double[])&nbsp;outputList.toArray(&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;Double[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">]&nbsp;);<br /><br /></span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">[]&nbsp;result&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;ArrayUtils.toPrimitive(&nbsp;resultObjArray,&nbsp;Double.NaN&nbsp;&nbsp;);<br /></span></div></font></font></font></font><font size="2"><font face="Courier New">ArrayUtils.toPrimitive()中对象数组可以为null,</font>最后一句double[] result =&nbsp;<br />ArrayUtils.toPrimitive( resultObjArray, Double.NaN&nbsp; )指定当某元素为null的时候将用第二个参数代替。因为第二个参数是可选的，当不指定时将会抛出<font face="Courier New">NullPointerException异常。</font></font>
          <br/><br/>
          <span style="color:red;">
            <a href="http://borball.javaeye.com/blog/207376#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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>Wed, 08 Mar 2006 09:28:00 +0800</pubDate>
        <link>http://borball.javaeye.com/blog/207376</link>
        <guid>http://borball.javaeye.com/blog/207376</guid>
      </item>
      <item>
        <title>1.5 ArrayUtils.clone() 和ArrayUtils.reverse() </title>
        <author>borball</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://borball.javaeye.com">borball</a>&nbsp;
          链接：<a href="http://borball.javaeye.com/blog/207377" style="color:red;">http://borball.javaeye.com/blog/207377</a>&nbsp;
          发表时间: 2006年03月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <font color="#ff0000"><font size="2">clone并倒转一个数组<br /></font><font color="#000000"><font size="2">问题提出：需要clone并倒转一个数组中的内容<br />解决方法：使用<font face="Courier New">ArrayUtils.clone()</font></font><a name="jakartackbk-CHP-1-ITERM-1832"></a><font size="2"> 和</font><a name="jakartackbk-CHP-1-ITERM-1833"></a><font size="2">&nbsp;<tt>ArrayUtils.reverse()</tt></font><a name="jakartackbk-CHP-1-ITERM-1834"></a><font size="2"> 方法<br />使用举例：<br /></font>
<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"><font size="2"><img src="/Images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">import</span></font><font size="2"><span style="COLOR: #000000">&nbsp;org.apache.commons.lang.ArrayUtils;<br /><img src="/Images/OutliningIndicators/None.gif" align="top" /><br /></span><span style="COLOR: #0000ff"><font color="#000000">&nbsp;&nbsp;&nbsp; </font>long</span><span style="COLOR: #000000">[]&nbsp;array&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span id="Codehighlighter1_59_78_Open_Text"><span style="COLOR: #000000">{&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">6</span><span style="COLOR: #000000">&nbsp;}</span></span></font><font size="2"><span style="COLOR: #000000">;<br /><img src="/Images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">long</span><span style="COLOR: #000000">[]&nbsp;reversed&nbsp;</span><span style="COLOR: #000000">=</span></font><font size="2"><span style="COLOR: #000000">&nbsp;ArrayUtils.clone(&nbsp;array&nbsp;);<br /><img src="/Images/OutliningIndicators/None.gif" align="top" /><br /><img src="/Images/OutliningIndicators/None.gif" align="top" />ArrayUtils.reverse(&nbsp;reversed&nbsp;);<br /><img src="/Images/OutliningIndicators/None.gif" align="top" /><br /><img src="/Images/OutliningIndicators/None.gif" align="top" />System.out.println(&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Original:&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">+</span></font><font size="2"><span style="COLOR: #000000">&nbsp;ArrayUtils.toString(&nbsp;array&nbsp;)&nbsp;);<br /><img src="/Images/OutliningIndicators/None.gif" align="top" /><br /><img src="/Images/OutliningIndicators/None.gif" align="top" />System.out.println(&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Reversed:&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;ArrayUtils.toString(&nbsp;reversed&nbsp;)&nbsp;);</span></font></div></font></font><font size="2">输出的结果为：Original: { 1, 3, 2, 3, 5, 6 }&nbsp;&nbsp;&nbsp; Reversed: { 6, 5, 3, 2, 3, 1 }<br />Discussion：在上述例子中ArrayUtils.clone()返回了一个新数组的引用，而ArrayUtils.reserve()方法会直接操作参数所指定的数组。除了基本类型外，这两个方法还支持对象数组。<br />如果没有这两个方法的帮助，我们可能会用以下方法实现倒转。<br /></font>
<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"><font size="2"><img src="/Images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;readTemps&nbsp;returns&nbsp;a&nbsp;1000&nbsp;member&nbsp;double[]</span></font><span style="COLOR: #008000"><br /><font size="2"><img src="/Images/OutliningIndicators/None.gif" align="top" /></font></span><span style="COLOR: #000000"><br /><font size="2"><img src="/Images/OutliningIndicators/None.gif" align="top" /></font></span><font size="2"><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">[]&nbsp;temperature&nbsp;</span><span style="COLOR: #000000">=</span></font><font size="2"><span style="COLOR: #000000">&nbsp;readTemps(&nbsp;);<br /><img src="/Images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">[]&nbsp;reversed&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">double</span></font><font size="2"><span style="COLOR: #000000">[temperature.length];<br /><img src="/Images/OutliningIndicators/None.gif" align="top" /><br /></span><span style="COLOR: #0000ff"><font color="#000000">&nbsp;&nbsp; </font>for</span><span style="COLOR: #000000">(&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;i&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;temperature.length;&nbsp;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">&nbsp;)</span></font><span id="Codehighlighter1_181_239_Open_Text"><font size="2"><span style="COLOR: #000000">{<br /><img src="/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;reversed[reversed.length&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;(i</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)]&nbsp;</span><span style="COLOR: #000000">=</span></font><span style="COLOR: #000000"><font size="2">&nbsp;temperature[i];<br /><img src="/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</font></span></span></div><font size="2">另外一种方法利用</font><font face="Courier New"><font size="2">Collections.reverse()，该方法是对一个List对象进行操作，所有之前需要将数组转换成List对象，另外List里面不能含有基本类型，还需要将基本类型包装一下，以下是实现的源码：<br /></font>
<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"><font size="2"><img src="/Images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">[]&nbsp;temps&nbsp;</span><span style="COLOR: #000000">=</span></font><font size="2"><span style="COLOR: #000000">&nbsp;readTemps(&nbsp;);<br /><img src="/Images/OutliningIndicators/None.gif" align="top" /><br /><img src="/Images/OutliningIndicators/None.gif" align="top" />List&nbsp;tempList&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span></font><font size="2"><span style="COLOR: #000000">&nbsp;ArrayList(&nbsp;);<br /></span><span style="COLOR: #0000ff"><font color="#000000">&nbsp;</font>for</span><span style="COLOR: #000000">(&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;i&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;temps.length;&nbsp;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">&nbsp;)</span></font><span id="Codehighlighter1_106_150_Open_Text"><font size="2"><span style="COLOR: #000000">{<br />&nbsp;&nbsp;&nbsp;&nbsp;tempList.add(&nbsp;</span><span style="COLOR: #0000ff">new</span></font><span style="COLOR: #000000"><font size="2">&nbsp;Double[temps[i]]&nbsp;);<br />&nbsp;}</font></span></span><span style="COLOR: #000000"><br /><font size="2"><img src="/Images/OutliningIndicators/None.gif" align="top" /><br /><img src="/Images/OutliningIndicators/None.gif" align="top" />Collections.reverse(&nbsp;tempList&nbsp;);<br /><img src="/Images/OutliningIndicators/None.gif" align="top" /></font></span><font size="2"><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">[]&nbsp;reversed&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">double</span></font><font size="2"><span style="COLOR: #000000">(&nbsp;tempList.size(&nbsp;)&nbsp;);<br /><img src="/Images/OutliningIndicators/None.gif" align="top" />Iterator&nbsp;i&nbsp;</span><span style="COLOR: #000000">=</span></font><font size="2"><span style="COLOR: #000000">&nbsp;tempList.iterator(&nbsp;);<br /><img src="/Images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;index&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span></font><font size="2"><span style="COLOR: #000000">;<br /></span><span style="COLOR: #0000ff">&nbsp;while</span><span style="COLOR: #000000">(&nbsp;i.hasNext(&nbsp;)&nbsp;)</span></font><span id="Codehighlighter1_310_385_Open_Text"><font size="2"><span style="COLOR: #000000">{<br />&nbsp; &nbsp;&nbsp;reversed[index]&nbsp;</span><span style="COLOR: #000000">=</span></font><font size="2"><span style="COLOR: #000000">&nbsp;((Double)&nbsp;i.next(&nbsp;)).doubleValue(&nbsp;);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;index</span><span style="COLOR: #000000">++</span></font><span style="COLOR: #000000"><font size="2">;<br />&nbsp;}</font></span></span><span style="COLOR: #000000"><br /><font size="2"><img src="/Images/OutliningIndicators/None.gif" align="top" /></font></span></div></font><font size="2">有些人会问道：不是所有的数组都有一个clone()方法吗?一种可能的解释是ArrayUtils.clone()使程序更具可读性，另外当一个数组引用使null时，ArrayUtils.clone()会返回一个null而不是抛出一个运行时异常。</font>
          <br/><br/>
          <span style="color:red;">
            <a href="http://borball.javaeye.com/blog/207377#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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>Wed, 08 Mar 2006 09:01:00 +0800</pubDate>
        <link>http://borball.javaeye.com/blog/207377</link>
        <guid>http://borball.javaeye.com/blog/207377</guid>
      </item>
      <item>
        <title>1.4 ArrayUtils.toString()</title>
        <author>borball</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://borball.javaeye.com">borball</a>&nbsp;
          链接：<a href="http://borball.javaeye.com/blog/207378" style="color:red;">http://borball.javaeye.com/blog/207378</a>&nbsp;
          发表时间: 2006年03月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font size="2"><font color="#ff0000">打印一个数组中的内容<br /></font>问题提出：如果需要打印数组中的内容<br />解决方法：使用</font><font size="2" face="Courier New">ArrayUtils.toString()方法。<br /></font><font face="Times New Roman"><font size="2">使用举例：<br /></font></font></p>
<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"><font size="2"><font color="#000000"><span style="COLOR: #0000ff">&nbsp;&nbsp;&nbsp; int</span><span style="COLOR: #000000">[]&nbsp;intArray&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">[]&nbsp;</span><span id="Codehighlighter1_27_43_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="/Images/dot.gif" /></span><span id="Codehighlighter1_27_43_Open_Text"><span style="COLOR: #000000">{&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">6</span><span style="COLOR: #000000">&nbsp;}</span></span></font></font><font size="2"><span style="COLOR: #000000">;<br /><img src="/Images/OutliningIndicators/None.gif" align="top" /><br /></span><span style="COLOR: #0000ff"><font color="#000000">&nbsp;&nbsp;&nbsp; </font>int</span><span style="COLOR: #000000">[]&nbsp;multiDimension&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">[][]&nbsp;</span><span id="Codehighlighter1_82_117_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="/Images/dot.gif" /></span><span id="Codehighlighter1_82_117_Open_Text"><span style="COLOR: #000000">{&nbsp;</span><span id="Codehighlighter1_84_94_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="/Images/dot.gif" /></span><span id="Codehighlighter1_84_94_Open_Text"><span style="COLOR: #000000">{&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">&nbsp;}</span></span><span style="COLOR: #000000">,&nbsp;</span><span id="Codehighlighter1_97_104_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="/Images/dot.gif" /></span><span id="Codehighlighter1_97_104_Open_Text"><span style="COLOR: #000000">{&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">&nbsp;}</span></span><span style="COLOR: #000000">,&nbsp;</span><span id="Codehighlighter1_107_115_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="/Images/dot.gif" /></span><span id="Codehighlighter1_107_115_Open_Text"><span style="COLOR: #000000">{</span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">6</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">7</span><span style="COLOR: #000000">}</span></span><span style="COLOR: #000000">&nbsp;}</span></span></font><font size="2"><span style="COLOR: #000000">;<br /><img src="/Images/OutliningIndicators/None.gif" align="top" /><br /><img src="/Images/OutliningIndicators/None.gif" align="top" />System.out.println(&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">intArray:&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">+</span></font><font size="2"><span style="COLOR: #000000">&nbsp;ArrayUtils.toString(&nbsp;intArray&nbsp;)&nbsp;);<br /><img src="/Images/OutliningIndicators/None.gif" align="top" />System.out.println(&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">multiDimension:&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">+</span></font><span style="COLOR: #000000"><font size="2">&nbsp;ArrayUtils.<br /><img src="/Images/OutliningIndicators/None.gif" align="top" />toString(&nbsp;multiDimension&nbsp;)&nbsp;);<br /><img src="/Images/OutliningIndicators/None.gif" align="top" /></font></span></div><font size="2">程序输出结果如下：<br />intArray: {2,3,4,5,6}<br />multiDimension: {{1,2,3},{2,3},{5,6,7}}<br /><br />Discussion：下面例子可以用来打印一个Object[]数组的所有内容，包括null。<br /></font>
<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"><font size="2"><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp; String[]&nbsp;strings&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;String[]&nbsp;</span><span id="Codehighlighter1_32_66_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="/Images/dot.gif" /></span><span id="Codehighlighter1_32_66_Open_Text"><span style="COLOR: #000000">{&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Blue</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Green</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Yellow</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;}</span></span></font><font size="2"><span style="COLOR: #000000">;<br /><img src="/Images/OutliningIndicators/None.gif" align="top" /><br /><img src="/Images/OutliningIndicators/None.gif" align="top" />System.out.println(&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Strings:&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;ArrayUtils.toString(&nbsp;strings,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Unknown</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;);</span></font></div><font size="2">当某一元素为null时，将会用ArrayUtils.toString( strings, "Unknown" )中第二个参数指定的String代替。</font>
          <br/><br/>
          <span style="color:red;">
            <a href="http://borball.javaeye.com/blog/207378#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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, 07 Mar 2006 17:50:00 +0800</pubDate>
        <link>http://borball.javaeye.com/blog/207378</link>
        <guid>http://borball.javaeye.com/blog/207378</guid>
      </item>
      <item>
        <title>1.3 CompareToBuilder</title>
        <author>borball</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://borball.javaeye.com">borball</a>&nbsp;
          链接：<a href="http://borball.javaeye.com/blog/207379" style="color:red;">http://borball.javaeye.com/blog/207379</a>&nbsp;
          发表时间: 2006年03月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font size="2">问题提出：需要快速实现compareTo()方法<br />解决方法：使用</font><font face="Courier New"><font color="#ff0000">CompareToBuilder</font>提供的<font color="#ff0000">compareTo()</font>方法。同样的CompareToBuilder也使用了反射机制。以下代码提供了一个compareTo()方法，用于比较两个对象所有的非static和非transient成员变量。<br /></font></p>
<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="/Images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&nbsp;org.apache.commons.lang.builder.CompareToBuilder;<br /><img src="/Images/OutliningIndicators/None.gif" align="top" /><br /><img src="/Images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Build&nbsp;a&nbsp;compareTo&nbsp;function&nbsp;from&nbsp;reflection&nbsp;</span><span style="COLOR: #008000"><br /><img src="/Images/OutliningIndicators/ExpandedBlockStart.gif" id="Codehighlighter1_136_197_Open_Image" onclick="this.style.display='none'; Codehighlighter1_136_197_Open_Text.style.display='none'; Codehighlighter1_136_197_Closed_Image.style.display='inline'; Codehighlighter1_136_197_Closed_Text.style.display='inline';" align="top" /><img src="/Images/OutliningIndicators/ContractedBlock.gif" id="Codehighlighter1_136_197_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_136_197_Closed_Text.style.display='none'; Codehighlighter1_136_197_Open_Image.style.display='inline'; Codehighlighter1_136_197_Open_Text.style.display='inline';" align="top" style="DISPLAY: none" /></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;compareTo(Object&nbsp;o)&nbsp;</span><span id="Codehighlighter1_136_197_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="/Images/dot.gif" /></span><span id="Codehighlighter1_136_197_Open_Text"><span style="COLOR: #000000">{<br /><img src="/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;CompareToBuilder.reflectionCompare(</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">,&nbsp;obj);<br /><img src="/Images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div><br /><font size="2">Discussion：</font><font face="Courier New"><font size="2">CompareToBuilder.reflectionCompare()提供了两个对象non-static和nontransient成员变量的方法。 reflectionCompare()方法不予理会static和transient变量，因此以下代码中的averageAge和fullName变量是不会进入比较表达式的。<br /></font>
<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"><font size="2"><img src="/Images/OutliningIndicators/ExpandedBlockStart.gif" id="Codehighlighter1_32_420_Open_Image" onclick="this.style.display='none'; Codehighlighter1_32_420_Open_Text.style.display='none'; Codehighlighter1_32_420_Closed_Image.style.display='inline'; Codehighlighter1_32_420_Closed_Text.style.display='inline';" align="top" /><img src="/Images/OutliningIndicators/ContractedBlock.gif" id="Codehighlighter1_32_420_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_32_420_Closed_Text.style.display='none'; Codehighlighter1_32_420_Open_Image.style.display='inline'; Codehighlighter1_32_420_Open_Text.style.display='inline';" align="top" style="DISPLAY: none" /><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;PoliticalCandidate&nbsp;</span><span id="Codehighlighter1_32_420_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="/Images/dot.gif" /></span></font><span id="Codehighlighter1_32_420_Open_Text"><font size="2"><span style="COLOR: #000000">{<br /><img src="/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Static&nbsp;variable</span></font><span style="COLOR: #008000"><br /><font size="2"><img src="/Images/OutliningIndicators/InBlock.gif" align="top" /></font></span><font size="2"><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">static</span></font><font size="2"><span style="COLOR: #000000">&nbsp;String&nbsp;averageAge;<br /><img src="/Images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Member&nbsp;variables&nbsp;</span></font><span style="COLOR: #008000"><br /><font size="2"><img src="/Images/OutliningIndicators/InBlock.gif" align="top" /></font></span><font size="2"><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">private</span></font><font size="2"><span style="COLOR: #000000">&nbsp;String&nbsp;firstName;<br /><img src="/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">private</span></font><font size="2"><span style="COLOR: #000000">&nbsp;String&nbsp;lastName;<br /><img src="/Images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">transient</span></font><font size="2"><span style="COLOR: #000000">&nbsp;String&nbsp;fullName;<br /><img src="/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span></font><font size="2"><span style="COLOR: #008000">&nbsp;Constructors<br /><img src="/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span></font><font size="2"><span style="COLOR: #008000">&nbsp;get/set&nbsp;methods<br /><img src="/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Build&nbsp;a&nbsp;compareTo&nbsp;function&nbsp;from&nbsp;reflection&nbsp;</span></font><span style="COLOR: #008000"><br /><font size="2"><img src="/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_349_417_Open_Image" onclick="this.style.display='none'; Codehighlighter1_349_417_Open_Text.style.display='none'; Codehighlighter1_349_417_Closed_Image.style.display='inline'; Codehighlighter1_349_417_Closed_Text.style.display='inline';" align="top" /><img src="/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_349_417_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_349_417_Closed_Text.style.display='none'; Codehighlighter1_349_417_Open_Image.style.display='inline'; Codehighlighter1_349_417_Open_Text.style.display='inline';" align="top" style="DISPLAY: none" /></font></span><font size="2"><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;compareTo(Object&nbsp;o)&nbsp;</span><span id="Codehighlighter1_349_417_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="/Images/dot.gif" /></span></font><span id="Codehighlighter1_349_417_Open_Text"><font size="2"><span style="COLOR: #000000">{<br /><img src="/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;CompareToBuilder.reflectionCompare(</span><span style="COLOR: #0000ff">this</span></font><span style="COLOR: #000000"><font size="2">,&nbsp;obj);<br /><img src="/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</font></span></span><span style="COLOR: #000000"><br /><font size="2"><img src="/Images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</font></span></span></div></font><font size="2">比较对象成员变量的时候应该有一个比较的次序存在，上述代码中默认的应该是先比较lastName,然后是firstName。调用append()方法可以把要比较的变量加入比较表达式中，并且遵循后加入的先比较的次序。<br />例如：<br /></font>
<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"><font size="2"><img src="/Images/OutliningIndicators/ExpandedBlockStart.gif" id="Codehighlighter1_31_444_Open_Image" onclick="this.style.display='none'; Codehighlighter1_31_444_Open_Text.style.display='none'; Codehighlighter1_31_444_Closed_Image.style.display='inline'; Codehighlighter1_31_444_Closed_Text.style.display='inline';" align="top" /><img src="/Images/OutliningIndicators/ContractedBlock.gif" id="Codehighlighter1_31_444_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_31_444_Closed_Text.style.display='none'; Codehighlighter1_31_444_Open_Image.style.display='inline'; Codehighlighter1_31_444_Open_Text.style.display='inline';" align="top" style="DISPLAY: none" /><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;compareTo(Object&nbsp;o)&nbsp;</span><span id="Codehighlighter1_31_444_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="/Images/dot.gif" /></span></font><span id="Codehighlighter1_31_444_Open_Text"><font size="2"><span style="COLOR: #000000">{<br /><img src="/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;compare&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;By&nbsp;default&nbsp;return&nbsp;less-than</span></font><span style="COLOR: #008000"><br /><font size="2"><img src="/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_173_421_Open_Image" onclick="this.style.display='none'; Codehighlighter1_173_421_Open_Text.style.display='none'; Codehighlighter1_173_421_Closed_Image.style.display='inline'; Codehighlighter1_173_421_Closed_Text.style.display='inline';" align="top" /><img src="/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_173_421_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_173_421_Closed_Text.style.display='none'; Codehighlighter1_173_421_Open_Image.style.display='inline'; Codehighlighter1_173_421_Open_Text.style.display='inline';" align="top" style="DISPLAY: none" /></font></span><font size="2"><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(&nbsp;o&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">&nbsp;PoliticalCandidate.</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">.isAssignableFrom(&nbsp;o.getClass(&nbsp;)&nbsp;)&nbsp;)&nbsp;</span><span id="Codehighlighter1_173_421_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="/Images/dot.gif" /></span></font><span id="Codehighlighter1_173_421_Open_Text"><font size="2"><span style="COLOR: #000000">{<br /><img src="/Images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PoliticalCandidate&nbsp;pc&nbsp;</span><span style="COLOR: #000000">=</span></font><font size="2"><span style="COLOR: #000000">&nbsp;(PoliticalCandidate)&nbsp;o;<br /><img src="/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;compare&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">new</span></font><span style="COLOR: #000000"><font size="2">&nbsp;CompareToBuilder(&nbsp;)<br /><img src="/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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.append(firstName,&nbsp;pc.firstName)<br /><img src="/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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.append(lastName,&nbsp;pc.lastName)).toComparison(&nbsp;);<br /><img src="/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</font></span></span><span style="COLOR: #000000"><br /><font size="2"><img src="/Images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</font></span><span style="COLOR: #0000ff"><font size="2">return</font></span><span style="COLOR: #000000"><font size="2">&nbsp;compare;<br /><img src="/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</font></span></span></div><font size="2">在比较的时候会先比较lastName，只有在lastName相同的情况下才会比较firstName。<br />ps：实现compareTo()的时候应保证和equals()规则相同，即当compareTo()返回是0的时候equals()应该返回true。<br /></font>
          <br/><br/>
          <span style="color:red;">
            <a href="http://borball.javaeye.com/blog/207379#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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, 07 Mar 2006 14:45:00 +0800</pubDate>
        <link>http://borball.javaeye.com/blog/207379</link>
        <guid>http://borball.javaeye.com/blog/207379</guid>
      </item>
      <item>
        <title>1.2 EqualsBuilder和HashCodeBuilder</title>
        <author>borball</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://borball.javaeye.com">borball</a>&nbsp;
          链接：<a href="http://borball.javaeye.com/blog/207380" style="color:red;">http://borball.javaeye.com/blog/207380</a>&nbsp;
          发表时间: 2006年03月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <font size="2">2.自动化hashCode()和equals()<br />&nbsp; 问题产生：当需要自动实现hashCode()和equals()方法<br />&nbsp; 解决方法：使用<font face="Courier New">EqualsBuilder和</font></font><font size="2"><tt>HashCodeBuilder</tt></font><a name="jakartackbk-CHP-1-ITERM-1797"></a><font size="2"> <br />&nbsp; 使用举例：<br />&nbsp; 
<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="/Images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&nbsp;org.apache.commons.lang.builder.HashCodeBuilder;<br /><img src="/Images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&nbsp;org.apache.commons.lang.builder.EqualsBuilder;<br /><img src="/Images/OutliningIndicators/None.gif" align="top" /><br /><img src="/Images/OutliningIndicators/ExpandedBlockStart.gif" id="Codehighlighter1_143_1005_Open_Image" onclick="this.style.display='none'; Codehighlighter1_143_1005_Open_Text.style.display='none'; Codehighlighter1_143_1005_Closed_Image.style.display='inline'; Codehighlighter1_143_1005_Closed_Text.style.display='inline';" align="top" /><img src="/Images/OutliningIndicators/ContractedBlock.gif" id="Codehighlighter1_143_1005_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_143_1005_Closed_Text.style.display='none'; Codehighlighter1_143_1005_Open_Image.style.display='inline'; Codehighlighter1_143_1005_Open_Text.style.display='inline';" align="top" style="DISPLAY: none" /></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;PoliticalCandidate&nbsp;</span><span id="Codehighlighter1_143_1005_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="/Images/dot.gif" /></span><span id="Codehighlighter1_143_1005_Open_Text"><span style="COLOR: #000000">{<br /><img src="/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Member&nbsp;variables&nbsp;-&nbsp;omitted&nbsp;for&nbsp;brevity<br /><img src="/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Constructors&nbsp;-&nbsp;omitted&nbsp;for&nbsp;brevity<br /><img src="/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;get/set&nbsp;methods&nbsp;-&nbsp;omitted&nbsp;for&nbsp;brevity<br /><img src="/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;A&nbsp;hashCode&nbsp;which&nbsp;creates&nbsp;a&nbsp;hash&nbsp;from&nbsp;the&nbsp;two&nbsp;unique&nbsp;identifiers</span><span style="COLOR: #008000"><br /><img src="/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000"><br /><img src="/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_377_524_Open_Image" onclick="this.style.display='none'; Codehighlighter1_377_524_Open_Text.style.display='none'; Codehighlighter1_377_524_Closed_Image.style.display='inline'; Codehighlighter1_377_524_Closed_Text.style.display='inline';" align="top" /><img src="/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_377_524_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_377_524_Closed_Text.style.display='none'; Codehighlighter1_377_524_Open_Image.style.display='inline'; Codehighlighter1_377_524_Open_Text.style.display='inline';" align="top" style="DISPLAY: none" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;hashCode(&nbsp;)&nbsp;</span><span id="Codehighlighter1_377_524_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="/Images/dot.gif" /></span><span id="Codehighlighter1_377_524_Open_Text"><span style="COLOR: #000000">{<br /><img src="/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;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;HashCodeBuilder(</span><span style="COLOR: #000000">17</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">37</span><span style="COLOR: #000000">)<br /><img src="/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;&nbsp;&nbsp;&nbsp;.append(firstName)<br /><img src="/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;&nbsp;&nbsp;&nbsp;.append(lastName).toHashCode(&nbsp;);<br /><img src="/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br /><img src="/Images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;An&nbsp;equals&nbsp;which&nbsp;compares&nbsp;two&nbsp;unique&nbsp;identifiers</span><span style="COLOR: #008000"><br /><img src="/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_618_1002_Open_Image" onclick="this.style.display='none'; Codehighlighter1_618_1002_Open_Text.style.display='none'; Codehighlighter1_618_1002_Closed_Image.style.display='inline'; Codehighlighter1_618_1002_Closed_Text.style.display='inline';" align="top" /><img src="/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_618_1002_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_618_1002_Closed_Text.style.display='none'; Codehighlighter1_618_1002_Open_Image.style.display='inline'; Codehighlighter1_618_1002_Open_Text.style.display='inline';" align="top" style="DISPLAY: none" /></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">boolean</span><span style="COLOR: #000000">&nbsp;equals(Object&nbsp;o)&nbsp;</span><span id="Codehighlighter1_618_1002_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="/Images/dot.gif" /></span><span id="Codehighlighter1_618_1002_Open_Text"><span style="COLOR: #000000">{<br /><img src="/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">boolean</span><span style="COLOR: #000000">&nbsp;equals&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">false</span><span style="COLOR: #000000">;<br /><img src="/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_736_973_Open_Image" onclick="this.style.display='none'; Codehighlighter1_736_973_Open_Text.style.display='none'; Codehighlighter1_736_973_Closed_Image.style.display='inline'; Codehighlighter1_736_973_Closed_Text.style.display='inline';" align="top" /><img src="/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_736_973_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_736_973_Closed_Text.style.display='none'; Codehighlighter1_736_973_Open_Image.style.display='inline'; Codehighlighter1_736_973_Open_Text.style.display='inline';" align="top" style="DISPLAY: none" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(&nbsp;o&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">PoliticalCandidate.</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">.isAssignableFrom(o)&nbsp;)&nbsp;</span><span id="Codehighlighter1_736_973_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="/Images/dot.gif" /></span><span id="Codehighlighter1_736_973_Open_Text"><span style="COLOR: #000000">{<br /><img src="/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PoliticalCandidate&nbsp;pc&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(PoliticalCandidate)&nbsp;o;<br /><img src="/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;equals&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;EqualsBuilder(&nbsp;)<br /><img src="/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;&nbsp;&nbsp;&nbsp;.append(firstName,&nbsp;ps.firstName)<br /><img src="/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;&nbsp;&nbsp;&nbsp;.append(lastName,&nbsp;ps.lastName)).isEquals(&nbsp;);<br /><img src="/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br /><img src="/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;equals;<br /><img src="/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br /><img src="/Images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000"><br /><img src="/Images/OutliningIndicators/None.gif" align="top" /></span></div>Discussion：<br />1.在上述例子中，当有相同的firstname和lastname时,认为两个对象的hashCode相同，从而equals()返回true.<br />如果hashCode取决于该class的所有filed时需要使用反射机制来产生一个hashCode。<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"><img src="/Images/OutliningIndicators/ExpandedBlockStart.gif" id="Codehighlighter1_23_78_Open_Image" onclick="this.style.display='none'; Codehighlighter1_23_78_Open_Text.style.display='none'; Codehighlighter1_23_78_Closed_Image.style.display='inline'; Codehighlighter1_23_78_Closed_Text.style.display='inline';" align="top" /><img src="/Images/OutliningIndicators/ContractedBlock.gif" id="Codehighlighter1_23_78_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_23_78_Closed_Text.style.display='none'; Codehighlighter1_23_78_Open_Image.style.display='inline'; Codehighlighter1_23_78_Open_Text.style.display='inline';" align="top" style="DISPLAY: none" /><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;hashCode(&nbsp;)&nbsp;</span><span id="Codehighlighter1_23_78_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="/Images/dot.gif" /></span><span id="Codehighlighter1_23_78_Open_Text"><span style="COLOR: #000000">{<br /><img src="/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;HashCodeBuilder.reflectionHashCode(</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">);<br /><img src="/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div><font face="Courier New">和ToStringBuilder</font>&nbsp;与 <tt>HashCodeBuilder一样</tt> <tt>EqualsBuilder</tt> 也是使用append()方法进行配置，<font face="Courier New">EqualsBuilder的append()方法可以接受基本类型、对象、数组作为参数。EqualsBuilder强大的地方在于可以直接把数组作为参数传入append()方法，EqualsBuilder会依次比较数组中的每个元素。<br /></font>2.如果两个对象相等当且仅当每个属性值都相等 这句话可以由以下代码实现：<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"><img src="/Images/OutliningIndicators/ExpandedBlockStart.gif" id="Codehighlighter1_32_86_Open_Image" onclick="this.style.display='none'; Codehighlighter1_32_86_Open_Text.style.display='none'; Codehighlighter1_32_86_Closed_Image.style.display='inline'; Codehighlighter1_32_86_Closed_Text.style.display='inline';" align="top" /><img src="/Images/OutliningIndicators/ContractedBlock.gif" id="Codehighlighter1_32_86_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_32_86_Closed_Text.style.display='none'; Codehighlighter1_32_86_Open_Image.style.display='inline'; Codehighlighter1_32_86_Open_Text.style.display='inline';" align="top" style="DISPLAY: none" /><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">boolean</span><span style="COLOR: #000000">&nbsp;equals(Object&nbsp;o)&nbsp;</span><span id="Codehighlighter1_32_86_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="/Images/dot.gif" /></span><span id="Codehighlighter1_32_86_Open_Text"><span style="COLOR: #000000">{<br /><img src="/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;EqualsBuilder.reflectionEquals(</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">,&nbsp;o);<br /><img src="/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div></font>
          <br/><br/>
          <span style="color:red;">
            <a href="http://borball.javaeye.com/blog/207380#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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, 07 Mar 2006 11:37:00 +0800</pubDate>
        <link>http://borball.javaeye.com/blog/207380</link>
        <guid>http://borball.javaeye.com/blog/207380</guid>
      </item>
      <item>
        <title>1.1 ReflectionToStringBuilder </title>
        <author>borball</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://borball.javaeye.com">borball</a>&nbsp;
          链接：<a href="http://borball.javaeye.com/blog/207381" style="color:red;">http://borball.javaeye.com/blog/207381</a>&nbsp;
          发表时间: 2006年03月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <font size="2">本笔记是在阅读<strong>Jakarta Commons Cookbook</strong>时所留下的。<br /></font><font color="#0000ff"><font size="2" color="#000000">1.使用<font face="Courier New">ReflectionToStringBuilder</font> 或者<tt>ToStringBuilder</tt> 自动产生toString()的内容。<br />&nbsp;&nbsp; 使用举例：假设有一个表征校长候选人信息的javabean－<font face="Courier New">PoliticalCandidate。<br /></font>&nbsp;&nbsp; 
<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="/Images/OutliningIndicators/ExpandedBlockStart.gif" id="Codehighlighter1_32_328_Open_Image" onclick="this.style.display='none'; Codehighlighter1_32_328_Open_Text.style.display='none'; Codehighlighter1_32_328_Closed_Image.style.display='inline'; Codehighlighter1_32_328_Closed_Text.style.display='inline';" align="top" /><img src="/Images/OutliningIndicators/ContractedBlock.gif" id="Codehighlighter1_32_328_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_32_328_Closed_Text.style.display='none'; Codehighlighter1_32_328_Open_Image.style.display='inline'; Codehighlighter1_32_328_Open_Text.style.display='inline';" align="top" style="DISPLAY: none" /><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;PoliticalCandidate&nbsp;</span><span id="Codehighlighter1_32_328_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="/Images/dot.gif" /></span><span id="Codehighlighter1_32_328_Open_Text"><span style="COLOR: #000000">{<br /><img src="/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&nbsp;String&nbsp;lastName;<br /><img src="/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&nbsp;String&nbsp;firstName;<br /><img src="/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&nbsp;Date&nbsp;dateOfBirth;<br /><img src="/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&nbsp;BigDecimal&nbsp;moneyRaised;<br /><img src="/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&nbsp;State&nbsp;homeState;<br /><img src="/Images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;get/set方法省略</span><span style="COLOR: #008000"><img src="/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000"><br /><img src="/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_268_326_Open_Image" onclick="this.style.display='none'; Codehighlighter1_268_326_Open_Text.style.display='none'; Codehighlighter1_268_326_Closed_Image.style.display='inline'; Codehighlighter1_268_326_Closed_Text.style.display='inline';" align="top" /><img src="/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_268_326_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_268_326_Closed_Text.style.display='none'; Codehighlighter1_268_326_Open_Image.style.display='inline'; Codehighlighter1_268_326_Open_Text.style.display='inline';" align="top" style="DISPLAY: none" />&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;toString(&nbsp;)&nbsp;</span><span id="Codehighlighter1_268_326_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="/Images/dot.gif" /></span><span id="Codehighlighter1_268_326_Open_Text"><span style="COLOR: #000000">{<br /><img src="/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ReflectionToStringBuilder.toString(&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">&nbsp;);<br /><img src="/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br /><img src="/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div><br />该bean里面有个toString()方法，假设有以下操作：<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"><img src="/Images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Create&nbsp;a&nbsp;State</span><span style="COLOR: #008000"><br /><img src="/Images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">State&nbsp;va&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;State(&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">VA</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Virginia</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="/Images/OutliningIndicators/None.gif" align="top" /><br /><img src="/Images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Create&nbsp;a&nbsp;Birth&nbsp;Date</span><span style="COLOR: #008000"><br /><img src="/Images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">Calendar&nbsp;calendar&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;GregorianCalendar(&nbsp;);<br /><img src="/Images/OutliningIndicators/None.gif" align="top" />calendar.set(&nbsp;Calendar.YEAR,&nbsp;</span><span style="COLOR: #000000">1743</span><span style="COLOR: #000000">&nbsp;);<br /><img src="/Images/OutliningIndicators/None.gif" align="top" />calendar.set(&nbsp;Calendar.MONTH,&nbsp;Calendar.APRIL&nbsp;);<br /><img src="/Images/OutliningIndicators/None.gif" align="top" />calendar.set(&nbsp;Calendar.DAY_OF_MONTH,&nbsp;</span><span style="COLOR: #000000">13</span><span style="COLOR: #000000">&nbsp;);<br /><img src="/Images/OutliningIndicators/None.gif" align="top" />Date&nbsp;dob&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;calendar.getTime(&nbsp;);<br /><img src="/Images/OutliningIndicators/None.gif" align="top" /><br /><img src="/Images/OutliningIndicators/None.gif" align="top" />BigDecimal&nbsp;moneyRaised&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;BigDecimal(&nbsp;</span><span style="COLOR: #000000">293829292.93</span><span style="COLOR: #000000">&nbsp;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><img src="/Images/OutliningIndicators/None.gif" align="top" /><br /><img src="/Images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Create&nbsp;a&nbsp;Political&nbsp;Candidate</span><span style="COLOR: #008000"><br /><img src="/Images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">PoliticalCandidate&nbsp;candidate&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;<br /><img src="/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;PoliticalCandidate(&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Jefferson</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Thomas</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;dob,&nbsp;moneyRaised,&nbsp;va&nbsp;);<br /><img src="/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><img src="/Images/OutliningIndicators/None.gif" align="top" />System.out.println(&nbsp;candidate&nbsp;);<br /><img src="/Images/OutliningIndicators/None.gif" align="top" /></span></div></font></font><font size="2">假设State对象也是一个使用<font face="Courier New">ReflectionToStringBuilder的javabean，上述程序一种可能的输出为<font color="#000000">com.discursive.jccook.lang.builders.PoliticalCandidate@187aeca</font><br />&nbsp;&nbsp;&nbsp; [lastName=Jefferson,\firstName=Thomas,<br />&nbsp;&nbsp;&nbsp;&nbsp; dateOfBirth=Sat Apr 13 22:38:42 CST 1743,<br />&nbsp;&nbsp;&nbsp;&nbsp; moneyRaised=\293829292.930000007152557373046875,<br />&nbsp;&nbsp;&nbsp;&nbsp; state=\com.discursive.jccook.lang.builders.State@87816d<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [abbreviation=VA,name=Virginia]]<br /><br /></font></font>
          <br/><br/>
          <span style="color:red;">
            <a href="http://borball.javaeye.com/blog/207381#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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, 07 Mar 2006 10:51:00 +0800</pubDate>
        <link>http://borball.javaeye.com/blog/207381</link>
        <guid>http://borball.javaeye.com/blog/207381</guid>
      </item>
  </channel>
</rss>