﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-黑豆熊——BlogJava</title><link>http://www.blogjava.net/youling/</link><description>面对挑战，我告诉自己：面对是勇气，积极面对是态度，坚持积极面对是毅力！</description><language>zh-cn</language><lastBuildDate>Tue, 12 May 2026 08:54:58 GMT</lastBuildDate><pubDate>Tue, 12 May 2026 08:54:58 GMT</pubDate><ttl>60</ttl><item><title>千万级sql优化</title><link>http://www.blogjava.net/youling/archive/2011/09/06/358076.html</link><dc:creator>黑豆熊</dc:creator><author>黑豆熊</author><pubDate>Tue, 06 Sep 2011 04:18:00 GMT</pubDate><guid>http://www.blogjava.net/youling/archive/2011/09/06/358076.html</guid><wfw:comment>http://www.blogjava.net/youling/comments/358076.html</wfw:comment><comments>http://www.blogjava.net/youling/archive/2011/09/06/358076.html#Feedback</comments><slash:comments>22</slash:comments><wfw:commentRss>http://www.blogjava.net/youling/comments/commentRss/358076.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/youling/services/trackbacks/358076.html</trackback:ping><description><![CDATA[这几天在开发一个模块的时候，遇到一个棘手的问题：海量数据的查询效率问题，在下面的sql语句中，sf02表的数据在七千万左右，sf01表的数据在三千万左右，并且两个表有关联：<br /><br />select a.tcol2, a.departcode, a.sendtime, sum(a.mainamount) mainamount<br />&nbsp; from sf02 a<br />&nbsp;where a.ksdm = '11019204'<br />&nbsp; and exists<br />&nbsp;(select policyno<br />&nbsp; from sf01 b<br />&nbsp; where b.businessnature = '531'<br />&nbsp; union all select policyno from sf01 b where b.businessnature = '532'<br />&nbsp; and a.policyno = b.policyno)<br />&nbsp; and (a.kindcode = 'R21' or a.kindcode = 'R29')<br />&nbsp; and a.insert_time &lt;= to_date('2011-09-05', 'yyyy-MM-dd')<br />&nbsp; and a.insert_time &gt;= to_date('2000-08-25', 'yyyy-MM-dd')<br />&nbsp;group by a.tcol2, a.departcode, a.sendtime<br />&nbsp;<br />由于数据库是分公司的，创建临时表不是太好使，这个问题一直没有太好的解决办法，不知道各位有没有好的思路，希望各位留下宝贵的意见，由于这个帖子放在提问区一直没有人浏览，不得已放在首页，还请blogJava对该帖放行，非常感谢。<img src ="http://www.blogjava.net/youling/aggbug/358076.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/youling/" target="_blank">黑豆熊</a> 2011-09-06 12:18 <a href="http://www.blogjava.net/youling/archive/2011/09/06/358076.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于：Cannot create JDBC driver of class '' for connect URL 'null' </title><link>http://www.blogjava.net/youling/archive/2009/03/17/260230.html</link><dc:creator>黑豆熊</dc:creator><author>黑豆熊</author><pubDate>Tue, 17 Mar 2009 05:29:00 GMT</pubDate><guid>http://www.blogjava.net/youling/archive/2009/03/17/260230.html</guid><wfw:comment>http://www.blogjava.net/youling/comments/260230.html</wfw:comment><comments>http://www.blogjava.net/youling/archive/2009/03/17/260230.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/youling/comments/commentRss/260230.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/youling/services/trackbacks/260230.html</trackback:ping><description><![CDATA[Cannot create JDBC driver of class '' for connect URL 'null' 错误<br />
<br />
<div class="t_msgfont" id="message3835133">今天在使用润乾报表的时候，出现了一个错误：Cannot create JDBC driver of class '' for connect URL 'null' <br />
<br />
当我们用Tomcat5.0.XX时，以Oracle为例，一般我们的配置如下，但直接移到5.5.XX时就会发生错误 <br />
&nbsp; &nbsp;&lt;Resource name="jdbc/XXX" type="javax.sql.DataSource"/&gt;<br />
&nbsp;&nbsp;&lt;ResourceParams name="jdbc/XXX"&gt;<br />
&nbsp; &nbsp; &lt;parameter&gt;<br />
&nbsp; &nbsp;&nbsp; &nbsp;&lt;name&gt;factory&lt;/name&gt;<br />
&nbsp; &nbsp;&nbsp; &nbsp;&lt;value&gt;org.apache.commons.dbcp.BasicDataSourceFactory&lt;/value&gt;<br />
&nbsp; &nbsp; &lt;/parameter&gt;<br />
&nbsp; &nbsp; &lt;parameter&gt;<br />
&nbsp; &nbsp;&nbsp; &nbsp;&lt;name&gt;password&lt;/name&gt;<br />
&nbsp; &nbsp;&nbsp; &nbsp;&lt;value&gt;password&lt;/value&gt;<br />
&nbsp; &nbsp; &lt;/parameter&gt;<br />
&nbsp; &nbsp; &lt;parameter&gt;<br />
&nbsp; &nbsp;&nbsp; &nbsp;&lt;name&gt;url&lt;/name&gt;<br />
&nbsp; &nbsp;&nbsp; &nbsp;&lt;value&gt;jdbc<img alt="" src="http://www.itpub.net/images/smilies/33.gif" border="0" smilieid="204" />racle:thin:@localhost:1521:SID&lt;/value&gt;<br />
&nbsp; &nbsp; &lt;/parameter&gt;<br />
&nbsp; &nbsp; &lt;parameter&gt;<br />
&nbsp; &nbsp;&nbsp; &nbsp;&lt;name&gt;driverClassName&lt;/name&gt;<br />
&nbsp; &nbsp;&nbsp; &nbsp;&lt;value&gt;oracle.jdbc.driver.OracleDriver&lt;/value&gt;<br />
&nbsp; &nbsp; &lt;/parameter&gt;<br />
&nbsp; &nbsp; &lt;parameter&gt;<br />
&nbsp; &nbsp;&nbsp; &nbsp;&lt;name&gt;username&lt;/name&gt;<br />
&nbsp; &nbsp;&nbsp; &nbsp;&lt;value&gt;username&lt;/value&gt;<br />
&nbsp; &nbsp; &lt;/parameter&gt;<br />
&nbsp;&nbsp;&lt;/ResourceParams&gt;<br />
<br />
当要移植到Tomcat5.5.XX时，配置应当修改一下，如下所示：&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;Resource<br />
&nbsp; &nbsp; name="jdbc/XXX"<br />
&nbsp; &nbsp; type="javax.sql.DataSource"<br />
&nbsp; &nbsp; password="password"<br />
&nbsp; &nbsp; driverClassName="oracle.jdbc.driver.OracleDriver"<br />
&nbsp; &nbsp; maxIdle="2"<br />
&nbsp; &nbsp; maxWait="5000"<br />
&nbsp; &nbsp; username="username"<br />
&nbsp; &nbsp; url="jdbc<img alt="" src="http://www.itpub.net/images/smilies/33.gif" border="0" smilieid="204" />racle:thin:@localhost:1521:SID"<br />
&nbsp; &nbsp; maxActive="4"/&gt;<br />
<br />
<br />
上面的错误消失以后，紧接着出现了：<span style="font-family: '微软雅黑','黑体',Arial,Helvetica,Sans-Serif">Cannot load JDBC driver class 'oracle.jdbc.driver.OracleDriver'</span><br />
<br />
修改方法如下：<br />
<p>1. 将servlet-api.jar和classes12.jar考到WEB-INF/lib目录下</p>
<p>2. 将servlet-api.jar和classes12.jar考到\Tomcat &nbsp; 5.0\common\lib下</p>
<br />
</div>
<img src ="http://www.blogjava.net/youling/aggbug/260230.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/youling/" target="_blank">黑豆熊</a> 2009-03-17 13:29 <a href="http://www.blogjava.net/youling/archive/2009/03/17/260230.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>大家来说说改Bug的好方法</title><link>http://www.blogjava.net/youling/archive/2008/12/16/246672.html</link><dc:creator>黑豆熊</dc:creator><author>黑豆熊</author><pubDate>Tue, 16 Dec 2008 09:02:00 GMT</pubDate><guid>http://www.blogjava.net/youling/archive/2008/12/16/246672.html</guid><wfw:comment>http://www.blogjava.net/youling/comments/246672.html</wfw:comment><comments>http://www.blogjava.net/youling/archive/2008/12/16/246672.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.blogjava.net/youling/comments/commentRss/246672.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/youling/services/trackbacks/246672.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 今天，我们做得那个项目，除了页面上处理，基本上已经可以跑通了，早上开始，我就开始改Bug了，上午10点左右，发现一处：点击项目选择的时候，弹出来的对话框上竟然没有执行单位名称，再看看别的模块里面，出现了同样的问题，本来没有在意这个小错误，以为也就是半个小时的事情就能搞定了，谁知道一下子耗费我将近五个小时，到下午的时候，才弄好，而修改过程更是简单的让人吃惊：只需要在页面的标签输出中改动一下，然后在相应的添加初始化方法中，把值设置进去就OK，就这么简单的一件事情把我整的是郁闷透顶，相当狼狈<a href="mailto:&#@$%^$#%$">&#@$%^$#%$</a>......<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 改完这个Bug以后，我给自己一点时间，反思一下出现这种情况的原因，感觉最主要的原因就是自己对测试方法和调试方法比较陌生，在这次的错误修改过程当中，我主要用的是日志分段打印输出，来查找出错的地方，真的是太浪费时间了，不知道各位大侠一般是怎样查找定位错误，修改错误以后，又是怎样快速高效的测试？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 望各位大侠不吝赐教，小弟感激不尽，先行谢过！
<img src ="http://www.blogjava.net/youling/aggbug/246672.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/youling/" target="_blank">黑豆熊</a> 2008-12-16 17:02 <a href="http://www.blogjava.net/youling/archive/2008/12/16/246672.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java.lang.UnsupportedClassVersionError异常的解决方法</title><link>http://www.blogjava.net/youling/archive/2008/12/12/246015.html</link><dc:creator>黑豆熊</dc:creator><author>黑豆熊</author><pubDate>Fri, 12 Dec 2008 10:11:00 GMT</pubDate><guid>http://www.blogjava.net/youling/archive/2008/12/12/246015.html</guid><wfw:comment>http://www.blogjava.net/youling/comments/246015.html</wfw:comment><comments>http://www.blogjava.net/youling/archive/2008/12/12/246015.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/youling/comments/commentRss/246015.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/youling/services/trackbacks/246015.html</trackback:ping><description><![CDATA[<p>今天下午的时候，一个同事买了一台笔记本，把他的台式机撤给我用，就在我把开发环境装好准备测试一下的时候，Tomcat启动时却是报了java.lang.UnsupportedClassVersionErrorde的错误，仔细看了一下，好像是什么：未知的版本错误，这时候才想起来，自己的Myeclipse装的是6.0的，jdk是1.4，Tomcat是5.5，而装好Meclipse以后默认的jdk版本是5.0，如果不注意着一点，Tomcat服务器在启动的时候，就会报上面的错误。现把解决得方法贴出来：<br />
&nbsp;&nbsp;&nbsp;&nbsp;</p>
<div id="BlogArticleDetail" style="font-size: 14px">
<div>1、Jbuilder2006自带了1.5的JDK,但如果你还想继续用JDK1.42，如果只是在Jbuilder2006的tool-&gt;configure-&gt;JDKs中添加一个JDK1.42或更低版本，那么即使你只写一个最简单的HelloWorld程序，Jbuilder2006都会给你报出长长一串错误，编写的代码在Jbuilder2005中也无法运行。JBuilder2006在运行编译工程时，会针对特定版本的VM进行编译，默认的是Java 2 SDK, v 5.0 And Late，因此，如果工程用的是1.5以下的JDK，碰到都是java.lang.UnsupportedClassVersionError这个错误。<br />
<br />
解决的办法其实很简单，只要更改这个选项就行了。具体步骤如下：<br />
----------------------------------------------------------<br />
1、右键点击工程文件，选择属性(properties),<br />
2、在属性窗口中选择 Build--&gt;Java,在右边的选项中有四个下拉框，就可以看到编译选项了，<br />
3、其中Compiler和Debug Option可以不用管，只在Languege features和Target VM中选择相应的JDK版本就可以了，然后确定，一切OK。<br />
附件中是配置的图片。<br />
-----------------------------------------------------------<br />
如果在Target VM中选择了All Java SDKs，那么你的class文件在使用JDK1.1的VM上都可以运行（Jbuilder2006帮助中是这么说的，估计没几个人的机子上还在用JDK1.1吧 :-）<br />
</div>
<div>2、Eclipse3.1同样会出现相同的问题，这时候只需要把项目用的JDK与你安装的JDK搞成版本一样就解决了．</div>
<div>步骤：右击你的项目－－＞属性－－＞Java Compiler，设置合适的版本！！</div>
</div>
<img src ="http://www.blogjava.net/youling/aggbug/246015.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/youling/" target="_blank">黑豆熊</a> 2008-12-12 18:11 <a href="http://www.blogjava.net/youling/archive/2008/12/12/246015.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>求教：让人郁闷的时间问题</title><link>http://www.blogjava.net/youling/archive/2008/12/01/243703.html</link><dc:creator>黑豆熊</dc:creator><author>黑豆熊</author><pubDate>Mon, 01 Dec 2008 06:15:00 GMT</pubDate><guid>http://www.blogjava.net/youling/archive/2008/12/01/243703.html</guid><wfw:comment>http://www.blogjava.net/youling/comments/243703.html</wfw:comment><comments>http://www.blogjava.net/youling/archive/2008/12/01/243703.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.blogjava.net/youling/comments/commentRss/243703.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/youling/services/trackbacks/243703.html</trackback:ping><description><![CDATA[遇到了一个很棘手的问题，Hibernate查询时，附带查询条件，下面是使用到的查询语句：select a.AURE_INVEST,c.ENGI_COST,c.EQUI_COST,c.DEMO_COST,c.TWOCL_COST,c.NOTE_COST,c.INTEREST_COST,sum(cast(c.FUNDS_PAID as float)) as sumGovPay,sum(cast(e.FUNDS_IN as float)) as lastMonthArrive,sum(cast(c.FUNDS_PAID as float)) as lastMonthPay,f.QUARTER1_BUDGET,f.QUARTER2_BUDGET,f.QUARTER3_BUDGET,f.QUARTER4_BUDGET,sum(cast(c.FUNDS_PAID as float)) as thisQuarterPay,f.ID,f.PROJ_CODE,b.PROJ_TYPE,b.PROJ_NAME,b.PROJ_SORT,b.PROJ_STAT,b.P_RECORD_TIME from GOV_CODE a,PROJ_CODE b,PROJ_FUNDS_PAID c,PROJ_FUNDS_SOURCE e,PROJ_YEAR_BUDGET f where e.DATA_YEAR&lt;'"+year+"' and e.DATA_MONTH&lt;'"+month+"' and c.DATA_DATE&lt;"+DataParser.formatStringDate(newDate)+" and f.DATA_YEAR='"+year+"' and c.DATA_DATE&gt;="+DataParser.formatStringDate(year+"-"+"10-01 00:00:00")+" and c.DATA_DATE&lt;="+DataParser.formatStringDate(year+"-"+"12-31 00:00:00")+" and a.GOV_CODE=b.GOV_CODE and c.PROJ_CODE=b.PROJ_CODE and f.PROJ_CODE=b.PROJ_CODE and e.PROJ_CODE=b.PROJ_CODE group by a.AURE_INVEST,c.ENGI_COST,c.EQUI_COST,c.DEMO_COST,c.TWOCL_COST,c.NOTE_COST,c.INTEREST_COST,<br />
f.QUARTER1_BUDGET,f.QUARTER2_BUDGET,f.QUARTER3_BUDGET,f.QUARTER4_BUDGET,f.ID,f.PROJ_CODE,b.PROJ_TYPE,<br />
b.PROJ_NAME,b.PROJ_SORT,b.PROJ_STAT,b.P_RECORD_TIME<br />
其中DATA_YEAR和DATA_MONTH在数据库中的存储类型是String型，&nbsp; DATA_DATE存储的类型是Date型，使用到的DataParser.formatStringDate方法如下：<br />
&nbsp;public static Date formatStringDate(String sDate)<br />
&nbsp;{<br />
&nbsp;&nbsp;DateFormat df = new SimpleDateFormat("yyyy-MM-dd 00:00:00");<br />
&nbsp;&nbsp;Date tDate = null;<br />
&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;tDate = df.parse(sDate);<br />
&nbsp;&nbsp;} catch (ParseException e) {<br />
&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;return tDate;<br />
&nbsp;}<br />
但是无论如何都是出不来结果，报的是一个Not all named parameters have been set: [00:00]的错误，格式化出来的时间也不是想要的类型，而是这个衰样：Sat Nov 01 00:00:00 CST 2008，与我想要的&#8220;yyyy-MM-dd hh:mm:ss&#8221;相去甚远，不知道该怎么格式化一下，麻烦那位高手指点一下，感激不尽！
 <img src ="http://www.blogjava.net/youling/aggbug/243703.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/youling/" target="_blank">黑豆熊</a> 2008-12-01 14:15 <a href="http://www.blogjava.net/youling/archive/2008/12/01/243703.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>sql语句的执行顺序--简介</title><link>http://www.blogjava.net/youling/archive/2008/11/28/243177.html</link><dc:creator>黑豆熊</dc:creator><author>黑豆熊</author><pubDate>Fri, 28 Nov 2008 03:17:00 GMT</pubDate><guid>http://www.blogjava.net/youling/archive/2008/11/28/243177.html</guid><wfw:comment>http://www.blogjava.net/youling/comments/243177.html</wfw:comment><comments>http://www.blogjava.net/youling/archive/2008/11/28/243177.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.blogjava.net/youling/comments/commentRss/243177.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/youling/services/trackbacks/243177.html</trackback:ping><description><![CDATA[今天上午在开发的过程中，突然遇到一个问题，需要了解SQL语句的执行顺序才能继续，上网上查了一下相关的资料，现整理如下：<br />
一、sql语句的执行步骤：<br />
&nbsp;1）语法分析，分析语句的语法是否符合规范，衡量语句中各表达式的意义。 <br />
2） 语义分析，检查语句中涉及的所有数据库对象是否存在，且用户有相应的权限。 <br />
3）视图转换，将涉及视图的查询语句转换为相应的对基表查询语句。 <br />
4）表达式转换， 将复杂的 SQL 表达式转换为较简单的等效连接表达式。<br />
&nbsp;5）选择优化器，不同的优化器一般产生不同的&#8220;执行计划&#8221; <br />
6）选择连接方式， ORACLE 有三种连接方式，对多表连接 ORACLE 可选择适当的连接方式。 <br />
7）选择连接顺序， 对多表连接 ORACLE 选择哪一对表先连接，选择这两表中哪个表做为源数据表。 <br />
8）选择数据的搜索路径，根据以上条件选择合适的数据搜索路径，如是选用全表搜索还是利用索引或是其他的方式。 <br />
9）运行&#8220;执行计划&#8221; <br />
二、oracle 共享原理：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ORACLE将执行过的SQL语句存放在内存的共享池(shared buffer pool)中，可以被所有的数据库用户共享 当你执行一个SQL语句(有时被称为一个游标)时,如果它和之前的执行过的语句完全相同, ORACLE就能很快获得已经被解析的语句以及最好的 执行路径. 这个功能大大地提高了SQL的执行性能并节省了内存的使用 <br />
三、oracle 语句提高查询效率的方法：1： where column in(select * from ... where ...); 2：... where exists (select 'X' from ...where ...); 第二种格式要远比第一种格式的效率高。在Oracle中可以几乎将所有的IN操作符子查询改写为使用EXISTS的子查询 使用EXIST，Oracle系统会首先检查主查询，然后运行子查询直到它找到第一个匹配项，这就节省了时间 Oracle系统在执行IN子查询时，首先执行子查询，并将获得的结果列表存放在在一个加了索引的临时表中 避免使用having字句 避免使用HAVING子句, HAVING 只会在检索出所有记录之后才对结果集进行过滤. 这个处理需要排序,总计等操作. 如果能通过WHERE子句限制记录的数目,那就能减少这方面的开销<br />
<p>SQL Select语句完整的执行顺序：&nbsp;</p>
<p>1、from子句组装来自不同数据源的数据；<br />
&nbsp;2、where子句基于指定的条件对记录行进行筛选； <br />
3、group by子句将数据划分为多个分组； <br />
4、使用聚集函数进行计算；<br />
5、使用having子句筛选分组； <br />
6、计算所有的表达式； <br />
7、使用order by对结果集进行排序。</p>
<img src ="http://www.blogjava.net/youling/aggbug/243177.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/youling/" target="_blank">黑豆熊</a> 2008-11-28 11:17 <a href="http://www.blogjava.net/youling/archive/2008/11/28/243177.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate 中的Formula 攻略（转载）</title><link>http://www.blogjava.net/youling/archive/2008/11/26/242749.html</link><dc:creator>黑豆熊</dc:creator><author>黑豆熊</author><pubDate>Wed, 26 Nov 2008 03:07:00 GMT</pubDate><guid>http://www.blogjava.net/youling/archive/2008/11/26/242749.html</guid><wfw:comment>http://www.blogjava.net/youling/comments/242749.html</wfw:comment><comments>http://www.blogjava.net/youling/archive/2008/11/26/242749.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/youling/comments/commentRss/242749.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/youling/services/trackbacks/242749.html</trackback:ping><description><![CDATA[键字: hibernate formula
<div class="blog_content">
<p>阅读对象:</p>
<p>&nbsp; 1.已经在使用Hibernate JPA完成持久化映射的朋友。</p>
<p>&nbsp; 2.在网上搜索Formula并通通搜到转载oralce一篇技术文章或hibernate annotations技术文档的朋友。</p>
<p>&nbsp; 3.发现@Formula不能使用并想Ctrl+Delete hibernate jar包，然后砸烂显示器的朋友。</p>
<p>&nbsp; </p>
<p>文章内容</p>
<p>&nbsp; 本文将说明如何使用@Formula，并且说明在哪几种情况下@Formula会失灵。</p>
<p>&nbsp;</p>
<p>1.Formula的作用</p>
<p>&nbsp; 引用hibernate annotations技术文档中的解释可以很好的说明@Formula的作用，但它确实没有说清楚怎么使用，并且给出的示例是用不了的，这让我浪费了好几个钟头的时间！</p>
<p>&nbsp;&nbsp; Formula的作用就是说白了就是用一个查询语句动态的生成一个类的属性，比如java eye登陆之后 收件箱显示有几封未读邮件的数字，就是一条select count(*)...构成的虚拟列，而不是存储在数据库里的一个字段。用比较标准的说法就是：有时候，你想让数据库，而非JVM，来替你完成一些计算，也可能想创建某种虚拟列，你可以使用sql片段，而不是将属性映射(物理)列。这种属性是只读的(属性值由公式求得).Formula甚至可以包含sql子查询</p>
<p>&nbsp;&nbsp; Formula真的这么强大吗？确实，它很好很强大，节省了不少代码！</p>
<p>&nbsp;</p>
<p>2.使用Formula</p>
<p>&nbsp; </p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://solonote.javaeye.com/blog/215093#"><img alt="复制代码" src="http://solonote.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span class="keyword">package</span><span>&nbsp;aa; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="keyword">import</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;javax.persistence.GenerationType.IDENTITY; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="keyword">import</span><span>&nbsp;javax.persistence.Entity; &nbsp;&nbsp;</span></span></li>
    <li><span class="keyword">import</span><span>&nbsp;javax.persistence.GeneratedValue; &nbsp;&nbsp;</span></span></li>
    <li><span class="keyword">import</span><span>&nbsp;javax.persistence.Id; &nbsp;&nbsp;</span></span></li>
    <li><span class="keyword">import</span><span>&nbsp;javax.persistence.Table; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="keyword">import</span><span>&nbsp;org.hibernate.annotations.Formula; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="comment">/** </span>&nbsp;</span></li>
    <li><span><span class="comment">&nbsp;*&nbsp;注解必须是在属性上的，如果有任何一个注解在方法上，那么@Formula将失效 </span>&nbsp;</span></li>
    <li><span><span class="comment">&nbsp;*&nbsp;@author&nbsp;昆明蜂鸟软件 </span>&nbsp;</span></li>
    <li><span><span class="comment">&nbsp;*&nbsp;@version&nbsp;0.1.0&nbsp;2008-7-15&nbsp;下午06:09:38 </span>&nbsp;</span></li>
    <li><span><span class="comment">&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span class="annotation">@Entity</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span class="annotation">@Table</span><span>(name&nbsp;=&nbsp;</span><span class="string">"user"</span><span>,&nbsp;catalog&nbsp;=&nbsp;</span><span class="string">"test"</span><span>) &nbsp;&nbsp;</span></span></li>
    <li><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;User&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="annotation">@Id</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="annotation">@GeneratedValue</span><span>(strategy&nbsp;=&nbsp;IDENTITY) &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;id; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="annotation">@Formula</span><span>(</span><span class="string">"(select&nbsp;COUNT(*)&nbsp;from&nbsp;user)"</span><span>) &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;count; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;getId()&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;id; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;setId(</span><span class="keyword">int</span><span>&nbsp;id)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.id&nbsp;=&nbsp;id; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;getCount()&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;count; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;setCount(</span><span class="keyword">int</span><span>&nbsp;count)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.count&nbsp;=&nbsp;count; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code">package aa;
import static javax.persistence.GenerationType.IDENTITY;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import org.hibernate.annotations.Formula;
/**
* 注解必须是在属性上的，如果有任何一个注解在方法上，那么@Formula将失效
* @author 昆明蜂鸟软件
* @version 0.1.0 2008-7-15 下午06:09:38
*/
@Entity
@Table(name = "user", catalog = "test")
public class User {
@Id
@GeneratedValue(strategy = IDENTITY)
private int id;
@Formula("(select COUNT(*) from user)")
private int count;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
}
</pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#49;&#46;&#64;&#70;&#111;&#114;&#109;&#117;&#108;&#97;"></a>&nbsp;</p>
<p>&nbsp;数据库表:</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Sql代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://solonote.javaeye.com/blog/215093#"><img alt="复制代码" src="http://solonote.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-sql">
    <li><span><span class="keyword">CREATE</span><span>&nbsp;</span><span class="keyword">TABLE</span><span>&nbsp;&nbsp;`test`.`</span><span class="func">user</span><span>`&nbsp;( &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;`id`&nbsp;</span><span class="keyword">int</span><span>(10)&nbsp;unsigned&nbsp;</span><span class="op">NOT</span><span>&nbsp;</span><span class="op">NULL</span><span>&nbsp;auto_increment, &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span><span class="keyword">PRIMARY</span><span>&nbsp;</span><span class="keyword">KEY</span><span>&nbsp;&nbsp;USING&nbsp;BTREE&nbsp;(`id`) &nbsp;&nbsp;</span></span></li>
    <li><span>)&nbsp;ENGINE=InnoDB&nbsp;AUTO_INCREMENT=3&nbsp;</span><span class="keyword">DEFAULT</span><span>&nbsp;CHARSET=utf8;&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<pre class="sql" style="display: none" name="code">CREATE TABLE  `test`.`user` (
`id` int(10) unsigned NOT NULL auto_increment,
PRIMARY KEY  USING BTREE (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;</pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="color: #ff0000">细节1</span>.使用@Formula 你的注解必须是在属性上，如果有一个注解在方法上，那么@Formula将失效。这个我是做过实验的，比如把以上的java文件改为:</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://solonote.javaeye.com/blog/215093#"><img alt="复制代码" src="http://solonote.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span class="keyword">package</span><span>&nbsp;aa; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="keyword">import</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;javax.persistence.GenerationType.IDENTITY; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="keyword">import</span><span>&nbsp;javax.persistence.Entity; &nbsp;&nbsp;</span></span></li>
    <li><span class="keyword">import</span><span>&nbsp;javax.persistence.GeneratedValue; &nbsp;&nbsp;</span></span></li>
    <li><span class="keyword">import</span><span>&nbsp;javax.persistence.Id; &nbsp;&nbsp;</span></span></li>
    <li><span class="keyword">import</span><span>&nbsp;javax.persistence.Table; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="keyword">import</span><span>&nbsp;org.hibernate.annotations.Formula; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="comment">/** </span>&nbsp;</span></li>
    <li><span><span class="comment">&nbsp;*&nbsp;注解必须是在属性上的，如果有任何一个注解在方法上，那么@Formula将失效 </span>&nbsp;</span></li>
    <li><span><span class="comment">&nbsp;*&nbsp;@author&nbsp;昆明蜂鸟软件 </span>&nbsp;</span></li>
    <li><span><span class="comment">&nbsp;*&nbsp;@version&nbsp;0.1.0&nbsp;2008-7-15&nbsp;下午06:09:38 </span>&nbsp;</span></li>
    <li><span><span class="comment">&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span class="annotation">@Entity</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span class="annotation">@Table</span><span>(name&nbsp;=&nbsp;</span><span class="string">"user"</span><span>,&nbsp;catalog&nbsp;=&nbsp;</span><span class="string">"test"</span><span>) &nbsp;&nbsp;</span></span></li>
    <li><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;User&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;id; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="annotation">@Formula</span><span>(</span><span class="string">"(select&nbsp;COUNT(*)&nbsp;from&nbsp;user)"</span><span>) &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;count; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="annotation">@Id</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="annotation">@GeneratedValue</span><span>(strategy&nbsp;=&nbsp;IDENTITY) &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;getId()&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;id; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;setId(</span><span class="keyword">int</span><span>&nbsp;id)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.id&nbsp;=&nbsp;id; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;getCount()&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;count; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;setCount(</span><span class="keyword">int</span><span>&nbsp;count)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.count&nbsp;=&nbsp;count; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code">package aa;
import static javax.persistence.GenerationType.IDENTITY;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import org.hibernate.annotations.Formula;
/**
* 注解必须是在属性上的，如果有任何一个注解在方法上，那么@Formula将失效
* @author 昆明蜂鸟软件
* @version 0.1.0 2008-7-15 下午06:09:38
*/
@Entity
@Table(name = "user", catalog = "test")
public class User {
private int id;
@Formula("(select COUNT(*) from user)")
private int count;
@Id
@GeneratedValue(strategy = IDENTITY)
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
}
</pre>
<p>&nbsp;</p>
<p>&nbsp;这样@Formula就不可以运行！！！我前边就是被Hibernate官方的文档给搞晕了。</p>
<p><span style="color: #ff0000">细节2</span>.既然@Formula 是一个虚拟列，那么数据库中不需要建这一列，同样可以，如果有个列存在，hibernate也会将&nbsp;&nbsp; 其忽略。以上示例中的user就没有count列。</p>
<p><span style="color: #ff0000">细节3</span>.sql语句必须写在()中，这个以前也有人说过。</p>
<p><span style="color: #ff0000">细节4.</span>如果有where子查询，那么表需要用别名，比如 select COUNT(*) from user where id=1 是错的</p>
<p>而select COUNT(*) from user u where u.id=1是正确的</p>
<p><span style="color: #ff0000">细节5.</span>只要是你在数据库的sql控制台执行过的语句，并且使用了表别名，那么@Formula都应该是支持的。</p>
<p>&nbsp;</p>
<p>&nbsp;确实@Formula是一个很常用且好用的东西！希望这篇文章能帮助你~~</p>
<p>&nbsp;</p>
</div>
<img src ="http://www.blogjava.net/youling/aggbug/242749.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/youling/" target="_blank">黑豆熊</a> 2008-11-26 11:07 <a href="http://www.blogjava.net/youling/archive/2008/11/26/242749.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JS的编码与解码</title><link>http://www.blogjava.net/youling/archive/2008/11/17/240967.html</link><dc:creator>黑豆熊</dc:creator><author>黑豆熊</author><pubDate>Mon, 17 Nov 2008 07:07:00 GMT</pubDate><guid>http://www.blogjava.net/youling/archive/2008/11/17/240967.html</guid><wfw:comment>http://www.blogjava.net/youling/comments/240967.html</wfw:comment><comments>http://www.blogjava.net/youling/archive/2008/11/17/240967.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/youling/comments/commentRss/240967.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/youling/services/trackbacks/240967.html</trackback:ping><description><![CDATA[<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 今天遇到这样一个问题，通过JS传递的URL中包含了一个中文词语，传递过去的值就变成了乱码，后来上网上一查，才发现，原来JS传递URL参数是采用UTF-8，而我们平常的地址栏传递编码格式是&#8220;ISO-8859-1&#8221;，因此在通过JS传递参数的时候，必须先编码，然后在使用的时候进行解码，针对此情况，我们可以写下面的一个方法，对它方便的进行转换：<br />
public static String decodeParamString(String paramValue)<br />
&nbsp;{<br />
&nbsp;&nbsp;if(paramValue==null)<br />
&nbsp;&nbsp;&nbsp;return null;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;try<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;String tmp0=URLEncoder.encode(paramValue, "ISO-8859-1");<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;String result=URLDecoder.decode(tmp0, "utf-8");<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;if(log.isInfoEnabled())<br />
&nbsp;&nbsp;&nbsp;&nbsp;log.info("原始字符串："+tmp0+"，解码结果："+result);<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;return result;<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;catch(Exception e)<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;log.error("解码失败：", e);<br />
&nbsp;&nbsp;&nbsp;return null;<br />
&nbsp;&nbsp;}<br />
&nbsp;}<br />
不过在传递URL的时候，需要先对URL进行处理url+=encodeURI(url);<br />
然后在接收参数的时候进行转化，呵呵，通过实际测试，效果还是不错的！ 
<img src ="http://www.blogjava.net/youling/aggbug/240967.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/youling/" target="_blank">黑豆熊</a> 2008-11-17 15:07 <a href="http://www.blogjava.net/youling/archive/2008/11/17/240967.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>select中实现readonly的方法</title><link>http://www.blogjava.net/youling/archive/2008/11/14/240472.html</link><dc:creator>黑豆熊</dc:creator><author>黑豆熊</author><pubDate>Fri, 14 Nov 2008 02:55:00 GMT</pubDate><guid>http://www.blogjava.net/youling/archive/2008/11/14/240472.html</guid><wfw:comment>http://www.blogjava.net/youling/comments/240472.html</wfw:comment><comments>http://www.blogjava.net/youling/archive/2008/11/14/240472.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/youling/comments/commentRss/240472.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/youling/services/trackbacks/240472.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 今天在做一个页面的时候，遇到一个问题，添加和更新使用同一个页面，当添加的时候，select可以正常使用，如果是更新，那么要求select的值是指定的，并且不可使用，保存时，该控件的值可以正常保存，大家知道select控件没有readonly属性，但是我们还需要用到该功能，该如何实现呢？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 上网搜索了一下，发现一种不错的方法，贡献给大家，代码如下：<br />
&nbsp;&nbsp;&nbsp; &lt;select name="projInveSour.phaseType" <span style="color: red">&lt;c:if test='${method eq "update"}'&gt; onbeforeactivate="return false" onfocus="this.blur()" onmouseover="this.setCapture()" onmouseout="this.releaseCapture()" &lt;/c:if&gt;&gt;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;option value=""&gt;全部&lt;/option&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;option value="立项" &lt;c:if test='${projInveSourForm.projInveSour.phaseType eq "立项"}'&gt;selected&lt;/c:if&gt;&gt;立项&lt;/option&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;option value="初设" &lt;c:if test='${projInveSourForm.projInveSour.phaseType eq "初设"}'&gt;selected&lt;/c:if&gt;&gt;初设&lt;/option&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/select&gt;<br />
红色部分为关键代码，大家参考一下，呵呵
<img src ="http://www.blogjava.net/youling/aggbug/240472.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/youling/" target="_blank">黑豆熊</a> 2008-11-14 10:55 <a href="http://www.blogjava.net/youling/archive/2008/11/14/240472.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA中的集合类</title><link>http://www.blogjava.net/youling/archive/2008/11/09/239507.html</link><dc:creator>黑豆熊</dc:creator><author>黑豆熊</author><pubDate>Sun, 09 Nov 2008 03:24:00 GMT</pubDate><guid>http://www.blogjava.net/youling/archive/2008/11/09/239507.html</guid><wfw:comment>http://www.blogjava.net/youling/comments/239507.html</wfw:comment><comments>http://www.blogjava.net/youling/archive/2008/11/09/239507.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/youling/comments/commentRss/239507.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/youling/services/trackbacks/239507.html</trackback:ping><description><![CDATA[&nbsp;
<p class="MsoNormal" style="text-align: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"><strong><span style="font-size: 10pt; font-family: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">理解集合类</span></strong><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"><span style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">集合类存放于<span lang="EN-US">java.util</span>包中。<span lang="EN-US"><br />
</span>集合类存放的都是对象的引用，而非对象本身，出于表达上的便利，我们称集合中的对象就是指集合中对象的引用（<span lang="EN-US">reference)</span>。<span lang="EN-US"><br />
</span>集合类型主要有<span lang="EN-US">3</span>种：<span lang="EN-US">set(</span>集）、<span lang="EN-US">list(</span>列表）和<span lang="EN-US">map(</span>映射<span lang="EN-US">)</span>。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">(1)</span><span style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">集<span lang="EN-US"><br />
</span>集（<span lang="EN-US">set</span>）是最简单的一种集合，它的对象不按特定方式排序，只是简单的把对象加入集合中，就像往口袋里放东西。<span lang="EN-US"><br />
</span>对集中成员的访问和操作是通过集中对象的引用进行的，所以集中不能有重复对象。<span lang="EN-US"><br />
</span>集也有多种变体，可以实现排序等功能，如<span lang="EN-US">TreeSet</span>，它把对象添加到集中的操作将变为按照某种比较规则将其插入到有序的对象序列中。它实现的是<span lang="EN-US">SortedSet</span>接口，也就是加入了对象比较的方法。通过对集中的对象迭代，我们可以得到一个升序的对象集合。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">(2)</span><span style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">列表<span lang="EN-US"><br />
</span>列表的主要特征是其对象以线性方式存储，没有特定顺序，只有一个开头和一个结尾，当然，它与根本没有顺序的集是不同的。<span lang="EN-US"><br />
</span>列表在数据结构中分别表现为：数组和向量、链表、堆栈、队列。<span lang="EN-US"><br />
</span>关于实现列表的集合类，是我们日常工作中经常用到的，将在后边的笔记详细介绍。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">(3)</span><span style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">映射<span lang="EN-US"><br />
</span>映射与集或列表有明显区别，映射中每个项都是成对的。映射中存储的每个对象都有一个相关的关键字（<span lang="EN-US">Key</span>）对象，关键字决定了对象在映射中的存储位置，检索对象时必须提供相应的关键字，就像在字典中查单词一样。关键字应该是唯一的。<span lang="EN-US"><br />
</span>关键字本身并不能决定对象的存储位置，它需要对过一种散列<span lang="EN-US">(hashing)</span>技术来处理，产生一个被称作散列码<span lang="EN-US">(hash code)</span>的整数值，散列码通常用作一个偏置量，该偏置量是相对于分配给映射的内存区域起始位置的，由此确定关键字<span lang="EN-US">/</span>对象对的存储位置。理想情况下，散列处理应该产生给定范围内均匀分布的值，而且每个关键字应得到不同的散列码。<span lang="EN-US"><o:p></o:p></span></span></p>
<ul type="disc">
    <li class="MsoNormal" style="text-align: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l1 level1 lfo1; tab-stops: list 36.0pt"><strong><span style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">集合类简介</span></strong><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"> <o:p></o:p></span></li>
</ul>
<p class="MsoNormal" style="text-align: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">java.util</span><span style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">中共有<span lang="EN-US">13</span>个类可用于管理集合对象，它们支持集、列表或映射等集合，以下是这些类的简单介绍<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"><strong><span style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">集：<span lang="EN-US"><br />
HashSet</span>：</span></strong><span style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"> 使用<span lang="EN-US">HashMap</span>的一个集的实现。虽然集定义成无序，但必须存在某种方法能相当高效地找到一个对象。使用一个<span lang="EN-US">HashMap</span>对象实现集的存储和检索操作是在固定时间内实现的<span lang="EN-US">. <br />
<strong>TreeSet</strong></span><strong>：</strong> 在集中以升序对对象排序的集的实现。这意味着从一个<span lang="EN-US">TreeSet</span>对象获得第一个迭代器将按升序提供对象。<span lang="EN-US">TreeSet</span>类使用了一个<span lang="EN-US">TreeMap. <br />
</span><strong>列表：</strong><span lang="EN-US"><br />
<strong>Vector</strong></span><strong>：</strong> 实现一个类似数组一样的表，自动增加容量来容纳你所需的元素。使用下标存储和检索对象就象在一个标准的数组中一样。你也可以用一个迭代器从一个<span lang="EN-US">Vector</span>中检索对象。<span lang="EN-US">Vector</span>是唯一的同步容器类<span lang="EN-US">??</span>当两个或多个线程同时访问时也是性能良好的。<span lang="EN-US"> <br />
<strong>Stsck:</strong> </span>这个类从<span lang="EN-US">Vector</span>派生而来，并且增加了方法实现栈<span lang="EN-US">??</span>一种后进先出的存储结构。<span lang="EN-US"> <br />
<strong>LinkedList:</strong> </span>实现一个链表。由这个类定义的链表也可以像栈或队列一样被使用。<span lang="EN-US"> <br />
<strong>ArrayList:</strong> </span>实现一个数组，它的规模可变并且能像链表一样被访问。它提供的功能类似<span lang="EN-US">Vector</span>类但不同步。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><br />
</span><strong><span style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">映射：<span lang="EN-US"><br />
HashTable</span>：</span></strong><span style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"> 实现一个映象，所有的键必须非空。为了能高效的工作，定义键的类必须实现<span lang="EN-US">hashcode()</span>方法和<span lang="EN-US">equal()</span>方法。这个类是前面<span lang="EN-US">java</span>实现的一个继承，并且通常能在实现映象的其他类中更好的使用。<span lang="EN-US"> <br />
<strong>HashMap</strong></span><strong>：</strong> 实现一个映象，允许存储空对象，而且允许键是空（由于键必须是唯一的，当然只能有一个）。<span lang="EN-US"> <br />
<strong>WeakHashMap</strong></span><strong>：</strong> 实现这样一个映象：通常如果一个键对一个对象而言不再被引用，键<span lang="EN-US">/</span>对象对将被舍弃。这与<span lang="EN-US">HashMap</span>形成对照，映象中的键维持键<span lang="EN-US">/</span>对象对的生命周期，尽管使用映象的程序不再有对键的引用，并且因此不能检索对象。<span lang="EN-US"> <br />
<strong>TreeMap</strong></span><strong>：</strong> 实现这样一个映象，对象是按键升序排列的。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">Set</span><span style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">和<span lang="EN-US">List</span>都是由公共接口<span lang="EN-US">Collection</span>扩展而来，所以它们都可以使用一个类型为<span lang="EN-US">Collection</span>的变量来引用。这就意味着任何列表或集构成的集合都可以用这种方式引用，只有映射类除外（但也不是完全排除在外，因为可以从映射获得一个列表。）所以说，把一个列表或集传递给方法的标准途径是使用<span lang="EN-US">Collection</span>类型的参数。<span lang="EN-US"><o:p></o:p></span></span></p>
<ul type="disc">
    <li class="MsoNormal" style="text-align: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l0 level1 lfo2; tab-stops: list 36.0pt"><strong><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">Vector </span></strong><strong><span style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">还是<span lang="EN-US">ArrayList</span>，哪一个更好，为什么？</span></strong><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"> <o:p></o:p></span></li>
</ul>
<p class="MsoNormal" style="text-align: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"><span style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">要回答这个问题不能一概而论，有时候使用<span lang="EN-US">Vector</span>比较好；有时是<span lang="EN-US">ArrayList</span>，有时候这两个都不是最好的选择。你别指望能够获得一个简单肯定答案，因为这要看你用它们干什么。下面有<span lang="EN-US">4</span>个要考虑的因素：<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">(1)API<o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">(2)</span><span style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">同步处理<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">(3)</span><span style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">数据增长性<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">(4)</span><span style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">使用模式<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"><span style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">下面针对这<span lang="EN-US">4</span>个方面进行一一探讨<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"><strong><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">API </span></strong><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><br />
</span><span style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">在由<span lang="EN-US">Ken Arnold</span>等编著的《<span lang="EN-US">Java Programming Language</span>》<span lang="EN-US">(Addison-Wesley, June 2000)</span>一书中有这样的描述，<span lang="EN-US">Vector</span>类似于<span lang="EN-US">ArrayList.</span>。所有从<span lang="EN-US">API</span>的角度来看这两个类非常相似。但他们之间也还是有一些主要的区别的。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"><strong><span style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">同步性</span></strong><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">Vector</span><span style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">是同步的。这个类中的一些方法保证了<span lang="EN-US">Vector</span>中的对象是线程安全的。而<span lang="EN-US">ArrayList</span>则是异步的，因此<span lang="EN-US">ArrayList</span>中的对象并不是线程安全的。因为同步的要求会影响执行的效率，所以如果你不需要线程安全的集合那么使用<span lang="EN-US">ArrayList</span>是一个很好的选择，这样可以避免由于同步带来的不必要的性能开销。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"><strong><span style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">数据增长</span></strong><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"><span style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">从内部实现机制来讲<span lang="EN-US">ArrayList</span>和<span lang="EN-US">Vector</span>都是使用数组<span lang="EN-US">(Array)</span>来控制集合中的对象。当你向这两种类型中增加元素的时候，如果元素的数目超出了内部数组目前的长度它们都需要扩展内部数组的长度，<span lang="EN-US">Vector</span>缺省情况下自动增长原来一倍的数组长度，<span lang="EN-US">ArrayList</span>是原来的<span lang="EN-US">50%,</span>所以最后你获得的这个集合所占的空间总是比你实际需要的要大。所以如果你要在集合中保存大量的数据那么使用<span lang="EN-US">Vector</span>有一些优势，因为你可以通过设置集合的初始化大小来避免不必要的资源开销。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"><strong><span style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">使用模式</span></strong><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"><span style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">在<span lang="EN-US">ArrayList</span>和<span lang="EN-US">Vector</span>中，从一个指定的位置（通过索引）查找数据或是在集合的末尾增加、移除一个元素所花费的时间是一样的，这个时间我们用<span lang="EN-US">O(1)</span>表示。但是，如果在集合的其他位置增加或移除元素那么花费的时间会呈线形增长：<span lang="EN-US">O(n-i)</span>，其中<span lang="EN-US">n</span>代表集合中元素的个数，<span lang="EN-US">i</span>代表元素增加或移除元素的索引位置。为什么会这样呢？以为在进行上述操作的时候集合中第<span lang="EN-US">i</span>和第<span lang="EN-US">i</span>个元素之后的所有元素都要执行位移的操作。这一切意味着什么呢？<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"><span style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">这意味着，你只是查找特定位置的元素或只在集合的末端增加、移除元素，那么使用<span lang="EN-US">Vector</span>或<span lang="EN-US">ArrayList</span>都可以。如果是其他操作，你最好选择其他的集合操作类。比如，<span lang="EN-US">LinkList</span>集合类在增加或移除集合中任何位置的元素所花费的时间都是一样的<span lang="EN-US">—O(1)</span>，但它在索引一个元素的使用缺比较慢－<span lang="EN-US">O(i),</span>其中<span lang="EN-US">i</span>是索引的位置<span lang="EN-US">.</span>使用<span lang="EN-US">ArrayList</span>也很容易，因为你可以简单的使用索引来代替创建<span lang="EN-US">iterator</span>对象的操作。<span lang="EN-US">LinkList</span>也会为每个插入的元素创建对象，所有你要明白它也会带来额外的开销。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"><span style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">最后，在《<span lang="EN-US">Practical Java</span>》一书中<span lang="EN-US">Peter Haggar</span>建议使用一个简单的数组（<span lang="EN-US">Array</span>）来代替<span lang="EN-US">Vector</span>或<span lang="EN-US">ArrayList</span>。尤其是对于执行效率要求高的程序更应如此。因为使用数组<span lang="EN-US">(Array)</span>避免了同步、额外的方法调用和不必要的重新分配空间的操作。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<img src ="http://www.blogjava.net/youling/aggbug/239507.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/youling/" target="_blank">黑豆熊</a> 2008-11-09 11:24 <a href="http://www.blogjava.net/youling/archive/2008/11/09/239507.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>