﻿<?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-Fantasy's World</title><link>http://www.blogjava.net/FinalFantasy/</link><description>世界的小世界，我的大世界^_^</description><language>zh-cn</language><lastBuildDate>Mon, 13 Apr 2026 17:41:48 GMT</lastBuildDate><pubDate>Mon, 13 Apr 2026 17:41:48 GMT</pubDate><ttl>60</ttl><item><title>Java只能处理300个异常？</title><link>http://www.blogjava.net/FinalFantasy/archive/2005/12/29/25921.html</link><dc:creator>FinalFantasy</dc:creator><author>FinalFantasy</author><pubDate>Thu, 29 Dec 2005 10:21:00 GMT</pubDate><guid>http://www.blogjava.net/FinalFantasy/archive/2005/12/29/25921.html</guid><wfw:comment>http://www.blogjava.net/FinalFantasy/comments/25921.html</wfw:comment><comments>http://www.blogjava.net/FinalFantasy/archive/2005/12/29/25921.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/FinalFantasy/comments/commentRss/25921.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/FinalFantasy/services/trackbacks/25921.html</trackback:ping><description><![CDATA[首先看看我写的一个小程序：<BR><BR>public class TestTry extends Exception<BR>{<BR>&nbsp;static boolean f=false;<BR>&nbsp;static int sum=0;<BR>&nbsp;static int created=0;<BR>&nbsp;static int i=0;<BR>&nbsp;TestTry()<BR>&nbsp;{<BR>&nbsp;&nbsp;i=created++;<BR>&nbsp;&nbsp;if(created&gt;=299) f=true;<BR>&nbsp;&nbsp;}<BR>&nbsp;public void finalize()<BR>&nbsp;{<BR>&nbsp;&nbsp;sum++;<BR>&nbsp;&nbsp;}<BR>&nbsp;public static void main(String[] args)<BR>&nbsp;{<BR>&nbsp;&nbsp;while(!TestTry.f)<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;try{<BR>&nbsp;&nbsp;&nbsp;&nbsp;throw new TestTry();<BR>&nbsp;&nbsp;&nbsp;&nbsp;}catch(Exception e){}<BR>&nbsp;&nbsp;&nbsp;&nbsp;finally{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Creat "+TestTry.i+" TestTry, "+TestTry.sum+" has been finalized!");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;//System.out.println("Creat "+TestTry.created+" TestTry, "+TestTry.sum+" has been finalized!");&nbsp;<BR>&nbsp;&nbsp;}<BR>&nbsp;}<BR><BR>这个是我在测试在try语句抛出异常后，在try语句中建立的对象是否会调用自身的终止函数时发现的，这里有个奇怪的现象在if(created&gt;=299) f=true;这条语句中，如果把条件created&gt;=299改为&gt;=比299更大的数，你会发现System.out.println("Creat "+TestTry.i+" TestTry, "+TestTry.sum+" has been finalized!");这条语句的输出的结果并不是你预想的那样（输出判断的数字+1的行数），而只是显示最后的三百行。那么在这之前抛出的异常上哪里去了呢？难道说Java只处理最后抛出的三百的异常么？<BR><img src ="http://www.blogjava.net/FinalFantasy/aggbug/25921.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/FinalFantasy/" target="_blank">FinalFantasy</a> 2005-12-29 18:21 <a href="http://www.blogjava.net/FinalFantasy/archive/2005/12/29/25921.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java回收机制分析</title><link>http://www.blogjava.net/FinalFantasy/archive/2005/12/26/25474.html</link><dc:creator>FinalFantasy</dc:creator><author>FinalFantasy</author><pubDate>Mon, 26 Dec 2005 09:46:00 GMT</pubDate><guid>http://www.blogjava.net/FinalFantasy/archive/2005/12/26/25474.html</guid><wfw:comment>http://www.blogjava.net/FinalFantasy/comments/25474.html</wfw:comment><comments>http://www.blogjava.net/FinalFantasy/archive/2005/12/26/25474.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/FinalFantasy/comments/commentRss/25474.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/FinalFantasy/services/trackbacks/25474.html</trackback:ping><description><![CDATA[这个文档是老师给我们看的，看了之后收获不少，帖出来让大家也看看：）
<HR>

<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-pagination: widow-orphan"><B><SPAN style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: Tahoma">引言</SPAN></B><SPAN style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: Tahoma"> <SPAN lang=EN-US><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 27pt; mso-pagination: widow-orphan"><SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: Tahoma">Java</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: Tahoma">的堆是一个运行时数据区<SPAN lang=EN-US>,</SPAN>类的实例<SPAN lang=EN-US>(</SPAN>对象<SPAN lang=EN-US>)</SPAN>从中分配空间。<SPAN lang=EN-US>Java</SPAN>虚拟机<SPAN lang=EN-US>(JVM)</SPAN>的堆中储存着正在运行的应用程序所建立的所有对象，这些对象通过<SPAN lang=EN-US>new</SPAN>、<SPAN lang=EN-US>newarray</SPAN>、<SPAN lang=EN-US>anewarray</SPAN>和<SPAN lang=EN-US>multianewarray</SPAN>等指令建立，但是它们不需要程序代码来显式地释放。一般来说，堆的是由垃圾回收 来负责的，尽管<SPAN lang=EN-US>JVM</SPAN>规范并不要求特殊的垃圾回收技术，甚至根本就不需要垃圾回收，但是由于内存的有限性，<SPAN lang=EN-US>JVM</SPAN>在实现的时候都有一个由垃圾回收所管理的堆。垃圾回收是一种动态存储管理技术，它自动地释放不再被程序引用的对象，按照特定的垃圾收集算法来实现资源自动回收的功能。<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-pagination: widow-orphan"><B><SPAN style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: Tahoma">垃圾收集的意义<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-pagination: widow-orphan"><SPAN style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: Tahoma">在<SPAN lang=EN-US>C++</SPAN>中，对象所占的内存在程序结束运行之前一直被占用，在明确释放之前不能分配给其它对象；而在<SPAN lang=EN-US>Java</SPAN>中，当没有对象引用指向原先分配给某个对象的内存时，该内存便成为垃圾。<SPAN lang=EN-US>JVM</SPAN>的一个系统级线程会自动释放该内存块。垃圾收集意味着程序不再需要的对象是<SPAN lang=EN-US>"</SPAN>无用信息<SPAN lang=EN-US>"</SPAN>，这些信息将被丢弃。当一个对象不再被引用的时候，内存回收它占领的空间，以便空间被后来的新对象使用。事实上，除了释放没用的对象，垃圾收集也可以清除内存记录碎片。由于创建对象和垃圾收集器释放丢弃对象所占的内存空间，内存会出现碎片。碎片是分配给对象的内存块之间的空闲内存洞。碎片整理将所占用的堆内存移到堆的一端，<SPAN lang=EN-US>JVM</SPAN>将整理出的内存分配给新的对象。<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-pagination: widow-orphan"><SPAN style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: Tahoma">垃圾收集能自动释放内存空间，减轻编程的负担。这使<SPAN lang=EN-US>Java </SPAN>虚拟机具有一些优点。首先，它能使编程效率提高。在没有垃圾收集机制的时候，可能要花许多时间来解决一个难懂的存储器问题。在用<SPAN lang=EN-US>Java</SPAN>语言编程的时候，靠垃圾收集机制可大大缩短时间。其次是它保护程序的完整性<SPAN lang=EN-US>, </SPAN>垃圾收集是<SPAN lang=EN-US>Java</SPAN>语言安全性策略的一个重要部份。<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-pagination: widow-orphan"><SPAN style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: Tahoma">垃圾收集的一个潜在的缺点是它的开销影响程序性能。<SPAN lang=EN-US>Java</SPAN>虚拟机必须追踪运行程序中有用的对象<SPAN lang=EN-US>, </SPAN>而且最终释放没用的对象。这一个过程需要花费处理器的时间。其次垃圾收集算法的不完备性，早先采用的某些垃圾收集算法就不能保证<SPAN lang=EN-US>100%</SPAN>收集到所有的废弃内存。当然随着垃圾收集算法的不断改进以及软硬件运行效率的不断提升，这些问题都可以迎刃而解。<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-pagination: widow-orphan"><B><SPAN style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: Tahoma">垃圾收集的算法分析<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-pagination: widow-orphan"><SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: Tahoma">Java</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: Tahoma">语言规范没有明确地说明<SPAN lang=EN-US>JVM</SPAN>使用哪种垃圾回收算法，但是任何一种垃圾收集算法一般要做<SPAN lang=EN-US>2</SPAN>件基本的事情：（<SPAN lang=EN-US>1</SPAN>）发现无用信息对象；（<SPAN lang=EN-US>2</SPAN>）回收被无用对象占用的内存空间，使该空间可被程序再次使用。<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-pagination: widow-orphan"><SPAN style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: Tahoma">大多数垃圾回收算法使用了根集<SPAN lang=EN-US>(root set)</SPAN>这个概念；所谓根集就量正在执行的<SPAN lang=EN-US>Java</SPAN>程序可以访问的引用变量的集合<SPAN lang=EN-US>(</SPAN>包括局部变量、参数、类变量<SPAN lang=EN-US>)</SPAN>，程序可以使用引用变量访问对象的属性和调用对象的方法。垃圾收集首选需要确定从根开始哪些是可达的和哪些是不可达的，从根集可达的对象都是活动对象，它们不能作为垃圾被回收，这也包括从根集间接可达的对象。而根集通过任意路径不可达的对象符合垃圾收集的条件，应该被回收。下面介绍几个常用的算法。<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 27pt; TEXT-INDENT: -18pt; mso-pagination: widow-orphan; mso-list: l0 level1 lfo1; tab-stops: list 27.0pt"><SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><SPAN style="mso-list: Ignore">1、<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp; </SPAN></SPAN></SPAN><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: Tahoma">引用计数法</SPAN><SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: Tahoma">(Reference Counting Collector)<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-pagination: widow-orphan"><SPAN style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: Tahoma">引用计数法是唯一没有使用根集的垃圾回收的法，该算法使用引用计数器来区分存活对象和不再使用的对象。一般来说，堆中的每个对象对应一个引用计数器。当每一次创建一个对象并赋给一个变量时，引用计数器置为<SPAN lang=EN-US>1</SPAN>。当对象被赋给任意变量时，引用计数器每次加<SPAN lang=EN-US>1</SPAN>当对象出了作用域后<SPAN lang=EN-US>(</SPAN>该对象丢弃不再使用<SPAN lang=EN-US>)</SPAN>，引用计数器减<SPAN lang=EN-US>1</SPAN>，一旦引用计数器为<SPAN lang=EN-US>0</SPAN>，对象就满足了垃圾收集的条件。</SPAN><SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 17.95pt; mso-pagination: widow-orphan"><SPAN style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: Tahoma">基于引用计数器的垃圾收集器运行较快，不会长时间中断程序执行，适宜地必须 实时运行的程序。但引用计数器增加了程序执行的开销，因为每次对象赋给新的变量，计数器加<SPAN lang=EN-US>1</SPAN>，而每次现有对象出了作用域生，计数器减<SPAN lang=EN-US>1</SPAN>。</SPAN><SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 17.95pt; TEXT-INDENT: -17.95pt; mso-pagination: widow-orphan; mso-char-indent-count: -1.71"><SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: Tahoma">2</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: Tahoma">、<SPAN lang=EN-US style="COLOR: red">tracing</SPAN><SPAN style="COLOR: red">算法</SPAN><SPAN lang=EN-US>(Tracing Collector)</SPAN></SPAN><SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 17.95pt; mso-pagination: widow-orphan"><SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: Tahoma">tracing</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: Tahoma">算法是为了解决引用计数法的问题而提出，它使用了根集的概念。基于<SPAN lang=EN-US>tracing</SPAN>算法的垃圾收集器从根集开始扫描，识别出哪些对象可达，哪些对象不可达，并用某种方式标记可达对象，例如对每个可达对象设置一个或多个位。在扫描识别过程中，基于<SPAN lang=EN-US>tracing</SPAN>算法的垃圾收集也称为标记和清除<SPAN lang=EN-US>(mark-and-sweep)</SPAN>垃圾收集器<SPAN lang=EN-US>.<o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-pagination: widow-orphan"><SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: Tahoma">3</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: Tahoma">、<SPAN lang=EN-US style="COLOR: red">compacting</SPAN>算法<SPAN lang=EN-US>(Compacting Collector)<o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 27pt; mso-pagination: widow-orphan"><SPAN style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: Tahoma">为了解决堆碎片问题，基于<SPAN lang=EN-US>tracing</SPAN>的垃圾回收吸收了<SPAN lang=EN-US>Compacting</SPAN>算法的思想，在清除的过程中，算法将所有的对象移到堆的一端，堆的另一端就变成了一个相邻的空闲内存区，收集器会对它移动的所有对象的所有引用进行更新，使得这些引用在新的位置能识别原来 的对象。在基于<SPAN lang=EN-US>Compacting</SPAN>算法的收集器的实现中，一般增加句柄和句柄表。　　<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-pagination: widow-orphan"><SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: Tahoma">4</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: Tahoma">、<SPAN lang=EN-US style="COLOR: red">copying</SPAN><SPAN style="COLOR: red">算法</SPAN><SPAN lang=EN-US>(Coping Collector)<o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 27pt; mso-pagination: widow-orphan"><SPAN style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: Tahoma">该算法的提出是为了克服句柄的开销和解决堆碎片的垃圾回收。它开始时把堆分成 一个对象 面和多个空闲面， 程序从对象面为对象分配空间，当对象满了，基于<SPAN lang=EN-US>coping</SPAN>算法的垃圾 收集就从根集中扫描活动对象，并将每个 活动对象复制到空闲面<SPAN lang=EN-US>(</SPAN>使得活动对象所占的内存之间没有空闲洞<SPAN lang=EN-US>)</SPAN>，这样空闲面变成了对象面，原来的对象面变成了空闲面，程序会在新的对象面中分配内存。<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 27pt; mso-pagination: widow-orphan"><SPAN style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: Tahoma">一种典型的基于<SPAN lang=EN-US>coping</SPAN>算法的垃圾回收是<SPAN lang=EN-US>stop-and-copy</SPAN>算法，它将堆分成对象面和空闲区域面，在对象面与空闲区域面的切换过程中，程序暂停执行。<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-pagination: widow-orphan"><SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: Tahoma">5</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: Tahoma">、<SPAN lang=EN-US style="COLOR: red">generation</SPAN>算法<SPAN lang=EN-US>(Generational Collector)<BR></SPAN>　　<SPAN lang=EN-US>stop-and-copy</SPAN>垃圾收集器的一个缺陷是收集器必须复制所有的活动对象，这增加了程序等待时间，这是<SPAN lang=EN-US>coping</SPAN>算法低效的原因。在程序设计中有这样的规律：多数对象存在的时间比较短，少数的存在时间比较长。因此，<SPAN lang=EN-US>generation</SPAN>算法将堆分成两个或多个，每个子堆作为对象的一代<SPAN lang=EN-US>(generation)</SPAN>。由于多数对象存在的时间比较短，随着程序丢弃不使用的对象，垃圾收集器将从最年轻的子堆中收集这些对象。在分代式的垃圾收集器运行后，上次运行存活下来的对象移到下一最高代的子堆中，由于老一代的子堆不会经常被回收，因而节省了时间。<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-pagination: widow-orphan"><SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: Tahoma">6</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: Tahoma">、<SPAN lang=EN-US style="COLOR: red">adaptive</SPAN>算法<SPAN lang=EN-US>(Adaptive Collector)<o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-pagination: widow-orphan"><SPAN style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: Tahoma">在特定的情况下，一些垃圾收集算法会优于其它算法。基于<SPAN lang=EN-US>Adaptive</SPAN>算法的垃圾收集器就是监控当前堆的使用情况，并将选择适当算法的垃圾收集器。<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-pagination: widow-orphan"><B><SPAN style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: Tahoma">透视<SPAN lang=EN-US>Java</SPAN>垃圾回收</SPAN></B><SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: Tahoma"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-pagination: widow-orphan"><SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: Tahoma">1</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: Tahoma">、命令行参数透视垃圾收集器的运行<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-pagination: widow-orphan"><SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: Tahoma">2</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: Tahoma">、使用<SPAN lang=EN-US>System.gc()</SPAN>可以不管<SPAN lang=EN-US>JVM</SPAN>使用的是哪一种垃圾回收的算法，都可以请求<SPAN lang=EN-US>Java</SPAN>的垃圾回收。在命令行中有一个参数<SPAN lang=EN-US>-verbosegc</SPAN>可以查看<SPAN lang=EN-US>Java</SPAN>使用的堆内存的情况，它的格式如下：<SPAN lang=EN-US><BR><BR><SPAN style="COLOR: red">java -verbosegc classfile</SPAN><BR><BR></SPAN>　　可以看个例子：</SPAN><SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-pagination: widow-orphan"><SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: Tahoma">class TestGC <BR>{<BR></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: Tahoma">　<SPAN lang=EN-US>public static void main(String[] args) <BR></SPAN>　<SPAN lang=EN-US>{<BR></SPAN>　　<SPAN lang=EN-US>new TestGC();<BR></SPAN>　　<SPAN lang=EN-US>System.gc();<BR></SPAN>　　<SPAN lang=EN-US>System.runFinalization();<BR></SPAN>　<SPAN lang=EN-US>}<BR>}<o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-pagination: widow-orphan"><SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: Tahoma"><BR></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: Tahoma">　　在这个例子中，一个新的对象被创建，由于它没有使用，所以该对象迅速地变为可达，程序编译后，执行命令：<SPAN lang=EN-US> java -verbosegc TestGC </SPAN>后结果为：<SPAN lang=EN-US><BR><BR>[Full GC 168K-&gt;97K(1984K), 0.0253873 secs]<BR><BR></SPAN>　　机器的环境为，<SPAN lang=EN-US>Windows 2000 + JDK<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" /><st1:chsdate w:st="on" IsROCDate="False" IsLunarDate="False" Day="30" Month="12" Year="1899">1.3.1</st1:chsdate>,</SPAN>箭头前后的数据<SPAN lang=EN-US>168K</SPAN>和<SPAN lang=EN-US>97K</SPAN>分别表示垃圾收集<SPAN lang=EN-US>GC</SPAN>前后所有存活对象使用的内存容量，说明有<SPAN lang=EN-US>168K-97K=71K</SPAN>的对象容量被回收，括号内的数据<SPAN lang=EN-US>1984K</SPAN>为堆内存的总容量，收集所需要的时间是<SPAN lang=EN-US>0.0253873</SPAN>秒（这个时间在每次执行的时候会有所不同）。<SPAN lang=EN-US><BR><BR></SPAN>　　<SPAN lang=EN-US>2</SPAN>、<SPAN lang=EN-US>finalize</SPAN>方法透视垃圾收集器的运行<SPAN lang=EN-US><BR><BR></SPAN>　　在<SPAN lang=EN-US>JVM</SPAN>垃圾收集器收集一个对象之前 ，一般要求程序调用适当的方法释放资源，但在没有明确释放资源的情况下，<SPAN lang=EN-US>Java</SPAN>提供了缺省机制来终止化该对象心释放资源，这个方法就是<SPAN lang=EN-US>finalize</SPAN>（）。它的原型为：<SPAN lang=EN-US><BR><BR>protected void finalize() throws Throwable<BR><BR></SPAN>　　在<SPAN lang=EN-US>finalize()</SPAN>方法返回之后，对象消失，垃圾收集开始执行。原型中的<SPAN lang=EN-US>throws Throwable</SPAN>表示它可以抛出任何类型的异常。<SPAN lang=EN-US><BR><BR></SPAN>　　之所以要使用<SPAN lang=EN-US>finalize()</SPAN>，是由于有时需要采取与<SPAN lang=EN-US>Java</SPAN>的普通方法不同的一种方法，通过分配内存来做一些具有<SPAN lang=EN-US>C</SPAN>风格的事情。这主要可以通过<SPAN lang=EN-US>"</SPAN>固有方法<SPAN lang=EN-US>"</SPAN>来进行，它是从<SPAN lang=EN-US>Java</SPAN>里调用非<SPAN lang=EN-US>Java</SPAN>方法的一种方式。<SPAN lang=EN-US>C</SPAN>和<SPAN lang=EN-US>C++</SPAN>是目前唯一获得固有方法支持的语言。但由于它们能调用通过其他语言编写的子程序，所以能够有效地调用任何东西。在非<SPAN lang=EN-US>Java</SPAN>代码内部，也许能调用<SPAN lang=EN-US>C</SPAN>的<SPAN lang=EN-US>malloc()</SPAN>系列函数，用它分配存储空间。而且除非调用了<SPAN lang=EN-US>free()</SPAN>，否则存储空间不会得到释放，从而造成内存<SPAN lang=EN-US>"</SPAN>漏洞<SPAN lang=EN-US>"</SPAN>的出现。当然，<SPAN lang=EN-US>free()</SPAN>是一个<SPAN lang=EN-US>C</SPAN>和<SPAN lang=EN-US>C++</SPAN>函数，所以我们需要在<SPAN lang=EN-US>finalize()</SPAN>内部的一个固有方法中调用它。也就是说我们不能过多地使用<SPAN lang=EN-US>finalize()</SPAN>，它并不是进行普通清除工作的理想场所。<SPAN lang=EN-US><BR><BR></SPAN>　　在普通的清除工作中，为清除一个对象，那个对象的用户必须在希望进行清除的地点调用一个清除方法。这与<SPAN lang=EN-US>C++"</SPAN>破坏器<SPAN lang=EN-US>"</SPAN>的概念稍有抵触。在<SPAN lang=EN-US>C++</SPAN>中，所有对象都会破坏（清除）。或者换句话说，所有对象都<SPAN lang=EN-US>"</SPAN>应该<SPAN lang=EN-US>"</SPAN>破坏。若将<SPAN lang=EN-US>C++</SPAN>对象创建成一个本地对象，比如在堆栈中创建（在<SPAN lang=EN-US>Java</SPAN>中是不可能的），那么清除或破坏工作就会在<SPAN lang=EN-US>"</SPAN>结束花括号<SPAN lang=EN-US>"</SPAN>所代表的、创建这个对象的作用域的末尾进行。若对象是用<SPAN lang=EN-US>new</SPAN>创建的（类似于<SPAN lang=EN-US>Java</SPAN>），那么当程序员调用<SPAN lang=EN-US>C++</SPAN>的<SPAN lang=EN-US>delete</SPAN>命令时（<SPAN lang=EN-US>Java</SPAN>没有这个命令），就会调用相应的破坏器。若程序员忘记了，那么永远不会调用破坏器，我们最终得到的将是一个内存<SPAN lang=EN-US>"</SPAN>漏洞<SPAN lang=EN-US>"</SPAN>，另外还包括对象的其他部分永远不会得到清除。<SPAN lang=EN-US><BR><BR></SPAN>　　相反，<SPAN lang=EN-US>Java</SPAN>不允许我们创建本地（局部）对象<SPAN lang=EN-US>--</SPAN>无论如何都要使用<SPAN lang=EN-US>new</SPAN>。但在<SPAN lang=EN-US>Java</SPAN>中，没有<SPAN lang=EN-US>"delete"</SPAN>命令来释放对象，因为垃圾收集器会帮助我们自动释放存储空间。所以如果站在比较简化的立场，我们可以说正是由于存在垃圾收集机制，所以<SPAN lang=EN-US>Java</SPAN>没有破坏器。然而，随着以后学习的深入，就会知道垃圾收集器的存在并不能完全消除对破坏器的需要，或者说不能消除对破坏器代表的那种机制的需要（而且绝对不能直接调用<SPAN lang=EN-US>finalize()</SPAN>，所以应尽量避免用它）。若希望执行除释放存储空间之外的其他某种形式的清除工作，仍然必须调用<SPAN lang=EN-US>Java</SPAN>中的一个方法。它等价于<SPAN lang=EN-US>C++</SPAN>的破坏器，只是没后者方便。<SPAN lang=EN-US><BR><BR></SPAN>　　下面这个例子向大家展示了垃圾收集所经历的过程，并对前面的陈述进行了总结。<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-pagination: widow-orphan"><SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: Tahoma">class Chair {<BR></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: Tahoma">　<SPAN lang=EN-US>static boolean gcrun = false;<BR></SPAN>　<SPAN lang=EN-US>static boolean f = false;<BR></SPAN>　<SPAN lang=EN-US>static int created = 0;<BR></SPAN>　<SPAN lang=EN-US>static int finalized = 0;<BR></SPAN>　<SPAN lang=EN-US>int i;<BR></SPAN>　<SPAN lang=EN-US>Chair() {<BR></SPAN>　　<SPAN lang=EN-US>i = ++created;<BR></SPAN>　　<SPAN lang=EN-US>if(created == 47) <BR></SPAN>　　　<SPAN lang=EN-US>System.out.println("Created 47");<BR></SPAN>　<SPAN lang=EN-US>}<BR></SPAN>　<SPAN lang=EN-US>protected void finalize() {<BR></SPAN>　　<SPAN lang=EN-US>if(!gcrun) {<BR></SPAN>　　　<SPAN lang=EN-US>gcrun = true;<BR></SPAN>　　　<SPAN lang=EN-US>System.out.println("Beginning to finalize after " + created + " Chairs have been created");<BR></SPAN>　　<SPAN lang=EN-US>}<BR></SPAN>　　<SPAN lang=EN-US>if(i == 47) {<BR></SPAN>　　　<SPAN lang=EN-US>System.out.println("Finalizing Chair #47, " +"Setting flag to stop Chair creation");<BR></SPAN>　　　<SPAN lang=EN-US>f = true;<BR></SPAN>　　<SPAN lang=EN-US>}<BR></SPAN>　　<SPAN lang=EN-US>finalized++;<BR></SPAN>　　<SPAN lang=EN-US>if(finalized &gt;= created)<BR></SPAN>　　　<SPAN lang=EN-US>System.out.println("All " + finalized + " finalized");<BR></SPAN>　<SPAN lang=EN-US>}<BR>}<BR><BR>public class Garbage {<BR></SPAN>　<SPAN lang=EN-US>public static void main(String[] args) {<BR></SPAN>　　<SPAN lang=EN-US>if(args.length == 0) {<BR></SPAN>　　　<SPAN lang=EN-US>System.err.println("Usage: \n" + "java Garbage before\n or:\n" + "java Garbage after");<BR></SPAN>　　　<SPAN lang=EN-US>return;<BR></SPAN>　　<SPAN lang=EN-US>}<BR></SPAN>　　<SPAN lang=EN-US>while(!Chair.f) {<BR></SPAN>　　　<SPAN lang=EN-US>new Chair();<BR></SPAN>　　　<SPAN lang=EN-US>new String("To take up space");<BR></SPAN>　　<SPAN lang=EN-US>}<BR></SPAN>　　<SPAN lang=EN-US>System.out.println("After all Chairs have been created:\n" + "total created = " + Chair.created +<BR>", total finalized = " + Chair.finalized);<BR></SPAN>　　<SPAN lang=EN-US>if(args[0].equals("before")) {<BR></SPAN>　　　　<SPAN lang=EN-US>System.out.println("gc():");<BR></SPAN>　　　　<SPAN lang=EN-US>System.gc();<BR></SPAN>　　　　<SPAN lang=EN-US>System.out.println("runFinalization():");<BR></SPAN>　　　　<SPAN lang=EN-US>System.runFinalization();<BR></SPAN>　　<SPAN lang=EN-US>}<BR></SPAN>　　<SPAN lang=EN-US>System.out.println("bye!");<BR></SPAN>　　<SPAN lang=EN-US>if(args[0].equals("after"))<BR></SPAN>　　　<SPAN lang=EN-US>System.runFinalizersOnExit(true);<BR></SPAN>　<SPAN lang=EN-US>}<BR>}<o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: Tahoma"><BR></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: Tahoma">　　上面这个程序创建了许多<SPAN lang=EN-US>Chair</SPAN>对象，而且在垃圾收集器开始运行后的某些时候，程序会停止创建<SPAN lang=EN-US>Chair</SPAN>。由于垃圾收集器可能在任何时间运行，所以我们不能准确知道它在何时启动。因此，程序用一个名为<SPAN lang=EN-US>gcrun</SPAN>的标记来指出垃圾收集器是否已经开始运行。利用第二个标记<SPAN lang=EN-US>f</SPAN>，<SPAN lang=EN-US>Chair</SPAN>可告诉<SPAN lang=EN-US>main()</SPAN>它应停止对象的生成。这两个标记都是在<SPAN lang=EN-US>finalize()</SPAN>内部设置的，它调用于垃圾收集期间。另两个<SPAN lang=EN-US>static</SPAN>变量<SPAN lang=EN-US>--created</SPAN>以及<SPAN lang=EN-US>finalized--</SPAN>分别用于跟踪已创建的对象数量以及垃圾收集器已进行完收尾工作的对象数量。最后，每个<SPAN lang=EN-US>Chair</SPAN>都有它自己的（非<SPAN lang=EN-US>static</SPAN>）<SPAN lang=EN-US>int i</SPAN>，所以能跟踪了解它具体的编号是多少。编号为<SPAN lang=EN-US>47</SPAN>的<SPAN lang=EN-US>Chair</SPAN>进行完收尾工作后，标记会设为<SPAN lang=EN-US>true</SPAN>，最终结束<SPAN lang=EN-US>Chair</SPAN>对象的创建过程。（关于这个例子的更具体的分析和说明请参看《<SPAN lang=EN-US>Java</SPAN>编程思想》的第四章）<SPAN lang=EN-US><BR><BR></SPAN>　　<B>关于垃圾收集的几点补充</B><SPAN lang=EN-US><BR><BR></SPAN>　　经过上述的说明，可以发现垃圾回收有以下的几个特点：<SPAN lang=EN-US><BR><BR></SPAN>　　（<SPAN lang=EN-US>1</SPAN>）垃圾收集发生的不可预知性：由于实现了不同的垃圾收集算法和采用了不同的收集机制，所以它有可能是定时发生，有可能是当出现系统空闲<SPAN lang=EN-US>CPU</SPAN>资源时发生，也有可能是和原始的垃圾收集一样，等到内存消耗出现极限时发生，这与垃圾收集器的选择和具体的设置都有关系。<SPAN lang=EN-US><BR><BR></SPAN>　　（<SPAN lang=EN-US>2</SPAN>）垃圾收集的精确性：主要包括<SPAN lang=EN-US>2 </SPAN>个方面：（<SPAN lang=EN-US>a</SPAN>）垃圾收集器能够精确标记活着的对象；（<SPAN lang=EN-US>b</SPAN>）垃圾收集器能够精确地定位对象之间的引用关系。前者是完全地回收所有废弃对象的前提，否则就可能造成内存泄漏。而后者则是实现归并和复制等算法的必要条件。所有不可达对象都能够可靠地得到回收，所有对象都能够重新分配，允许对象的复制和对象内存的缩并，这样就有效地防止内存的支离破碎。（<SPAN lang=EN-US>3</SPAN>）现在有许多种不同的垃圾收集器，每种有其算法且其表现各异，既有当垃圾收集开始时就停止应用程序的运行，又有当垃圾收集开始时也允许应用程序的线程运行，还有在同一时间垃圾收集多线程运行。<SPAN lang=EN-US><BR><BR></SPAN>　　（<SPAN lang=EN-US>4</SPAN>）垃圾收集的实现和具体的<SPAN lang=EN-US>JVM </SPAN>以及<SPAN lang=EN-US>JVM</SPAN>的内存模型有非常紧密的关系。不同的<SPAN lang=EN-US>JVM </SPAN>可能采用不同的垃圾收集，而<SPAN lang=EN-US>JVM </SPAN>的内存模型决定着该<SPAN lang=EN-US>JVM</SPAN>可以采用哪些类型垃圾收集。现在，<SPAN lang=EN-US>HotSpot </SPAN>系列<SPAN lang=EN-US>JVM</SPAN>中的内存系统都采用先进的面向对象的框架设计，这使得该系列<SPAN lang=EN-US>JVM</SPAN>都可以采用最先进的垃圾收集。<SPAN lang=EN-US><BR><BR></SPAN>　　（<SPAN lang=EN-US>5</SPAN>）随着技术的发展，现代垃圾收集技术提供许多可选的垃圾收集器，而且在配置每种收集器的时候又可以设置不同的参数，这就使得根据不同的应用环境获得最优的应用性能成为可能。<SPAN lang=EN-US><BR><BR></SPAN>　　针对以上特点，我们在使用的时候要注意：<SPAN lang=EN-US><BR><BR></SPAN>　　（<SPAN lang=EN-US>1</SPAN>）不要试图去假定垃圾收集发生的时间，这一切都是未知的。比如，方法中的一个临时对象在方法调用完毕后就变成了无用对象，这个时候它的内存就可以被释放。<SPAN lang=EN-US><BR><BR></SPAN>　　（<SPAN lang=EN-US>2</SPAN>）<SPAN lang=EN-US>Java</SPAN>中提供了一些和垃圾收集打交道的类，而且提供了一种强行执行垃圾收集的方法<SPAN lang=EN-US>--</SPAN>调用<SPAN lang=EN-US>System.gc()</SPAN>，但这同样是个不确定的方法。<SPAN lang=EN-US>Java </SPAN>中并不保证每次调用该方法就一定能够启动垃圾收集，它只不过会向<SPAN lang=EN-US>JVM</SPAN>发出这样一个申请，到底是否真正执行垃圾收集，一切都是个未知数。<SPAN lang=EN-US><BR><BR></SPAN>　　（<SPAN lang=EN-US>3</SPAN>）挑选适合自己的垃圾收集器。一般来说，如果系统没有特殊和苛刻的性能要求，可以采用<SPAN lang=EN-US>JVM</SPAN>的缺省选项。否则可以考虑使用有针对性的垃圾收集器，比如增量收集器就比较适合实时性要求较高的系统之中。系统具有较高的配置，有比较多的闲置资源，可以考虑使用并行标记<SPAN lang=EN-US>/</SPAN>清除收集器。<SPAN lang=EN-US><BR><BR></SPAN>　　（<SPAN lang=EN-US>4</SPAN>）关键的也是难把握的问题是内存泄漏。良好的编程习惯和严谨的编程态度永远是最重要的，不要让自己的一个小错误导致内存出现大漏洞。<SPAN lang=EN-US><BR><BR></SPAN>　　（<SPAN lang=EN-US>5</SPAN>）尽早释放无用对象的引用。大多数程序员在使用临时变量的时候，都是让引用变量在退出活动域<SPAN lang=EN-US>(scope)</SPAN>后，自动设置为<SPAN lang=EN-US>null</SPAN>，暗示垃圾收集器来收集该对象，还必须注意该引用的对象是否被监听，如果有，则要去掉监听器，然后再赋空值。<SPAN lang=EN-US><BR><BR></SPAN>　　<B>结束语</B><SPAN lang=EN-US><BR><BR></SPAN>　　一般来说，<SPAN lang=EN-US>Java</SPAN>开发人员可以不重视<SPAN lang=EN-US>JVM</SPAN>中堆内存的分配和垃圾处理收集，但是，充分理解<SPAN lang=EN-US>Java</SPAN>的这一特性可以让我们更有效地利用资源。同时要注意<SPAN lang=EN-US>finalize()</SPAN>方法是<SPAN lang=EN-US>Java</SPAN>的缺省机制，有时为确保对象资源的明确释放，可以编写自己的<SPAN lang=EN-US>finalize</SPAN>方法。<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: Tahoma"><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: Tahoma"><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><o:p>&nbsp;</o:p></SPAN></P><img src ="http://www.blogjava.net/FinalFantasy/aggbug/25474.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/FinalFantasy/" target="_blank">FinalFantasy</a> 2005-12-26 17:46 <a href="http://www.blogjava.net/FinalFantasy/archive/2005/12/26/25474.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Google编程挑战赛入围赛250分题及答案——BusStops题</title><link>http://www.blogjava.net/FinalFantasy/archive/2005/12/21/24975.html</link><dc:creator>FinalFantasy</dc:creator><author>FinalFantasy</author><pubDate>Wed, 21 Dec 2005 10:24:00 GMT</pubDate><guid>http://www.blogjava.net/FinalFantasy/archive/2005/12/21/24975.html</guid><wfw:comment>http://www.blogjava.net/FinalFantasy/comments/24975.html</wfw:comment><comments>http://www.blogjava.net/FinalFantasy/archive/2005/12/21/24975.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/FinalFantasy/comments/commentRss/24975.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/FinalFantasy/services/trackbacks/24975.html</trackback:ping><description><![CDATA[<P>Problem Statement</P>
<P>You are given a String[] cityMap representing the layout of a city. The city consists of blocks. The first element of cityMap represents the first row of blocks, etc. A 'B' character indicates a location where there is a bus stop. There will be exactly one 'X' character, indicating your location. All other characters will be '.'. You are also given an int walkingDistance, which is the maximum distance you are willing to walk to a bus stop. The distance should be calculated as the number of blocks vertically plus the number of blocks horizontally. Return the number of bus stops that are within walking distance of your current location.<BR><BR>Definition<BR><BR>Class:BusStops<BR>Method:countStops<BR>Parameters:String[], int<BR>Returns:int<BR>Method signature:int countStops(String[] cityMap, int walkingDistance)<BR>(be sure your method is public)<BR><BR>Constraints<BR><BR>-cityMap will contain between 1 and 50 elements, inclusive.<BR>-Each element of cityMap will contain between 1 and 50 characters, inclusive.<BR>-Each element of cityMap will contain the same number of characters.<BR>-Each character of each element of cityMap will be 'B', 'X', or '.'.<BR>-There will be exactly one 'X' character in cityMap.<BR>-walkingDistance will be between 1 and 100, inclusive.<BR><BR>Examples<BR><BR>0)</P>
<P>{"...B.",<BR>&nbsp;".....",<BR>&nbsp;"..X.B",<BR>&nbsp;".....",<BR>&nbsp;"B...."}<BR>3<BR>Returns: 2<BR>You can reach the bus stop at the top (3 units away), or on the right (2 units away). The one in the lower left is 4 units away, which is too far.<BR><BR>1)</P>
<P>{"B.B..",<BR>&nbsp;".....",<BR>&nbsp;"B....",<BR>&nbsp;".....",<BR>&nbsp;"....X"}<BR>8<BR>Returns: 3<BR>A distance of 8 can get us anywhere on the map, so we can reach all 3 bus stops.<BR><BR>2)</P>
<P>{"BBBBB",<BR>&nbsp;"BB.BB",<BR>&nbsp;"B.X.B",<BR>&nbsp;"BB.BB",<BR>&nbsp;"BBBBB"}<BR>1<BR>Returns: 0<BR>Plenty of bus stops, but unfortunately we cannot reach any of them.<BR><BR>3)</P>
<P>{"B..B..",<BR>&nbsp;".B...B",<BR>&nbsp;"..B...",<BR>&nbsp;"..B.X.",<BR>&nbsp;"B.B.B.",<BR>&nbsp;".B.B.B"}<BR>3<BR>Returns: 7<BR></P>
<HR>
说实话我觉得这一题没啥意思，超简单，首先先确定X的位置，再用遍历数组找B的位置，再求相减的绝对值然后判断是否超出给出的最大距离就行了。相对这题PlayCars却很有意思，到现在我也没想出除了穷举以外的一个更好的算法，因为我觉得穷举可能会超时。有哪位有其它的办法的话，请告诉我，大家探讨一下，谢谢。好了，不废话了，下面是这题的答案：<BR><BR>public class BusStops {<BR>&nbsp;public static void main(String[] arg){<BR>&nbsp;&nbsp;BusStops&nbsp;total = new BusStops();<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(total.countStops({"...B.",".....","..X.B",".....","B...."},3));<BR>&nbsp;}<BR>&nbsp;<BR>&nbsp;public int countStops(String[] cityMap, int walkingDistance){<BR>&nbsp;&nbsp;int sum= 0;<BR>&nbsp;&nbsp;int locationX = -1;<BR>&nbsp;&nbsp;int locationY = -1;<BR>&nbsp;&nbsp;for(int i=0;i&lt;cityMap.length;i++){<BR>&nbsp;&nbsp;&nbsp;for(int j=0;j&lt;cityMap[i].length();j++){<BR>&nbsp;&nbsp;&nbsp;&nbsp;if(cityMap[i].charAt(j)=='X'){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;locationX = i;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;locationY = j;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;for(int i=0;i&lt;cityMap.length;i++){<BR>&nbsp;&nbsp;&nbsp;for(int j=0;j&lt;cityMap[i].length();j++){<BR>&nbsp;&nbsp;&nbsp;&nbsp;if(cityMap[i].charAt(j)=='B' &amp;&amp; (Math.abs(locationX - i) + Math.abs(locationY - j)&lt;=walkingDistance))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum++;<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;return sum;<BR>&nbsp;}<BR>}<img src ="http://www.blogjava.net/FinalFantasy/aggbug/24975.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/FinalFantasy/" target="_blank">FinalFantasy</a> 2005-12-21 18:24 <a href="http://www.blogjava.net/FinalFantasy/archive/2005/12/21/24975.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Google编程挑战赛250分题目及答案</title><link>http://www.blogjava.net/FinalFantasy/archive/2005/12/14/23893.html</link><dc:creator>FinalFantasy</dc:creator><author>FinalFantasy</author><pubDate>Wed, 14 Dec 2005 08:32:00 GMT</pubDate><guid>http://www.blogjava.net/FinalFantasy/archive/2005/12/14/23893.html</guid><wfw:comment>http://www.blogjava.net/FinalFantasy/comments/23893.html</wfw:comment><comments>http://www.blogjava.net/FinalFantasy/archive/2005/12/14/23893.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/FinalFantasy/comments/commentRss/23893.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/FinalFantasy/services/trackbacks/23893.html</trackback:ping><description><![CDATA[<TABLE class=MsoNormalTable style="mso-cellspacing: 1.5pt; mso-table-layout-alt: fixed" cellPadding=0 border=0>
<TBODY>
<TR style="mso-yfti-irow: 0; mso-yfti-firstrow: yes; mso-row-margin-right: 2.25pt">
<TD style="BORDER-RIGHT: #ffffff; PADDING-RIGHT: 0.75pt; BORDER-TOP: #ffffff; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #ffffff; WIDTH: 537.75pt; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #ffffff; BACKGROUND-COLOR: transparent" width=717 colSpan=2>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; mso-outline-level: 3" align=left><B><SPAN lang=EN-US style="FONT-SIZE: 13.5pt; COLOR: black; FONT-FAMILY: 'Lucida Grande'; mso-font-kerning: 0pt">Problem Statement <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p></o:p></SPAN></B></P></TD>
<TD style="BORDER-RIGHT: #ffffff; PADDING-RIGHT: 0cm; BORDER-TOP: #ffffff; PADDING-LEFT: 0cm; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ffffff; PADDING-TOP: 0cm; BORDER-BOTTOM: #ffffff; BACKGROUND-COLOR: transparent; mso-cell-special: placeholder" width=3>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt">&nbsp;</P></TD></TR>
<TR style="mso-yfti-irow: 1">
<TD style="BORDER-RIGHT: #ffffff; PADDING-RIGHT: 0.75pt; BORDER-TOP: #ffffff; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #ffffff; WIDTH: 16.7pt; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #ffffff; BACKGROUND-COLOR: transparent" width=22>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Grande'; mso-font-kerning: 0pt">&nbsp;&nbsp;&nbsp;&nbsp; <o:p></o:p></SPAN></P></TD>
<TD style="BORDER-RIGHT: #ffffff; PADDING-RIGHT: 0.75pt; BORDER-TOP: #ffffff; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #ffffff; WIDTH: 523.3pt; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #ffffff; BACKGROUND-COLOR: transparent" width=698 colSpan=2>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan" align=left><SPAN lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Grande'; mso-font-kerning: 0pt">When a stone is thrown across water, sometimes it will land on the water and bounce rather than falling in right away. Suppose that a stone is thrown a distance of <I>n</I>. On each successive bounce it will travel half the distance as the previous bounce (rounded down to the nearest integer). When it can not travel any further, it falls into the water. If, at any point, the stone lands on an obstruction rather than water, it will not bounce, but will simply deflect and fall into the water. Please look at the figure for further clarification (with black, red and green cells representing banks, obstructions and free water respectively). So, if the stone is thrown a distance 7, it will bounce and travel a distance of 3, then finally a distance of 1, having travelled a total distance of 11 (the green path in the figure). If a stone is thrown a distance of 8, it will reach the opposite bank, and if thrown at distances of 2 or 6 it will hit an obstruction during its travel. These are the three red paths in the figure. <o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm -38.2pt 0pt 0cm; TEXT-ALIGN: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; mso-para-margin-right: -3.64gd" align=left><SPAN lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Grande'; mso-font-kerning: 0pt"><?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /><v:shapetype id=_x0000_t75 stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></v:path><o:lock aspectratio="t" v:ext="edit"></o:lock></v:shapetype><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan" align=left><SPAN lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Grande'; mso-font-kerning: 0pt"><BR><IMG src="http://www.gua2.net/up/google1.jpg"><BR>You are given a String <B>water</B>. An 'X' represents an obstruction, while a '.' represents water free from obstruction. You are to return an int representing the maximum distance a stone can travel and finally fall in the water, without hitting any obstructions, and without reaching the opposite bank (going beyond the end of the string). You may choose any initial distance for the throw, which starts from the left side of the string. A distance of 1 is the first character of the string, etc. If no initial throw will result in the stone landing in the water without hitting an obstruction, return 0. <o:p></o:p></SPAN></P></TD></TR>
<TR style="mso-yfti-irow: 2">
<TD style="BORDER-RIGHT: #ffffff; PADDING-RIGHT: 0.75pt; BORDER-TOP: #ffffff; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #ffffff; WIDTH: 541.5pt; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #ffffff; BACKGROUND-COLOR: transparent" width=722 colSpan=3>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; mso-outline-level: 3" align=left><B><SPAN lang=EN-US style="FONT-SIZE: 13.5pt; COLOR: black; FONT-FAMILY: 'Lucida Grande'; mso-font-kerning: 0pt">Definition <o:p></o:p></SPAN></B></P></TD></TR>
<TR style="mso-yfti-irow: 3">
<TD style="BORDER-RIGHT: #ffffff; PADDING-RIGHT: 0.75pt; BORDER-TOP: #ffffff; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #ffffff; WIDTH: 16.7pt; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #ffffff; BACKGROUND-COLOR: transparent" width=22>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Grande'; mso-font-kerning: 0pt">&nbsp;&nbsp;&nbsp;&nbsp; <o:p></o:p></SPAN></P></TD>
<TD style="BORDER-RIGHT: #ffffff; PADDING-RIGHT: 0.75pt; BORDER-TOP: #ffffff; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #ffffff; WIDTH: 523.3pt; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #ffffff; BACKGROUND-COLOR: transparent" width=698 colSpan=2>
<TABLE class=MsoNormalTable style="mso-cellspacing: 1.5pt; mso-table-layout-alt: fixed" cellPadding=0 border=0>
<TBODY>
<TR style="mso-yfti-irow: 0; mso-yfti-firstrow: yes">
<TD style="BORDER-RIGHT: #ffffff; PADDING-RIGHT: 0.75pt; BORDER-TOP: #ffffff; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #ffffff; WIDTH: 107.65pt; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #ffffff; BACKGROUND-COLOR: transparent" width=144>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Grande'; mso-font-kerning: 0pt">Class: <o:p></o:p></SPAN></P></TD>
<TD style="BORDER-RIGHT: #ffffff; PADDING-RIGHT: 0.75pt; BORDER-TOP: #ffffff; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #ffffff; WIDTH: 173.7pt; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #ffffff; BACKGROUND-COLOR: transparent" width=232>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Grande'; mso-font-kerning: 0pt">SkipStones <o:p></o:p></SPAN></P></TD></TR>
<TR style="mso-yfti-irow: 1">
<TD style="BORDER-RIGHT: #ffffff; PADDING-RIGHT: 0.75pt; BORDER-TOP: #ffffff; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #ffffff; WIDTH: 107.65pt; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #ffffff; BACKGROUND-COLOR: transparent" width=144>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Grande'; mso-font-kerning: 0pt">Method: <o:p></o:p></SPAN></P></TD>
<TD style="BORDER-RIGHT: #ffffff; PADDING-RIGHT: 0.75pt; BORDER-TOP: #ffffff; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #ffffff; WIDTH: 173.7pt; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #ffffff; BACKGROUND-COLOR: transparent" width=232>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Grande'; mso-font-kerning: 0pt">maxDistance <o:p></o:p></SPAN></P></TD></TR>
<TR style="mso-yfti-irow: 2">
<TD style="BORDER-RIGHT: #ffffff; PADDING-RIGHT: 0.75pt; BORDER-TOP: #ffffff; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #ffffff; WIDTH: 107.65pt; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #ffffff; BACKGROUND-COLOR: transparent" width=144>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Grande'; mso-font-kerning: 0pt">Parameters: <o:p></o:p></SPAN></P></TD>
<TD style="BORDER-RIGHT: #ffffff; PADDING-RIGHT: 0.75pt; BORDER-TOP: #ffffff; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #ffffff; WIDTH: 173.7pt; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #ffffff; BACKGROUND-COLOR: transparent" width=232>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Grande'; mso-font-kerning: 0pt">String <o:p></o:p></SPAN></P></TD></TR>
<TR style="mso-yfti-irow: 3">
<TD style="BORDER-RIGHT: #ffffff; PADDING-RIGHT: 0.75pt; BORDER-TOP: #ffffff; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #ffffff; WIDTH: 107.65pt; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #ffffff; BACKGROUND-COLOR: transparent" width=144>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Grande'; mso-font-kerning: 0pt">Returns: <o:p></o:p></SPAN></P></TD>
<TD style="BORDER-RIGHT: #ffffff; PADDING-RIGHT: 0.75pt; BORDER-TOP: #ffffff; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #ffffff; WIDTH: 173.7pt; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #ffffff; BACKGROUND-COLOR: transparent" width=232>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Grande'; mso-font-kerning: 0pt">int <o:p></o:p></SPAN></P></TD></TR>
<TR style="mso-yfti-irow: 4">
<TD style="BORDER-RIGHT: #ffffff; PADDING-RIGHT: 0.75pt; BORDER-TOP: #ffffff; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #ffffff; WIDTH: 107.65pt; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #ffffff; BACKGROUND-COLOR: transparent" width=144>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Grande'; mso-font-kerning: 0pt">Method signature: <o:p></o:p></SPAN></P></TD>
<TD style="BORDER-RIGHT: #ffffff; PADDING-RIGHT: 0.75pt; BORDER-TOP: #ffffff; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #ffffff; WIDTH: 173.7pt; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #ffffff; BACKGROUND-COLOR: transparent" width=232>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Grande'; mso-font-kerning: 0pt">int maxDistance(String water) <o:p></o:p></SPAN></P></TD></TR>
<TR style="mso-yfti-irow: 5; mso-yfti-lastrow: yes">
<TD style="BORDER-RIGHT: #ffffff; PADDING-RIGHT: 0.75pt; BORDER-TOP: #ffffff; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #ffffff; WIDTH: 282.85pt; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #ffffff; BACKGROUND-COLOR: transparent" width=377 colSpan=2>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Grande'; mso-font-kerning: 0pt">(be sure your method is public) <o:p></o:p></SPAN></P></TD></TR></TBODY></TABLE>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Grande'; mso-font-kerning: 0pt"><o:p></o:p></SPAN></P></TD></TR>
<TR style="mso-yfti-irow: 4">
<TD style="BORDER-RIGHT: #ffffff; PADDING-RIGHT: 0.75pt; BORDER-TOP: #ffffff; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #ffffff; WIDTH: 16.7pt; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #ffffff; BACKGROUND-COLOR: transparent" width=22>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Grande'; mso-font-kerning: 0pt">&nbsp;&nbsp;&nbsp;&nbsp; <o:p></o:p></SPAN></P></TD>
<TD style="BORDER-RIGHT: #ffffff; PADDING-RIGHT: 0.75pt; BORDER-TOP: #ffffff; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #ffffff; WIDTH: 523.3pt; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #ffffff; BACKGROUND-COLOR: transparent" width=698 colSpan=2>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; mso-font-kerning: 0pt"><o:p>&nbsp;</o:p></SPAN></P></TD></TR>
<TR style="mso-yfti-irow: 5">
<TD style="BORDER-RIGHT: #ffffff; PADDING-RIGHT: 0.75pt; BORDER-TOP: #ffffff; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #ffffff; WIDTH: 16.7pt; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #ffffff; BACKGROUND-COLOR: transparent" width=22>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Grande'; mso-font-kerning: 0pt"><o:p>&nbsp;</o:p></SPAN></P></TD>
<TD style="BORDER-RIGHT: #ffffff; PADDING-RIGHT: 0.75pt; BORDER-TOP: #ffffff; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #ffffff; WIDTH: 523.3pt; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #ffffff; BACKGROUND-COLOR: transparent" width=698 colSpan=2>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; mso-font-kerning: 0pt"><o:p>&nbsp;</o:p></SPAN></P></TD></TR>
<TR style="mso-yfti-irow: 6">
<TD style="BORDER-RIGHT: #ffffff; PADDING-RIGHT: 0.75pt; BORDER-TOP: #ffffff; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #ffffff; WIDTH: 541.5pt; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #ffffff; BACKGROUND-COLOR: transparent" width=722 colSpan=3>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; mso-outline-level: 3" align=left><B><SPAN lang=EN-US style="FONT-SIZE: 13.5pt; COLOR: black; FONT-FAMILY: 'Lucida Grande'; mso-font-kerning: 0pt">Notes <o:p></o:p></SPAN></B></P></TD></TR>
<TR style="mso-yfti-irow: 7">
<TD style="BORDER-RIGHT: #ffffff; PADDING-RIGHT: 0.75pt; BORDER-TOP: #ffffff; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #ffffff; WIDTH: 16.7pt; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #ffffff; BACKGROUND-COLOR: transparent" vAlign=top width=22>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center; mso-pagination: widow-orphan" align=center><SPAN lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Grande'; mso-font-kerning: 0pt">- <o:p></o:p></SPAN></P></TD>
<TD style="BORDER-RIGHT: #ffffff; PADDING-RIGHT: 0.75pt; BORDER-TOP: #ffffff; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #ffffff; WIDTH: 523.3pt; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #ffffff; BACKGROUND-COLOR: transparent" width=698 colSpan=2>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Grande'; mso-font-kerning: 0pt">Obstructions are at water level, so the stone will not hit any obstructions while it's in the air. <o:p></o:p></SPAN></P></TD></TR>
<TR style="mso-yfti-irow: 8">
<TD style="BORDER-RIGHT: #ffffff; PADDING-RIGHT: 0.75pt; BORDER-TOP: #ffffff; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #ffffff; WIDTH: 541.5pt; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #ffffff; BACKGROUND-COLOR: transparent" width=722 colSpan=3>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; mso-outline-level: 3" align=left><B><SPAN lang=EN-US style="FONT-SIZE: 13.5pt; COLOR: black; FONT-FAMILY: 'Lucida Grande'; mso-font-kerning: 0pt">Constraints <o:p></o:p></SPAN></B></P></TD></TR>
<TR style="mso-yfti-irow: 9">
<TD style="BORDER-RIGHT: #ffffff; PADDING-RIGHT: 0.75pt; BORDER-TOP: #ffffff; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #ffffff; WIDTH: 16.7pt; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #ffffff; BACKGROUND-COLOR: transparent" vAlign=top width=22>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center; mso-pagination: widow-orphan" align=center><SPAN lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Grande'; mso-font-kerning: 0pt">- <o:p></o:p></SPAN></P></TD>
<TD style="BORDER-RIGHT: #ffffff; PADDING-RIGHT: 0.75pt; BORDER-TOP: #ffffff; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #ffffff; WIDTH: 523.3pt; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #ffffff; BACKGROUND-COLOR: transparent" width=698 colSpan=2>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><B><SPAN lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Grande'; mso-font-kerning: 0pt">water</SPAN></B><SPAN lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Grande'; mso-font-kerning: 0pt"> will contain between 1 and 50 elements, inclusive. <o:p></o:p></SPAN></P></TD></TR>
<TR style="mso-yfti-irow: 10">
<TD style="BORDER-RIGHT: #ffffff; PADDING-RIGHT: 0.75pt; BORDER-TOP: #ffffff; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #ffffff; WIDTH: 16.7pt; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #ffffff; BACKGROUND-COLOR: transparent" vAlign=top width=22>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center; mso-pagination: widow-orphan" align=center><SPAN lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Grande'; mso-font-kerning: 0pt">- <o:p></o:p></SPAN></P></TD>
<TD style="BORDER-RIGHT: #ffffff; PADDING-RIGHT: 0.75pt; BORDER-TOP: #ffffff; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #ffffff; WIDTH: 523.3pt; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #ffffff; BACKGROUND-COLOR: transparent" width=698 colSpan=2>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Grande'; mso-font-kerning: 0pt">Each element of <B>water</B> will contain between 1 and 50 characters, inclusive. <o:p></o:p></SPAN></P></TD></TR>
<TR style="mso-yfti-irow: 11">
<TD style="BORDER-RIGHT: #ffffff; PADDING-RIGHT: 0.75pt; BORDER-TOP: #ffffff; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #ffffff; WIDTH: 16.7pt; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #ffffff; BACKGROUND-COLOR: transparent" vAlign=top width=22>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center; mso-pagination: widow-orphan" align=center><SPAN lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Grande'; mso-font-kerning: 0pt">- <o:p></o:p></SPAN></P></TD>
<TD style="BORDER-RIGHT: #ffffff; PADDING-RIGHT: 0.75pt; BORDER-TOP: #ffffff; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #ffffff; WIDTH: 523.3pt; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #ffffff; BACKGROUND-COLOR: transparent" width=698 colSpan=2>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Grande'; mso-font-kerning: 0pt">Each character of each element of <B>water</B> will be 'X' or '.'. <o:p></o:p></SPAN></P></TD></TR>
<TR style="mso-yfti-irow: 12">
<TD style="BORDER-RIGHT: #ffffff; PADDING-RIGHT: 0.75pt; BORDER-TOP: #ffffff; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #ffffff; WIDTH: 541.5pt; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #ffffff; BACKGROUND-COLOR: transparent" width=722 colSpan=3>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; mso-outline-level: 3" align=left><B><SPAN lang=EN-US style="FONT-SIZE: 13.5pt; COLOR: black; FONT-FAMILY: 'Lucida Grande'; mso-font-kerning: 0pt">Examples <o:p></o:p></SPAN></B></P></TD></TR>
<TR style="mso-yfti-irow: 13">
<TD style="BORDER-RIGHT: #ffffff; PADDING-RIGHT: 0.75pt; BORDER-TOP: #ffffff; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #ffffff; WIDTH: 16.7pt; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #ffffff; BACKGROUND-COLOR: transparent" noWrap width=22>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center; mso-pagination: widow-orphan" align=center><SPAN lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Grande'; mso-font-kerning: 0pt">0) <o:p></o:p></SPAN></P></TD>
<TD style="BORDER-RIGHT: #ffffff; PADDING-RIGHT: 0.75pt; BORDER-TOP: #ffffff; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #ffffff; WIDTH: 523.3pt; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #ffffff; BACKGROUND-COLOR: transparent" width=698 colSpan=2>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Grande'; mso-font-kerning: 0pt"><o:p>&nbsp;</o:p></SPAN></P></TD></TR>
<TR style="mso-yfti-irow: 14">
<TD style="BORDER-RIGHT: #ffffff; PADDING-RIGHT: 0.75pt; BORDER-TOP: #ffffff; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #ffffff; WIDTH: 16.7pt; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #ffffff; BACKGROUND-COLOR: transparent" width=22>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Grande'; mso-font-kerning: 0pt">&nbsp;&nbsp;&nbsp;&nbsp; <o:p></o:p></SPAN></P></TD>
<TD style="BORDER-RIGHT: #ffffff; PADDING-RIGHT: 0.75pt; BORDER-TOP: #ffffff; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #ffffff; WIDTH: 523.3pt; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #ffffff; BACKGROUND-COLOR: transparent" width=698 colSpan=2>
<TABLE class=MsoNormalTable style="mso-cellspacing: 1.5pt; mso-table-layout-alt: fixed" cellPadding=0 border=0>
<TBODY>
<TR style="mso-yfti-irow: 0; mso-yfti-firstrow: yes">
<TD style="BORDER-RIGHT: #ffffff; PADDING-RIGHT: 0.75pt; BORDER-TOP: #ffffff; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #ffffff; WIDTH: 292.3pt; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #ffffff; BACKGROUND-COLOR: transparent" width=390>
<TABLE class=MsoNormalTable style="mso-cellspacing: 1.5pt; mso-table-layout-alt: fixed" cellPadding=0 border=0>
<TBODY>
<TR style="mso-yfti-irow: 0; mso-yfti-firstrow: yes; mso-yfti-lastrow: yes">
<TD style="BORDER-RIGHT: #ffffff; PADDING-RIGHT: 0.75pt; BORDER-TOP: #ffffff; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #ffffff; WIDTH: 85.5pt; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #ffffff; BACKGROUND-COLOR: transparent" width=114>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align=left><SPAN lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">"..X.....X..."<o:p></o:p></SPAN></P></TD></TR></TBODY></TABLE>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Grande'; mso-font-kerning: 0pt"><o:p></o:p></SPAN></P></TD></TR>
<TR style="mso-yfti-irow: 1">
<TD style="BORDER-RIGHT: #ffffff; PADDING-RIGHT: 0.75pt; BORDER-TOP: #ffffff; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #ffffff; WIDTH: 292.3pt; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #ffffff; BACKGROUND-COLOR: transparent" width=390>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align=left><SPAN lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">Returns: 11<o:p></o:p></SPAN></P></TD></TR>
<TR style="mso-yfti-irow: 2; mso-yfti-lastrow: yes">
<TD style="BORDER-RIGHT: #ffffff; PADDING-RIGHT: 0.75pt; BORDER-TOP: #ffffff; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #ffffff; WIDTH: 292.3pt; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #ffffff; BACKGROUND-COLOR: transparent" width=390>
<TABLE class=MsoNormalTable style="mso-cellspacing: 1.5pt; mso-table-layout-alt: fixed" cellPadding=0 border=0>
<TBODY>
<TR style="mso-yfti-irow: 0; mso-yfti-firstrow: yes; mso-yfti-lastrow: yes">
<TD style="BORDER-RIGHT: #ffffff; PADDING-RIGHT: 0.75pt; BORDER-TOP: #ffffff; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #ffffff; WIDTH: 287.8pt; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #ffffff; BACKGROUND-COLOR: transparent" width=384>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Grande'; mso-font-kerning: 0pt">This is the example from the problem statement. <o:p></o:p></SPAN></P></TD></TR></TBODY></TABLE>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Grande'; mso-font-kerning: 0pt"><o:p></o:p></SPAN></P></TD></TR></TBODY></TABLE>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Grande'; mso-font-kerning: 0pt"><o:p></o:p></SPAN></P></TD></TR>
<TR style="mso-yfti-irow: 15">
<TD style="BORDER-RIGHT: #ffffff; PADDING-RIGHT: 0.75pt; BORDER-TOP: #ffffff; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #ffffff; WIDTH: 16.7pt; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #ffffff; BACKGROUND-COLOR: transparent" noWrap width=22>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center; mso-pagination: widow-orphan" align=center><SPAN lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Grande'; mso-font-kerning: 0pt">1) <o:p></o:p></SPAN></P></TD>
<TD style="BORDER-RIGHT: #ffffff; PADDING-RIGHT: 0.75pt; BORDER-TOP: #ffffff; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #ffffff; WIDTH: 523.3pt; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #ffffff; BACKGROUND-COLOR: transparent" width=698 colSpan=2>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Grande'; mso-font-kerning: 0pt"><o:p>&nbsp;</o:p></SPAN></P></TD></TR>
<TR style="mso-yfti-irow: 16">
<TD style="BORDER-RIGHT: #ffffff; PADDING-RIGHT: 0.75pt; BORDER-TOP: #ffffff; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #ffffff; WIDTH: 16.7pt; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #ffffff; BACKGROUND-COLOR: transparent" width=22>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Grande'; mso-font-kerning: 0pt">&nbsp;&nbsp;&nbsp;&nbsp; <o:p></o:p></SPAN></P></TD>
<TD style="BORDER-RIGHT: #ffffff; PADDING-RIGHT: 0.75pt; BORDER-TOP: #ffffff; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #ffffff; WIDTH: 523.3pt; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #ffffff; BACKGROUND-COLOR: transparent" width=698 colSpan=2>
<TABLE class=MsoNormalTable style="mso-cellspacing: 1.5pt; mso-table-layout-alt: fixed" cellPadding=0 border=0>
<TBODY>
<TR style="mso-yfti-irow: 0; mso-yfti-firstrow: yes">
<TD style="BORDER-RIGHT: #ffffff; PADDING-RIGHT: 0.75pt; BORDER-TOP: #ffffff; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #ffffff; WIDTH: 459.05pt; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #ffffff; BACKGROUND-COLOR: transparent" width=612>
<TABLE class=MsoNormalTable style="mso-cellspacing: 1.5pt; mso-table-layout-alt: fixed" cellPadding=0 border=0>
<TBODY>
<TR style="mso-yfti-irow: 0; mso-yfti-firstrow: yes; mso-yfti-lastrow: yes">
<TD style="BORDER-RIGHT: #ffffff; PADDING-RIGHT: 0.75pt; BORDER-TOP: #ffffff; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #ffffff; WIDTH: 55.5pt; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #ffffff; BACKGROUND-COLOR: transparent" width=74>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align=left><SPAN lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">"...X..."<o:p></o:p></SPAN></P></TD></TR></TBODY></TABLE>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Grande'; mso-font-kerning: 0pt"><o:p></o:p></SPAN></P></TD></TR>
<TR style="mso-yfti-irow: 1">
<TD style="BORDER-RIGHT: #ffffff; PADDING-RIGHT: 0.75pt; BORDER-TOP: #ffffff; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #ffffff; WIDTH: 459.05pt; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #ffffff; BACKGROUND-COLOR: transparent" width=612>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align=left><SPAN lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">Returns: 3<o:p></o:p></SPAN></P></TD></TR>
<TR style="mso-yfti-irow: 2; mso-yfti-lastrow: yes">
<TD style="BORDER-RIGHT: #ffffff; PADDING-RIGHT: 0.75pt; BORDER-TOP: #ffffff; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #ffffff; WIDTH: 459.05pt; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #ffffff; BACKGROUND-COLOR: transparent" width=612>
<TABLE class=MsoNormalTable style="mso-cellspacing: 1.5pt; mso-table-layout-alt: fixed" cellPadding=0 border=0>
<TBODY>
<TR style="mso-yfti-irow: 0; mso-yfti-firstrow: yes; mso-yfti-lastrow: yes">
<TD style="BORDER-RIGHT: #ffffff; PADDING-RIGHT: 0.75pt; BORDER-TOP: #ffffff; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #ffffff; WIDTH: 514.3pt; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #ffffff; BACKGROUND-COLOR: transparent" width=686>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Grande'; mso-font-kerning: 0pt">If it weren't for the obstruction, we could start with a throw of distance 4, and go a total of 7. But, the best we can do is to throw the stone a distance of 2, and have it skip a distance of 1. <o:p></o:p></SPAN></P></TD></TR></TBODY></TABLE>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Grande'; mso-font-kerning: 0pt"><o:p></o:p></SPAN></P></TD></TR></TBODY></TABLE>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Grande'; mso-font-kerning: 0pt"><o:p></o:p></SPAN></P></TD></TR>
<TR style="mso-yfti-irow: 17">
<TD style="BORDER-RIGHT: #ffffff; PADDING-RIGHT: 0.75pt; BORDER-TOP: #ffffff; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #ffffff; WIDTH: 16.7pt; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #ffffff; BACKGROUND-COLOR: transparent" noWrap width=22>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center; mso-pagination: widow-orphan" align=center><SPAN lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Grande'; mso-font-kerning: 0pt">2) <o:p></o:p></SPAN></P></TD>
<TD style="BORDER-RIGHT: #ffffff; PADDING-RIGHT: 0.75pt; BORDER-TOP: #ffffff; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #ffffff; WIDTH: 523.3pt; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #ffffff; BACKGROUND-COLOR: transparent" width=698 colSpan=2>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Grande'; mso-font-kerning: 0pt"><o:p>&nbsp;</o:p></SPAN></P></TD></TR>
<TR style="mso-yfti-irow: 18">
<TD style="BORDER-RIGHT: #ffffff; PADDING-RIGHT: 0.75pt; BORDER-TOP: #ffffff; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #ffffff; WIDTH: 16.7pt; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #ffffff; BACKGROUND-COLOR: transparent" width=22>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Grande'; mso-font-kerning: 0pt">&nbsp;&nbsp;&nbsp;&nbsp; <o:p></o:p></SPAN></P></TD>
<TD style="BORDER-RIGHT: #ffffff; PADDING-RIGHT: 0.75pt; BORDER-TOP: #ffffff; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #ffffff; WIDTH: 523.3pt; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #ffffff; BACKGROUND-COLOR: transparent" width=698 colSpan=2>
<TABLE class=MsoNormalTable style="mso-cellspacing: 1.5pt; mso-table-layout-alt: fixed" cellPadding=0 border=0>
<TBODY>
<TR style="mso-yfti-irow: 0; mso-yfti-firstrow: yes">
<TD style="BORDER-RIGHT: #ffffff; PADDING-RIGHT: 0.75pt; BORDER-TOP: #ffffff; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #ffffff; WIDTH: 229.1pt; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #ffffff; BACKGROUND-COLOR: transparent" width=305>
<TABLE class=MsoNormalTable style="mso-cellspacing: 1.5pt; mso-table-layout-alt: fixed" cellPadding=0 border=0>
<TBODY>
<TR style="mso-yfti-irow: 0; mso-yfti-firstrow: yes; mso-yfti-lastrow: yes">
<TD style="BORDER-RIGHT: #ffffff; PADDING-RIGHT: 0.75pt; BORDER-TOP: #ffffff; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #ffffff; WIDTH: 157.5pt; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #ffffff; BACKGROUND-COLOR: transparent" width=210>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align=left><SPAN lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">"....X....X...XXXX.X....."<o:p></o:p></SPAN></P></TD></TR></TBODY></TABLE>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Grande'; mso-font-kerning: 0pt"><o:p></o:p></SPAN></P></TD></TR>
<TR style="mso-yfti-irow: 1">
<TD style="BORDER-RIGHT: #ffffff; PADDING-RIGHT: 0.75pt; BORDER-TOP: #ffffff; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #ffffff; WIDTH: 229.1pt; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #ffffff; BACKGROUND-COLOR: transparent" width=305>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align=left><SPAN lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">Returns: 22<o:p></o:p></SPAN></P></TD></TR>
<TR style="mso-yfti-irow: 2; mso-yfti-lastrow: yes">
<TD style="BORDER-RIGHT: #ffffff; PADDING-RIGHT: 0.75pt; BORDER-TOP: #ffffff; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #ffffff; WIDTH: 229.1pt; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #ffffff; BACKGROUND-COLOR: transparent" width=305>
<TABLE class=MsoNormalTable style="mso-cellspacing: 1.5pt; mso-table-layout-alt: fixed" cellPadding=0 border=0>
<TBODY>
<TR style="mso-yfti-irow: 0; mso-yfti-firstrow: yes; mso-yfti-lastrow: yes">
<TD style="BORDER-RIGHT: #ffffff; PADDING-RIGHT: 0.75pt; BORDER-TOP: #ffffff; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #ffffff; WIDTH: 224.6pt; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #ffffff; BACKGROUND-COLOR: transparent" width=299>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Grande'; mso-font-kerning: 0pt">12 + 6 + 3 + 1 = 22, is the best case. <o:p></o:p></SPAN></P></TD></TR></TBODY></TABLE>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Grande'; mso-font-kerning: 0pt"><o:p></o:p></SPAN></P></TD></TR></TBODY></TABLE>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Grande'; mso-font-kerning: 0pt"><o:p></o:p></SPAN></P></TD></TR>
<TR style="mso-yfti-irow: 19">
<TD style="BORDER-RIGHT: #ffffff; PADDING-RIGHT: 0.75pt; BORDER-TOP: #ffffff; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #ffffff; WIDTH: 16.7pt; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #ffffff; BACKGROUND-COLOR: transparent" noWrap width=22>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center; mso-pagination: widow-orphan" align=center><SPAN lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Grande'; mso-font-kerning: 0pt">3) <o:p></o:p></SPAN></P></TD>
<TD style="BORDER-RIGHT: #ffffff; PADDING-RIGHT: 0.75pt; BORDER-TOP: #ffffff; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #ffffff; WIDTH: 523.3pt; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #ffffff; BACKGROUND-COLOR: transparent" width=698 colSpan=2>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Grande'; mso-font-kerning: 0pt"><o:p>&nbsp;</o:p></SPAN></P></TD></TR>
<TR style="mso-yfti-irow: 20; mso-yfti-lastrow: yes">
<TD style="BORDER-RIGHT: #ffffff; PADDING-RIGHT: 0.75pt; BORDER-TOP: #ffffff; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #ffffff; WIDTH: 16.7pt; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #ffffff; BACKGROUND-COLOR: transparent" width=22>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Grande'; mso-font-kerning: 0pt">&nbsp;&nbsp;&nbsp;&nbsp; <o:p></o:p></SPAN></P></TD>
<TD style="BORDER-RIGHT: #ffffff; PADDING-RIGHT: 0.75pt; BORDER-TOP: #ffffff; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #ffffff; WIDTH: 523.3pt; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #ffffff; BACKGROUND-COLOR: transparent" width=698 colSpan=2>
<TABLE class=MsoNormalTable style="mso-cellspacing: 1.5pt; mso-table-layout-alt: fixed" cellPadding=0 border=0>
<TBODY>
<TR style="mso-yfti-irow: 0; mso-yfti-firstrow: yes">
<TD style="BORDER-RIGHT: #ffffff; PADDING-RIGHT: 0.75pt; BORDER-TOP: #ffffff; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #ffffff; WIDTH: 459.05pt; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #ffffff; BACKGROUND-COLOR: transparent" width=612>
<TABLE class=MsoNormalTable style="mso-cellspacing: 1.5pt; mso-table-layout-alt: fixed" cellPadding=0 border=0>
<TBODY>
<TR style="mso-yfti-irow: 0; mso-yfti-firstrow: yes; mso-yfti-lastrow: yes">
<TD style="BORDER-RIGHT: #ffffff; PADDING-RIGHT: 0.75pt; BORDER-TOP: #ffffff; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #ffffff; WIDTH: 103.5pt; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #ffffff; BACKGROUND-COLOR: transparent" width=138>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align=left><SPAN lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">"XXXXXXX.XXX.X.."<o:p></o:p></SPAN></P></TD></TR></TBODY></TABLE>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Grande'; mso-font-kerning: 0pt"><o:p></o:p></SPAN></P></TD></TR>
<TR style="mso-yfti-irow: 1">
<TD style="BORDER-RIGHT: #ffffff; PADDING-RIGHT: 0.75pt; BORDER-TOP: #ffffff; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #ffffff; WIDTH: 459.05pt; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #ffffff; BACKGROUND-COLOR: transparent" width=612>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align=left><SPAN lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">Returns: 15<o:p></o:p></SPAN></P></TD></TR>
<TR style="mso-yfti-irow: 2; mso-yfti-lastrow: yes">
<TD style="BORDER-RIGHT: #ffffff; PADDING-RIGHT: 0.75pt; BORDER-TOP: #ffffff; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #ffffff; WIDTH: 459.05pt; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #ffffff; BACKGROUND-COLOR: transparent" width=612>
<TABLE class=MsoNormalTable style="mso-cellspacing: 1.5pt; mso-table-layout-alt: fixed" cellPadding=0 border=0>
<TBODY>
<TR style="mso-yfti-irow: 0; mso-yfti-firstrow: yes; mso-yfti-lastrow: yes">
<TD style="BORDER-RIGHT: #ffffff; PADDING-RIGHT: 0.75pt; BORDER-TOP: #ffffff; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #ffffff; WIDTH: 454.55pt; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #ffffff; BACKGROUND-COLOR: transparent" width=606>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Grande'; mso-font-kerning: 0pt">Here, an initial throw of 8 is the only way to avoid hitting an obstruction. Notice that the stone finally falls in the water just before reaching the opposite bank. <o:p></o:p></SPAN></P></TD></TR></TBODY></TABLE>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Grande'; mso-font-kerning: 0pt"><o:p></o:p></SPAN></P></TD></TR></TBODY></TABLE>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Grande'; mso-font-kerning: 0pt"><o:p></o:p></SPAN></P></TD></TR>
<TR height=0>
<TD style="BORDER-RIGHT: #ffffff; BORDER-TOP: #ffffff; BORDER-LEFT: #ffffff; BORDER-BOTTOM: #ffffff; BACKGROUND-COLOR: transparent" width=25></TD>
<TD style="BORDER-RIGHT: #ffffff; BORDER-TOP: #ffffff; BORDER-LEFT: #ffffff; BORDER-BOTTOM: #ffffff; BACKGROUND-COLOR: transparent" width=695></TD>
<TD style="BORDER-RIGHT: #ffffff; BORDER-TOP: #ffffff; BORDER-LEFT: #ffffff; BORDER-BOTTOM: #ffffff; BACKGROUND-COLOR: transparent" width=6></TD></TR></TBODY></TABLE>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan" align=left><SPAN lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Grande'; mso-font-kerning: 0pt"><o:p></o:p></SPAN>&nbsp;</P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: black"><o:p>&nbsp;</o:p></SPAN></P>
<HR>
这次的题目可以说并不是太难，也许很多人被全英文的题目给难住了，其实并不应该。像我这个还没过CET4的人都能看得懂，何况是大家呢：）好了，废话不多说了，下面是我写的答案：<BR><BR>public class SkipStones<BR>{<BR>&nbsp;public int sum;<BR>&nbsp;public int total;<BR>&nbsp;public int maxDistance(String water)<BR>&nbsp;{<BR>&nbsp;&nbsp;for(int i=water.length();i&gt;0;i--)<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;total=0;<BR>&nbsp;&nbsp;&nbsp;sum=0;<BR>&nbsp;&nbsp;&nbsp;int j=i;<BR>&nbsp;&nbsp;&nbsp;do<BR>&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;sum+=j;<BR>&nbsp;&nbsp;&nbsp;&nbsp;j/=2;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}while(j!=0);<BR>&nbsp;&nbsp;&nbsp;if(sum&gt;water.length()) continue;<BR>&nbsp;&nbsp;&nbsp;else<BR>&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;j=i;<BR>&nbsp;&nbsp;&nbsp;&nbsp;int b=j-1;<BR>&nbsp;&nbsp;&nbsp;&nbsp;while(j!=0)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(water.charAt(b)=='X') break;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;total+=j;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;j/=2;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b+=j;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;if(total==sum) break;<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;if(total==sum) return sum;<BR>&nbsp;&nbsp;&nbsp;else return 0;<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;public static void main(String[] args)<BR>&nbsp;{<BR>&nbsp;&nbsp;SkipStones a=new SkipStones();<BR>&nbsp;&nbsp;System.out.println("The maxdistance is "+a.maxDistance("..X.....X..."));<BR>&nbsp;&nbsp;}<BR>&nbsp;}<img src ="http://www.blogjava.net/FinalFantasy/aggbug/23893.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/FinalFantasy/" target="_blank">FinalFantasy</a> 2005-12-14 16:32 <a href="http://www.blogjava.net/FinalFantasy/archive/2005/12/14/23893.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于Garbage.java的思考</title><link>http://www.blogjava.net/FinalFantasy/archive/2005/11/01/17664.html</link><dc:creator>FinalFantasy</dc:creator><author>FinalFantasy</author><pubDate>Tue, 01 Nov 2005 05:05:00 GMT</pubDate><guid>http://www.blogjava.net/FinalFantasy/archive/2005/11/01/17664.html</guid><wfw:comment>http://www.blogjava.net/FinalFantasy/comments/17664.html</wfw:comment><comments>http://www.blogjava.net/FinalFantasy/archive/2005/11/01/17664.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/FinalFantasy/comments/commentRss/17664.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/FinalFantasy/services/trackbacks/17664.html</trackback:ping><description><![CDATA[<FONT face=宋体 size=2>《thinking in java》中一段代码剖析</FONT>
<P class=p10 style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: normal"><B style="mso-bidi-font-weight: normal"><FONT face=宋体><FONT size=2>程序代码<SPAN lang=EN-US></SPAN></FONT></FONT></B></P>
<P>
<P class=p10 style="MARGIN: auto 0cm; TEXT-INDENT: 21pt"><SPAN lang=EN-US><FONT face=宋体 size=2>//chapter03:Garbage.java</FONT></SPAN></P>
<P class=p10 style="MARGIN: auto 0cm; TEXT-INDENT: 21pt"><SPAN lang=EN-US><FONT face=宋体 size=2>// Demonstration of the garbage</FONT></SPAN></P>
<P class=p10 style="MARGIN: auto 0cm; TEXT-INDENT: 21pt"><SPAN lang=EN-US><FONT face=宋体 size=2>// collector and finalization</FONT></SPAN></P>
<P class=p10 style="MARGIN: auto 0cm; TEXT-INDENT: 21pt"><SPAN lang=EN-US></SPAN></P>
<P>
<P class=p10 style="MARGIN: auto 0cm; TEXT-INDENT: 21pt"><SPAN lang=EN-US><FONT face=宋体 size=2>class Chair { </FONT></SPAN></P>
<P class=p10 style="MARGIN: auto 0cm; TEXT-INDENT: 21pt"><SPAN lang=EN-US><FONT face=宋体><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp; </SPAN>static boolean gcrun = false;</FONT></FONT></SPAN></P>
<P class=p10 style="MARGIN: auto 0cm; TEXT-INDENT: 21pt"><SPAN lang=EN-US><FONT face=宋体><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp; </SPAN>static boolean f = false;</FONT></FONT></SPAN></P>
<P class=p10 style="MARGIN: auto 0cm; TEXT-INDENT: 21pt"><SPAN lang=EN-US><FONT face=宋体><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp; </SPAN>static int created = 0;</FONT></FONT></SPAN></P>
<P class=p10 style="MARGIN: auto 0cm; TEXT-INDENT: 21pt"><SPAN lang=EN-US><FONT face=宋体><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp; </SPAN>static int finalized = 0;</FONT></FONT></SPAN></P>
<P class=p10 style="MARGIN: auto 0cm; TEXT-INDENT: 21pt"><SPAN lang=EN-US><FONT face=宋体><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp; </SPAN>int i;</FONT></FONT></SPAN></P>
<P class=p10 style="MARGIN: auto 0cm; TEXT-INDENT: 21pt"><SPAN lang=EN-US><FONT face=宋体><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;</SPAN><SPAN style="mso-spacerun: yes">&nbsp;</SPAN>Chair() { </FONT></FONT></SPAN></P>
<P class=p10 style="MARGIN: auto 0cm; TEXT-INDENT: 21pt"><SPAN lang=EN-US><FONT face=宋体><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>i = ++created;</FONT></FONT></SPAN></P>
<P class=p10 style="MARGIN: auto 0cm; TEXT-INDENT: 21pt"><SPAN lang=EN-US><FONT face=宋体><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>if(created == 47) </FONT></FONT></SPAN></P>
<P class=p10 style="MARGIN: auto 0cm; TEXT-INDENT: 21pt"><SPAN lang=EN-US><FONT face=宋体><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>System.out.println("Created 47");</FONT></FONT></SPAN></P>
<P class=p10 style="MARGIN: auto 0cm; TEXT-INDENT: 21pt"><SPAN lang=EN-US><FONT face=宋体><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp; </SPAN>}</FONT></FONT></SPAN></P>
<P class=p10 style="MARGIN: auto 0cm; TEXT-INDENT: 21pt"><SPAN lang=EN-US><FONT face=宋体><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp; </SPAN>public void finalize() { </FONT></FONT></SPAN></P>
<P class=p10 style="MARGIN: auto 0cm; TEXT-INDENT: 21pt"><SPAN lang=EN-US><FONT face=宋体><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>if(!gcrun) { </FONT></FONT></SPAN></P>
<P class=p10 style="MARGIN: auto 0cm; TEXT-INDENT: 21pt"><SPAN lang=EN-US><FONT face=宋体><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>// The first time finalize() is called:</FONT></FONT></SPAN></P>
<P class=p10 style="MARGIN: auto 0cm; TEXT-INDENT: 21pt"><SPAN lang=EN-US><FONT face=宋体><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>gcrun = true;</FONT></FONT></SPAN></P>
<P class=p10 style="MARGIN: auto 0cm; TEXT-INDENT: 21pt"><SPAN lang=EN-US><FONT face=宋体><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>System.out.println(</FONT></FONT></SPAN></P>
<P class=p10 style="MARGIN: auto 0cm; TEXT-INDENT: 21pt"><SPAN lang=EN-US><FONT face=宋体><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>"Beginning to finalize after " +</FONT></FONT></SPAN></P>
<P class=p10 style="MARGIN: auto 0cm; TEXT-INDENT: 21pt"><SPAN lang=EN-US><FONT face=宋体><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>created + " Chairs have been created");</FONT></FONT></SPAN></P>
<P class=p10 style="MARGIN: auto 0cm; TEXT-INDENT: 21pt"><SPAN lang=EN-US><FONT face=宋体><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>}</FONT></FONT></SPAN></P>
<P class=p10 style="MARGIN: auto 0cm; TEXT-INDENT: 21pt"><SPAN lang=EN-US><FONT face=宋体><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>if(i == 47) { </FONT></FONT></SPAN></P>
<P class=p10 style="MARGIN: auto 0cm; TEXT-INDENT: 21pt"><SPAN lang=EN-US><FONT face=宋体><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>System.out.println(</FONT></FONT></SPAN></P>
<P class=p10 style="MARGIN: auto 0cm; TEXT-INDENT: 21pt"><SPAN lang=EN-US><FONT face=宋体><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>"Finalizing Chair #47, " +</FONT></FONT></SPAN></P>
<P class=p10 style="MARGIN: auto 0cm; TEXT-INDENT: 21pt"><SPAN lang=EN-US><FONT face=宋体><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>"Setting flag to stop Chair creation");</FONT></FONT></SPAN></P>
<P class=p10 style="MARGIN: auto 0cm; TEXT-INDENT: 21pt"><SPAN lang=EN-US><FONT face=宋体><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>f = true;</FONT></FONT></SPAN></P>
<P class=p10 style="MARGIN: auto 0cm; TEXT-INDENT: 21pt"><SPAN lang=EN-US><FONT face=宋体><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>}</FONT></FONT></SPAN></P>
<P class=p10 style="MARGIN: auto 0cm; TEXT-INDENT: 21pt"><SPAN lang=EN-US><FONT face=宋体><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>finalized++;</FONT></FONT></SPAN></P>
<P class=p10 style="MARGIN: auto 0cm; TEXT-INDENT: 21pt"><SPAN lang=EN-US><FONT face=宋体><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>if(finalized &gt;= created)</FONT></FONT></SPAN></P>
<P class=p10 style="MARGIN: auto 0cm; TEXT-INDENT: 21pt"><SPAN lang=EN-US><FONT face=宋体><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>System.out.println(</FONT></FONT></SPAN></P>
<P class=p10 style="MARGIN: auto 0cm; TEXT-INDENT: 21pt"><SPAN lang=EN-US><FONT face=宋体><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>"All " + finalized + " finalized");</FONT></FONT></SPAN></P>
<P class=p10 style="MARGIN: auto 0cm; TEXT-INDENT: 21pt"><SPAN lang=EN-US><FONT face=宋体><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp; </SPAN>}</FONT></FONT></SPAN></P>
<P class=p10 style="MARGIN: auto 0cm; TEXT-INDENT: 21pt"><SPAN lang=EN-US><FONT face=宋体 size=2>}</FONT></SPAN></P>
<P class=p10 style="MARGIN: auto 0cm; TEXT-INDENT: 21pt"><SPAN lang=EN-US></SPAN></P>
<P>
<P class=p10 style="MARGIN: auto 0cm; TEXT-INDENT: 21pt"><SPAN lang=EN-US><FONT face=宋体 size=2>public class Garbage { </FONT></SPAN></P>
<P class=p10 style="MARGIN: auto 0cm; TEXT-INDENT: 21pt"><SPAN lang=EN-US><FONT face=宋体><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp; </SPAN>public static void main(String[] args) { </FONT></FONT></SPAN></P>
<P class=p10 style="MARGIN: auto 0cm; TEXT-INDENT: 21pt"><SPAN lang=EN-US><FONT face=宋体><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>// As long as the flag hasn't been set,</FONT></FONT></SPAN></P>
<P class=p10 style="MARGIN: auto 0cm; TEXT-INDENT: 21pt"><SPAN lang=EN-US><FONT face=宋体><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>// make Chairs and Strings:</FONT></FONT></SPAN></P>
<P class=p10 style="MARGIN: auto 0cm; TEXT-INDENT: 21pt"><SPAN lang=EN-US><FONT face=宋体><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>while(!Chair.f) { </FONT></FONT></SPAN></P>
<P class=p10 style="MARGIN: auto 0cm; TEXT-INDENT: 21pt"><SPAN lang=EN-US><FONT face=宋体><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;</SPAN>new Chair();</FONT></FONT></SPAN></P>
<P class=p10 style="MARGIN: auto 0cm; TEXT-INDENT: 21pt"><SPAN lang=EN-US><FONT face=宋体><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>new String("To take up space");</FONT></FONT></SPAN></P>
<P class=p10 style="MARGIN: auto 0cm; TEXT-INDENT: 21pt"><SPAN lang=EN-US><FONT face=宋体><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>}</FONT></FONT></SPAN></P>
<P class=p10 style="MARGIN: auto 0cm; TEXT-INDENT: 21pt"><SPAN lang=EN-US><FONT face=宋体><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>System.out.println(</FONT></FONT></SPAN></P>
<P class=p10 style="MARGIN: auto 0cm; TEXT-INDENT: 21pt"><SPAN lang=EN-US><FONT face=宋体><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>"After all Chairs have been created:\n" +</FONT></FONT></SPAN></P>
<P class=p10 style="MARGIN: auto 0cm; TEXT-INDENT: 21pt"><SPAN lang=EN-US><FONT face=宋体><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>"total created = " + Chair.created +</FONT></FONT></SPAN></P>
<P class=p10 style="MARGIN: auto 0cm; TEXT-INDENT: 21pt"><SPAN lang=EN-US><FONT face=宋体><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>", total finalized = " + Chair.finalized);</FONT></FONT></SPAN></P>
<P class=p10 style="MARGIN: auto 0cm; TEXT-INDENT: 21pt"><SPAN lang=EN-US><FONT face=宋体><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>// Optional arguments force garbage</FONT></FONT></SPAN></P>
<P class=p10 style="MARGIN: auto 0cm; TEXT-INDENT: 21pt"><SPAN lang=EN-US><FONT face=宋体><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>// collection &amp; finalization:</FONT></FONT></SPAN></P>
<P class=p10 style="MARGIN: auto 0cm; TEXT-INDENT: 21pt"><SPAN lang=EN-US><FONT face=宋体><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>if(args.length &gt; 0) { </FONT></FONT></SPAN></P>
<P class=p10 style="MARGIN: auto 0cm; TEXT-INDENT: 21pt"><SPAN lang=EN-US><FONT face=宋体><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>if(args[0].equals("gc") &amp;line;&amp;line; </FONT></FONT></SPAN></P>
<P class=p10 style="MARGIN: auto 0cm; TEXT-INDENT: 21pt"><SPAN lang=EN-US><FONT face=宋体><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>args[0].equals("all")) { </FONT></FONT></SPAN></P>
<P class=p10 style="MARGIN: auto 0cm; TEXT-INDENT: 21pt"><SPAN lang=EN-US><FONT face=宋体><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>System.out.println("gc():");</FONT></FONT></SPAN></P>
<P class=p10 style="MARGIN: auto 0cm; TEXT-INDENT: 21pt"><SPAN lang=EN-US><FONT face=宋体><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>System.gc();</FONT></FONT></SPAN></P>
<P class=p10 style="MARGIN: auto 0cm; TEXT-INDENT: 21pt"><SPAN lang=EN-US><FONT face=宋体><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>}</FONT></FONT></SPAN></P>
<P class=p10 style="MARGIN: auto 0cm; TEXT-INDENT: 21pt"><SPAN lang=EN-US><FONT face=宋体><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>if(args[0].equals("finalize") &amp;line;&amp;line; </FONT></FONT></SPAN></P>
<P class=p10 style="MARGIN: auto 0cm; TEXT-INDENT: 21pt"><SPAN lang=EN-US><FONT face=宋体><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>args[0].equals("all")) { </FONT></FONT></SPAN></P>
<P class=p10 style="MARGIN: auto 0cm; TEXT-INDENT: 21pt"><SPAN lang=EN-US><FONT face=宋体><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>System.out.println("runFinalization():");</FONT></FONT></SPAN></P>
<P class=p10 style="MARGIN: auto 0cm; TEXT-INDENT: 21pt"><SPAN lang=EN-US><FONT face=宋体><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>System.runFinalization();</FONT></FONT></SPAN></P>
<P class=p10 style="MARGIN: auto 0cm; TEXT-INDENT: 21pt"><SPAN lang=EN-US><FONT face=宋体><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>}</FONT></FONT></SPAN></P>
<P class=p10 style="MARGIN: auto 0cm; TEXT-INDENT: 21pt"><SPAN lang=EN-US><FONT face=宋体><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>}</FONT></FONT></SPAN></P>
<P class=p10 style="MARGIN: auto 0cm; TEXT-INDENT: 21pt"><SPAN lang=EN-US><FONT face=宋体><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>System.out.println("bye!");</FONT></FONT></SPAN></P>
<P class=p10 style="MARGIN: auto 0cm; TEXT-INDENT: 21pt"><SPAN lang=EN-US><FONT face=宋体><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp; </SPAN>}</FONT></FONT></SPAN></P>
<P class=p10 style="MARGIN: auto 0cm; TEXT-INDENT: 21pt"><FONT face=宋体><FONT size=2><SPAN lang=EN-US>} ///:~</SPAN>为什么执行<SPAN lang=EN-US style="COLOR: red">java Garbage gc</SPAN>以后，当所有对象创建完（比如<SPAN lang=EN-US>8000</SPAN>个），这时只清除了<SPAN lang=EN-US>2000</SPAN>个（不定），应该只能创建<SPAN lang=EN-US>47</SPAN>个对象啊</FONT></FONT></P>
<P class=p10 style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: normal"><B><FONT face=宋体 size=2>分析：</FONT></B></P>
<P class=p10 style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: normal"><FONT face=宋体 size=2>首先，在一个循环当中创建对象，并且只是创建，而不引用，也就是说这个对象会自动的被系统当作垃圾处理掉。但请注意，<SPAN lang=EN-US>finalize()</SPAN>方法并不是立刻就会执行的，执行的时间完全由系统来决定。所以很有可能的情况是已经创建了<SPAN lang=EN-US>20000</SPAN>个对象，才开始其中的某一个对象的清除工作（这可能和时间或者系统内容的占用有关）。看<SPAN lang=EN-US>finalize()</SPAN>方法中的一段代码：</FONT></P>
<P class=p10 style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: normal"><SPAN lang=EN-US><FONT face=宋体 size=2>&nbsp;&nbsp;&nbsp;&nbsp;if (!gcrun) { </FONT></SPAN></P>
<P class=p10 style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: normal"><SPAN lang=EN-US><FONT face=宋体 size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gcrun = true;</FONT></SPAN></P>
<P class=p10 style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: normal"><SPAN lang=EN-US><FONT face=宋体 size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</FONT></SPAN></P>
<P class=p10 style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: normal"><SPAN lang=EN-US><FONT face=宋体 size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"\nBeginning to finalize after" + created + "Chairs have been created\nat ");</FONT></SPAN></P>
<P class=p10 style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: normal"><SPAN lang=EN-US><FONT face=宋体 size=2>&nbsp;&nbsp;&nbsp;&nbsp; }</FONT></SPAN></P>
<P class=p10 style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: normal"><FONT face=宋体 size=2>就会出现这样的结果：</FONT></P>
<P class=p10 style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: normal"><SPAN lang=EN-US><FONT face=宋体 size=2>Beginning to finalize after 25038 Chairs have been created</FONT></SPAN></P>
<P class=p10 style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: normal"><SPAN lang=EN-US></SPAN></P>
<P>
<P class=p10 style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: normal"><FONT face=宋体 size=2>这时对象的创建过程仍在继续（因为已经<SPAN lang=EN-US>Finalize</SPAN>的对象还不满<SPAN lang=EN-US>47</SPAN>个，<SPAN lang=EN-US>Chair.f</SPAN>还是<SPAN lang=EN-US>false</SPAN>）。所以<SPAN lang=EN-US>Chair.created</SPAN>会继续增加。</FONT></P>
<P class=p10 style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: normal"><FONT face=宋体 size=2>直到有<SPAN lang=EN-US>47</SPAN>个对象被清除了，<SPAN lang=EN-US>Chair.f</SPAN>被置成<SPAN lang=EN-US>true</SPAN>了，创建对象的循环才结束。看<SPAN lang=EN-US>main</SPAN>方法中的一段代码：</FONT></P>
<P class=p10 style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: normal"><SPAN lang=EN-US><FONT face=宋体 size=2>&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</FONT></SPAN></P>
<P class=p10 style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: normal"><SPAN lang=EN-US><FONT face=宋体 size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"\nAfter all chairs have been created:\n"</FONT></SPAN></P>
<P class=p10 style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: normal"><SPAN lang=EN-US><FONT face=宋体 size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+ "total created ="</FONT></SPAN></P>
<P class=p10 style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: normal"><SPAN lang=EN-US><FONT face=宋体 size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+ Chair.created</FONT></SPAN></P>
<P class=p10 style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: normal"><SPAN lang=EN-US><FONT face=宋体 size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+ ",total finalized ="</FONT></SPAN></P>
<P class=p10 style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: normal"><SPAN lang=EN-US><FONT face=宋体 size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+ Chair.finalized+"\n");</FONT></SPAN></P>
<P class=p10 style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: normal"><FONT face=宋体 size=2>如上所说，<SPAN lang=EN-US>Chair.created</SPAN>是不断增加的，而在这段代码执行之前，又会有<SPAN lang=EN-US>N</SPAN>个对象被释放掉了，所以<SPAN lang=EN-US>finalized</SPAN>也增加了。</FONT></P>
<P class=p10 style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: normal"><FONT face=宋体 size=2>结果可能是这样的：</FONT></P>
<P class=p10 style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: normal"><SPAN lang=EN-US><FONT face=宋体 size=2>total created =29096,total finalized =73</FONT></SPAN></P>
<P class=p10 style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: normal"><SPAN lang=EN-US></SPAN></P>
<P>
<P class=p10 style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: normal"><FONT face=宋体><FONT size=2>其实这一过程和使用的<SPAN lang=EN-US>JVM</SPAN>有很大关系，执行结果可能会很不相同。但有一点是可以肯定的，那就是<SPAN style="COLOR: red">我们无法确定<SPAN lang=EN-US>JVM</SPAN>什么时候做对象的清除工作</SPAN>（这也是<SPAN lang=EN-US>Thinking in java</SPAN>中这段代码的想要说明的），<SPAN style="COLOR: red">可能会在这个对象刚刚<SPAN lang=EN-US>“</SPAN>无用<SPAN lang=EN-US>”</SPAN>的时候就清除掉了，也可能滞后几秒，甚至永远不清除。</SPAN></FONT></FONT></P>
<P class=p10 style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: normal"><SPAN lang=EN-US></SPAN></P>
<P>
<P class=p10 style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: normal"><B><FONT face=宋体 size=2>结论：</FONT></B></P>
<P class=p10 style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: normal"><FONT face=宋体 size=2>不能指望<SPAN lang=EN-US>finalize()</SPAN>方法能稳定的工作，尤其不能依靠它来做文件的关闭等操作，由于<SPAN lang=EN-US>finalize()</SPAN>的不确定性，往往得不到你想要的结果。事实上我们只需要知道所有无用的对象，<SPAN lang=EN-US>JVM</SPAN>会自己清除就够了。省点心思去睡觉岂不是更好的一件事情 ：）</FONT></P><img src ="http://www.blogjava.net/FinalFantasy/aggbug/17664.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/FinalFantasy/" target="_blank">FinalFantasy</a> 2005-11-01 13:05 <a href="http://www.blogjava.net/FinalFantasy/archive/2005/11/01/17664.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>整合Apache和Tomcat打造PHP、JSP服务器</title><link>http://www.blogjava.net/FinalFantasy/archive/2005/10/06/14894.html</link><dc:creator>FinalFantasy</dc:creator><author>FinalFantasy</author><pubDate>Thu, 06 Oct 2005 11:28:00 GMT</pubDate><guid>http://www.blogjava.net/FinalFantasy/archive/2005/10/06/14894.html</guid><wfw:comment>http://www.blogjava.net/FinalFantasy/comments/14894.html</wfw:comment><comments>http://www.blogjava.net/FinalFantasy/archive/2005/10/06/14894.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.blogjava.net/FinalFantasy/comments/commentRss/14894.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/FinalFantasy/services/trackbacks/14894.html</trackback:ping><description><![CDATA[<SPAN id=zoom>&nbsp;
<P>洛阳的天气可真是讨厌，昨天好不容易放晴了一天，今天就又下起了大雨，本来计划好去买衣服的，现在只能泡汤了。这几天来上网查了很多的资料，为了组建一个PHP、JSP、ASP的全能平台，PHP跟JSP的平台是组建好了，可是ASP怎么样都不行，好不容易下了个IASP装上了，配置了之后却老是出现错误。哎NB怎么就不配个专业版的系统给我呢，这样我就不用那么费劲了，只要把IIS跟Apache整合起来就行了。趁着有点时间就把用apache组建的PHP、JSP平台教程整理出来了，说实话光这两个都费了我好多的劲呀，特别是JSP，网上的教程都不知道是什么年代写的了，几乎都不能用了，我废了好几天的功夫才把这些零件给找齐，所以还特别记下了下载的地址，要下的就要赶快了！好了，废话不多说了，往下看吧。对了，另外再多说一句，下面的配置是我安装我本机的安装地址的，如果你的安装地址跟我的不符，那么你就要一些相应的改进！还有，如果一下的下载地址无效了，你可以在我这留下你的邮箱，我可以将这些东西发给你。<BR></P>
<HR>
前期准备：&nbsp; 
<P>
<P>所需软件列表 <BR>1、apache_2.0.54-win32-x86-no_ssl.exe （Apache web服务器） <A href="http://apache.justdn.org/httpd/binaries/win32/apache_2.0.54-win32-x86-no_ssl.exe"><A href="http://apache.justdn.org/httpd/binaries/win32/apache_2.0.54-win32-x86-no_ssl.exe" target=_blank>http://apache.justdn.org/......2.0.54-win32-x86-no_ssl.exe</A></A><BR>2、php-5.0.5-Win32 （PHP语言解析器）<BR>4、jdk1.4.2（JAVA 语言环境） <BR>5、jakarta-tomcat-5.5.12 （Tomcat JSP解析服务器） <A href="http://mirror.vmmatrix.net/apache/dist/jakarta/tomcat-5/v5.5.12-alpha/bin/apache-tomcat-5.5.12.exe"><A href="http://mirror.vmmatrix.net/apache/dist/jakarta/tomcat-5/v5.5.12-alpha/bin/apache-tomcat-5.5.12.exe" target=_blank>http://mirror.vmmatrix.ne......in/apache-tomcat-5.5.12.exe</A></A> <BR>7、mod_jk-1.2.14-apache-2.0.54.so.asc （整合Apache+Tomcat的plus） <A href="http://apache.linuxforum.net/dist/jakarta/tomcat-connectors/jk/binaries/win32/jk-1.2.14/mod_jk-1.2.14-apache-2.0.54.so.asc"><A href="http://apache.linuxforum.net/dist/jakarta/tomcat-connectors/jk/binaries/win32/jk-1.2.14/mod_jk-1.2.14-apache-2.0.54.so.asc" target=_blank>http://apache.linuxforum.......1.2.14-apache-2.0.54.so.asc</A></A>（为了找这个文件都把我给找疯了，网上的教程到处都说要mod_jk_1.2.5_2.0.47.dll，可是我找了两天死都找不到，后来到apache的官方网站看着生硬的EN去查才找到这么个文件，看文件名直觉就告诉我找对了，现在的apache不都是用so扩展了么，而且在那个页面也说明了这一点，要使用还要改名，所以在这里特别指出下载地址，让大家少走很多的弯路）</P>
<P>开始安装： <BR>一、 Apahce+PHP安装配置&nbsp; </P>
<P>1、安装apache_2.0.54-win32-x86-no_ssl.exe，为了方便把路径改为c:\吧，其他都不用管一路next下去。 <BR>2、安装完成之后，apache服务自动加载，这时打开浏览器，浏览：<A href="http://localhost/"><A href="http://localhost/" target=_blank>http://localhost</A></A>，出现apache欢迎页面（这步需要将C:\apache2\htdocs目录中的文件“index.html.en”改为“index.html”，方能显示）；如果这步出现异常，请检查安装源文件，重新安装。 <BR>3. 安装php-5.0.5-Win32,一般下载的PHP文件为一个免安装的压缩包，解压到C：\PHP就可以。&nbsp; <BR>4. 配置PHP和Apache，使之能解析php程序。&nbsp; <BR>PHP配置：将C:\PHP\目录中的“php.ini-dist”改名“php.ini”,然后添加环境变量。在环境变量里的classpath中添加“.;c:\php;”，在新建一个“PHPRC”的变量，里面同样是添加“.;c:\php;”&nbsp; <BR>Apache配置：&nbsp; <BR>打开C:\apache2\conf\httpd.conf&nbsp; </P>
<P>httpd.conf是apache的配置文件，在此配置文件最后添加以下语句，用以支持php程序：&nbsp; </P>
<P>ScriptAlias /php/ "C:/PHP/"&nbsp; </P>
<P>AddType application/x-httpd-php .php3&nbsp; </P>
<P>AddType application/x-httpd-php .php&nbsp; </P>
<P>AddType application/x-httpd-php .phtml&nbsp; </P>
<P>Action application/x-httpd-php "/php/php.exe"&nbsp; </P>
<P>ok，接下来重启Apache服务器（如果加载PHP成功，可以在Apache监控器中看到Apache/2.0.52(win32) PHP/5.0.4）就可以测试了PHP了，用编辑器编写如下语句：&nbsp; <BR>&lt;? <BR>phpinfo();&nbsp; </P>
<P>?&gt;&nbsp; </P>
<P>保存文件名为“test.php”到C:\apache2\htdocs目录，然后打开浏览器，浏览：<A href="http://localhost/test.php"><A href="http://localhost/test.php" target=_blank>http://localhost/test.php</A></A>，出现PHP基本信息就说明配置成功。严格按以上说明安装配置，都会一次成功。 </P>
<P>二、安装JDK和Tomcat</P>
<P>1. 安装j2sdk-1_4_2-windows-i586，JDK一定要在Tomcat之前安装，默认安装路径就可以。<BR>2. 安装Jakarta-Tomcat-5.5.12，默认安装路径就可以。<BR>4．设置环境变量（桌面-&gt;我的电脑-&gt;右键点击-&gt;选择“属性”-&gt;高级-&gt;环境变量），所有设置均在系统变量栏进行。<BR>新建-&gt;变量名：JAVA_HOME<BR>-&gt;变量值：C:\j2sdk1.4.2<BR>新建-&gt;变量名：TOMCAT_HOME<BR>-&gt;变量值：C:\Program Files\Apache Software Foundation\Tomcat 5.5<BR>新建-&gt;变量名： PATH<BR>-&gt;变量值：.;C:\j2sdk1.4.2\bin; （前面的“.;”一定要有）<BR>修改增加环境变量 CLASSPATH (如果没有此变量名，则新建)<BR>-&gt;增加变量值：.;C:\j2sdk1.4.2\lib\dt.jar;C:\j2sdk1.4.2\lib\tool.jar; <BR>C:\j2sdk1.4.2\lib\NetComponents.jar;<BR>C:\Program Files\Apache Software Foundation\Tomcat 5.5\common\classes;<BR>C:\Program Files\Apache Software Foundation\Tomcat 5.5\common\lib;<BR>C:\Program Files\Apache Software Foundation\Tomcat 5.5\common\lib\servlet-api.jar;（前面的“.;”一定要有）</P>
<P>5. 启动Tomcat服务器，打开浏览器，浏览：<A href="http://localhost:8080/"><A href="http://localhost:8080/" target=_blank>http://localhost:8080/</A></A> ，出现Tomcat欢迎页面；如果这步出现异常，请检查安装源文件，重新安装。</P>
<P>三、整合Apache+Tomcat服务器</P>
<P>1. 复制mod_jk-1.2.14-apache-2.0.54.so.asc文件到C:\Apache2\modules目录，并将其文件名改为mod_jk.so。<BR>2. Apache配置：<BR>C:\apahce2\conf\httpd.conf<BR>httpd.conf<BR>在此配置文件最后添加以下语句，用以支持jsp程序：<BR>LoadModule jk_module modules/mod_jk.so </P>
<P>JkWorkersFile "C:/Program Files/Apache Software Foundation/Tomcat 5.5/conf/workers.properties" <BR>JkMount /servlet/* ajp13 <BR>JkMount /*.jsp ajp13</P>
<P>还有要在<BR>DirectoryIndex index.html index.html.var的后面加上default.jsp index.jsp（前面忘了说了，支持PHP还要加上index.php default.php）</P>
<P>3. 在C:\Program Files\Apache Software Foundation\Tomcat 5.5\conf\目录下，新建文件名为“workers.properties”的文件，将如下内容复制到新建文件workers.properties中。</P>
<P>workers.properties<BR># 只复制以下内容即可：</P>
<P>workers.tomcat_home=C:\Program Files\Apache Software Foundation\Tomcat 5.5<BR>workers.java_home=C:\j2sdk1.4.2<BR>ps=\<BR># worker.list=ajp13 <BR>worker.list=ajp12,ajp13 </P>
<P>worker.ajp12.port=8007<BR>worker.ajp12.host=localhost<BR>worker.ajp12.type=ajp12 <BR>worker.ajp12.lbfactor=1</P>
<P>worker.ajp13.port=8009 <BR>worker.ajp13.host=localhost <BR>worker.ajp13.type=ajp13<BR>worker.ajp13.lbfactor=1</P>
<P>worker.loadbalancer.type=lb </P>
<P>worker.loadbalancer.balanced_workers=ajp12, ajp13<BR>worker.inprocess.type=jni <BR>worker.inprocess.class_path=$(workers.tomcat_home)$(ps)classes <BR>worker.inprocess.class_path=$(workers.tomcat_home)$(ps)lib$(ps)jaxp.jar </P>
<P>worker.inprocess.class_path=$(workers.tomcat_home)$(ps)lib$(ps)parser.jar </P>
<P>worker.inprocess.class_path=$(workers.tomcat_home)$(ps)common$(ps)lib$(ps)jasper.jar </P>
<P>worker.inprocess.class_path=$(workers.tomcat_home)$(ps)common$(ps)lib$(ps)servlet.jar </P>
<P>worker.inprocess.class_path=$(workers.tomcat_home)$(ps)common$(ps)lib$(ps)webserver.jar</P>
<P>worker.inprocess.class_path=$(workers.java_home)$(ps)lib$(ps)tools.jar </P>
<P>worker.inprocess.cmd_line=-config </P>
<P>worker.inprocess.cmd_line=$(workers.tomcat_home)/conf/jni_server.xml </P>
<P>worker.inprocess.cmd_line=-home </P>
<P>worker.inprocess.cmd_line=$(workers.tomcat_home) </P>
<P>worker.inprocess.jvm_lib=$(workers.java_home)$(ps)jre$(ps)bin$(ps)classic$(ps)jvm.dll </P>
<P><BR>worker.inprocess.stdout=$(workers.tomcat_home)$(ps)inprocess.stdout </P>
<P>worker.inprocess.stderr=$(workers.tomcat_home)$(ps)inprocess.stderr </P>
<P>worker.inprocess.sysprops=tomcat.home=$(workers.tomcat_home)</P>
<P>接下来重启Tomcat和Apache服务器（必须先重启Tomcat再重启Apache，不然会出错，如果加载JK成功，这个时候你可以在Apache监控器中看到Apache/2.0.52(win32) PHP/5.0.4 mod_jk/1.2.8）就可以测试了，把Tomcat的webapps这个目录拷贝到Apache的htdocs目录下面，然后直接在浏览器地址栏输入：<A href="http://localhost/webapps"><A href="http://localhost/webapps" target=_blank>http://localhost/webapps</A></A> 和 <A href="http://localhost:8080/"><A href="http://localhost:8080/" target=_blank>http://localhost:8080</A></A>如果显示的页面一样就说明成功了。</P>
<P>剩下的就是连接MySQL了，但是本人不才一个叫mm.mysql-2.0.4-bin.jar的文件怎么也找不到，只找到了个mysql-connector-java-3.1.5-gamma-bin.jar的文件，可是我试过了一点用都没有，所以连接数据库的教程等我试验成功再说拉！如果哪位高人能救救我的告诉我mm.mysql-2.0.4-bin.jar的下载地址或者告诉我IASP到底改如何配置，我真是感激不尽。<BR><BR><BR></P></SPAN><img src ="http://www.blogjava.net/FinalFantasy/aggbug/14894.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/FinalFantasy/" target="_blank">FinalFantasy</a> 2005-10-06 19:28 <a href="http://www.blogjava.net/FinalFantasy/archive/2005/10/06/14894.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>