﻿<?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-fjpan2002-文章分类-Java</title><link>http://www.blogjava.net/fjpan2002/category/3566.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 28 Feb 2007 07:48:04 GMT</lastBuildDate><pubDate>Wed, 28 Feb 2007 07:48:04 GMT</pubDate><ttl>60</ttl><item><title>Java异常处理之陋习展播（ZT）</title><link>http://www.blogjava.net/fjpan2002/articles/57079.html</link><dc:creator>勇敢的心</dc:creator><author>勇敢的心</author><pubDate>Fri, 07 Jul 2006 01:53:00 GMT</pubDate><guid>http://www.blogjava.net/fjpan2002/articles/57079.html</guid><wfw:comment>http://www.blogjava.net/fjpan2002/comments/57079.html</wfw:comment><comments>http://www.blogjava.net/fjpan2002/articles/57079.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fjpan2002/comments/commentRss/57079.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fjpan2002/services/trackbacks/57079.html</trackback:ping><description><![CDATA[
		<p>
				<font size="2">java 异常  </font>
		</p>
		<p>
				<br />
				<font size="2">你觉得自己是一个Java专家吗？是否肯定自己已经全面掌握了Java的异常处理机制？在下面这段代码中，你能够迅速找出异常处理的六个问题吗？  </font>
		</p>
		<p>
				<font size="2">[code:1:48e2a3bb92] <br />1 OutputStreamWriter out = ... </font>
		</p>
		<p>
				<font size="2">2 java.sql.Connection conn = ... </font>
		</p>
		<p>
				<font size="2">3 try { // ⑸ </font>
		</p>
		<p>
				<font size="2">4    Statement stat = conn.createStatement();                                                                           </font>
		</p>
		<p>
				<font size="2">5    ResultSet rs = stat.executeQuery( </font>
		</p>
		<p>
				<font size="2">6    "select uid, name from user"); </font>
		</p>
		<p>
				<font size="2">7    while (rs.next()) </font>
		</p>
		<p>
				<font size="2">8    { </font>
		</p>
		<p>
				<font size="2">9       out.println("ID：" + rs.getString("uid") // ⑹ </font>
		</p>
		<p>
				<font size="2">10     "，姓名：" + rs.getString("name")); </font>
		</p>
		<p>
				<font size="2">11   } </font>
		</p>
		<p>
				<font size="2">12   conn.close(); // ⑶ </font>
		</p>
		<p>
				<font size="2">13   out.close(); </font>
		</p>
		<p>
				<font size="2">14 } </font>
		</p>
		<p>
				<font size="2">15 catch(Exception ex) // ⑵ </font>
		</p>
		<p>
				<font size="2">16 { </font>
		</p>
		<p>
				<font size="2">17    ex.printStackTrace(); //⑴，⑷ </font>
		</p>
		<p>
				<font size="2">18 } <br />[/code:1:48e2a3bb92] </font>
		</p>
		<p>
				<font size="2">
				</font> </p>
		<p>
				<font size="2">　　作为一个Java程序员，你至少应该能够找出两个问题。但是，如果你不能找出全部六个问题，请继续阅读本文。  </font>
		</p>
		<p>
				<br />
				<font size="2">　　本文讨论的不是Java异常处理的一般性原则，因为这些原则已经被大多数人熟知。我们要做的是分析各种可称为“反例”（anti-pattern）的违背优秀编码规范的常见坏习惯，帮助读者熟悉这些典型的反面例子，从而能够在实际工作中敏锐地察觉和避免这些问题。  </font>
		</p>
		<p>
				<br />
				<font size="2">　　反例之一：丢弃异常 </font>
		</p>
		<p>
				<br />
				<font size="2">　　代码：15行-18行。  </font>
		</p>
		<p>
				<br />
				<font size="2">　　这段代码捕获了异常却不作任何处理，可以算得上Java编程中的杀手。从问题出现的频繁程度和祸害程度来看，它也许可以和C/C++程序的一个恶名远播的问题相提并论——不检查缓冲区是否已满。如果你看到了这种丢弃（而不是抛出）异常的情况，可以百分之九十九地肯定代码存在问题（在极少数情况下，这段代码有存在的理由，但最好加上完整的注释，以免引起别人误解）。  </font>
		</p>
		<p>
				<br />
				<font size="2">　　这段代码的错误在于，异常（几乎）总是意味着某些事情不对劲了，或者说至少发生了某些不寻常的事情，我们不应该对程序发出的求救信号保持沉默和无动于衷。调用一下printStackTrace算不上“处理异常”。不错，调用printStackTrace对调试程序有帮助，但程序调试阶段结束之后，printStackTrace就不应再在异常处理模块中担负主要责任了。  </font>
		</p>
		<p>
				<br />
				<font size="2">　　丢弃异常的情形非常普遍。打开JDK的ThreadDeath类的文档，可以看到下面这段说明：“特别地，虽然出现ThreadDeath是一种‘正常的情形’，但ThreadDeath类是Error而不是Exception的子类，因为许多应用会捕获所有的Exception然后丢弃它不再理睬。”这段话的意思是，虽然ThreadDeath代表的是一种普通的问题，但鉴于许多应用会试图捕获所有异常然后不予以适当的处理，所以JDK把ThreadDeath定义成了Error的子类，因为Error类代表的是一般的应用不应该去捕获的严重问题。可见，丢弃异常这一坏习惯是如此常见，它甚至已经影响到了Java本身的设计。  </font>
		</p>
		<p>
				<br />
				<font size="2">　　那么，应该怎样改正呢？主要有四个选择：  </font>
		</p>
		<p>
				<br />
				<font size="2">　　1、处理异常。针对该异常采取一些行动，例如修正问题、提醒某个人或进行其他一些处理，要根据具体的情形确定应该采取的动作。再次说明，调用printStackTrace算不上已经“处理好了异常”。  </font>
		</p>
		<p>
				<br />
				<font size="2">　　2、重新抛出异常。处理异常的代码在分析异常之后，认为自己不能处理它，重新抛出异常也不失为一种选择。  </font>
		</p>
		<p>
				<br />
				<font size="2">　　3、把该异常转换成另一种异常。大多数情况下，这是指把一个低级的异常转换成应用级的异常（其含义更容易被用户了解的异常）。  </font>
		</p>
		<p>
				<br />
				<font size="2">　　4、不要捕获异常。  </font>
		</p>
		<p>
				<br />
				<font size="2">　　结论一：既然捕获了异常，就要对它进行适当的处理。不要捕获异常之后又把它丢弃，不予理睬。  </font>
		</p>
		<p>
				<br />
				<font size="2">　　反例之二：不指定具体的异常  </font>
		</p>
		<p>
				<br />
				<font size="2">　　代码：15行。  </font>
		</p>
		<p>
				<br />
				<font size="2">　　许多时候人们会被这样一种“美妙的”想法吸引：用一个catch语句捕获所有的异常。最常见的情形就是使用catch(Exception ex)语句。但实际上，在绝大多数情况下，这种做法不值得提倡。为什么呢？  </font>
		</p>
		<p>
				<br />
				<font size="2">　　要理解其原因，我们必须回顾一下catch语句的用途。catch语句表示我们预期会出现某种异常，而且希望能够处理该异常。异常类的作用就是告诉Java编译器我们想要处理的是哪一种异常。由于绝大多数异常都直接或间接从java.lang.Exception派生，catch(Exception ex)就相当于说我们想要处理几乎所有的异常。  </font>
		</p>
		<p>
				<br />
				<font size="2">　　再来看看前面的代码例子。我们真正想要捕获的异常是什么呢？最明显的一个是SQLException，这是JDBC操作中常见的异常。另一个可能的异常是IOException，因为它要操作OutputStreamWriter。显然，在同一个catch块中处理这两种截然不同的异常是不合适的。如果用两个catch块分别捕获SQLException和IOException就要好多了。这就是说，catch语句应当尽量指定具体的异常类型，而不应该指定涵盖范围太广的Exception类。  </font>
		</p>
		<p>
				<br />
				<font size="2">　　另一方面，除了这两个特定的异常，还有其他许多异常也可能出现。例如，如果由于某种原因，executeQuery返回了null，该怎么办？答案是让它们继续抛出，即不必捕获也不必处理。实际上，我们不能也不应该去捕获可能出现的所有异常，程序的其他地方还有捕获异常的机会——直至最后由JVM处理。  </font>
		</p>
		<p>
				<br />
				<font size="2">　　结论二：在catch语句中尽可能指定具体的异常类型，必要时使用多个catch。不要试图处理所有可能出现的异常。  </font>
		</p>
		<p>
				<br />
				<font size="2">　　反例之三：占用资源不释放  </font>
		</p>
		<p>
				<br />
				<font size="2">　　代码：3行-14行。  </font>
		</p>
		<p>
				<br />
				<font size="2">　　异常改变了程序正常的执行流程。这个道理虽然简单，却常常被人们忽视。如果程序用到了文件、Socket、JDBC连接之类的资源，即使遇到了异常，也要正确释放占用的资源。为此，Java提供了一个简化这类操作的关键词finally。  </font>
		</p>
		<p>
				<br />
				<font size="2">　　finally是样好东西：不管是否出现了异常，Finally保证在try/catch/finally块结束之前，执行清理任务的代码总是有机会执行。遗憾的是有些人却不习惯使用finally。  </font>
		</p>
		<p>
				<br />
				<font size="2">　　当然，编写finally块应当多加小心，特别是要注意在finally块之内抛出的异常——这是执行清理任务的最后机会，尽量不要再有难以处理的错误。  </font>
		</p>
		<p>
				<br />
				<font size="2">　　结论三：保证所有资源都被正确释放。充分运用finally关键词。  </font>
		</p>
		<p>
				<br />
				<font size="2">　　反例之四：不说明异常的详细信息  </font>
		</p>
		<p>
				<br />
				<font size="2">　　代码：3行-18行。  </font>
		</p>
		<p>
				<br />
				<font size="2">　　仔细观察这段代码：如果循环内部出现了异常，会发生什么事情？我们可以得到足够的信息判断循环内部出错的原因吗？不能。我们只能知道当前正在处理的类发生了某种错误，但却不能获得任何信息判断导致当前错误的原因。  </font>
		</p>
		<p>
				<br />
				<font size="2">　　printStackTrace的堆栈跟踪功能显示出程序运行到当前类的执行流程，但只提供了一些最基本的信息，未能说明实际导致错误的原因，同时也不易解读。  </font>
		</p>
		<p>
				<br />
				<font size="2">　　因此，在出现异常时，最好能够提供一些文字信息，例如当前正在执行的类、方法和其他状态信息，包括以一种更适合阅读的方式整理和组织printStackTrace提供的信息。  </font>
		</p>
		<p>
				<br />
				<font size="2">　　结论四：在异常处理模块中提供适量的错误原因信息，组织错误信息使其易于理解和阅读。  </font>
		</p>
		<p>
				<br />
				<font size="2">　　反例之五：过于庞大的try块  </font>
		</p>
		<p>
				<br />
				<font size="2">　　代码：3行-14行。  </font>
		</p>
		<p>
				<br />
				<font size="2">　　经常可以看到有人把大量的代码放入单个try块，实际上这不是好习惯。这种现象之所以常见，原因就在于有些人图省事，不愿花时间分析一大块代码中哪几行代码会抛出异常、异常的具体类型是什么。把大量的语句装入单个巨大的try块就象是出门旅游时把所有日常用品塞入一个大箱子，虽然东西是带上了，但要找出来可不容易。  </font>
		</p>
		<p>
				<br />
				<font size="2">　　一些新手常常把大量的代码放入单个try块，然后再在catch语句中声明Exception，而不是分离各个可能出现异常的段落并分别捕获其异常。这种做法为分析程序抛出异常的原因带来了困难，因为一大段代码中有太多的地方可能抛出Exception。  </font>
		</p>
		<p>
				<br />
				<font size="2">　　结论五：尽量减小try块的体积。  </font>
		</p>
		<p>
				<br />
				<font size="2">　　反例之六：输出数据不完整  </font>
		</p>
		<p>
				<br />
				<font size="2">　　代码：7行-11行。  </font>
		</p>
		<p>
				<br />
				<font size="2">　　不完整的数据是Java程序的隐形杀手。仔细观察这段代码，考虑一下如果循环的中间抛出了异常，会发生什么事情。循环的执行当然是要被打断的，其次，catch块会执行——就这些，再也没有其他动作了。已经输出的数据怎么办？使用这些数据的人或设备将收到一份不完整的（因而也是错误的）数据，却得不到任何有关这份数据是否完整的提示。对于有些系统来说，数据不完整可能比系统停止运行带来更大的损失。  </font>
		</p>
		<p>
				<br />
				<font size="2">　　较为理想的处置办法是向输出设备写一些信息，声明数据的不完整性；另一种可能有效的办法是，先缓冲要输出的数据，准备好全部数据之后再一次性输出。  </font>
		</p>
		<p>
				<br />
				<font size="2">　　结论六：全面考虑可能出现的异常以及这些异常对执行流程的影响。  </font>
		</p>
		<p>
				<br />
				<font size="2">　　改写后的代码  </font>
		</p>
		<p>
				<br />
				<font size="2">　　根据上面的讨论，下面给出改写后的代码。也许有人会说它稍微有点啰嗦，但是它有了比较完备的异常处理机制。  </font>
		</p>
		<p>
				<font size="2">[code:1:48e2a3bb92] <br />OutputStreamWriter out = ... </font>
		</p>
		<p>
				<font size="2">java.sql.Connection conn = ... </font>
		</p>
		<p>
				<font size="2">try { </font>
		</p>
		<p>
				<font size="2">   Statement stat = conn.createStatement(); </font>
		</p>
		<p>
				<font size="2">   ResultSet rs = stat.executeQuery( </font>
		</p>
		<p>
				<font size="2">   "select uid, name from user"); </font>
		</p>
		<p>
				<font size="2">   while (rs.next()) </font>
		</p>
		<p>
				<font size="2">   { </font>
		</p>
		<p>
				<font size="2">      out.println("ID：" + rs.getString("uid") + </font>
		</p>
		<p>
				<font size="2">      "，姓名: " + rs.getString("name")); </font>
		</p>
		<p>
				<font size="2">   } </font>
		</p>
		<p>
				<font size="2">} </font>
		</p>
		<p>
				<font size="2">catch(SQLException sqlex) </font>
		</p>
		<p>
				<font size="2">{ </font>
		</p>
		<p>
				<font size="2">   out.println("警告：数据不完整"); </font>
		</p>
		<p>
				<font size="2">   throw new ApplicationException( </font>
		</p>
		<p>
				<font size="2">   "读取数据时出现SQL错误", sqlex); </font>
		</p>
		<p>
				<font size="2">} </font>
		</p>
		<p>
				<font size="2">catch(IOException ioex) </font>
		</p>
		<p>
				<font size="2">{ </font>
		</p>
		<p>
				<font size="2">   throw new ApplicationException( </font>
		</p>
		<p>
				<font size="2">   "写入数据时出现IO错误", ioex); </font>
		</p>
		<p>
				<font size="2">} </font>
		</p>
		<p>
				<font size="2">finally </font>
		</p>
		<p>
				<font size="2">{ </font>
		</p>
		<p>
				<font size="2">   if (conn != null) { </font>
		</p>
		<p>
				<font size="2">      try { </font>
		</p>
		<p>
				<font size="2">         conn.close(); </font>
		</p>
		<p>
				<font size="2">      } </font>
		</p>
		<p>
				<font size="2">      catch(SQLException sqlex2) </font>
		</p>
		<p>
				<font size="2">      { </font>
		</p>
		<p>
				<font size="2">          System.err(this.getClass().getName() + </font>
		</p>
		<p>
				<font size="2">          ".mymethod - 不能关闭数据库连接: " + </font>
		</p>
		<p>
				<font size="2">          sqlex2.toString()); </font>
		</p>
		<p>
				<font size="2">      } </font>
		</p>
		<p>
				<font size="2">   } </font>
		</p>
		<p>
				<br />
				<font size="2">   if (out != null) { </font>
		</p>
		<p>
				<font size="2">      try { </font>
		</p>
		<p>
				<font size="2">         out.close(); </font>
		</p>
		<p>
				<font size="2">      } </font>
		</p>
		<p>
				<font size="2">      catch(IOException ioex2) </font>
		</p>
		<p>
				<font size="2">      { </font>
		</p>
		<p>
				<font size="2">         System.err(this.getClass().getName() + </font>
		</p>
		<p>
				<font size="2">         ".mymethod - 不能关闭输出文件" + </font>
		</p>
		<p>
				<font size="2">         ioex2.toString()); </font>
		</p>
		<p>
				<font size="2">      } </font>
		</p>
		<p>
				<font size="2">   } </font>
		</p>
		<p>
				<font size="2">} <br />[/code:1:48e2a3bb92] </font>
		</p>
		<p>
				<font size="2">　　本文的结论不是放之四海皆准的教条，有时常识和经验才是最好的老师。如果你对自己的做法没有百分之百的信心，务必加上详细、全面的注释。  <br />　　另一方面，不要笑话这些错误，不妨问问你自己是否真地彻底摆脱了这些坏习惯。即使最有经验的程序员偶尔也会误入歧途，原因很简单，因为它们确确实实带来了“方便”。所有这些反例都可以看作Java编程世界的恶魔，它们美丽动人，无孔不入，时刻诱惑着你。也许有人会认为这些都属于鸡皮蒜毛的小事，不足挂齿，但请记住：勿以恶小而为之，勿以善小而不为。 <br /></font>
		</p>
<img src ="http://www.blogjava.net/fjpan2002/aggbug/57079.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fjpan2002/" target="_blank">勇敢的心</a> 2006-07-07 09:53 <a href="http://www.blogjava.net/fjpan2002/articles/57079.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java面试题3</title><link>http://www.blogjava.net/fjpan2002/articles/25849.html</link><dc:creator>勇敢的心</dc:creator><author>勇敢的心</author><pubDate>Thu, 29 Dec 2005 02:53:00 GMT</pubDate><guid>http://www.blogjava.net/fjpan2002/articles/25849.html</guid><wfw:comment>http://www.blogjava.net/fjpan2002/comments/25849.html</wfw:comment><comments>http://www.blogjava.net/fjpan2002/articles/25849.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fjpan2002/comments/commentRss/25849.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fjpan2002/services/trackbacks/25849.html</trackback:ping><description><![CDATA[简答题：<BR>1、什么是数据库的事务？事务的原子性？有几种方法可以实现事务的原子性？<BR>2、DOM是什么？SAX Parser和DOM Parser有何区别？<BR>3、同一机器中不同java虚拟机的程序有几种通讯方式？不同机器的呢？<BR>4、如何起一个线程？如何结束一个线程？如何安全地结束一个线程？<BR>以下为写具体代码题：<BR>5、用java实现一个动态增长的堆栈。<BR>6、写一个读写锁，可以同时多人读，一个人写，并用这个读写锁实现生产者－消费者同步。<BR>7、写一个单例实现，并考虑当它实现可序列化接口的实现。<BR>8、写任意一种排序方法，并说明如何将这个排序算法应用到Java Collection中。<BR>9、写一个程序判断一字节byte中有多少bit被置为1?<BR>思考题：<BR>10、有一个单向链表，不知道它的头，有个指针P指向该链表中的节点N，如何将节点N删除？<BR><BR><BR>[基础问答]<BR>1.下面哪些类可以被继承?<BR>java.lang.Thread&nbsp;(T)<BR>java.lang.Number&nbsp;(T)<BR>java.lang.Double&nbsp;(F)<BR>java.lang.Math&nbsp;&nbsp;(F)<BR>java.lang.Void&nbsp;&nbsp;(F)<BR>java.lang.Class&nbsp;&nbsp;(F)<BR>java.lang.ClassLoader&nbsp;(T)<BR><BR>2.抽象类和接口的区别<BR>(1)接口可以被多重implements,抽象类只能被单一extends<BR>(2)接口只有定义,抽象类可以有定义和实现<BR>(3)接口的字段定义默认为:public&nbsp;static&nbsp;final,&nbsp;抽象类字段默认是"friendly"(本包可见)<BR><BR>3.Hashtable的原理,并说出HashMap与Hashtable的区别<BR>HashTable的原理:通过节点的关键码确定节点的存储位置,即给定节点的关键码k,通过一定的函数关系H(散列函数),得到函数值H(k),将此值解释为该节点的存储地址.<BR>HashMap&nbsp;与Hashtable很相似,但HashMap&nbsp;是非同步(unsynchronizded)和可以以null为关键码的.<BR><BR>4.forward和redirect的区别<BR>forward:&nbsp;an&nbsp;internal&nbsp;transfer&nbsp;in&nbsp;servlet<BR>redirect:&nbsp;重定向,有2次request,第2次request将丢失第一次的attributs/parameters等<BR><BR>5.什么是Web容器?<BR>实现J2EE规范中web协议的应用.该协议定义了web程序的运行时环境,包括:并发性,安全性,生命周期管理等等.<BR><BR>6.解释下面关于J2EE的名词<BR>(1)JNDI:Java&nbsp;Naming&nbsp;&amp;&nbsp;Directory&nbsp;Interface,JAVA命名目录服务.主要提供的功能是：提供一个目录系统，让其它各地的应用程序在其上面留下自己的索引，从而满足快速查找和定位分布式应用程序的功能.<BR>(2)JMS：Java&nbsp;Message&nbsp;Service,JAVA消息服务.主要实现各个应用程序之间的通讯.包括点对点和广播.<BR>(3)JTA：Java&nbsp;Transaction&nbsp;API,JAVA事务服务.提供各种分布式事务服务.应用程序只需调用其提供的接口即可.<BR>(4)JAF:&nbsp;Java&nbsp;Action&nbsp;FrameWork,JAVA安全认证框架.提供一些安全控制方面的框架.让开发者通过各种部署和自定义实现自己的个性安全控制策略.<BR>(5)RMI:Remote&nbsp;Method&nbsp;Interface,远程方法调用<BR><BR>7.EJB是基于哪些技术实现的？并说&nbsp;出SessionBean和EntityBean的区别，StatefulBean和StatelessBean的区别.<BR>EJB包括Session&nbsp;Bean、Entity&nbsp;Bean、Message&nbsp;Driven&nbsp;Bean，基于JNDI、RMI、JAT等技术实现.<BR>SessionBean在J2EE应用程序中被用来完成一些服务器端的业务操作，例如访问数据库、调用其他EJB组件.EntityBean被用来代表应用系统中用到的数据.对于客户机，SessionBean是一种非持久性对象，它实现某些在服务器上运行的业务逻辑;EntityBean是一种持久性对象，它代表一个存储在持久性存储器中的实体的对象视图，或是一个由现有企业应用程序实现的实体.<BR>Session&nbsp;Bean&nbsp;还可以再细分为&nbsp;Stateful&nbsp;Session&nbsp;Bean&nbsp;与&nbsp;Stateless&nbsp;Session&nbsp;Bean&nbsp;.这两种的&nbsp;Session&nbsp;Bean都可以将系统逻辑放在&nbsp;method之中执行，不同的是&nbsp;Stateful&nbsp;Session&nbsp;Bean&nbsp;可以记录呼叫者的状态，因此通常来说，一个使用者会有一个相对应的&nbsp;Stateful&nbsp;Session&nbsp;Bean&nbsp;的实体.Stateless&nbsp;Session&nbsp;Bean&nbsp;虽然也是逻辑组件，但是他却不负责记录使用者状态，也就是说当使用者呼叫&nbsp;Stateless&nbsp;Session&nbsp;Bean&nbsp;的时候，EJB&nbsp;Container&nbsp;并不会找寻特定的&nbsp;Stateless&nbsp;Session&nbsp;Bean&nbsp;的实体来执行这个&nbsp;method.换言之，很可能数个使用者在执行某个&nbsp;Stateless&nbsp;Session&nbsp;Bean&nbsp;的&nbsp;methods&nbsp;时，会是同一个&nbsp;Bean&nbsp;的&nbsp;Instance&nbsp;在执行.从内存方面来看，&nbsp;Stateful&nbsp;Session&nbsp;Bean&nbsp;与&nbsp;Stateless&nbsp;Session&nbsp;Bean&nbsp;比较，&nbsp;Stateful&nbsp;Session&nbsp;Bean&nbsp;会消耗&nbsp;J2EE&nbsp;Server&nbsp;较多的内存，然而&nbsp;Stateful&nbsp;Session&nbsp;Bean&nbsp;的优势却在于他可以维持使用者的状态.<BR><BR>8.XML的解析方法<BR>Sax,DOM,JDOM<BR><BR>9.什么是Web&nbsp;Service?<BR>Web&nbsp;Service就是为了使原来各孤立的站点之间的信息能够相互通信、共享而提出的一种接口。<BR>Web&nbsp;Service所使用的是Internet上统一、开放的标准，如HTTP、XML、SOAP（简单对象访问协议）、WSDL等，所以Web&nbsp;Service可以在任何支持这些标准的环境（Windows,Linux）中使用。<BR>注：SOAP协议（Simple&nbsp;Object&nbsp;Access&nbsp;Protocal,简单对象访问协议）,它是一个用于分散和分布式环境下网络信息交换的基于XML的通讯协议。在此协议下，软件组件或应用程序能够通过标准的HTTP协议进行通讯。它的设计目标就是简单性和扩展性，这有助于大量异构程序和平台之间的互操作性，从而使存在的应用程序能够被广泛的用户访问。<BR><BR>优势：<BR>(1).跨平台；<BR>(2).SOAP协议是基于XML和HTTP这些业界的标准的，得到了所有的重要公司的支持。<BR>(3).由于使用了SOAP，数据是以ASCII文本的方式而非二进制传输，调试很方便；并且由于这样，它的数据容易通过防火墙，不需要防火墙为了程序而单独开一个“漏洞”。<BR>(4).此外，WebService实现的技术难度要比CORBA和DCOM小得多。<BR>(5).要实现B2B集成，EDI比较完善与比较复杂；而用WebService则可以低成本的实现，小公司也可以用上。<BR>(6).在C/S的程序中，WebService可以实现网页无整体刷新的与服务器打交道并取数。<BR>缺点：<BR>(1).WebService使用了XML对数据封装，会造成大量的数据要在网络中传输。<BR>(2).WebService规范没有规定任何与实现相关的细节，包括对象模型、编程语言，这一点，它不如CORBA。<BR><BR>10.多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么?<BR>答：多线程有两种实现方法，分别是继承Thread类与实现Runnable接口<BR>同步的实现方面有两种，分别是synchronized,wait与notify<BR><BR>11.JSP中动态INCLUDE与静态INCLUDE的区别？&nbsp;<BR>动态INCLUDE用jsp:include动作实现<BR>&lt;jsp:include&nbsp;page="included.jsp"&nbsp;flush="true"/&gt;<BR>它总是会检查所含文件中的变化，适合用于包含动态页面，并且可以带参数<BR>静态INCLUDE用include伪码实现,定不会检查所含文件的变化，适用于包含静态页面<BR>&lt;%@&nbsp;include&nbsp;file="included.htm"&nbsp;%&gt;<BR>&nbsp;<BR><BR><BR>[Java编程与程序运行结果]<BR>1.Java编程,打印昨天的当前时刻<BR>public&nbsp;class&nbsp;YesterdayCurrent{<BR>&nbsp;&nbsp;public&nbsp;void&nbsp;main(String[]&nbsp;args){<BR>&nbsp;&nbsp;&nbsp;&nbsp;Calendar&nbsp;cal&nbsp;=&nbsp;Calendar.getInstance();<BR>&nbsp;&nbsp;&nbsp;&nbsp;cal.add(Calendar.DATE,&nbsp;-1);<BR>&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(cal.getTime());<BR>&nbsp;&nbsp;}<BR>}<BR><BR>2.文件读写,实现一个计数器<BR>&nbsp;&nbsp;public&nbsp;int&nbsp;getNum(){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;i&nbsp;=&nbsp;-1;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;stri="";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BufferedReader&nbsp;in&nbsp;=&nbsp;new&nbsp;BufferedReader(new&nbsp;FileReader(f));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while((stri=in.readLine())!=null){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;=&nbsp;Integer.parseInt(stri.trim());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in.close();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}catch(Exception&nbsp;e){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;i;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;setNum(){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;i&nbsp;=&nbsp;getNum();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i++;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PrintWriter&nbsp;out=new&nbsp;PrintWriter(new&nbsp;BufferedWriter(new&nbsp;FileWriter(f,false)));&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.write(String.valueOf(i));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//可能是编码的原因，如果直接写入int的话，将出现java编码和windows编码的混乱，因此此处写入的是String<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.close()&nbsp;;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}catch(Exception&nbsp;e){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>3.&nbsp;指出下面程序的运行结果:<BR>class&nbsp;A{<BR>&nbsp;&nbsp;&nbsp;&nbsp;static{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.print("1");<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;A(){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.print("2");<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>}<BR>class&nbsp;B&nbsp;extends&nbsp;A{<BR>&nbsp;&nbsp;&nbsp;&nbsp;static{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.print("a");<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;B(){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.print("b");<BR>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;<BR>}<BR>public&nbsp;class&nbsp;Hello{<BR>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;ars){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A&nbsp;ab&nbsp;=&nbsp;new&nbsp;B();&nbsp;//执行到此处,结果:&nbsp;1a2b<BR>&nbsp;ab&nbsp;=&nbsp;new&nbsp;B();&nbsp;//执行到此处,结果:&nbsp;1a2bab<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>}<BR>注:类的static&nbsp;代码段,可以看作是类首次加载(被虚拟机加载)执行的代码,而对于类的加载,首先要执行其基类的构造,再执行其本身的构造<BR>4.写一个Singleton模式的例子<BR>public&nbsp;class&nbsp;Singleton{<BR>&nbsp;private&nbsp;static&nbsp;Singleton&nbsp;single&nbsp;=&nbsp;new&nbsp;Singleton();<BR>&nbsp;private&nbsp;Singleton(){}<BR>&nbsp;public&nbsp;Singleton&nbsp;getInstance(){<BR>&nbsp;&nbsp;return&nbsp;single;<BR>&nbsp;}<BR>}<BR><BR>[数据库]<BR>1.删除表的重复记录<BR>如果记录完全相同才算重复记录,那么:&nbsp;&nbsp;(sql&nbsp;server2000下测试通过)<BR>select&nbsp;distinct&nbsp;*&nbsp;into&nbsp;#tmpp&nbsp;from&nbsp;tid<BR>delete&nbsp;from&nbsp;tid&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>insert&nbsp;into&nbsp;tid&nbsp;select&nbsp;*&nbsp;from&nbsp;#tmpp<BR>drop&nbsp;table&nbsp;#tmpp<BR>如果有id主键(数字,自增1的那种),那么:(sql&nbsp;server2000下测试通过)<BR>delete&nbsp;from&nbsp;tableA&nbsp;where&nbsp;id&nbsp;not&nbsp;in<BR>(select&nbsp;id&nbsp;=&nbsp;min(id)&nbsp;from&nbsp;tableA&nbsp;group&nbsp;by&nbsp;name)<BR><BR>2.delete&nbsp;from&nbsp;tablea&nbsp;＆&nbsp;truncate&nbsp;table&nbsp;tablea的区别<BR>truncate&nbsp;语句执行速度快,占资源少,并且只记录页删除的日志；<BR>delete&nbsp;对每条记录的删除均需要记录日志<BR><img src ="http://www.blogjava.net/fjpan2002/aggbug/25849.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fjpan2002/" target="_blank">勇敢的心</a> 2005-12-29 10:53 <a href="http://www.blogjava.net/fjpan2002/articles/25849.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java排序法</title><link>http://www.blogjava.net/fjpan2002/articles/22627.html</link><dc:creator>勇敢的心</dc:creator><author>勇敢的心</author><pubDate>Mon, 05 Dec 2005 12:24:00 GMT</pubDate><guid>http://www.blogjava.net/fjpan2002/articles/22627.html</guid><wfw:comment>http://www.blogjava.net/fjpan2002/comments/22627.html</wfw:comment><comments>http://www.blogjava.net/fjpan2002/articles/22627.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fjpan2002/comments/commentRss/22627.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fjpan2002/services/trackbacks/22627.html</trackback:ping><description><![CDATA[<FONT face=Arial>/*这个程序是我在一个帖子上看到的，觉得写的十分的不错，拿出来与大家共享下*/<BR>package&nbsp;com.cucu.test;&nbsp;<BR><BR>public&nbsp;class&nbsp;Sort&nbsp;{&nbsp;<BR><BR>&nbsp;&nbsp;public&nbsp;void&nbsp;swap(int&nbsp;a[],&nbsp;int&nbsp;i,&nbsp;int&nbsp;j)&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;tmp&nbsp;=&nbsp;a[i];&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;a[i]&nbsp;=&nbsp;a[j];&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;a[j]&nbsp;=&nbsp;tmp;&nbsp;<BR>&nbsp;&nbsp;}&nbsp;<BR><BR>&nbsp;&nbsp;public&nbsp;int&nbsp;partition(int&nbsp;a[],&nbsp;int&nbsp;low,&nbsp;int&nbsp;high)&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;pivot,&nbsp;p_pos,&nbsp;i;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;p_pos&nbsp;=&nbsp;low;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;pivot&nbsp;=&nbsp;a[p_pos];&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(i&nbsp;=&nbsp;low&nbsp;+&nbsp;1;&nbsp;i&nbsp;&lt;=&nbsp;high;&nbsp;i++)&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(a[i]&nbsp;&gt;&nbsp;pivot)&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p_pos++;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;swap(a,&nbsp;p_pos,&nbsp;i);&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;swap(a,&nbsp;low,&nbsp;p_pos);&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;p_pos;&nbsp;<BR>&nbsp;&nbsp;}&nbsp;<BR><BR>&nbsp;&nbsp;public&nbsp;void&nbsp;quicksort(int&nbsp;a[],&nbsp;int&nbsp;low,&nbsp;int&nbsp;high)&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;pivot;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(low&nbsp;&lt;&nbsp;high)&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pivot&nbsp;=&nbsp;partition(a,&nbsp;low,&nbsp;high);&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;quicksort(a,&nbsp;low,&nbsp;pivot&nbsp;-&nbsp;1);&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;quicksort(a,&nbsp;pivot&nbsp;+&nbsp;1,&nbsp;high);&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<BR><BR>&nbsp;&nbsp;}&nbsp;<BR><BR>&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;main(String&nbsp;args[])&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;vec[]&nbsp;=&nbsp;new&nbsp;int[]&nbsp;{&nbsp;37,&nbsp;47,&nbsp;23,&nbsp;-5,&nbsp;19,&nbsp;56&nbsp;};&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;temp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;//选择排序法(Selection&nbsp;Sort)&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;long&nbsp;begin&nbsp;=&nbsp;System.currentTimeMillis();&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;k&nbsp;=&nbsp;0;&nbsp;k&nbsp;&lt;&nbsp;1000000;&nbsp;k++)&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;vec.length;&nbsp;i++)&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;j&nbsp;=&nbsp;i;&nbsp;j&nbsp;&lt;&nbsp;vec.length;&nbsp;j++)&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(vec[j]&nbsp;&gt;&nbsp;vec[i])&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp&nbsp;=&nbsp;vec[i];&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vec[i]&nbsp;=&nbsp;vec[j];&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vec[j]&nbsp;=&nbsp;temp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;long&nbsp;end&nbsp;=&nbsp;System.currentTimeMillis();&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("选择法用时为："&nbsp;+&nbsp;(end&nbsp;-&nbsp;begin));&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;//打印排序好的结果&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;vec.length;&nbsp;i++)&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(vec[i]);&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;冒泡排序法(Bubble&nbsp;Sort)&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;begin&nbsp;=&nbsp;System.currentTimeMillis();&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;k&nbsp;=&nbsp;0;&nbsp;k&nbsp;&lt;&nbsp;1000000;&nbsp;k++)&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;vec.length;&nbsp;i++)&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;j&nbsp;=&nbsp;i;&nbsp;j&nbsp;&lt;&nbsp;vec.length&nbsp;-&nbsp;1;&nbsp;j++)&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(vec[j&nbsp;+&nbsp;1]&nbsp;&gt;&nbsp;vec[j])&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp&nbsp;=&nbsp;vec[j&nbsp;+&nbsp;1];&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vec[j&nbsp;+&nbsp;1]&nbsp;=&nbsp;vec[j];&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vec[j]&nbsp;=&nbsp;temp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;=&nbsp;System.currentTimeMillis();&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("冒泡法用时为："&nbsp;+&nbsp;(end&nbsp;-&nbsp;begin));&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;//打印排序好的结果&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;vec.length;&nbsp;i++)&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(vec[i]);&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;//插入排序法(Insertion&nbsp;Sort)&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;begin&nbsp;=&nbsp;System.currentTimeMillis();&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;k&nbsp;=&nbsp;0;&nbsp;k&nbsp;&lt;&nbsp;1000000;&nbsp;k++)&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i&nbsp;=&nbsp;1;&nbsp;i&nbsp;&lt;&nbsp;vec.length;&nbsp;i++)&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;j&nbsp;=&nbsp;i;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(vec[j&nbsp;-&nbsp;1]&nbsp;&lt;&nbsp;vec[i])&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vec[j]&nbsp;=&nbsp;vec[j&nbsp;-&nbsp;1];&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;j--;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(j&nbsp;&lt;=&nbsp;0)&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vec[j]&nbsp;=&nbsp;vec[i];&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;=&nbsp;System.currentTimeMillis();&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("插入法用时为："&nbsp;+&nbsp;(end&nbsp;-&nbsp;begin));&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;//打印排序好的结果&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;vec.length;&nbsp;i++)&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(vec[i]);&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;//快速排序法(Quick&nbsp;Sort)&nbsp;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;Sort&nbsp;s&nbsp;=&nbsp;new&nbsp;Sort();&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;begin&nbsp;=&nbsp;System.currentTimeMillis();&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;k&nbsp;=&nbsp;0;&nbsp;k&nbsp;&lt;&nbsp;1000000;&nbsp;k++)&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s.quicksort(vec,&nbsp;0,&nbsp;5);&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;=&nbsp;System.currentTimeMillis();&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("快速法用时为："&nbsp;+&nbsp;(end&nbsp;-&nbsp;begin));&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;//打印排序好的结果&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;vec.length;&nbsp;i++)&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(vec[i]);&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;&nbsp;}&nbsp;<BR><BR>}&nbsp;</FONT><BR><BR>************************************************************************************<BR><BR>
<OL>
<LI><B><FONT color=#0000ff>package</FONT></B> org.jr.util;<BR>
<LI><BR>
<LI><I><FONT color=#339900>/**</FONT></I><BR>
<LI><I><FONT color=#339900>* Copyright: Copyright (c) 2002-2004</FONT></I><BR>
<LI><I><FONT color=#339900>* Company: JavaResearch(http://www.javaresearch.org)</FONT></I><BR>
<LI><I><FONT color=#339900>* 最后更新日期:2003年3月4日</FONT></I><BR>
<LI><I><FONT color=#339900>* @author Cherami</FONT></I><BR>
<LI><I><FONT color=#339900>*/</FONT></I><BR>
<LI><BR>
<LI><B><FONT color=#0000ff>import</FONT></B> org.jr.*;<BR>
<LI><BR>
<LI><I><FONT color=#339900>/**</FONT></I><BR>
<LI><I><FONT color=#339900>* 排序工具类，提供常见的需要排序但是又没有实现Comparable接口的类。</FONT></I><BR>
<LI><I><FONT color=#339900>* 此类也提供一些创建的排序算法的范例。</FONT></I><BR>
<LI><I><FONT color=#339900>* @since&nbsp; 0.5</FONT></I><BR>
<LI><I><FONT color=#339900>*/</FONT></I><BR>
<LI><BR>
<LI><B><FONT color=#0000ff>public</FONT></B> <B><FONT color=#0000ff>class</FONT></B> <A href="http://www.javaresearch.org/source/javaresearch/jrlib0.6/org/jr/util/CompareUtil.java.html"><FONT color=#ff0000><U>CompareUtil</U></FONT></A> {<BR>
<LI>&nbsp; <I><FONT color=#339900>/**</FONT></I><BR>
<LI><I><FONT color=#339900>&nbsp;&nbsp; * 私有构造方法，防止类的实例化，因为工具类不需要实例化。</FONT></I><BR>
<LI><I><FONT color=#339900>&nbsp;&nbsp; */</FONT></I><BR>
<LI>&nbsp; <B><FONT color=#0000ff>private</FONT></B> <A href="http://www.javaresearch.org/source/javaresearch/jrlib0.6/org/jr/util/CompareUtil.java.html"><FONT color=#ff0000><U>CompareUtil</U></FONT></A>() {<BR>
<LI>&nbsp; }<BR>
<LI><BR>
<LI>&nbsp; <I><FONT color=#339900>/**</FONT></I><BR>
<LI><I><FONT color=#339900>&nbsp;&nbsp; * 比较两个数字。</FONT></I><BR>
<LI><I><FONT color=#339900>&nbsp;&nbsp; * 这个方法取Number的double值进行比较，因此只有在两个数严格相等的情况下才返回0，</FONT></I><BR>
<LI><I><FONT color=#339900>&nbsp;&nbsp; * 又可能因为Java中Double型和Float的精度不同而导致两个相等的数不返回0。</FONT></I><BR>
<LI><I><FONT color=#339900>&nbsp;&nbsp; * @param o1 第一个数字</FONT></I><BR>
<LI><I><FONT color=#339900>&nbsp;&nbsp; * @param o2 第二个数字</FONT></I><BR>
<LI><I><FONT color=#339900>&nbsp;&nbsp; * @return 第一个数字大于第二个返回1，等于返回0，否则返回－1</FONT></I><BR>
<LI><I><FONT color=#339900>&nbsp;&nbsp; * @since&nbsp; 0.5</FONT></I><BR>
<LI><I><FONT color=#339900>&nbsp;&nbsp; */</FONT></I><BR>
<LI>&nbsp; <B><FONT color=#0000ff>public</FONT></B> <B><FONT color=#0000ff>static</FONT></B> <B><FONT color=#0000ff>int</FONT></B> compare(<B><A href="http://www.javaresearch.org/source/javaresearch/jdk142/java/lang/Number.java.html"><FONT color=#ff0000><U>Number</U></FONT></A></B> o1, <B><A href="http://www.javaresearch.org/source/javaresearch/jdk142/java/lang/Number.java.html"><FONT color=#ff0000><U>Number</U></FONT></A></B> o2) {<BR>
<LI>&nbsp;&nbsp;&nbsp; <B><FONT color=#0000ff>double</FONT></B> n1 = o1.doubleValue();<BR>
<LI>&nbsp;&nbsp;&nbsp; <B><FONT color=#0000ff>double</FONT></B> n2 = o2.doubleValue();<BR>
<LI>&nbsp;&nbsp;&nbsp; <B><FONT color=#0000ff>if</FONT></B> (n1 &lt; n2) {<BR>
<LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <B><FONT color=#0000ff>return</FONT></B> -1;<BR>
<LI>&nbsp;&nbsp;&nbsp; }<BR>
<LI>&nbsp;&nbsp;&nbsp; <B><FONT color=#0000ff>else</FONT></B> <B><FONT color=#0000ff>if</FONT></B> (n1 &gt; n2) {<BR>
<LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <B><FONT color=#0000ff>return</FONT></B> 1;<BR>
<LI>&nbsp;&nbsp;&nbsp; }<BR>
<LI>&nbsp;&nbsp;&nbsp; <B><FONT color=#0000ff>else</FONT></B> {<BR>
<LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <B><FONT color=#0000ff>return</FONT></B> 0;<BR>
<LI>&nbsp;&nbsp;&nbsp; }<BR>
<LI>&nbsp; }<BR>
<LI><BR>
<LI>&nbsp; <I><FONT color=#339900>/**</FONT></I><BR>
<LI><I><FONT color=#339900>&nbsp;&nbsp; * 比较两个布尔型值。</FONT></I><BR>
<LI><I><FONT color=#339900>&nbsp;&nbsp; * 如果两个的值不同，true被认为等于1，而false等于0。</FONT></I><BR>
<LI><I><FONT color=#339900>&nbsp;&nbsp; * @param o1 第一个值</FONT></I><BR>
<LI><I><FONT color=#339900>&nbsp;&nbsp; * @param o2 第二个值</FONT></I><BR>
<LI><I><FONT color=#339900>&nbsp;&nbsp; * @return 第一个值大于第二个返回1，等于返回0，否则返回-1</FONT></I><BR>
<LI><I><FONT color=#339900>&nbsp;&nbsp; * @since&nbsp; 0.5</FONT></I><BR>
<LI><I><FONT color=#339900>&nbsp;&nbsp; */</FONT></I><BR>
<LI>&nbsp; <B><FONT color=#0000ff>public</FONT></B> <B><FONT color=#0000ff>static</FONT></B> <B><FONT color=#0000ff>int</FONT></B> compare(<B><A href="http://www.javaresearch.org/source/javaresearch/jdk142/java/lang/Boolean.java.html"><FONT color=#ff0000><U>Boolean</U></FONT></A></B> o1, <B><A href="http://www.javaresearch.org/source/javaresearch/jdk142/java/lang/Boolean.java.html"><FONT color=#ff0000><U>Boolean</U></FONT></A></B> o2) {<BR>
<LI>&nbsp;&nbsp;&nbsp; <B><FONT color=#0000ff>boolean</FONT></B> b1 = o1.booleanValue();<BR>
<LI>&nbsp;&nbsp;&nbsp; <B><FONT color=#0000ff>boolean</FONT></B> b2 = o2.booleanValue();<BR>
<LI>&nbsp;&nbsp;&nbsp; <B><FONT color=#0000ff>if</FONT></B> (b1 == b2) {<BR>
<LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <B><FONT color=#0000ff>return</FONT></B> 0;<BR>
<LI>&nbsp;&nbsp;&nbsp; }<BR>
<LI>&nbsp;&nbsp;&nbsp; <B><FONT color=#0000ff>else</FONT></B> <B><FONT color=#0000ff>if</FONT></B> (b1) {<BR>
<LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <B><FONT color=#0000ff>return</FONT></B> 1;<BR>
<LI>&nbsp;&nbsp;&nbsp; }<BR>
<LI>&nbsp;&nbsp;&nbsp; <B><FONT color=#0000ff>else</FONT></B> {<BR>
<LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <B><FONT color=#0000ff>return</FONT></B> -1;<BR>
<LI>&nbsp;&nbsp;&nbsp; }<BR>
<LI>&nbsp; }<BR>
<LI><BR>
<LI>&nbsp; <I><FONT color=#339900>/**</FONT></I><BR>
<LI><I><FONT color=#339900>&nbsp;&nbsp; * 冒泡排序法排序。</FONT></I><BR>
<LI><I><FONT color=#339900>&nbsp;&nbsp; * @param objects 排序对象</FONT></I><BR>
<LI><I><FONT color=#339900>&nbsp;&nbsp; * @param isAscent 排序顺序</FONT></I><BR>
<LI><I><FONT color=#339900>&nbsp;&nbsp; * @return 排序后应该有的索引数组</FONT></I><BR>
<LI><I><FONT color=#339900>&nbsp;&nbsp; * @since&nbsp; 0.5</FONT></I><BR>
<LI><I><FONT color=#339900>&nbsp;&nbsp; */</FONT></I><BR>
<LI>&nbsp; <B><FONT color=#0000ff>public</FONT></B> <B><FONT color=#0000ff>static</FONT></B> <B><FONT color=#0000ff>int</FONT></B>[] n2sort(<B><A href="http://www.javaresearch.org/source/javaresearch/jdk142/java/lang/Comparable.java.html"><FONT color=#ff0000><U>Comparable</U></FONT></A></B>[] objects, <B><FONT color=#0000ff>boolean</FONT></B> isAscent) {<BR>
<LI>&nbsp;&nbsp;&nbsp; <B><FONT color=#0000ff>int</FONT></B> <B><FONT color=#0000ff>length</FONT></B> = objects.<B><FONT color=#0000ff>length</FONT></B>;<BR>
<LI>&nbsp;&nbsp;&nbsp; <B><FONT color=#0000ff>int</FONT></B>[] indexes = <A href="http://www.javaresearch.org/source/javaresearch/jrlib0.6/org/jr/util/ArrayUtil.java.html"><FONT color=#ff0000><U>ArrayUtil</U></FONT></A>.getInitedIntArray(<B><FONT color=#0000ff>length</FONT></B>);<BR>
<LI>&nbsp;&nbsp;&nbsp; <B><FONT color=#0000ff>for</FONT></B> (<B><FONT color=#0000ff>int</FONT></B> i = 0; i &lt; <B><FONT color=#0000ff>length</FONT></B>; i++) {<BR>
<LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <B><FONT color=#0000ff>for</FONT></B> (<B><FONT color=#0000ff>int</FONT></B> j = i + 1; j &lt; <B><FONT color=#0000ff>length</FONT></B>; j++) {<BR>
<LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <B><FONT color=#0000ff>if</FONT></B> (isAscent == <B><FONT color=#0000ff>true</FONT></B>) {<BR>
<LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <B><FONT color=#0000ff>if</FONT></B> (objects[indexes[i]].compareTo(objects[indexes[j]]) &gt; 0) {<BR>
<LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; swap(indexes, i, j);<BR>
<LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
<LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
<LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <B><FONT color=#0000ff>else</FONT></B> {<BR>
<LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <B><FONT color=#0000ff>if</FONT></B> (objects[indexes[i]].compareTo(objects[indexes[j]]) &lt; 0) {<BR>
<LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; swap(indexes, i, j);<BR>
<LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
<LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
<LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
<LI>&nbsp;&nbsp;&nbsp; }<BR>
<LI>&nbsp;&nbsp;&nbsp; <B><FONT color=#0000ff>return</FONT></B> indexes;<BR>
<LI>&nbsp; }<BR>
<LI><BR>
<LI>&nbsp; <I><FONT color=#339900>/**</FONT></I><BR>
<LI><I><FONT color=#339900>&nbsp;&nbsp; * 冒泡排序法排序。</FONT></I><BR>
<LI><I><FONT color=#339900>&nbsp;&nbsp; * @param objects 排序对象</FONT></I><BR>
<LI><I><FONT color=#339900>&nbsp;&nbsp; * @param key 排序关键字</FONT></I><BR>
<LI><I><FONT color=#339900>&nbsp;&nbsp; * @param isAscent 排序顺序</FONT></I><BR>
<LI><I><FONT color=#339900>&nbsp;&nbsp; * @return 排序后应该有的索引数组</FONT></I><BR>
<LI><I><FONT color=#339900>&nbsp;&nbsp; * @since&nbsp; 0.5</FONT></I><BR>
<LI><I><FONT color=#339900>&nbsp;&nbsp; */</FONT></I><BR>
<LI>&nbsp; <B><FONT color=#0000ff>public</FONT></B> <B><FONT color=#0000ff>static</FONT></B> <B><FONT color=#0000ff>int</FONT></B>[] n2sort(<A href="http://www.javaresearch.org/source/javaresearch/jrlib0.6/org/jr/PropertyComparable.java.html"><FONT color=#ff0000><U>PropertyComparable</U></FONT></A>[] objects, <B><FONT color=#0000ff>int</FONT></B> key,<BR>
<LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <B><FONT color=#0000ff>boolean</FONT></B> isAscent) {<BR>
<LI>&nbsp;&nbsp;&nbsp; <B><FONT color=#0000ff>int</FONT></B> <B><FONT color=#0000ff>length</FONT></B> = objects.<B><FONT color=#0000ff>length</FONT></B>;<BR>
<LI>&nbsp;&nbsp;&nbsp; <B><FONT color=#0000ff>int</FONT></B>[] indexes = <A href="http://www.javaresearch.org/source/javaresearch/jrlib0.6/org/jr/util/ArrayUtil.java.html"><FONT color=#ff0000><U>ArrayUtil</U></FONT></A>.getInitedIntArray(<B><FONT color=#0000ff>length</FONT></B>);<BR>
<LI>&nbsp;&nbsp;&nbsp; <B><FONT color=#0000ff>for</FONT></B> (<B><FONT color=#0000ff>int</FONT></B> i = 0; i &lt; <B><FONT color=#0000ff>length</FONT></B>; i++) {<BR>
<LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <B><FONT color=#0000ff>for</FONT></B> (<B><FONT color=#0000ff>int</FONT></B> j = i + 1; j &lt; <B><FONT color=#0000ff>length</FONT></B>; j++) {<BR>
<LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <B><FONT color=#0000ff>if</FONT></B> (isAscent == <B><FONT color=#0000ff>true</FONT></B>) {<BR>
<LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <B><FONT color=#0000ff>if</FONT></B> (objects[indexes[i]].compareTo(objects[indexes[j]], key) &gt; 0) {<BR>
<LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; swap(indexes, i, j);<BR>
<LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
<LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
<LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <B><FONT color=#0000ff>else</FONT></B> {<BR>
<LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <B><FONT color=#0000ff>if</FONT></B> (objects[indexes[i]].compareTo(objects[indexes[j]], key) &lt; 0) {<BR>
<LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; swap(indexes, i, j);<BR>
<LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
<LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
<LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
<LI>&nbsp;&nbsp;&nbsp; }<BR>
<LI>&nbsp;&nbsp;&nbsp; <B><FONT color=#0000ff>return</FONT></B> indexes;<BR>
<LI>&nbsp; }<BR>
<LI><BR>
<LI>&nbsp; <I><FONT color=#339900>/**</FONT></I><BR>
<LI><I><FONT color=#339900>&nbsp;&nbsp; * 冒泡排序法排序。</FONT></I><BR>
<LI><I><FONT color=#339900>&nbsp;&nbsp; * @param objects 排序对象</FONT></I><BR>
<LI><I><FONT color=#339900>&nbsp;&nbsp; * @return 按照升序排序后应该有的索引数组</FONT></I><BR>
<LI><I><FONT color=#339900>&nbsp;&nbsp; * @since&nbsp; 0.6</FONT></I><BR>
<LI><I><FONT color=#339900>&nbsp;&nbsp; */</FONT></I><BR>
<LI>&nbsp; <B><FONT color=#0000ff>public</FONT></B> <B><FONT color=#0000ff>static</FONT></B> <B><FONT color=#0000ff>int</FONT></B>[] n2sort(<B><A href="http://www.javaresearch.org/source/javaresearch/jdk142/java/lang/Comparable.java.html"><FONT color=#ff0000><U>Comparable</U></FONT></A></B>[] objects) {<BR>
<LI>&nbsp;&nbsp;&nbsp; <B><FONT color=#0000ff>return</FONT></B> n2sort(objects,<B><FONT color=#0000ff>true</FONT></B>);<BR>
<LI>&nbsp; }<BR>
<LI><BR>
<LI>&nbsp; <I><FONT color=#339900>/**</FONT></I><BR>
<LI><I><FONT color=#339900>&nbsp;&nbsp; * 冒泡排序法排序。</FONT></I><BR>
<LI><I><FONT color=#339900>&nbsp;&nbsp; * @param objects 排序对象</FONT></I><BR>
<LI><I><FONT color=#339900>&nbsp;&nbsp; * @param key 排序关键字</FONT></I><BR>
<LI><I><FONT color=#339900>&nbsp;&nbsp; * @return 按照升序排序后应该有的索引数组</FONT></I><BR>
<LI><I><FONT color=#339900>&nbsp;&nbsp; * @since&nbsp; 0.6</FONT></I><BR>
<LI><I><FONT color=#339900>&nbsp;&nbsp; */</FONT></I><BR>
<LI>&nbsp; <B><FONT color=#0000ff>public</FONT></B> <B><FONT color=#0000ff>static</FONT></B> <B><FONT color=#0000ff>int</FONT></B>[] n2sort(<A href="http://www.javaresearch.org/source/javaresearch/jrlib0.6/org/jr/PropertyComparable.java.html"><FONT color=#ff0000><U>PropertyComparable</U></FONT></A>[] objects, <B><FONT color=#0000ff>int</FONT></B> key) {<BR>
<LI>&nbsp;&nbsp;&nbsp; <B><FONT color=#0000ff>return</FONT></B> n2sort(objects,key);<BR>
<LI>&nbsp; }<BR>
<LI><BR>
<LI>&nbsp; <I><FONT color=#339900>/**</FONT></I><BR>
<LI><I><FONT color=#339900>&nbsp;&nbsp; * 插入排序法排序。</FONT></I><BR>
<LI><I><FONT color=#339900>&nbsp;&nbsp; * @param objects 排序对象</FONT></I><BR>
<LI><I><FONT color=#339900>&nbsp;&nbsp; * @return 按照升序排序后应该有的索引数组</FONT></I><BR>
<LI><I><FONT color=#339900>&nbsp;&nbsp; * @since&nbsp; 0.6</FONT></I><BR>
<LI><I><FONT color=#339900>&nbsp;&nbsp; */</FONT></I><BR>
<LI>&nbsp; <B><FONT color=#0000ff>public</FONT></B> <B><FONT color=#0000ff>static</FONT></B> <B><FONT color=#0000ff>int</FONT></B>[] insertionSort(<B><A href="http://www.javaresearch.org/source/javaresearch/jdk142/java/lang/Comparable.java.html"><FONT color=#ff0000><U>Comparable</U></FONT></A></B>[] objects) {<BR>
<LI>&nbsp;&nbsp;&nbsp; <B><FONT color=#0000ff>int</FONT></B> <B><FONT color=#0000ff>length</FONT></B> = objects.<B><FONT color=#0000ff>length</FONT></B>;<BR>
<LI>&nbsp;&nbsp;&nbsp; <B><FONT color=#0000ff>int</FONT></B>[] indexes = <A href="http://www.javaresearch.org/source/javaresearch/jrlib0.6/org/jr/util/ArrayUtil.java.html"><FONT color=#ff0000><U>ArrayUtil</U></FONT></A>.getInitedIntArray(<B><FONT color=#0000ff>length</FONT></B>);<BR>
<LI>&nbsp;&nbsp;&nbsp; <B><FONT color=#0000ff>for</FONT></B> (<B><FONT color=#0000ff>int</FONT></B> i = 1; i &lt; <B><FONT color=#0000ff>length</FONT></B>; i++) {<BR>
<LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <B><FONT color=#0000ff>int</FONT></B> j = i;<BR>
<LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <B><A href="http://www.javaresearch.org/source/javaresearch/jdk142/java/lang/Comparable.java.html"><FONT color=#ff0000><U>Comparable</U></FONT></A></B> B = objects[indexes[i]];<BR>
<LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <B><FONT color=#0000ff>while</FONT></B> ((j &gt; 0) &amp;&amp; (objects[indexes[j-1]].compareTo(B) &gt; 0)) {<BR>
<LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; indexes[j] = indexes[j-1];<BR>
<LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; j--;<BR>
<LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
<LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; indexes[j] = i;<BR>
<LI>&nbsp;&nbsp;&nbsp; }<BR>
<LI>&nbsp;&nbsp;&nbsp; <B><FONT color=#0000ff>return</FONT></B> indexes;<BR>
<LI>&nbsp; }<BR>
<LI><BR>
<LI>&nbsp; <I><FONT color=#339900>/**</FONT></I><BR>
<LI><I><FONT color=#339900>&nbsp;&nbsp; * 插入排序法排序。</FONT></I><BR>
<LI><I><FONT color=#339900>&nbsp;&nbsp; * @param objects 排序对象</FONT></I><BR>
<LI><I><FONT color=#339900>&nbsp;&nbsp; * @param key 排序关键字</FONT></I><BR>
<LI><I><FONT color=#339900>&nbsp;&nbsp; * @return 按照升序排序后应该有的索引数组</FONT></I><BR>
<LI><I><FONT color=#339900>&nbsp;&nbsp; * @since&nbsp; 0.6</FONT></I><BR>
<LI><I><FONT color=#339900>&nbsp;&nbsp; */</FONT></I><BR>
<LI>&nbsp; <B><FONT color=#0000ff>public</FONT></B> <B><FONT color=#0000ff>static</FONT></B> <B><FONT color=#0000ff>int</FONT></B>[] insertionSort(<A href="http://www.javaresearch.org/source/javaresearch/jrlib0.6/org/jr/PropertyComparable.java.html"><FONT color=#ff0000><U>PropertyComparable</U></FONT></A>[] objects, <B><FONT color=#0000ff>int</FONT></B> key) {<BR>
<LI>&nbsp;&nbsp;&nbsp; <B><FONT color=#0000ff>int</FONT></B> <B><FONT color=#0000ff>length</FONT></B> = objects.<B><FONT color=#0000ff>length</FONT></B>;<BR>
<LI>&nbsp;&nbsp;&nbsp; <B><FONT color=#0000ff>int</FONT></B>[] indexes = <A href="http://www.javaresearch.org/source/javaresearch/jrlib0.6/org/jr/util/ArrayUtil.java.html"><FONT color=#ff0000><U>ArrayUtil</U></FONT></A>.getInitedIntArray(<B><FONT color=#0000ff>length</FONT></B>);<BR>
<LI>&nbsp;&nbsp;&nbsp; <B><FONT color=#0000ff>for</FONT></B> (<B><FONT color=#0000ff>int</FONT></B> i = 1; i &lt; <B><FONT color=#0000ff>length</FONT></B>; i++) {<BR>
<LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <B><FONT color=#0000ff>int</FONT></B> j = i;<BR>
<LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <B><A href="http://www.javaresearch.org/source/javaresearch/jdk142/java/lang/Comparable.java.html"><FONT color=#ff0000><U>Comparable</U></FONT></A></B> B = objects[indexes[i]];<BR>
<LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <B><FONT color=#0000ff>while</FONT></B> ((j &gt; 0) &amp;&amp; (objects[indexes[j-1]].compareTo(B,key) &gt; 0)) {<BR>
<LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; indexes[j] = indexes[j-1];<BR>
<LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; j--;<BR>
<LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
<LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; indexes[j] = i;<BR>
<LI>&nbsp;&nbsp;&nbsp; }<BR>
<LI>&nbsp;&nbsp;&nbsp; <B><FONT color=#0000ff>return</FONT></B> indexes;<BR>
<LI>&nbsp; }<BR>
<LI><BR>
<LI>&nbsp; <I><FONT color=#339900>/**</FONT></I><BR>
<LI><I><FONT color=#339900>&nbsp;&nbsp; * 选择排序法排序。</FONT></I><BR>
<LI><I><FONT color=#339900>&nbsp;&nbsp; * @param objects 排序对象</FONT></I><BR>
<LI><I><FONT color=#339900>&nbsp;&nbsp; * @return 按照升序排序后应该有的索引数组</FONT></I><BR>
<LI><I><FONT color=#339900>&nbsp;&nbsp; * @since&nbsp; 0.6</FONT></I><BR>
<LI><I><FONT color=#339900>&nbsp;&nbsp; */</FONT></I><BR>
<LI>&nbsp; <B><FONT color=#0000ff>public</FONT></B> <B><FONT color=#0000ff>static</FONT></B> <B><FONT color=#0000ff>int</FONT></B>[] selectionSort(<B><A href="http://www.javaresearch.org/source/javaresearch/jdk142/java/lang/Comparable.java.html"><FONT color=#ff0000><U>Comparable</U></FONT></A></B>[] objects) {<BR>
<LI>&nbsp;&nbsp;&nbsp; <B><FONT color=#0000ff>int</FONT></B> <B><FONT color=#0000ff>length</FONT></B> = objects.<B><FONT color=#0000ff>length</FONT></B>;<BR>
<LI>&nbsp;&nbsp;&nbsp; <B><FONT color=#0000ff>int</FONT></B>[] indexes = <A href="http://www.javaresearch.org/source/javaresearch/jrlib0.6/org/jr/util/ArrayUtil.java.html"><FONT color=#ff0000><U>ArrayUtil</U></FONT></A>.getInitedIntArray(<B><FONT color=#0000ff>length</FONT></B>);<BR>
<LI>&nbsp;&nbsp;&nbsp; <B><FONT color=#0000ff>for</FONT></B> (<B><FONT color=#0000ff>int</FONT></B> i = 0; i &lt; <B><FONT color=#0000ff>length</FONT></B>; i++) {<BR>
<LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <B><FONT color=#0000ff>int</FONT></B> min = i;<BR>
<LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <B><FONT color=#0000ff>int</FONT></B> j;<BR>
<LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <I><FONT color=#339900>//在未排序列表里面查找最小元素</FONT></I><BR>
<LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <B><FONT color=#0000ff>for</FONT></B> (j = i + 1; j &lt; <B><FONT color=#0000ff>length</FONT></B>; j++) {<BR>
<LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <B><FONT color=#0000ff>if</FONT></B> (objects[indexes[j]].compareTo(objects[indexes[min]]) &lt;0 ) {<BR>
<LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; min = j;<BR>
<LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
<LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
<LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <I><FONT color=#339900>//将最小的元素交换到未排序元素的最开始</FONT></I><BR>
<LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; swap(indexes,i,min);<BR>
<LI>&nbsp;&nbsp;&nbsp; }<BR>
<LI>&nbsp;&nbsp;&nbsp; <B><FONT color=#0000ff>return</FONT></B> indexes;<BR>
<LI>&nbsp; }<BR>
<LI><BR>
<LI>&nbsp; <I><FONT color=#339900>/**</FONT></I><BR>
<LI><I><FONT color=#339900>&nbsp;&nbsp; * 选择排序法排序。</FONT></I><BR>
<LI><I><FONT color=#339900>&nbsp;&nbsp; * @param objects 排序对象</FONT></I><BR>
<LI><I><FONT color=#339900>&nbsp;&nbsp; * @param key 排序关键字</FONT></I><BR>
<LI><I><FONT color=#339900>&nbsp;&nbsp; * @return 按照升序排序后应该有的索引数组</FONT></I><BR>
<LI><I><FONT color=#339900>&nbsp;&nbsp; * @since&nbsp; 0.6</FONT></I><BR>
<LI><I><FONT color=#339900>&nbsp;&nbsp; */</FONT></I><BR>
<LI>&nbsp; <B><FONT color=#0000ff>public</FONT></B> <B><FONT color=#0000ff>static</FONT></B> <B><FONT color=#0000ff>int</FONT></B>[] selectionSort(<A href="http://www.javaresearch.org/source/javaresearch/jrlib0.6/org/jr/PropertyComparable.java.html"><FONT color=#ff0000><U>PropertyComparable</U></FONT></A>[] objects, <B><FONT color=#0000ff>int</FONT></B> key) {<BR>
<LI>&nbsp;&nbsp;&nbsp; <B><FONT color=#0000ff>int</FONT></B> <B><FONT color=#0000ff>length</FONT></B> = objects.<B><FONT color=#0000ff>length</FONT></B>;<BR>
<LI>&nbsp;&nbsp;&nbsp; <B><FONT color=#0000ff>int</FONT></B>[] indexes = <A href="http://www.javaresearch.org/source/javaresearch/jrlib0.6/org/jr/util/ArrayUtil.java.html"><FONT color=#ff0000><U>ArrayUtil</U></FONT></A>.getInitedIntArray(<B><FONT color=#0000ff>length</FONT></B>);<BR>
<LI>&nbsp;&nbsp;&nbsp; <B><FONT color=#0000ff>for</FONT></B> (<B><FONT color=#0000ff>int</FONT></B> i = 0; i &lt; <B><FONT color=#0000ff>length</FONT></B>; i++) {<BR>
<LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <B><FONT color=#0000ff>int</FONT></B> min = i;<BR>
<LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <B><FONT color=#0000ff>int</FONT></B> j;<BR>
<LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <I><FONT color=#339900>//在未排序列表里面查找最小元素</FONT></I><BR>
<LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <B><FONT color=#0000ff>for</FONT></B> (j = i + 1; j &lt; <B><FONT color=#0000ff>length</FONT></B>; j++) {<BR>
<LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <B><FONT color=#0000ff>if</FONT></B> (objects[indexes[j]].compareTo(objects[indexes[min]],key) &lt;0 ) { 
<LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; min = j;<BR>
<LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
<LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
<LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <I><FONT color=#339900>//将最小的元素交换到未排序元素的最开始</FONT></I><BR>
<LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; swap(indexes,i,min);<BR>
<LI>&nbsp;&nbsp;&nbsp; }<BR>
<LI>&nbsp;&nbsp;&nbsp; <B><FONT color=#0000ff>return</FONT></B> indexes;<BR>
<LI>&nbsp; }<BR>
<LI><BR>
<LI>&nbsp; <I><FONT color=#339900>/**</FONT></I><BR>
<LI><I><FONT color=#339900>&nbsp;&nbsp; * 双向冒泡排序法排序。</FONT></I><BR>
<LI><I><FONT color=#339900>&nbsp;&nbsp; * @param objects 排序对象</FONT></I><BR>
<LI><I><FONT color=#339900>&nbsp;&nbsp; * @return 按照升序排序后应该有的索引数组</FONT></I><BR>
<LI><I><FONT color=#339900>&nbsp;&nbsp; * @since&nbsp; 0.6</FONT></I><BR>
<LI><I><FONT color=#339900>&nbsp;&nbsp; */</FONT></I><BR>
<LI>&nbsp; <B><FONT color=#0000ff>public</FONT></B> <B><FONT color=#0000ff>static</FONT></B> <B><FONT color=#0000ff>int</FONT></B>[] bidirectionalBubbleSort(<B><A href="http://www.javaresearch.org/source/javaresearch/jdk142/java/lang/Comparable.java.html"><FONT color=#ff0000><U>Comparable</U></FONT></A></B>[] objects) {<BR>
<LI>&nbsp;&nbsp;&nbsp; <B><FONT color=#0000ff>int</FONT></B> <B><FONT color=#0000ff>length</FONT></B> = objects.<B><FONT color=#0000ff>length</FONT></B>;<BR>
<LI>&nbsp;&nbsp;&nbsp; <B><FONT color=#0000ff>int</FONT></B>[] indexes = <A href="http://www.javaresearch.org/source/javaresearch/jrlib0.6/org/jr/util/ArrayUtil.java.html"><FONT color=#ff0000><U>ArrayUtil</U></FONT></A>.getInitedIntArray(<B><FONT color=#0000ff>length</FONT></B>);<BR>
<LI>&nbsp;&nbsp;&nbsp; <B><FONT color=#0000ff>int</FONT></B> j;<BR>
<LI>&nbsp;&nbsp;&nbsp; <B><FONT color=#0000ff>int</FONT></B> limit = objects.<B><FONT color=#0000ff>length</FONT></B>;<BR>
<LI>&nbsp;&nbsp;&nbsp; <B><FONT color=#0000ff>int</FONT></B> start = -1;<BR>
<LI>&nbsp;&nbsp;&nbsp; <B><FONT color=#0000ff>while</FONT></B> (start &lt; limit) {<BR>
<LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; start++;<BR>
<LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; limit--;<BR>
<LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <B><FONT color=#0000ff>for</FONT></B> (j = start; j &lt; limit; j++) {<BR>
<LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <B><FONT color=#0000ff>if</FONT></B> (objects[indexes[j]].compareTo(objects[indexes[j+1]]) &gt; 0) {<BR>
<LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; swap(indexes,j,j+1);<BR>
<LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
<LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
<LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <B><FONT color=#0000ff>for</FONT></B> (j = limit; --j &gt;= start;) {<BR>
<LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <B><FONT color=#0000ff>if</FONT></B> (objects[indexes[j]].compareTo(objects[indexes[j+1]]) &gt; 0) {<BR>
<LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; swap(indexes,j,j+1);<BR>
<LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
<LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
<LI>&nbsp;&nbsp;&nbsp; }<BR>
<LI>&nbsp;&nbsp;&nbsp; <B><FONT color=#0000ff>return</FONT></B> indexes;<BR>
<LI>&nbsp; }<BR>
<LI><BR>
<LI>&nbsp; <I><FONT color=#339900>/**</FONT></I><BR>
<LI><I><FONT color=#339900>&nbsp;&nbsp; * 双向冒泡排序法排序。</FONT></I><BR>
<LI><I><FONT color=#339900>&nbsp;&nbsp; * @param objects 排序对象</FONT></I><BR>
<LI><I><FONT color=#339900>&nbsp;&nbsp; * @param key 排序关键字</FONT></I><BR>
<LI><I><FONT color=#339900>&nbsp;&nbsp; * @return 按照升序排序后应该有的索引数组</FONT></I><BR>
<LI><I><FONT color=#339900>&nbsp;&nbsp; * @since&nbsp; 0.6</FONT></I><BR>
<LI><I><FONT color=#339900>&nbsp;&nbsp; */</FONT></I><BR>
<LI>&nbsp; <B><FONT color=#0000ff>public</FONT></B> <B><FONT color=#0000ff>static</FONT></B> <B><FONT color=#0000ff>int</FONT></B>[] bidirectionalBubbleSort(<A href="http://www.javaresearch.org/source/javaresearch/jrlib0.6/org/jr/PropertyComparable.java.html"><FONT color=#ff0000><U>PropertyComparable</U></FONT></A>[] objects, <B><FONT color=#0000ff>int</FONT></B> key) {<BR>
<LI>&nbsp;&nbsp;&nbsp; <B><FONT color=#0000ff>int</FONT></B> <B><FONT color=#0000ff>length</FONT></B> = objects.<B><FONT color=#0000ff>length</FONT></B>;<BR>
<LI>&nbsp;&nbsp;&nbsp; <B><FONT color=#0000ff>int</FONT></B>[] indexes = <A href="http://www.javaresearch.org/source/javaresearch/jrlib0.6/org/jr/util/ArrayUtil.java.html"><FONT color=#ff0000><U>ArrayUtil</U></FONT></A>.getInitedIntArray(<B><FONT color=#0000ff>length</FONT></B>);<BR>
<LI>&nbsp;&nbsp;&nbsp; <B><FONT color=#0000ff>int</FONT></B> j;<BR>
<LI>&nbsp;&nbsp;&nbsp; <B><FONT color=#0000ff>int</FONT></B> limit = objects.<B><FONT color=#0000ff>length</FONT></B>;<BR>
<LI>&nbsp;&nbsp;&nbsp; <B><FONT color=#0000ff>int</FONT></B> start = -1;<BR>
<LI>&nbsp;&nbsp;&nbsp; <B><FONT color=#0000ff>while</FONT></B> (start &lt; limit) {<BR>
<LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; start++;<BR>
<LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; limit--;<BR>
<LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <B><FONT color=#0000ff>for</FONT></B> (j = start; j &lt; limit; j++) {<BR>
<LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <B><FONT color=#0000ff>if</FONT></B> (objects[indexes[j]].compareTo(objects[indexes[j+1]]) &gt; 0) {<BR>
<LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; swap(indexes,j,j+1);<BR>
<LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
<LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
<LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <B><FONT color=#0000ff>for</FONT></B> (j = limit; --j &gt;= start;) {<BR>
<LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <B><FONT color=#0000ff>if</FONT></B> (objects[indexes[j]].compareTo(objects[indexes[j+1]],key) &gt; 0) {<BR>
<LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; swap(indexes,j,j+1);<BR>
<LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
<LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
<LI>&nbsp;&nbsp;&nbsp; }<BR>
<LI>&nbsp;&nbsp;&nbsp; <B><FONT color=#0000ff>return</FONT></B> indexes;<BR>
<LI>&nbsp; }<BR>
<LI><BR>
<LI>&nbsp; <I><FONT color=#339900>/**</FONT></I><BR>
<LI><I><FONT color=#339900>&nbsp;&nbsp; * 交换两个元素的值。</FONT></I><BR>
<LI><I><FONT color=#339900>&nbsp;&nbsp; * @param indexes 原索引数组</FONT></I><BR>
<LI><I><FONT color=#339900>&nbsp;&nbsp; * @param i 第一行</FONT></I><BR>
<LI><I><FONT color=#339900>&nbsp;&nbsp; * @param j 第二行</FONT></I><BR>
<LI><I><FONT color=#339900>&nbsp;&nbsp; */</FONT></I><BR>
<LI>&nbsp; <B><FONT color=#0000ff>private</FONT></B> <B><FONT color=#0000ff>static</FONT></B> <B><FONT color=#0000ff>void</FONT></B> swap(<B><FONT color=#0000ff>int</FONT></B>[] indexes, <B><FONT color=#0000ff>int</FONT></B> i, <B><FONT color=#0000ff>int</FONT></B> j) {<BR>
<LI>&nbsp;&nbsp;&nbsp; <B><FONT color=#0000ff>int</FONT></B> tmp = indexes[i];<BR>
<LI>&nbsp;&nbsp;&nbsp; indexes[i] = indexes[j];<BR>
<LI>&nbsp;&nbsp;&nbsp; indexes[j] = tmp;<BR>
<LI>&nbsp; }<BR>
<LI><BR>
<LI>} 
<LI>------------------------------------------ 
<LI>
<LI>冒泡排序： 
<LI>
<P>1、比较相邻的两个元素，如果后面的比前面小，就对调二者。反复比较，到最后两个元素。结果，最大值就跑到了最末位置。 </P>
<LI>
<P>2、反复第一步，直到所有较大值都跑到靠后的位置。</P>
<LI>
<P>---------------------------------------------</P>
<LI>
<P>选择排序</P>
<LI>
<P>1、一开始整个数列是未排列的</P>
<LI>
<P>2、从未排列的数中，挑选出最小的数，和未排列的数中的第一个元素互调，并将该最小的数归类到已排序的序列中；</P>
<LI>
<P>3、重复第2步，直到所有的数都归类到已排序数列中。</P>
<LI>
<P>---------------------------------------------</P>
<LI>
<P>插入排序法：</P>
<LI>
<P>1、一开始只有第一个数在已排序数列中，其他的数归类到未排序数列中；</P>
<LI>
<P>2、将未排序的第一个数，插入到已排序数列中，使得插入后的已排序数列仍然维持由小到大的顺序；</P>
<LI>
<P>3、重复步骤2，直到所有的数都在已排序数列中。</P>
<LI>
<P>-----------------------------------------------</P>
<LI></LI></OL><img src ="http://www.blogjava.net/fjpan2002/aggbug/22627.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fjpan2002/" target="_blank">勇敢的心</a> 2005-12-05 20:24 <a href="http://www.blogjava.net/fjpan2002/articles/22627.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java面试收集（持续更新）-1 原贴编辑太慢了</title><link>http://www.blogjava.net/fjpan2002/articles/21680.html</link><dc:creator>勇敢的心</dc:creator><author>勇敢的心</author><pubDate>Mon, 28 Nov 2005 07:24:00 GMT</pubDate><guid>http://www.blogjava.net/fjpan2002/articles/21680.html</guid><wfw:comment>http://www.blogjava.net/fjpan2002/comments/21680.html</wfw:comment><comments>http://www.blogjava.net/fjpan2002/articles/21680.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fjpan2002/comments/commentRss/21680.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fjpan2002/services/trackbacks/21680.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 91、应用服务器与WEB SERVER的区别？通俗的讲，Web服务器传送(serves)页面使浏览器可以浏览，然而应用程序服务器提供的是客户端应用程序可以调用(call)的方法(methods)。确切一点，你可以说：Web服务器专门处理HTTP请求(request)，但是应用程序服务器是通过很多协议来为应用程序提供(serves)商业逻辑(business logic)。92、BS与CS的联系与区...&nbsp;&nbsp;<a href='http://www.blogjava.net/fjpan2002/articles/21680.html'>阅读全文</a><img src ="http://www.blogjava.net/fjpan2002/aggbug/21680.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fjpan2002/" target="_blank">勇敢的心</a> 2005-11-28 15:24 <a href="http://www.blogjava.net/fjpan2002/articles/21680.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java面试收集（持续更新）</title><link>http://www.blogjava.net/fjpan2002/articles/21654.html</link><dc:creator>勇敢的心</dc:creator><author>勇敢的心</author><pubDate>Mon, 28 Nov 2005 05:05:00 GMT</pubDate><guid>http://www.blogjava.net/fjpan2002/articles/21654.html</guid><wfw:comment>http://www.blogjava.net/fjpan2002/comments/21654.html</wfw:comment><comments>http://www.blogjava.net/fjpan2002/articles/21654.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fjpan2002/comments/commentRss/21654.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fjpan2002/services/trackbacks/21654.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 一、Java基础1、谈谈final, finally, finalize的区别。final—修饰符（关键字）如果一个类被声明为final，意味着它不能再派生出新的子类，不能作为父类被继承。因此一个类不能既被声明为 abstract的，又被声明为final的。将变量或方法声明为final，可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给定初值，而在以后的引用中只能读取，不可修改。...&nbsp;&nbsp;<a href='http://www.blogjava.net/fjpan2002/articles/21654.html'>阅读全文</a><img src ="http://www.blogjava.net/fjpan2002/aggbug/21654.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fjpan2002/" target="_blank">勇敢的心</a> 2005-11-28 13:05 <a href="http://www.blogjava.net/fjpan2002/articles/21654.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>