﻿<?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-Flyingis-随笔分类-JavaSE</title><link>http://www.blogjava.net/flyingis/category/4268.html</link><description>Talking and thinking freely !&lt;br&gt;
Flying in the world of Java and GIS !</description><language>zh-cn</language><lastBuildDate>Mon, 28 May 2007 01:29:55 GMT</lastBuildDate><pubDate>Mon, 28 May 2007 01:29:55 GMT</pubDate><ttl>60</ttl><item><title>SuSE 9.1 平台 ArcIMS(JRE) 中文显示解决方案</title><link>http://www.blogjava.net/flyingis/archive/2007/05/28/120386.html</link><dc:creator>Flyingis</dc:creator><author>Flyingis</author><pubDate>Mon, 28 May 2007 01:29:00 GMT</pubDate><guid>http://www.blogjava.net/flyingis/archive/2007/05/28/120386.html</guid><wfw:comment>http://www.blogjava.net/flyingis/comments/120386.html</wfw:comment><comments>http://www.blogjava.net/flyingis/archive/2007/05/28/120386.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/flyingis/comments/commentRss/120386.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/flyingis/services/trackbacks/120386.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 最初以为是操作系统的字体显示问题，但SuSE9.1本身是包含中文字体的，很容易让我们想到了JRE。<br><br>文章标题为《SuSE 9.1 平台 ArcIMS 中文显示解决方案》，ArcIMS运行于JRE环境之上，因此问题的根本在于SuSE9.1平台下JRE运行时环境的中文显示，通过文中介绍的方案可以解决SuSE9.1操作系统中运行于JRE之上的所有应用程序的中文显示问题，如ArcIMS Author打开SDE空间数据库时以中文命名的表无法显示，数据属性字段中的中文显示为乱码等等。&nbsp;&nbsp;<a href='http://www.blogjava.net/flyingis/archive/2007/05/28/120386.html'>阅读全文</a><img src ="http://www.blogjava.net/flyingis/aggbug/120386.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/flyingis/" target="_blank">Flyingis</a> 2007-05-28 09:29 <a href="http://www.blogjava.net/flyingis/archive/2007/05/28/120386.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>静态设计</title><link>http://www.blogjava.net/flyingis/archive/2006/12/27/90319.html</link><dc:creator>Flyingis</dc:creator><author>Flyingis</author><pubDate>Wed, 27 Dec 2006 08:16:00 GMT</pubDate><guid>http://www.blogjava.net/flyingis/archive/2006/12/27/90319.html</guid><wfw:comment>http://www.blogjava.net/flyingis/comments/90319.html</wfw:comment><comments>http://www.blogjava.net/flyingis/archive/2006/12/27/90319.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/flyingis/comments/commentRss/90319.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/flyingis/services/trackbacks/90319.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 重新看看静态设计的优劣之处。&nbsp;&nbsp;<a href='http://www.blogjava.net/flyingis/archive/2006/12/27/90319.html'>阅读全文</a><img src ="http://www.blogjava.net/flyingis/aggbug/90319.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/flyingis/" target="_blank">Flyingis</a> 2006-12-27 16:16 <a href="http://www.blogjava.net/flyingis/archive/2006/12/27/90319.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[Java Puzzlers]表达式随想</title><link>http://www.blogjava.net/flyingis/archive/2006/03/30/38379.html</link><dc:creator>Flyingis</dc:creator><author>Flyingis</author><pubDate>Thu, 30 Mar 2006 15:47:00 GMT</pubDate><guid>http://www.blogjava.net/flyingis/archive/2006/03/30/38379.html</guid><wfw:comment>http://www.blogjava.net/flyingis/comments/38379.html</wfw:comment><comments>http://www.blogjava.net/flyingis/archive/2006/03/30/38379.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/flyingis/comments/commentRss/38379.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/flyingis/services/trackbacks/38379.html</trackback:ping><description><![CDATA[
		<font size="2">    作者：<a class="" title="" href="/flyingis/" target="_blank"><font color="#000080">Flyingis</font></a><br /><br />    前段时间到书店抱了几本书回来，虽说网上有很多电子版的资料，但有时候觉得一些比较经典、自己比较喜欢的书籍还是有必要捧在手上细读的，《Java Puzzlers》就是其中之一，没事的时候就喜欢拿出来翻翻，怕自己像看新闻报纸一样看过就淡忘了，还是略作笔记让自己多份思考。<br /><br />    软件开发人员无论最初是从哪种语言开始学习的，首先都要掌握该语言的编程基础，例如语句、表达式、变量、数据类型、运算符、字符串等等，这些基础性的知识简单，但细节却比较繁琐，不同的编译器也会有不同的编译规则。以前寝室有同学考过的全国计算机等级考试二级C语言的试题中，语言的础规则是出题者最热衷的题形之一，曾经也觉得出题者无聊，只重理论不看实际，毕竟一些表达方法和书写格式可以通过规范来约束简化，但是作为一名程序员，一个专业的开发人员，应该了解自己所使用语言的基础规则，有时候一些程序的BUG就是存在于这些不起眼，或是自己认为应该没有问题的地方。<br /><br />    Java语言的表达式和C/C++比较相近，但也存在一些差异，这些差异不仅仅是那些看得见的差异，还有隐性的，例如相同的表达式，编译的规则不同。因此，我们需要理解Java表达式的一些基础性知识，加深认识。<br /><br />1.  要精确表达一个浮点型变量，应该使用BigDecimal对象来构造这个实例，使用float或double在一般情况下只是提供了在一定精度范围下的一种近似，不能产生精确的结果。常用的数据库中都有与BigDecimal相对应的数据类型，有的更为详细。<br />2.  对于 long value = 30 * 300 * 3000 * 3000; 来说，long类型可以完整保存右边表达式计算的结果，但是右边表达式的计算是按照int类型进行的，只有当右边表达式计算完成后才会转换为long类型，在计算过程中，右边表达式的值就已经超出int范围，因此会出现计算溢出。<br />3.  通常我们使用最多的是十进制计算，和十进制不同的是，当十六进制或八进制常量的最高位被置位时，该常量是负值。<br />4.  注意数据类型之间的相互转换（特别是char类型和其他类型间的转换），以及三目运算符的第二和第三操作数类型不一致的情况处理。<br />5.  在C/C++中，操作符的操作数是从右向左计算，Java中相反。<br />6.  复合赋值操作和简单赋值操作在一般情况下是相同的，例如 x *= y 和 x = x * y ，但是当x和y类型不同时情况有所变化，例如当x为short类型，y为double类型时，x *= y的结果虽然和想象的有些出入，至少可以编译通过，但后者赋值却是非法的。<br /><br />    大家可以继续补充……<br /></font>
<img src ="http://www.blogjava.net/flyingis/aggbug/38379.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/flyingis/" target="_blank">Flyingis</a> 2006-03-30 23:47 <a href="http://www.blogjava.net/flyingis/archive/2006/03/30/38379.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java I/O中的对象序列化</title><link>http://www.blogjava.net/flyingis/archive/2006/01/08/27134.html</link><dc:creator>Flyingis</dc:creator><author>Flyingis</author><pubDate>Sun, 08 Jan 2006 05:13:00 GMT</pubDate><guid>http://www.blogjava.net/flyingis/archive/2006/01/08/27134.html</guid><wfw:comment>http://www.blogjava.net/flyingis/comments/27134.html</wfw:comment><comments>http://www.blogjava.net/flyingis/archive/2006/01/08/27134.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/flyingis/comments/commentRss/27134.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/flyingis/services/trackbacks/27134.html</trackback:ping><description><![CDATA[<P class=MsoNormal style="MARGIN: 7.8pt 0cm; TEXT-INDENT: 21pt; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"></SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p>作者：<A href="/flyingis/"><FONT color=#000080>Flyingis</FONT></A><BR><BR><SPAN lang=EN-US style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Java</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对象序列化将那些实现了</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">Serializable</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">接口的对象转换成一个字节序列，并能够以后将这个字节序列完全恢复为原来的对象。利用对象的序列化，可以实现轻量级持久性，这意味着一个对象的生存周期并不取决于程序是否正在执行，它可以生存于程序的调用之间。通过将一个序列化对象写入磁盘，然后在重新调用程序时恢复该对象，就能够实现持久性的效果。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">JDO</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">Hibernate</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">等中间件为我们提供了更规范、完善的持久化机制，这里所述只是最基本的基于文件</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">I/O</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的持久化。</SPAN></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 7.8pt 0cm; TEXT-INDENT: 21pt; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对象序列化主要是为了支持两种主要的特性，一是</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">Java</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">远程方法调用</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">(RMI)</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，另外一个是序列化</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">Java Beans</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 7.8pt 0cm 7.8pt 18pt; TEXT-INDENT: -18pt; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 18.0pt; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt"><SPAN lang=EN-US style="FONT-SIZE: 10pt; mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore">1.<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">实现了</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">Serializable</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">接口的对象的序列化</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 7.8pt 0cm; TEXT-INDENT: 20pt; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm; mso-char-indent-count: 2.0"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">要序列化一个对象，首先要创建</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">OutputStream</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对象，然后将其封装在一个</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">ObjectOutputStream</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对象内。此时，调用</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">writeObject()</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法将对象序列化并发送给</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">OutputStream</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。在反序列化时，需要将一个</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">InputStream</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">封装在</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">ObjectInputStream</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">内，然后调用</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">readObject()</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，得到的结果是一个</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">Object</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对象，需要进行转型得到最后所需的对象。<SPAN style="COLOR: blue">需要注意的是，在对一个</SPAN></SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; COLOR: blue">Serializable</SPAN><SPAN style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对象进行反序列化的过程中，没有调用任何构造器，包括缺省的构造器，整个对象都是通过从</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; COLOR: blue">InputStream</SPAN><SPAN style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中取得数据恢复过来的。对象序列化是面向字节的，因此采用</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; COLOR: blue">InputStream</SPAN><SPAN style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; COLOR: blue">OutputStream</SPAN><SPAN style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">层次结构。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 7.8pt 0cm 7.8pt 18pt; TEXT-INDENT: -18pt; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 18.0pt; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt"><SPAN lang=EN-US style="FONT-SIZE: 10pt; mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore">2.<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">实现了</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">Externalizable</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">接口的对象的序列化</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 7.8pt 0cm; TEXT-INDENT: 20pt; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm; mso-char-indent-count: 2.0"><SPAN lang=EN-US style="FONT-SIZE: 10pt">Externalizable</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">接口继承了</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">Serializable</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">接口，同时添加了</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">writeExternal()</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">readExternal()</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，它们在序列化和反序列化过程中会被自动调用。出于安全的考虑，可以将需要序列化的对象在上述方法中显式处理，否则不用在上述两个方法内考虑。<SPAN style="COLOR: blue">注意，对于实现了</SPAN></SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; COLOR: blue">Serializable</SPAN><SPAN style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">接口的对象，对象完全以它存储的二进制位为基础来构造，不调用构造器。而对于一个</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; COLOR: blue">Externalizable</SPAN><SPAN style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对象，所有普通的缺省构造器都会被调用，然后调用</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; COLOR: blue">readExternal()</SPAN><SPAN style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 7.8pt 0cm 7.8pt 18pt; TEXT-INDENT: -18pt; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 18.0pt; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt"><SPAN lang=EN-US style="FONT-SIZE: 10pt; mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore">3.<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">transient</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">关键字</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 7.8pt 0cm; TEXT-INDENT: 20pt; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm; mso-char-indent-count: 2.0"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在某些情况下，有些特定的子对象不希望</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">Java</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">序列化机制自动保存与恢复，即使对象中的这些信息是</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">private</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的，经过序列化处理，就可以通过读取文件或者拦截网络传输的方式来访问到它。实现了</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">Externalizable</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">接口的对象的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">writeExternal()</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法可以对需要的对象进行显式的序列化，但是如果我们操作的是一个实现了</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">Serializable</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">接口的对象，就只能用</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">transient</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">关键字逐个字段的关闭序列化，只需要在字段定义前加上该关键字即可。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 7.8pt 0cm 7.8pt 18pt; TEXT-INDENT: -18pt; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 18.0pt; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt"><SPAN lang=EN-US style="FONT-SIZE: 10pt; mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore">4.<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">实现了</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">Serializable</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">接口的同时，提供两个方法</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 7.8pt 0cm; TEXT-INDENT: 20pt; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm; mso-char-indent-count: 2.0"><SPAN lang=EN-US style="FONT-SIZE: 10pt">private void writeObject(ObjectOutputStream stream) throws IOException<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 7.8pt 0cm; TEXT-INDENT: 20pt; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm; mso-char-indent-count: 2.0"><SPAN lang=EN-US style="FONT-SIZE: 10pt">private void readObject(ObjectInputStream stream) <o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 7.8pt 0cm; TEXT-INDENT: 30pt; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm; mso-char-indent-count: 3.0"><SPAN lang=EN-US style="FONT-SIZE: 10pt">throws IOException, ClassNotFoundException<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 7.8pt 0cm; TEXT-INDENT: 20pt; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm; mso-char-indent-count: 2.0"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这种方法使用起来比较混乱，仅仅提供了这样的一种功能，绝大多数情况下，使用前面三种方法就能满足需求。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P><img src ="http://www.blogjava.net/flyingis/aggbug/27134.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/flyingis/" target="_blank">Flyingis</a> 2006-01-08 13:13 <a href="http://www.blogjava.net/flyingis/archive/2006/01/08/27134.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>文件加锁基础</title><link>http://www.blogjava.net/flyingis/archive/2006/01/07/26973.html</link><dc:creator>Flyingis</dc:creator><author>Flyingis</author><pubDate>Sat, 07 Jan 2006 05:50:00 GMT</pubDate><guid>http://www.blogjava.net/flyingis/archive/2006/01/07/26973.html</guid><wfw:comment>http://www.blogjava.net/flyingis/comments/26973.html</wfw:comment><comments>http://www.blogjava.net/flyingis/archive/2006/01/07/26973.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/flyingis/comments/commentRss/26973.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/flyingis/services/trackbacks/26973.html</trackback:ping><description><![CDATA[<SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
<P class=MsoNormal style="MARGIN: 7.8pt 0cm; TEXT-INDENT: 21.85pt; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">作者：<A HREF="/flyingis/"><FONT color=#000080>Flyingis</FONT></A><BR><BR>&nbsp;&nbsp;&nbsp; 文件加锁是</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><FONT face="Times New Roman">JDK1.4</FONT></SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">引入的一种机制，它允许我们同步访问某个作为共享资源的文件。竞争同一文件的两个线程可能在不同的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><FONT face="Times New Roman">Java</FONT></SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">虚拟机上，或者一个是</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><FONT face="Times New Roman">Java</FONT></SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">线程，另一个是操作系统中的某个本地线程。文件锁对其他的操作系统进程是可见的，因为</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><FONT face="Times New Roman">Java</FONT></SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的文件加锁直接映射到了本地操作系统的加锁工具。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 7.8pt 0cm; TEXT-INDENT: 21.85pt; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">通过对</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><FONT face="Times New Roman">FileChannel</FONT></SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">调用</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><FONT face="Times New Roman">tryLock()</FONT></SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">或</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><FONT face="Times New Roman">lock()</FONT></SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，就可以获得整个文件的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><FONT face="Times New Roman">FileLock</FONT></SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。特殊的是，</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><FONT face="Times New Roman">SocketChannel/DatagramChannel/ServerSocketChannel</FONT></SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">不需要加锁，因为它们是从单进程实体继承而来，我们通常不在两个进程之间共享网络的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><FONT face="Times New Roman">socket</FONT></SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 7.8pt 0cm; TEXT-INDENT: 21.85pt; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="FONT-SIZE: 10pt"><FONT face="Times New Roman">tryLock()</FONT></SPAN></B><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是非阻塞式的，它设法获取锁，但如果不能获得，例如因为其他一些进程已经持有相同的锁，而且不共享时，它将直接从方法调用返回。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 7.8pt 0cm; TEXT-INDENT: 21.85pt; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="FONT-SIZE: 10pt"><FONT face="Times New Roman">lock()</FONT></SPAN></B><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是阻塞式的，它要阻塞进程直到锁可以获得，或调用</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><FONT face="Times New Roman">lock()</FONT></SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的线程中断，或调用</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><FONT face="Times New Roman">lock()</FONT></SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的通道关闭。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 7.8pt 0cm; TEXT-INDENT: 21.85pt; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对独占锁和共享锁的支持必须由底层的操作系统提供。锁的类型可以通过</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><FONT face="Times New Roman">FileLock.isShared()</FONT></SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">进行查询。另外，我们不能获取缓冲器上的锁，只能是通道上的。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 7.8pt 0cm; TEXT-INDENT: 21.85pt; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">文件加锁的实际应用之一：文件映射通常应用于大型的文件，我们可能需要对巨大的文件进行部分加锁，以便其他的进程可以修改文件中未被加锁的部分，数据库就是如此，使得多用户可以访问到未加锁的部分数据。其他的应用还知之甚少。</SPAN></SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><BR></SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p><BR></o:p></SPAN></P><img src ="http://www.blogjava.net/flyingis/aggbug/26973.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/flyingis/" target="_blank">Flyingis</a> 2006-01-07 13:50 <a href="http://www.blogjava.net/flyingis/archive/2006/01/07/26973.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java I/O中的数据编码转换</title><link>http://www.blogjava.net/flyingis/archive/2006/01/03/26436.html</link><dc:creator>Flyingis</dc:creator><author>Flyingis</author><pubDate>Tue, 03 Jan 2006 06:02:00 GMT</pubDate><guid>http://www.blogjava.net/flyingis/archive/2006/01/03/26436.html</guid><wfw:comment>http://www.blogjava.net/flyingis/comments/26436.html</wfw:comment><comments>http://www.blogjava.net/flyingis/archive/2006/01/03/26436.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/flyingis/comments/commentRss/26436.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/flyingis/services/trackbacks/26436.html</trackback:ping><description><![CDATA[<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 20pt; mso-char-indent-count: 2.0"><SPAN lang=EN-US style="FONT-SIZE: 10pt">作者：<A HREF="/flyingis/"><FONT color=#000080>Flyingis</FONT></A><BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JDK1.4</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">开始便引入了</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">java.nio.*</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">包，其目的在于提高</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">I/O</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的速度，这是因为该类库使用的结构更接近于操作系统执行</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">I/O</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的方式，即通过通道和缓冲器来读写数据。在实际应用中，和我们直接交互的是缓冲器，然后把缓冲器派送到通道，通道要么从缓冲器获得数据，要么向缓冲器发送数据。<BR></SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 20pt; mso-char-indent-count: 2.0"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><BR>&nbsp;&nbsp;&nbsp; 在基于</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">Java</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的各种开发中，字符编码是常见的问题之一，在最基本的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">Java I/O</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中也存在这种问题。新的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">Java I/O</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">通过通道和缓冲器来读写数据，缓冲器容纳的是普通的字节，为了把它们转换成字符，我们要么在输入的时候对其进行编码，要么在从缓冲器输出时对它们进行解码。<BR></SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="FONT-SIZE: 10pt"><BR>import java.io.*;<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="FONT-SIZE: 10pt">import java.nio.*;<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="FONT-SIZE: 10pt">import java.nio.channels.*;<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="FONT-SIZE: 10pt">import java.nio.charset.*;<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="FONT-SIZE: 10pt">public class ByteToCharacter {<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="FONT-SIZE: 10pt"><SPAN style="mso-spacerun: yes">&nbsp; </SPAN>private static final int SIZE = 1024;<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="FONT-SIZE: 10pt"><SPAN style="mso-spacerun: yes">&nbsp; </SPAN>public static void main(String[] args) throws Exception {<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><SPAN lang=EN-US style="FONT-SIZE: 10pt">FileChannel fc = new FileOutputStream(“Output.txt”).getChannel();<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><SPAN lang=EN-US style="FONT-SIZE: 10pt">ByteBuffer buffer = ByteBuffer.allocate(SIZE);<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><SPAN lang=EN-US style="FONT-SIZE: 10pt"><FONT color=#0000ff>/**<o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 25.7pt; mso-char-indent-count: 2.57"><FONT color=#0000ff><SPAN lang=EN-US style="FONT-SIZE: 10pt">* </SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在输入的时候进行编码方式一</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 25.7pt; mso-char-indent-count: 2.57"><SPAN lang=EN-US style="FONT-SIZE: 10pt"><FONT color=#0000ff>*/<o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><SPAN lang=EN-US style="FONT-SIZE: 10pt">fc.write(ByteBuffer.wrap(“Good holiday!”.getBytes(“UTF-16BE”)));&nbsp;&nbsp;<FONT color=#0000ff>// UTF-16BE可以更换为其他编码方式</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><SPAN lang=EN-US style="FONT-SIZE: 10pt">fc.close();<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><SPAN lang=EN-US style="FONT-SIZE: 10pt">fc = new FileInputStream(“Output.txt”).getChannel();<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><SPAN lang=EN-US style="FONT-SIZE: 10pt">fc.read(buffer);<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><SPAN lang=EN-US style="FONT-SIZE: 10pt">buffer.flip();<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>//</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">准备从缓冲区读取已经写入的数据</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><SPAN lang=EN-US style="FONT-SIZE: 10pt">System.out.println(buffer.asCharBuffer());<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><SPAN lang=EN-US style="FONT-SIZE: 10pt"><FONT color=#0000ff>/**<o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 25.7pt; mso-char-indent-count: 2.57"><FONT color=#0000ff><SPAN lang=EN-US style="FONT-SIZE: 10pt">* </SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在输入的时候进行编码方式二</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 25.7pt; mso-char-indent-count: 2.57"><FONT color=#0000ff><SPAN lang=EN-US style="FONT-SIZE: 10pt">* </SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">通过</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">asCharBuffer()</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法直接以</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">char</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">形式将字符写入</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 25.7pt; mso-char-indent-count: 2.57"><SPAN lang=EN-US style="FONT-SIZE: 10pt"><FONT color=#0000ff>*/<o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><SPAN lang=EN-US style="FONT-SIZE: 10pt">fc = new FileOutputStream(“Output.txt”).getChannel();<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><SPAN lang=EN-US style="FONT-SIZE: 10pt">buffer.clear();<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><SPAN lang=EN-US style="FONT-SIZE: 10pt">buffer.asCharBuffer.put(“Good holiday has passed!”);<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><SPAN lang=EN-US style="FONT-SIZE: 10pt">fc.write(buffer);<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><SPAN lang=EN-US style="FONT-SIZE: 10pt">fc.close();<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><SPAN lang=EN-US style="FONT-SIZE: 10pt">fc = new FileInputStream(“Output.txt”).getChannel();<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><SPAN lang=EN-US style="FONT-SIZE: 10pt">buffer.clear();<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><SPAN lang=EN-US style="FONT-SIZE: 10pt">fc.read(buffer);<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><SPAN lang=EN-US style="FONT-SIZE: 10pt">buffer.flip();<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><SPAN lang=EN-US style="FONT-SIZE: 10pt">System.out.println(buffer.asCharBuffer());<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><SPAN lang=EN-US style="FONT-SIZE: 10pt"><FONT color=#0000ff>/**<o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 25.7pt; mso-char-indent-count: 2.57"><FONT color=#0000ff><SPAN lang=EN-US style="FONT-SIZE: 10pt">* </SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">从缓冲器输出时进行编码</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 25.7pt; mso-char-indent-count: 2.57"><SPAN lang=EN-US style="FONT-SIZE: 10pt"><FONT color=#0000ff>*/<o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><SPAN lang=EN-US style="FONT-SIZE: 10pt">fc = new FileOutputStream(“Output.txt”).getChannel();<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><SPAN lang=EN-US style="FONT-SIZE: 10pt">fc.write(ByteBuffer.wrap(“Once again!”.getBytes()));<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><SPAN lang=EN-US style="FONT-SIZE: 10pt">fc.close();<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><SPAN lang=EN-US style="FONT-SIZE: 10pt">fc = new FileInputStream(“Output.txt”).getChannel();<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><SPAN lang=EN-US style="FONT-SIZE: 10pt">buffer.clear();<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><SPAN lang=EN-US style="FONT-SIZE: 10pt">fc.read(buffer);<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><SPAN lang=EN-US style="FONT-SIZE: 10pt">buffer.flip();<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><SPAN lang=EN-US style="FONT-SIZE: 10pt">String encode = System.getProperty(“file.encoding”);<SPAN style="mso-spacerun: yes">&nbsp; </SPAN><FONT color=#0000ff>// </FONT></SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><FONT color=#0000ff>平台缺省字符集，更加通用的方法，跨平台特性的体现之一</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><SPAN lang=EN-US style="FONT-SIZE: 10pt">System.out.println(Charset.forName(encode).decode(buffer));<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 10pt; mso-char-indent-count: 1.0"><SPAN lang=EN-US style="FONT-SIZE: 10pt">}<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="FONT-SIZE: 10pt">}<BR><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="FONT-SIZE: 10pt"><SPAN style="mso-spacerun: yes"><BR>&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在上述代码中，如果不对从缓冲器写入的数据进行正确编码，那么当再次通过缓冲器读取这些数据时，将不能显示任何所需要的数据。<BR></SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 20pt; mso-char-indent-count: 2.0"><SPAN lang=EN-US style="FONT-SIZE: 10pt"><BR>&nbsp;&nbsp;&nbsp; JDK</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">java.nio.charset.Charset</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类提供了把数据编码成多种不同类型的字符集的工具，满足在各种应用中的编码需求。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P><img src ="http://www.blogjava.net/flyingis/aggbug/26436.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/flyingis/" target="_blank">Flyingis</a> 2006-01-03 14:02 <a href="http://www.blogjava.net/flyingis/archive/2006/01/03/26436.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java I/O中的设计模式</title><link>http://www.blogjava.net/flyingis/archive/2005/12/30/26118.html</link><dc:creator>Flyingis</dc:creator><author>Flyingis</author><pubDate>Fri, 30 Dec 2005 13:47:00 GMT</pubDate><guid>http://www.blogjava.net/flyingis/archive/2005/12/30/26118.html</guid><wfw:comment>http://www.blogjava.net/flyingis/comments/26118.html</wfw:comment><comments>http://www.blogjava.net/flyingis/archive/2005/12/30/26118.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/flyingis/comments/commentRss/26118.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/flyingis/services/trackbacks/26118.html</trackback:ping><description><![CDATA[<P class=MsoNormal style="MARGIN: 7.8pt 0cm; TEXT-INDENT: 20pt; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm; mso-char-indent-count: 2.0"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">作者：<A href="/flyingis/"><FONT color=#000080>Flyingis</FONT></A><BR><BR>&nbsp;&nbsp;&nbsp; 任何程序语言的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">I/O</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">设计都是一项具有挑战的任务，因为数据的传输存在多种可能，这些可能不仅存在于数据发送端和接收端</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">(</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">文件、网络链接等</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">)</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，还存在于这些数据的多种存在方式，例如缓冲区数据、顺序存取数据、字符数据、字节数据等等。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 7.8pt 0cm; TEXT-INDENT: 21pt; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><SPAN lang=EN-US style="FONT-SIZE: 10pt">Java</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">I/O</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">使用“流”这个抽象的概念，它屏蔽了实际的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">I/O</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">设备中处理数据的细节。在实际的应用中，我们很少使用单一的类来创建流对象，而是通过多个对象来提供所需要的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">I/O</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">功能。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">Java</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">从</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">1.0</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">到</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">1.1</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">到</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">1.4</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">多</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">I/O</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类库作了多次重大修改，具体的可以参考相关的书籍或</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><A href="http://www.sun.com/" target=_blank><FONT color=#a52a2a>Sun<SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN lang=EN-US>官方网站</SPAN></SPAN></FONT></A></SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。这里是从模式的角度来分析</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">Java</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">I/O</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类库的设计。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 7.8pt 0cm; TEXT-INDENT: 21pt; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="FONT-SIZE: 10pt">Strategy</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">设计模式</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 7.8pt 0cm; TEXT-INDENT: 21pt; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">将会发生变化的代码封装在单独的类</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">(Strategy</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对象</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">)</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中，供其他保持不变的类使用，实现某种算法或应用，这是</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">Strategy</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">设计模式的一般思想。在</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">Java I/O</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中，一个典型的应用是</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">File</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类，它可以代表一个特定文件的名称，也可以代表一个目录下一组文件的名称。当我们要查询显示一个目录下特定文件类型的所有文件对象信息时，就需要将这个目录下的文件过滤，找到所需要的对象。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P><SPAN lang=EN-US style="FONT-SIZE: 10pt">
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="FONT-SIZE: 10pt">import java.io.*;<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="FONT-SIZE: 10pt">import java.util.*;<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="FONT-SIZE: 10pt">import java.util.regex.*;<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="FONT-SIZE: 10pt">public class AlphabeticComparator implements Comparator {<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 10pt; mso-char-indent-count: 1.0"><SPAN lang=EN-US style="FONT-SIZE: 10pt">public int compare(Object o1, Object o2) {<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 10pt; mso-char-indent-count: 1.0"><SPAN lang=EN-US style="FONT-SIZE: 10pt"><SPAN style="mso-spacerun: yes">&nbsp; </SPAN>String s1 = (String)o1;<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 10pt; mso-char-indent-count: 1.0"><SPAN lang=EN-US style="FONT-SIZE: 10pt"><SPAN style="mso-spacerun: yes">&nbsp; </SPAN>String s2 = (String)o2;<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 10pt; mso-char-indent-count: 1.0"><SPAN lang=EN-US style="FONT-SIZE: 10pt"><SPAN style="mso-spacerun: yes">&nbsp; </SPAN>return s1.toLowerCase().compareTo(s2.toLowerCase());<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>//</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">比较时不考虑大小写</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 10.5pt"><SPAN lang=EN-US style="FONT-SIZE: 10pt">}<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="FONT-SIZE: 10pt">}<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="FONT-SIZE: 10pt">public class FruitList {<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="FONT-SIZE: 10pt"><SPAN style="mso-spacerun: yes">&nbsp; </SPAN>public static FilenameFilter filter(final String regex) {<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><SPAN lang=EN-US style="FONT-SIZE: 10pt">return new FilenameFilter() {<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><SPAN lang=EN-US style="FONT-SIZE: 10pt"><SPAN style="mso-spacerun: yes">&nbsp; </SPAN>private Pattern pattern = Pattern.compile(regex);<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><SPAN lang=EN-US style="FONT-SIZE: 10pt"><SPAN style="mso-spacerun: yes">&nbsp; </SPAN>public boolean accept(File dir, String name) {<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><SPAN lang=EN-US style="FONT-SIZE: 10pt"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>return pattern.matcher(new File(name).getName()).matches();<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 30.7pt; mso-char-indent-count: 3.07"><SPAN lang=EN-US style="FONT-SIZE: 10pt">}<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><SPAN lang=EN-US style="FONT-SIZE: 10pt">};<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 10pt; mso-char-indent-count: 1.0"><SPAN lang=EN-US style="FONT-SIZE: 10pt">}<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 10pt; mso-char-indent-count: 1.0"><SPAN lang=EN-US style="FONT-SIZE: 10pt">public static void main(String[] args) {<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 10pt; mso-char-indent-count: 1.0"><SPAN lang=EN-US style="FONT-SIZE: 10pt"><SPAN style="mso-spacerun: yes">&nbsp; </SPAN>File path = new File(“.”);<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 10pt; mso-char-indent-count: 1.0"><SPAN lang=EN-US style="FONT-SIZE: 10pt"><SPAN style="mso-spacerun: yes">&nbsp; </SPAN>String[] list;<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 10pt; mso-char-indent-count: 1.0"><SPAN lang=EN-US style="FONT-SIZE: 10pt"><SPAN style="mso-spacerun: yes">&nbsp; </SPAN>if (args.length == 0)<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 10pt; mso-char-indent-count: 1.0"><SPAN lang=EN-US style="FONT-SIZE: 10pt"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>list = path.list();<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>//</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">搜索出该目录下所有类型的文件</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 20pt; mso-char-indent-count: 2.0"><SPAN lang=EN-US style="FONT-SIZE: 10pt">else<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 20pt; mso-char-indent-count: 2.0"><SPAN lang=EN-US style="FONT-SIZE: 10pt"><SPAN style="mso-spacerun: yes">&nbsp; </SPAN>list = path.list(filter(args[0]));<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>//</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">搜索出该目录下指定类型的文件</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 20pt; mso-char-indent-count: 2.0"><SPAN lang=EN-US style="FONT-SIZE: 10pt">Arrays.sort(list, new AlphabeticComparator());<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 20pt; mso-char-indent-count: 2.0"><SPAN lang=EN-US style="FONT-SIZE: 10pt">for (int i = 0; i &lt; list.length; i++)<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 20pt; mso-char-indent-count: 2.0"><SPAN lang=EN-US style="FONT-SIZE: 10pt"><SPAN style="mso-spacerun: yes">&nbsp; </SPAN>System.out.println(list[i]);<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 10pt; mso-char-indent-count: 1.0"><SPAN lang=EN-US style="FONT-SIZE: 10pt">}<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: 'Times New Roman'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">}</SPAN></SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在上述代码中，有两个地方使用了</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">Strategy</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">设计模式，一个是</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">AlphabeticComparator</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类，用来在忽略字符串大小写的情况下提供排序的规则，另一个就是</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">FilenameFilter</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">接口，使用了匿名内部类的设计，然后将其中实现的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">accept()</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">规则提供给</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">File</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">list</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法使用。这里是用来判断正则表达式</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">regex</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是否和文件名匹配，当运行程序在命令操作符中输入</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">“E.*\.java”</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">时，搜索到的是该目录下所有</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">.java</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">文件。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 7.8pt 0cm; TEXT-INDENT: 21.75pt; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><SPAN lang=EN-US style="FONT-SIZE: 10pt">File</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类除了上述用法外，还可以创建或删除目录，查看文件的信息，包括文件大小、最后修改日期，读写状态等，具体的可以参考</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">JDK</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">文档。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 7.8pt 0cm; TEXT-INDENT: 21.75pt; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="FONT-SIZE: 10pt">Decorator</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">设计模式</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 7.8pt 0cm; TEXT-INDENT: 21.75pt; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><A href="http://www.j2eesp.com/" target=_blank><FONT color=#a52a2a>http://www.j2eesp.com</FONT></A></SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">上有对</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">Decorator</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">设计模式的定义：动态给一个对象添加一些额外的职责，就像在墙上刷油漆。使用</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">Decorator</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">模式相比用生成子类方式达到功能的扩充显得更为灵活。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">Decorator</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">模式规定所有封装于初始对象内部的对象具有相同的接口，这使得该模式的应用具有透明性。</SPAN><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 7.8pt 0cm; TEXT-INDENT: 21.75pt; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">Java I/O</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">设计中，</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">Decorator</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">模式主要体现在</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">filter</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类的设计上，抽象类</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">filter</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是所有</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">Decorator</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">模式类的基类。但是</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">Decorator</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">模式同样存在缺点：在编写程序时，它在给开发人员提供了灵活性的同时，增加了代码的复杂性，造成了</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">Java I/O</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类操作不便，因为很多</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">I/O</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">设计中都需要应用</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">Decorator</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">模式，增加一些类来完成该设计。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 7.8pt 0cm; TEXT-INDENT: 21.75pt; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">例如在</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">Java 1.0</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中，</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">FilterInputStream</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">从</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">InputStream</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中读取数据，</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">FilterOutPutStream</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">向</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">OutputStream</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中写入数据，在</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">Java 1.1</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中，相应的有</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">FilterReader</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">FilterWriter(</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">抽象类，没有子类</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">)</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">用于</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">Decorator</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">模式设计。举个简单的例子：</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 7.8pt 0cm; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><SPAN lang=EN-US style="FONT-SIZE: 10pt">import java.io.*;<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 7.8pt 0cm; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><SPAN lang=EN-US style="FONT-SIZE: 10pt">public class DecoratorDemo {<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 7.8pt 0cm; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><SPAN lang=EN-US style="FONT-SIZE: 10pt"><SPAN style="mso-spacerun: yes">&nbsp; </SPAN>public static void main(String[] args) {<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 7.8pt 0cm; TEXT-INDENT: 21.75pt; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><SPAN lang=EN-US style="FONT-SIZE: 10pt">BufferedReader in = new BufferedReader(new FileReader(“FruitList.java”));<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 7.8pt 0cm; TEXT-INDENT: 21.75pt; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><SPAN lang=EN-US style="FONT-SIZE: 10pt">String s = new String();<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 7.8pt 0cm; TEXT-INDENT: 21.75pt; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><SPAN lang=EN-US style="FONT-SIZE: 10pt">while ((s = in.readLine()) != null)</SPAN></P>
<P class=MsoNormal style="MARGIN: 7.8pt 0cm; TEXT-INDENT: 21.75pt; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><SPAN lang=EN-US style="FONT-SIZE: 10pt"><SPAN style="mso-spacerun: yes">&nbsp; </SPAN>System.out.println(s);<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 7.8pt 0cm; TEXT-INDENT: 21.75pt; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><SPAN lang=EN-US style="FONT-SIZE: 10pt">in.close();<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 7.8pt 0cm; TEXT-INDENT: 10pt; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm; mso-char-indent-count: 1.0"><SPAN lang=EN-US style="FONT-SIZE: 10pt">}<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 7.8pt 0cm; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><SPAN lang=EN-US style="FONT-SIZE: 10pt">}<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 7.8pt 0cm; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><SPAN lang=EN-US style="FONT-SIZE: 10pt"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>BufferedReader</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">FileReader</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">完成了</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">Decorate</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">模式设计，这两个类可以更换为其他具有相同功用的类(在Thinking in Java中称为“修饰器”类)来组合完成特定的任务，正如上文所述，这给开发者提供了多种组合方式，同时也相对的增加了复杂度。</SPAN></P>
<P class=MsoNormal style="MARGIN: 7.8pt 0cm; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">&nbsp;&nbsp;&nbsp; <FONT color=#ff1493>最后，祝blogjava所有成员和Java、开源爱好者元旦快乐！幸福安康！</FONT></SPAN></P><img src ="http://www.blogjava.net/flyingis/aggbug/26118.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/flyingis/" target="_blank">Flyingis</a> 2005-12-30 21:47 <a href="http://www.blogjava.net/flyingis/archive/2005/12/30/26118.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java容器分析--Map</title><link>http://www.blogjava.net/flyingis/archive/2005/12/27/25534.html</link><dc:creator>Flyingis</dc:creator><author>Flyingis</author><pubDate>Tue, 27 Dec 2005 02:07:00 GMT</pubDate><guid>http://www.blogjava.net/flyingis/archive/2005/12/27/25534.html</guid><wfw:comment>http://www.blogjava.net/flyingis/comments/25534.html</wfw:comment><comments>http://www.blogjava.net/flyingis/archive/2005/12/27/25534.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/flyingis/comments/commentRss/25534.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/flyingis/services/trackbacks/25534.html</trackback:ping><description><![CDATA[<P class=MsoNormal style="MARGIN: 6pt 0cm; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">&nbsp;&nbsp;&nbsp; 作者：<A HREF="/flyingis/"><FONT color=#000080>Flyingis</FONT></A><BR><BR>标准的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">Java</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类库中包含了几种类型的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">Map</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，它们都拥有同样的基本接口</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">Map</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，但是行为特性各不相同，主要表现在效率、键值对的保存、元素呈现次序、对象的保存周期和判定键是否等价的策略等方面。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 6pt 0cm; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><SPAN lang=EN-US style="FONT-SIZE: 10pt">1.Map</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的功能方法</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 6pt 0cm; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><SPAN lang=EN-US style="FONT-SIZE: 10pt">Map(interface): </SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">维护</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">label</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">value</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的关联性，使得可以通过</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">label</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">查找</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">value</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 6pt 0cm; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><SPAN lang=EN-US style="FONT-SIZE: 10pt">HashMap: Map</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">基于散列表的实现，取代了</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">Hashtable</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。插入和查询</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">label/value</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的开销是固定的，并且可以通过构造器设置容量和负载因子，以调整容器的性能。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 6pt 0cm; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><SPAN lang=EN-US style="FONT-SIZE: 10pt">LinkedHashMap: </SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">HashMap</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的基础上做了一些改进，在迭代遍历它时，取得</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">label/value</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的顺序是其插入的次序，或者是最近最少使用</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">(LRU)</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的次序，速度上比</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">HashMap</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">要慢一点，但在迭代访问时速度会更快，主要原因是它使用了链表维护内部次序。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 6pt 0cm; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><SPAN lang=EN-US style="FONT-SIZE: 10pt">TreeMap: </SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">查看</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">label</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">或</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">label/value</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">时，元素会被排序，其次序由</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">Comparable</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">或</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">Comparator</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">决定，因此查询所得到的结果是经过排序的。另外，它是唯一带有</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">subMap()</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">Map</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">具体类，即返回一个子树。它也是</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">SortedMap</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">接口的唯一实现，</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">subMap()</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法也是从该接口继承的。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 6pt 0cm; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><SPAN lang=EN-US style="FONT-SIZE: 10pt">WeakHashMap: Weak Key</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">映射，允许释放映射所指向的对象。当映射之外没有引用指向某个</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">label</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">时，此</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">label</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">可以被垃圾收集器回收。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 6pt 0cm; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><SPAN lang=EN-US style="FONT-SIZE: 10pt">IdentityHashMap: </SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">使用</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">==</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">代替</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">equals()</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">label</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">进行比较的散列映射。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 6pt 0cm; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><SPAN lang=EN-US style="FONT-SIZE: 10pt">2.hashCode()<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 6pt 0cm; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><SPAN lang=EN-US style="FONT-SIZE: 10pt"><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">当使用标准库中的类</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">Integer</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">作为</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">HashMap</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">label</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">时，程序能够正常运行，但是使用自己创建的类作为</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">HashMap</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">label</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">时，通常犯一个错误。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 6pt 0cm; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><SPAN lang=EN-US style="FONT-SIZE: 10pt"><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">HashMap</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中通过</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">label</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">查找</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">value</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">时，实际上是计算</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">label</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对象地址的散列码来确定</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">value</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的。一般情况下，我们是使用基类</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">Object</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的方法</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">hashCode()</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">来生成散列码，它默认是使用对象的地址来计算的，因此由第一个对象</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">new Apple(5)</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和第二个对象</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">new Apple(5)</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">生成的散列码是不同的，不能完成正确的查找。通常，我们可以编写自己的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">hashCode()</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法来覆盖基类的原始方法，但与此同时，我们必须同时实现</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">equals()</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法来判断当前的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">label</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是否与表中存在的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">label</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">相同。正确的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">equals()</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法满足五个条件：</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 6pt 0cm 6pt 18pt; TEXT-INDENT: -18pt; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 18.0pt; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt"><SPAN lang=EN-US style="FONT-SIZE: 10pt; mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore">(1)<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">自反性。对于任意的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">x</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">x.equals(x)</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一定返回</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">true</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 6pt 0cm 6pt 18pt; TEXT-INDENT: -18pt; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 18.0pt; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt"><SPAN lang=EN-US style="FONT-SIZE: 10pt; mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore">(2)<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对称性。对于任意的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">x</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">y</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，如果</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">y.equals(x)</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">返回</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">true</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，则</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">x.equals(y)</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">也返回</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">true</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 6pt 0cm 6pt 18pt; TEXT-INDENT: -18pt; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 18.0pt; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt"><SPAN lang=EN-US style="FONT-SIZE: 10pt; mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore">(3)<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">传递性。对于任意的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">x</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">y</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">z</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，如果有</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">x.equals(y)</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">返回</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">true</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">y.equals(z)</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">返回</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">true</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，则</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">x.equals(z)</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一定返回</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">true</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 6pt 0cm 6pt 18pt; TEXT-INDENT: -18pt; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 18.0pt; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt"><SPAN lang=EN-US style="FONT-SIZE: 10pt; mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore">(4)<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一致性。对于任意的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">x</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">y</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，如果对象中用于等价比较的信息没有改变，那么无论调用</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">x.equals(y)</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">多少次，返回的结果应该保持一致，要么一直是</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">true</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，要么一直是</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">false</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 6pt 0cm 6pt 18pt; TEXT-INDENT: -18pt; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 18.0pt; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt"><SPAN lang=EN-US style="FONT-SIZE: 10pt; mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore">(5)<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对任何不是</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">null</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">x</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">x.equals(null)</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一定返回</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">false</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 6pt 0cm; TEXT-INDENT: 18pt; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><SPAN lang=EN-US style="FONT-SIZE: 10pt">equals()</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">比较的是对象的地址，如果要使用自己的类作为</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">HashMap</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">label</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，必须同时重载</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">hashCode()</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">equals()</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 6pt 0cm; TEXT-INDENT: 18pt; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">使用散列的目的：想要使用一个对象来查找另一个对象。使用</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">TreeSet</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">或</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">TreeMap</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">也能实现此目的。另外，还可以自己实现一个</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">Map</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，此时，必须提供</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">Map.entrySet()</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法来生成</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">Map.Entry</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对象的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">Set</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 6pt 0cm; TEXT-INDENT: 18pt; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">使用散列的价值：速度，散列使得查询可以快速进行。散列将</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">label</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">保存载数组中方便快速查询，因为存储一组元素最快的数据结构是数组，用它来表示</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">label</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的信息</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">(</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">后面有信息的描述</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">)</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，而不是</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">label</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">本身。通过</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">label</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对象计算得到一个数字，作为数组的下标，这个数字就是散列码</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">(</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">即前面所述的信息</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">)</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。该散列码具体是通过定义在基类</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">Object</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中，可能由程序员自定义的类覆盖的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">hashCode()</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法，即散列函数生成。为了解决数组容量带来的限制，可以使不同的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">label</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">生成相同的下标，保存在一个链表</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">list</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中，每一个链表就是数组的一个元素。查询</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">label</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">时就可以通过对</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">list</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中的信息进行查找，当散列函数比较好，数组的每个位置中的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">list</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">长度较短，则可以快速查找到数组元素</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">list</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中的某个位置，提高了整体速度。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 6pt 0cm; TEXT-INDENT: 18pt; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">散列表中的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">slot</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">通常称为</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">bucket</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，为了使散列分步均匀，</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">bucket</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的值一般取质数。但事实证明，质数实际上并不是散列</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">bucket</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的理想容量，近来</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">Java</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">散列实现都使用</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">2</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的幂，具体如何验证以后再续。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 6pt 0cm; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><SPAN lang=EN-US style="FONT-SIZE: 10pt">3.HashMap</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的性能因子</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 6pt 0cm; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">容量</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">(capacity): </SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">散列表中</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">bucket</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的数量。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 6pt 0cm; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">初始化容量</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">(initial capacity): </SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">创建散列表时</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">bucket</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的数量。可以在构造方法中指定</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">HashMap</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">HashSet</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的初始化容量。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 6pt 0cm; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">尺寸</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">(size): </SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">散列表中记录的数量。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">(</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">数组的元素个数，非</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">list</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中元素总和</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">)<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 6pt 0cm; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">负载因子</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">(load factor): </SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">尺寸</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">/</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">容量。负载因子为</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">0</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，表示空的散列表，</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">0.5</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">表示半满的散列表。轻负载的散列表具有冲突少，适宜插入与查询的特点，但是使用迭代器遍历会比较慢。较高的负载会减少所需空间大小。当负载达到指定值时，容器会自动成倍地增加容量，并将原有的对象重新分配，存入新的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">bucket</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中，这个过程称为“重散列”。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 6pt 0cm; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><SPAN lang=EN-US style="FONT-SIZE: 10pt">4.</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">重写</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">hashCode()</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的关键</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 6pt 0cm 6pt 18pt; TEXT-INDENT: -18pt; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 18.0pt; mso-list: l1 level1 lfo2; tab-stops: list 18.0pt"><SPAN lang=EN-US style="FONT-SIZE: 10pt; mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore">(1)<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对同一个对象调用</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">hashCode()</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">都应该生成同样的值。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 6pt 0cm 6pt 18pt; TEXT-INDENT: -18pt; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 18.0pt; mso-list: l1 level1 lfo2; tab-stops: list 18.0pt"><SPAN lang=EN-US style="FONT-SIZE: 10pt; mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore">(2)<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">hashCode()</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法不要依赖于对象中易变的数据，当数据发生变化时，</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">hashCode()</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">就会生成一个不同的散列码，即产生了一个不同的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">label</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 6pt 0cm 6pt 18pt; TEXT-INDENT: -18pt; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 18.0pt; mso-list: l1 level1 lfo2; tab-stops: list 18.0pt"><SPAN lang=EN-US style="FONT-SIZE: 10pt; mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore">(3)<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">hashCode()</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">不应依赖于具有唯一性的对象信息，例如对象地址。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 6pt 0cm 6pt 18pt; TEXT-INDENT: -18pt; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 18.0pt; mso-list: l1 level1 lfo2; tab-stops: list 18.0pt"><SPAN lang=EN-US style="FONT-SIZE: 10pt; mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore">(4)<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">散列码应该更关心速度，而不是唯一性，因为散列码不必是唯一的。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 6pt 0cm 6pt 18pt; TEXT-INDENT: -18pt; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 18.0pt; mso-list: l1 level1 lfo2; tab-stops: list 18.0pt"><SPAN lang=EN-US style="FONT-SIZE: 10pt; mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore">(5)<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">好的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">hashCode()</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">应该产生分步均匀的散列码。在</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">Effective Java(Addison-Wesley 2001)</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中，</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">Joshua Bloch</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">给</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">hashCode()</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">给出了设计指导，可以参考。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman'">编写正确高效的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: 'Times New Roman'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">hashCode()</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman'">和</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: 'Times New Roman'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">equals()</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman'">可以参考</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: 'Times New Roman'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">Apache</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman'">的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: 'Times New Roman'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">Jakarta Commons</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman'">项目中的工具。<BR><BR>其它相关内容：<BR><A href="/flyingis/archive/2005/12/15/24089.html"><FONT color=#000080>Java容器分析--数组</FONT></A><BR><A href="/flyingis/archive/2005/12/21/24951.html"><FONT color=#000080>Java容器分析--List和Set</FONT></A></SPAN><img src ="http://www.blogjava.net/flyingis/aggbug/25534.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/flyingis/" target="_blank">Flyingis</a> 2005-12-27 10:07 <a href="http://www.blogjava.net/flyingis/archive/2005/12/27/25534.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java容器分析--List和Set</title><link>http://www.blogjava.net/flyingis/archive/2005/12/21/24951.html</link><dc:creator>Flyingis</dc:creator><author>Flyingis</author><pubDate>Wed, 21 Dec 2005 07:06:00 GMT</pubDate><guid>http://www.blogjava.net/flyingis/archive/2005/12/21/24951.html</guid><wfw:comment>http://www.blogjava.net/flyingis/comments/24951.html</wfw:comment><comments>http://www.blogjava.net/flyingis/archive/2005/12/21/24951.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/flyingis/comments/commentRss/24951.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/flyingis/services/trackbacks/24951.html</trackback:ping><description><![CDATA[<SPAN lang=EN-US><FONT size=2><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
<P class=MsoNormal style="MARGIN: 6pt 0cm; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">&nbsp;&nbsp;&nbsp; 作者：<A HREF="/flyingis/"><FONT color=#000080>Flyingis</FONT></A><BR><BR>&nbsp;&nbsp;&nbsp; 容器类可以大大提高编程效率和编程能力，在</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><FONT face="Times New Roman">Java2</FONT></SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中，所有的容器都由</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><FONT face="Times New Roman">SUN</FONT></SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">公司的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><FONT face="Times New Roman">Joshua Bloch</FONT></SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">进行了重新设计，丰富了容器类库的功能。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 6pt 0cm; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><SPAN lang=EN-US style="FONT-SIZE: 10pt"><FONT face="Times New Roman"><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>Java2</FONT></SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">容器类类库的用途是“保存对象”，它分为两类：</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 6pt 0cm; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><FONT face="Times New Roman"><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="FONT-SIZE: 10pt">Collection</SPAN></B><SPAN lang=EN-US style="FONT-SIZE: 10pt">----</SPAN></FONT><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一组独立的元素，通常这些元素都服从某种规则。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><FONT face="Times New Roman">List</FONT></SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">必须保持元素特定的顺序，而</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><FONT face="Times New Roman">Set</F