??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲黄色小视频,国产在线制服美女,成人在线二区http://www.aygfsteel.com/association/zh-cnFri, 20 Jun 2025 00:26:08 GMTFri, 20 Jun 2025 00:26:08 GMT60Java Map 集合cȝ?/title><link>http://www.aygfsteel.com/association/archive/2008/03/09/184901.html</link><dc:creator>扬扬</dc:creator><author>扬扬</author><pubDate>Sun, 09 Mar 2008 14:04:00 GMT</pubDate><guid>http://www.aygfsteel.com/association/archive/2008/03/09/184901.html</guid><wfw:comment>http://www.aygfsteel.com/association/comments/184901.html</wfw:comment><comments>http://www.aygfsteel.com/association/archive/2008/03/09/184901.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/association/comments/commentRss/184901.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/association/services/trackbacks/184901.html</trackback:ping><description><![CDATA[<p><span id="wmqeeuq" class="topstoryhead">Java Map 集合cȝ?/span><br /> <span id="wmqeeuq" class="italicbodycopy">作者:Jack Shirazi</span> </p> <p><span id="wmqeeuq" class="boldbodycopy">了解最常用的集合类型之一 Map 的基知识以及如何针对您应用程序特有的数据优化 Map?/span></p> <p> <table cellpadding="5" width="25%" bgcolor="#dddddd" border="0"> <tbody> <tr> <td><span id="wmqeeuq" class="boldbodycopy">本文相关下蝲Q?/span><br /> <span id="wmqeeuq" class="boldbodycopy">·</span> <a target="_blank"><span id="wmqeeuq" class="bodylink">Jack ?HashMap 试</span></a><br /> <span id="wmqeeuq" class="boldbodycopy">·</span> <a target="_blank"><span id="wmqeeuq" class="bodylink">Oracle JDeveloper 10<em>g</em></span></a> </td> </tr> </tbody> </table> <br clear="all" /> <p> </p> <p><span id="wmqeeuq" class="bodycopy">java.util 中的集合cd?Java 中某些最常用的类?最常用的集合类?List ?Map?List 的具体实现包?ArrayList ?VectorQ它们是可变大小的列表,比较适合构徏、存储和操作Mcd对象的元素列表?List 适用于按数值烦引访问元素的情Ş?/span> </p> <p><span id="wmqeeuq" class="bodycopy">Map 提供了一个更通用的元素存储方法?Map 集合cȝ于存储元素对Q称?#8220;?#8221;?#8220;?#8221;Q,其中每个键映到一个倹{?从概念上而言Q您可以?List 看作是具有数值键?Map?而实际上Q除?List ?Map 都在定义 java.util 中外Q两者ƈ没有直接的联pR本文将着重介l核?Java 发行套g中附带的 MapQ同时还介l如何采用或实现更适用于您应用E序特定数据的专?Map?/span> </p> <p><span id="wmqeeuq" class="parahead1">了解 Map 接口和方?/span> </p> <p><span id="wmqeeuq" class="bodycopy">Java 核心cM有很多预定义?Map cR?在介l具体实C前,我们先介l一?Map 接口本nQ以便了解所有实现的共同炏V?Map 接口定义了四U类型的ҎQ每?Map 都包含这些方法?下面Q我们从两个普通的ҎQ?a ><span id="wmqeeuq" class="bodylink">?1</span></a>Q开始对q些Ҏ加以介绍?/span> </p> <p><span id="wmqeeuq" class="italicbodycopy"><a name="T1"></a>?1Q?覆盖的方法?我们这 Object 的这两个Ҏ覆盖Q以正确比较 Map 对象的等h?/span> <table cellpadding="5" width="100%" align="center" bgcolor="#dddddd" border="1" vspace="5" hspace="5"> <tbody> <tr> <td><span id="wmqeeuq" class="bodycopy">equals(Object o)</span></td> <td><span id="wmqeeuq" class="bodycopy">比较指定对象与此 Map 的等h?/span></td> </tr> <tr> <td><span id="wmqeeuq" class="bodycopy">hashCode()</span></td> <td><span id="wmqeeuq" class="bodycopy">q回?Map 的哈希码</span></td> </tr> </tbody> </table> <p> </p> <p><span id="wmqeeuq" class="boldbodycopy">Map 构徏</span> </p> <p><span id="wmqeeuq" class="bodycopy">Map 定义了几个用于插入和删除元素的变换方法(<a ><span id="wmqeeuq" class="bodylink">?2</span></a>Q?/span> </p> <p><span id="wmqeeuq" class="italicbodycopy"><a name="T2"></a>?2Q?Map 更新ҎQ?可以更改 Map 内容?/span> <table cellpadding="5" width="100%" align="center" bgcolor="#dddddd" border="1" vspace="5" hspace="5"> <tbody> <tr> <td><span id="wmqeeuq" class="bodycopy">clear()</span></td> <td><span id="wmqeeuq" class="bodycopy">?Map 中删除所有映?/span></td> </tr> <tr> <td><span id="wmqeeuq" class="bodycopy">remove(Object key)</span></td> <td><span id="wmqeeuq" class="bodycopy">?Map 中删除键和关联的?/span></td> </tr> <tr> <td><span id="wmqeeuq" class="bodycopy">put(Object key, Object value)</span></td> <td><span id="wmqeeuq" class="bodycopy">指定g指定键相兌</span></td> </tr> <tr> <td><span id="wmqeeuq" class="bodycopy">clear()</span></td> <td><span id="wmqeeuq" class="bodycopy">?Map 中删除所有映?/span></td> </tr> <tr> <td><span id="wmqeeuq" class="bodycopy">putAll(Map t)</span></td> <td><span id="wmqeeuq" class="bodycopy">指?Map 中的所有映复制到?map</span></td> </tr> </tbody> </table> <p> </p> <p><span id="wmqeeuq" class="bodycopy">管您可能注意到Q纵然假讑ֿ略构Z个需要传递给 putAll() ?Map 的开销Q?putAll() 通常也ƈ不比使用大量?put() 调用更有效率Q但 putAll() 的存在一点也不稀奇?q是因ؓQputAll() 除了q代 put() 所执行的将每个键值对d?Map 的算法以外,q需要P代所传递的 Map 的元素?但应注意QputAll() 在添加所有元素之前可以正调?Map 的大,因此如果您未亲自调整 Map 的大(我们对此进行简单介l)Q则 putAll() 可能比预期的更有效?/span> </p> <p><span id="wmqeeuq" class="boldbodycopy">查看 Map</span> </p> <p><span id="wmqeeuq" class="bodycopy">q代 Map 中的元素不存在直接了当的Ҏ?如果要查询某?Map 以了解其哪些元素满特定查询Q或如果要P代其所有元素(无论原因如何Q,则您首先需要获取该 Map ?#8220;视图”?有三U可能的视图Q参?a ><span id="wmqeeuq" class="bodylink">?3</span></a>Q?/span> <ul> <li><span id="wmqeeuq" class="bodycopy">所有键值对 ?参见 entrySet()</span> <li><span id="wmqeeuq" class="bodycopy">所有键 ?参见 keySet()</span> <li><span id="wmqeeuq" class="bodycopy">所有??参见 values()</span> </li> </ul> <p> </p> <p><span id="wmqeeuq" class="bodycopy">前两个视囑֝q回 Set 对象Q第三个视图q回 Collection 对象?p两种情况而言Q问题到q里q没有结束,q是因ؓ您无法直接P?Collection 对象?Set 对象。要q行q代Q您必须获得一?Iterator 对象?因此Q要q代 Map 的元素,必须q行比较烦琐的编?/span> </p> <p> <pre>Iterator keyValuePairs = aMap.entrySet().iterator(); Iterator keys = aMap.keySet().iterator(); Iterator values = aMap.values().iterator(); </pre> <p> </p> <p><span id="wmqeeuq" class="bodycopy">值得注意的是Q这些对象(Set、Collection ?IteratorQ实际上是基 Map 的视图,而不是包含所有元素的副本?q它们的用效率很高?另一斚wQCollection ?Set 对象?toArray() Ҏ却创建包?Map 所有元素的数组对象Q因此除了确实需要用数l中元素的情形外Q其效率q不高?/span> </p> <p><span id="wmqeeuq" class="bodycopy">我运行了一个小试Q随附文件中?<a target="_blank"><span id="wmqeeuq" class="bodylink">Test1</span></a>Q,该测试用了 HashMapQƈ使用以下两种Ҏ对P?Map 元素的开销q行了比较:</span> </p> <p> <pre>int mapsize = aMap.size(); <strong>Iterator keyValuePairs1 = aMap.entrySet().iterator();</strong> for (int i = 0; i < mapsize; i++) { Map.Entry entry = (Map.Entry) keyValuePairs1.next(); Object key = entry.getKey(); Object value = entry.getValue(); ... } <strong>Object[] keyValuePairs2 = aMap.entrySet().toArray();</strong> for (int i = 0; i < rem; i++) { { Map.Entry entry = (Map.Entry) keyValuePairs2[i]; Object key = entry.getKey(); <table cellpadding="5" width="40%" align="right" bgcolor="#dddddd" border="1" vspace="5" hspace="5"> <tbody> <tr> <td><center><span id="wmqeeuq" class="parahead1">Profilers in Oracle JDeveloper</span></center> <p> </p> <p><span id="wmqeeuq" class="bodycopy">Oracle JDeveloper 包含一个嵌入的监测器,它测量内存和执行旉Q您能够快速识别代码中的瓶颈?我曾使用 Jdeveloper 的执行监器监测 HashMap ?containsKey() ?containsValue() ҎQƈ很快发现 containsKey() Ҏ的速度?containsValue() Ҏ慢很多(实际上要慢几个数量Q)?Q参?a ><span id="wmqeeuq" class="bodylink">?1</span></a> ?a ><span id="wmqeeuq" class="bodylink">?2</span></a>Q以及随附文件中?<a target="_blank"><span id="wmqeeuq" class="bodylink">Test2</span></a> c)?/span> </p> </td> </tr> </tbody> </table> Object value = entry.getValue(); ... } </pre> <span id="wmqeeuq" class="bodycopy">此测试用了两种量ҎQ?一U是量q代元素的时_另一U测量?toArray 调用创徏数组的其他开销?W一U方法(忽略创徏数组所需的时_表明Q用已?toArray 调用中创建的数组q代元素的速度要比使用 Iterator 的速度大约?30%-60%?但如果将使用 toArray Ҏ创徏数组的开销包含在内Q则使用 Iterator 实际上要?10%-20%?因此Q如果由于某U原因要创徏一个集合元素的数组而非q代q些元素Q则应用该数组q代元素?但如果您不需要此中间数组Q则不要创徏它,而是使用 Iterator q代元素?/span> <p> </p> <p><span id="wmqeeuq" class="italicbodycopy"><a name="T3"></a>?3Q?q回视图?Map ҎQ?使用q些Ҏq回的对象,您可以遍?Map 的元素,q可以删?Map 中的元素?/span> <table cellpadding="5" width="100%" align="center" bgcolor="#dddddd" border="1" vspace="5" hspace="5"> <tbody> <tr> <td><span id="wmqeeuq" class="bodycopy">entrySet()</span></td> <td><span id="wmqeeuq" class="bodycopy">q回 Map 中所包含映射?Set 视图?Set 中的每个元素都是一?Map.Entry 对象Q可以?getKey() ?getValue() ҎQ还有一?setValue() ҎQ访问后者的键元素和值元?/span></td> </tr> <tr> <td><span id="wmqeeuq" class="bodycopy">keySet()</span></td> <td><span id="wmqeeuq" class="bodycopy">q回 Map 中所包含键的 Set 视图?删除 Set 中的元素q将删除 Map 中相应的映射Q键和|</span></td> </tr> <tr> <td><span id="wmqeeuq" class="bodycopy">values()</span></td> <td><span id="wmqeeuq" class="bodycopy">q回 map 中所包含值的 Collection 视图?删除 Collection 中的元素q将删除 Map 中相应的映射Q键和|</span></td> </tr> </tbody> </table> <p> </p> <p><span id="wmqeeuq" class="boldbodycopy">讉K元素</span> </p> <p><span id="wmqeeuq" class="bodycopy">?4 中列Z Map 讉KҎ。Map 通常适合按键Q而非按|q行讉K?Map 定义中没有规定这肯定是真的,但通常您可以期望这是真的?例如Q您可以期望 containsKey() Ҏ?get() Ҏ一样快?另一斚wQcontainsValue() Ҏ很可能需要扫?Map 中的|因此它的速度可能比较慢?/span> </p> <p><span id="wmqeeuq" class="italicbodycopy"><a name="T4"></a>?4Q?Map 讉K和测试方法: q些Ҏ索有?Map 内容的信息但不更?Map 内容?/span> <table cellpadding="5" width="100%" align="center" bgcolor="#dddddd" border="1" vspace="5" hspace="5"> <tbody> <tr> <td><span id="wmqeeuq" class="bodycopy">get(Object key)</span></td> <td><span id="wmqeeuq" class="bodycopy">q回与指定键兌的?/span></td> </tr> <tr> <td><span id="wmqeeuq" class="bodycopy">containsKey(Object key)</span></td> <td><span id="wmqeeuq" class="bodycopy">如果 Map 包含指定键的映射Q则q回 true</span></td> </tr> <tr> <td><span id="wmqeeuq" class="bodycopy">containsValue(Object value)</span></td> <td><span id="wmqeeuq" class="bodycopy">如果?Map 一个或多个键映到指定|则返?true</span></td> </tr> <tr> <td><span id="wmqeeuq" class="bodycopy">isEmpty()</span></td> <td><span id="wmqeeuq" class="bodycopy">如果 Map 不包含键-值映,则返?true</span></td> </tr> <tr> <td><span id="wmqeeuq" class="bodycopy">size()</span></td> <td><span id="wmqeeuq" class="bodycopy">q回 Map 中的?值映的数目</span></td> </tr> </tbody> </table> <p> </p> <p><span id="wmqeeuq" class="bodycopy">对?containsKey() ?containsValue() 遍历 HashMap 中所有元素所需旉的测试表明,containsValue() 所需的时间要长很多?实际上要长几个数量Q?Q参?a ><span id="wmqeeuq" class="bodylink">?1</span></a> ?a ><span id="wmqeeuq" class="bodylink">?2</span></a>Q以及随附文件中?<a target="_blank"><span id="wmqeeuq" class="bodylink">Test2</span></a>Q?因此Q如?containsValue() 是应用程序中的性能问题Q它很快显现出来,q可以通过监测您的应用E序L地将其识别?q种情况下,我相信您能够惛_一个有效的替换Ҏ来实?containsValue() 提供的等效功能?但如果想不出办法Q则一个可行的解决Ҏ是再创徏一?MapQƈ第一?Map 的所有g为键?q样Q第一?Map 上的 containsValue() 成为第二个 Map 上更有效?containsKey()?/span> </p> <p><a name="F1"></a> <table width="100%" align="center"> <tbody> <tr> <td align="center"><img height="468" alt="?1" src="http://www.oracle.com/technology/pub/images/map_test.gif" width="750" border="0" /> </td> </tr> <tr> <td> <center><span id="wmqeeuq" class="bodycopy">?1Q?使用 JDeveloper 创徏q运?Map 试c?/span></center></td> </tr> </tbody> </table> <p> </p> <p><a name="F2"></a> <table width="100%" align="center"> <tbody> <tr> <td align="center"><img height="448" alt="?2" src="http://www.oracle.com/technology/pub/images/map_test2.gif" width="750" border="0" /> </td> </tr> <tr> <td> <center><span id="wmqeeuq" class="bodycopy">?2Q??JDeveloper 中用执行监器q行的性能监测查出应用E序中的瓉</span></center></td> </tr> </tbody> </table> <p> </p> <p><span id="wmqeeuq" class="parahead1">核心 Map</span> </p> <p><span id="wmqeeuq" class="bodycopy">Java 自带了各U?Map cR?q些 Map cd归ؓ三种cdQ?</span></p> <p> <ol> <li><span id="wmqeeuq" class="bodycopy">通用 MapQ用于在应用E序中管理映,通常?java.util E序包中实现</span> <ul> <li><span id="wmqeeuq" class="bodycopy">HashMap</span> <li><span id="wmqeeuq" class="bodycopy">Hashtable</span> <li><span id="wmqeeuq" class="bodycopy">Properties</span> <li><span id="wmqeeuq" class="bodycopy">LinkedHashMap</span> <li><span id="wmqeeuq" class="bodycopy">IdentityHashMap</span> <li><span id="wmqeeuq" class="bodycopy">TreeMap</span> <li><span id="wmqeeuq" class="bodycopy">WeakHashMap</span> <li><span id="wmqeeuq" class="bodycopy">ConcurrentHashMap</span> </li> </ul> <li><span id="wmqeeuq" class="bodycopy">专用 MapQ您通常不必亲自创徏此类 MapQ而是通过某些其他cd其进行访?/span> <ul> <li><span id="wmqeeuq" class="bodycopy">java.util.jar.Attributes</span> <li><span id="wmqeeuq" class="bodycopy">javax.print.attribute.standard.PrinterStateReasons</span> <li><span id="wmqeeuq" class="bodycopy">java.security.Provider</span> <li><span id="wmqeeuq" class="bodycopy">java.awt.RenderingHints</span> <li><span id="wmqeeuq" class="bodycopy">javax.swing.UIDefaults</span> </li> </ul> <li><span id="wmqeeuq" class="bodycopy">一个用于帮助实现您自己?Map cȝ抽象c?/span> <ul> <li><span id="wmqeeuq" class="bodycopy">AbstractMap</span> </li> </ul> </li> </ol> <p> </p> <p><span id="wmqeeuq" class="parahead1">内部哈希Q?哈希映射技?/span> </p> <p><span id="wmqeeuq" class="bodycopy">几乎所有通用 Map 都用哈希映?q是一U将元素映射到数l的非常单的机制Q您应了解哈希映的工作原理Q以便充分利?Map?/span> </p> <p><span id="wmqeeuq" class="bodycopy">哈希映射l构׃个存储元素的内部数组l成?׃内部采用数组存储Q因此必然存在一个用于确定Q意键讉K数组的烦引机制?实际上,该机刉要提供一个小于数l大的整数索引倹{?该机制称作哈希函数??Java Z哈希?Map 中,哈希函数对象{换ؓ一个适合内部数组的整数?您不必ؓL一个易于用的哈希函数而大伤脑{: 每个对象都包含一个返回整数值的 hashCode() Ҏ?要将该值映到数组Q只需其转换Z个正|然后在将该值除以数l大后取余数即可?以下是一个简单的、适用于Q何对象的 Java 哈希函数</span> </p> <p> <pre>int hashvalue = Maths.abs(key.hashCode()) % table.length; </pre> <p> </p> <p><span id="wmqeeuq" class="bodycopy">Q? 二进制运符Q称作模Q将左侧的值除以右侧的|然后q回整数形式的余数。)</span> </p> <p><span id="wmqeeuq" class="bodycopy">实际上,?1.4 版发布之前,q就是各U基于哈希的 Map cL使用的哈希函数?但如果您查看一下代码,您将看到</span> </p> <p> <pre>int hashvalue = (key.hashCode() & 0x7FFFFFFF) % table.length; </pre> <p> </p> <p><span id="wmqeeuq" class="bodycopy">它实际上是用更快机制获取正值的同一函数??1.4 版中QHashMap cdC用一个不同且更复杂的哈希函数Q该函数Z Doug Lea ?util.concurrent E序包(E后我将更详l地再次介绍 Doug Lea 的类Q?/span> </p> <p><a name="F3"></a> <table width="100%" align="center"> <tbody> <tr> <td align="center"><img height="446" alt="?3" src="http://www.oracle.com/technology/pub/images/jave_maps.gif" width="260" border="0" /> </td> </tr> <tr> <td> <center><span id="wmqeeuq" class="bodycopy">?3Q?哈希工作原理</span></center></td> </tr> </tbody> </table> <p> </p> <p><span id="wmqeeuq" class="bodycopy">该图介绍了哈希映的基本原理Q但我们q没有对其进行详l介l?我们的哈希函数将L对象映射C个数l位|,但如果两个不同的键映到相同的位|,情况会如何Q?q是一U必然发生的情况?在哈希映的术语中,q称作冲H?Map 处理q些冲突的方法是在烦引位|处插入一个链接列表,q简单地元素添加到此链接列表?因此Q一个基于哈希的 Map 的基?put() Ҏ可能如下所C?/span> </p> <p> <pre>public Object put(Object key, Object value) { //我们的内部数l是一?Entry 对象数组 //Entry[] table; //获取哈希码,q映到一个烦? int hash = key.hashCode(); int index = (hash & 0x7FFFFFFF) % table.length; //循环遍历位于 table[index] 处的链接列表Q以查明 //我们是否拥有此键??如果拥有Q则覆盖? for (Entry e = table[index] ; e != null ; e = e.next) { //必须查键是否相等Q原因是不同的键对象 //可能拥有相同的哈? if ((e.hash == hash) && e.key.equals(key)) { //q是相同键,覆盖该? //q从该方法返?old ? Object old = e.value; e.value = value; return old; } } //仍然在此处,因此它是一个新键,只需d一个新 Entry //Entry 对象包含 key 对象?value 对象、一个整型的 hash? //和一个指向列表中的下一?Entry ?next Entry //创徏一个指向上一个列表开头的?EntryQ? //q将此新 Entry 插入表中 Entry e = new Entry(hash, key, value, table[index]); table[index] = e; return null; } </pre> <p> </p> <p><span id="wmqeeuq" class="bodycopy">如果看一下各U基于哈希的 Map 的源代码Q您发现这基本上就是它们的工作原理?此外Q还有一些需要进一步考虑的事,如处理空键和g及调整内部数l?此处定义?put() Ҏq包含相?get() 的算法,q是因ؓ插入包括搜烦映射索引处的以查明该键是否已经存在?Q即 get() Ҏ?put() Ҏh相同的算法,?get() 不包含插入和覆盖代码。) 使用链接列表q不是解军_H的唯一ҎQ某些哈希映用另一U?#8220;开攑ּd”ҎQ本文对其不予介l?/span> </p> <p><span id="wmqeeuq" class="parahead1">优化 Hasmap</span> </p> <p><span id="wmqeeuq" class="bodycopy">如果哈希映射的内部数l只包含一个元素,则所有项映到此数l位|,从而构成一个较长的链接列表?׃我们的更新和讉K使用了对链接列表的线性搜索,而这要比 Map 中的每个数组索引只包含一个对象的情Ş要慢得多Q因此这样做的效率很低?讉K或更新链接列表的旉与列表的大小U性相养I而用哈希函数访问或更新数组中的单个元素则与数组大小无关 ?渐q性质QBig-O 表示法)而言Q前者ؓ O(n)Q而后者ؓ O(1)?因此Q用一个较大的数组而不是让太多的项聚集在太的数组位置中是有意义的?/span> </p> <p><span id="wmqeeuq" class="boldbodycopy">调整 Map 实现的大?/span> </p> <p><span id="wmqeeuq" class="bodycopy">在哈希术语中Q内部数l中的每个位|称?#8220;存储?#8221;(bucket)Q而可用的存储桶数Q即内部数组的大)UC定w (capacity)?Z Map 对象有效地处理Q意数目的,Map 实现可以调整自n的大?但调整大的开销很大?调整大小需要将所有元素重新插入到新数l中Q这是因Z同的数组大小意味着对象现在映射C同的索引倹{?先前冲突的键可能不再冲突Q而先前不冲突的其他键现在可能冲突?q显然表明,如果?Map 调整得够大Q则可以减少甚至不再需要重新调整大,q很有可能显著提高速度?/span> </p> <p><span id="wmqeeuq" class="bodycopy">使用 1.4.2 JVM q行一个简单的试Q即用大量的(数目过一百万Q填?HashMap??5 昄了结果,q将所有时间标准化为已预先讄大小的服务器模式Q关联文件中?<a target="_blank"><span id="wmqeeuq" class="bodylink">Test3</span></a>Q?对于已预先设|大的 JVMQ客L和服务器模式 JVM q行旉几乎相同Q在攑ּ JIT ~译阶段后)?但?Map 的默认大将引发多次调整大小操作Q开销很大Q在服务器模式下要多?50% 的时_而在客户端模式下几乎要多用两倍的旉Q?/span> </p> <p><span id="wmqeeuq" class="italicbodycopy"><a name="T5"></a>?5Q?填充已预先设|大的 HashMap 与填充默认大的 HashMap 所需旉的比?/span> <table cellpadding="5" width="100%" align="center" bgcolor="#dddddd" border="1" vspace="5" hspace="5"> <tbody> <tr> <td></td> <td><span id="wmqeeuq" class="boldbodycopy">客户端模?/span></td> <td><span id="wmqeeuq" class="boldbodycopy">服务器模?/span></td> </tr> <tr> <td><span id="wmqeeuq" class="bodycopy">预先讄的大?/span></td> <td><span id="wmqeeuq" class="bodycopy">100%</span> <td><span id="wmqeeuq" class="bodycopy">100%</span></td> </span> </tr> <tr> <td><span id="wmqeeuq" class="bodycopy">默认大小</span></td> <td><span id="wmqeeuq" class="bodycopy">294%</span></td> <td><span id="wmqeeuq" class="bodycopy">157%</span></td> </tr> </tbody> </table> <p> </p> <p><span id="wmqeeuq" class="boldbodycopy">使用负蝲因子</span> </p> <p><span id="wmqeeuq" class="bodycopy">为确定何时调整大,而不是对每个存储桶中的链接列表的深度q行记数Q基于哈希的 Map 使用一个额外参数ƈ_略计算存储桶的密度?Map 在调整大之前,使用名ؓ“负蝲因子”的参数指C?Map 承担的“负蝲”量,卛_的负载程度?负蝲因子、项敎ͼMap 大小Q与定w之间的关pȝ单明了:</span> </p> <p> <ul> <li><span id="wmqeeuq" class="bodycopy">如果Q负载因子)xQ容量)>QMap 大小Q,则调?Map 大小</span> </li> </ul> <p> </p> <p><span id="wmqeeuq" class="bodycopy">例如Q如果默认负载因子ؓ 0.75Q默认容量ؓ 11Q则 11 x 0.75 = 8.25Q该值向下取整ؓ 8 个元素?因此Q如果将W?8 个项d到此 MapQ则?Map 自w的大小调整Z个更大的倹{?相反Q要计算避免调整大小所需的初始容量,用将要添加的Ҏ除以负蝲因子Qƈ向上取整Q例如,</span> </p> <p> <ul> <li><span id="wmqeeuq" class="bodycopy">对于负蝲因子?0.75 ?100 个项Q应容量设|ؓ 100/0.75 = 133.33Qƈ结果向上取整ؓ 134Q或取整?135 以用奇敎ͼ</span> </li> </ul> <p> </p> <p><span id="wmqeeuq" class="bodycopy">奇数个存储桶?map 能够通过减少冲突数来提高执行效率?虽然我所做的试Q关联文件中?a target="_blank"><span id="wmqeeuq" class="bodylink">Test4</span></a>Qƈ未表明质数可以始l获得更好的效率Q但理想情Ş是容量取质数?1.4 版后的某?MapQ如 HashMap ?LinkedHashMapQ而非 Hashtable ?IdentityHashMapQ用需?2 的幂定w的哈希函敎ͼ但下一个最?2 的幂定wp?Map 计算Q因此您不必亲自计算?/span> </p> <p><span id="wmqeeuq" class="bodycopy">负蝲因子本n是空间和旉之间的调整折街?较小的负载因子将占用更多的空_但将降低冲突的可能性,从而将加快讉K和更新的速度?使用大于 0.75 的负载因子可能是不明智的Q而用大?1.0 的负载因子肯定是不明知的Q这是因必定会引发一ơ冲H?使用于 0.50 的负载因子好处ƈ不大Q但只要您有效地调整 Map 的大,应不会对负载因子造成性能开销Q而只会造成内存开销?但较的负蝲因子意味着如果您未预先调整 Map 的大,则导致更频繁的调整大,从而降低性能Q因此在调整负蝲因子时一定要注意q个问题?/span> </p> <p><span id="wmqeeuq" class="parahead1">选择适当?Map</span> </p> <p><span id="wmqeeuq" class="bodycopy">应用哪U?MapQ?它是否需要同步? 要获得应用程序的最x能Q这可能是所面的两个最重要的问题?当用通用 Map Ӟ调整 Map 大小和选择负蝲因子늛?Map 调整选项?/span> </p> <p><span id="wmqeeuq" class="bodycopy">以下是一个用于获得最?Map 性能的简单方?/span> <ol> <li><span id="wmqeeuq" class="bodycopy">您的所?Map 变量声明?MapQ而不是Q何具体实玎ͼ即不要声明ؓ HashMap ?HashtableQ或M其他 Map cd现?/span> <p> </p> <p> <pre>Map criticalMap = new HashMap(); //? HashMap criticalMap = new HashMap(); //? </pre> <p> </p> <p><span id="wmqeeuq" class="bodycopy">q您能够只更改一行代码即可非常轻村֜替换M特定?Map 实例?/span> </p> <li><span id="wmqeeuq" class="bodycopy">下蝲 Doug Lea ?util.concurrent E序?(<a target="_blank"><span id="wmqeeuq" class="bodylink">http://gee.cs.oswego.edu/dl/classes/EDU/oswego/cs/dl/util/concurrent/intro.html</span></a>)??ConcurrentHashMap 用作默认 Map?当移植到 1.5 版时Q将 java.util.concurrent.ConcurrentHashMap 用作您的默认 Map?不要?ConcurrentHashMap 包装在同步的包装器中Q即使它用于多个线E?使用默认大小和负载因子?/span> <li><span id="wmqeeuq" class="bodycopy">监测您的应用E序?如果发现某个 Map 造成瓉Q则分析造成瓉的原因,q分或全部更改?Map 的以下内容: Map c;Map 大小Q负载因子;关键对象 equals() Ҏ实现?专用?Map 的基本上都需要特D用途的定制 Map 实现Q否则通用 Map 实现您所需的性能目标?/span> </li> </ol> <p> </p> <p><span id="wmqeeuq" class="boldbodycopy">Map 选择</span> </p> <p><span id="wmqeeuq" class="bodycopy">也许您曾期望更复杂的考量Q而这实际上是否显得太ҎQ?好的Q让我们慢慢来?首先Q您应用哪U?MapQ?{案很简单: 不要为您的设计选择M特定?MapQ除非实际的设计需要指定一个特D类型的 Map?设计旉常不需要选择具体?Map 实现?您可能知道自己需要一?MapQ但不知道用哪U?而这恰恰是使用 Map 接口的意义所在?直到需要时再选择 Map 实现 ?如果随处使用“Map”声明的变量,则更改应用程序中MҎ Map ?Map 实现只需要更改一行,q是一U开销很少的调整选择?是否要用默认的 Map 实现Q?我很快将谈到q个问题?/span> </p> <p><span id="wmqeeuq" class="boldbodycopy">同步 Map</span> </p> <p><span id="wmqeeuq" class="bodycopy">同步与否有何差别Q?Q对于同步,您既可以使用同步?MapQ也可以使用 Collections.synchronizedMap() 未同步?Map 转换为同步的 Map?后者?#8220;同步的包装器”Q这是一个异常复杂的选择Q完全取决于您如何根据多U程q发讉K和更C?MapQ同时还需要进行维护方面的考虑?例如Q如果您开始时未ƈ发更新特?MapQ但它后来更改ؓq发更新Q情况将如何Q?在这U情况下Q很Ҏ在开始时使用一个未同步?MapQƈ在后来向应用E序中添加ƈ发更新线E时忘记此未同步的 Map 更改为同步的 Map?q将使您的应用程序容易崩溃(一U要定和跟t的最p糕的错误)?但如果默认ؓ同步Q则因随之而来的可怕性能而序列化执行多线E应用程序?看v来,我们需要某U决{树来帮助我们正选择?/span> </p> <p><span id="wmqeeuq" class="bodycopy">Doug Lea 是纽U州立大学奥斯威戈分校计机U学pȝ教授?他创Z一l公共领域的E序包(l称 util.concurrentQ,该程序包包含许多可以化高性能q行~程的实用程序类?q些cM包含两个 MapQ即 ConcurrentReaderHashMap ?ConcurrentHashMap?q些 Map 实现是线E安全的Qƈ且不需要对q发讉K或更新进行同步,同时q适用于大多数需?Map 的情c?它们q远比同步的 MapQ如 HashtableQ或使用同步的包装器更具伸羃性,q且?HashMap 相比Q它们对性能的破坏很?util.concurrent E序包构成了 JSR166 的基QJSR166 已经开发了一个包含在 Java 1.5 版中的ƈ发实用程序,?Java 1.5 版将把这?Map 包含在一个新?java.util.concurrent E序包中?/span> </p> <p> <table cellpadding="5" width="40%" align="right" bgcolor="#dddddd" border="1" vspace="5" hspace="5"> <tbody> <tr> <td> <center><span id="wmqeeuq" class="parahead1">后箋步骤</span></center> <p> </p> <p><a target="_blank"><span id="wmqeeuq" class="bodylink">下蝲 Oracle JDeveloper 10<em>g</em></span></a>Q?span class="bodycopy">改变您对 Java 开发的看法</span> </p> <p><a target="_blank"><span id="wmqeeuq" class="bodylink">Oracle JDeveloper 10<em>g</em> 中的监测?/span></a>Q?<span id="wmqeeuq" class="bodycopy">该监器利用 Java 虚拟Z的某些特性,使您能够发现应用E序代码中的~程~陷、性能问题以及内存泄漏?可以监器与调试器?CodeCoach 一起用来q行功能强大且有效的应用E序代码故障排除?了解更多有关事g监测、执行监以及内存监的信息?</span></p> </td> </tr> </tbody> </table> <span id="wmqeeuq" class="bodycopy">所有这一切意味着您不需要一个决{树来决定是使用同步?Map q是使用非同步的 MapQ?而只需使用 ConcurrentHashMap?当然Q在某些情况下,使用 ConcurrentHashMap q不合适?但这些情况很见Qƈ且应具体情况具体处理?q就是监的用途?/span> <p> </p> <p><span id="wmqeeuq" class="parahead1">l束?/span> </p> <p><span id="wmqeeuq" class="bodycopy">通过 Oracle JDeveloper 可以非常L地创Z个用于比较各U?Map 性能的测试类?更重要的是,集成良好的监器可以在开发过E中快速、轻村֜识别性能瓉 - 集成?IDE 中的监测器通常被较频繁C用,以便帮助构徏一个成功的工程?现在Q您已经拥有了一个监器q了解了有关通用 Map 及其性能的基知识Q可以开始运行您自己的测试,以查明您的应用程序是否因 Map 而存在瓶颈以及在何处需要更Ҏ使用?Map?</span></p> <p><span id="wmqeeuq" class="bodycopy">以上内容介绍了通用 Map 及其性能的基知识?当然Q有关特?Map 实现以及如何Ҏ不同的需求用它们还存在更多复杂和值得x的事,q些在本文W?2 部分中介l?/span> </p> <hr /> <span id="wmqeeuq" class="boldbodycopy">Jack Shirazi</span><span id="wmqeeuq" class="bodycopy"> ?O'Reilly ?#8220;<span id="wmqeeuq" class="italicbodycopy">Java 性能调整</span><span id="wmqeeuq" class="bodycopy">”的作者,以及受欢q的 JavaPerformanceTuning.com |站Q提?Java 性能信息的全球知名站点)的ȝ?Jack ?Java 性能领域提供咨询q著书立说?他还监督 JavaPerformanceTuning.com 提供的信息,其中包括每年大约发布 1000 条性能技巧以及许多有x能工具、讨论组{内容的文章?Jack 早年q曾发布有关蛋白质结构预以及黑z热力学斚w的文章,而且在其I闲时还Ҏ?Perl5 核心模块作出了A献?/span> <br /> <br /> <a >摘自:http://www.oracle.com/technology/global/cn/pub/articles/maps1.html</a></span> <img src ="http://www.aygfsteel.com/association/aggbug/184901.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/association/" target="_blank">扬扬</a> 2008-03-09 22:04 <a href="http://www.aygfsteel.com/association/archive/2008/03/09/184901.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>AraryList学习ȝhttp://www.aygfsteel.com/association/archive/2008/03/08/184646.html扬扬扬扬Sat, 08 Mar 2008 02:48:00 GMThttp://www.aygfsteel.com/association/archive/2008/03/08/184646.htmlhttp://www.aygfsteel.com/association/comments/184646.htmlhttp://www.aygfsteel.com/association/archive/2008/03/08/184646.html#Feedback0http://www.aygfsteel.com/association/comments/commentRss/184646.htmlhttp://www.aygfsteel.com/association/services/trackbacks/184646.html
AraryList学习ȝ
在大多数的计机语言中,我们在申明一个数l的时候必首先固定数l的大小Q否则编译会出错Q但是在很多时候,我们事先q不能确定数l的大小Q这时ؓ了保证程序能够顺利的q行我们可能不得不尽量将数组的长度定的很大,q样当数l的实际长度比较时Q就会浪Ҏ很多资源。ؓ了解军_E序q行时动态改变数l大地问题Q在java中提供了q样一个类ArrayListQ它能够实现与数l同L功能Qƈ能够动态地改变大小Q就像一个能够自׃׾~的容器一P如气球,呵呵?br /> 1Q?工作原理
在ArrayList有一个内部数l,专门用来存放攑֜ArrayList中的对象的reference。我
们不断调用ArrayList的add(Object object)Ҏ增加对象Q最l那个内部数l会fullQ这个时?#8220;奇”发生了,ArrayList会自动创Z个更大的内部数组把那些references从较的数组中拷贝过来同时把要add的那个对象也塞进去,当然q样会引起额外的开销?br /> 从这个原理来看,我认为在使用ArrayList的时候最好在构造它的时候指定一个初始容量或者通过调用ensureCapacity(int i)指定一个容易,q样在达到预讄定w之前Q都不会有额外的开销Q否则的话每增加一个新的对象都会引起额外的开销。当ArrayList的大?size)不会再发生变化时Q我们可以调用ArrayList的trimToSize()Ҏ来降低ArrayList的存储容量至其实际存储容?即size的大?。打个比方,我们初始化一个ArrayList时指定了其容量ؓ100Q但最l它只存放了60个对象,q个时候通过调用trimToSize()ҎQ就可以刚好把存储空间调整ؓ存放60个对象所需的大,多余的空间将由垃圑֛收器负责回收。请注意Q只有当你确定ArrayList的大?size)不再变化的时候才调用trimToSize()ҎQ否则,当你再增加新的对象就会引起额外的开销?br /> 2Q?操作ArrayList
在ArrayList被构造好之后Q我们就可以利用它的Ҏ对其中的对象q行操作了,包括
增删Ҏ{等。通过使用泛型Q我们可以很好的把ArrayList灉|的增长性和数组方便的存取访问结合v来。例如,我声明了一个泛型,ArrayList<Stirng> test =new ArrayList<String>();在通过addҎ加入了若q个String对象后,可以通过如下代码把其转化Z个String数组QString str[]=new String[test.size()];test.toArray(str)。这样test中的元素都到str中了Q可以很方便的存取了?注:泛型是JDK5.0的新Ҏ,以后会专门单独学习ȝ)

本脓来自ZDNetChina中文C֌ http://bbs.zdnet.com.cn ,本脓地址Qhttp://bbs.zdnet.com.cn/viewthread.php?tid=226817

 

 



扬扬 2008-03-08 10:48 发表评论
]]>
使用JDOM操作XMLpd文章?使用JDOM和XPATHl合查询 http://www.aygfsteel.com/association/archive/2008/03/07/184567.html扬扬扬扬Fri, 07 Mar 2008 09:46:00 GMThttp://www.aygfsteel.com/association/archive/2008/03/07/184567.htmlhttp://www.aygfsteel.com/association/comments/184567.htmlhttp://www.aygfsteel.com/association/archive/2008/03/07/184567.html#Feedback0http://www.aygfsteel.com/association/comments/commentRss/184567.htmlhttp://www.aygfsteel.com/association/services/trackbacks/184567.html 使用JDOM操作XMLpd文章?使用JDOM和XPATHl合查询

package jing.xml;
/**
* <p>Title: 使用JDOM和XPATHl合查询</p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2004</p>
* <p>Company: </p>
* @author Ƨ朝?13873195792
* @version 1.0
*/
import org.jdom.*;
import org.jdom.output.*;
import org.jdom.input.*;
import org.jdom.xpath.*;

import java.io.*;
import java.util.*;

public class TreeXML {
public TreeXML() {
}

public static void main(String[] args) throws Exception {
SAXBuilder sb = new SAXBuilder(); // 新徏立构造器
Document doc = sb.build(new FileInputStream("company.xml")); // d文g
Element root = doc.getRootElement(); // 获得根元素element
List row = root.getChildren(); //取得节点列表 ~程大本营HTTp://www.timihome.net
//按CID查找直接定位到ROW元素q回的是集合
List find = XPath.selectNodes(root, "/ROOT/ROW[@PID=&acute;1&acute;]");
for (int i = 0; i < find.size(); i++) {
Element findelement = (Element) find.get(i);
System.out.println(findelement.getAttributeValue("CNAME"));
}

//多条件查?br /> Element findelement=(Element)XPath.selectSingleNode(root,"/ROOT/ROW[@PID=&acute;3&acute;][@CID=&acute;10&acute;]");
System.out.println(findelement.getAttributeValue("CNAME"));

XMLOutputter outp = new XMLOutputter(Format.getPrettyFormat()); //格式华输出,产生~进和换?br />
//重新格式?br /> Format format = outp.getFormat();
format.setEncoding("GB2312");
format.setExpandEmptyElements(true);
outp.setFormat(format);

//outp.output(doc, new FileOutputStream("jdomcompany.xml")); //输出XML文档
outp.output(doc, System.out);
System.out.println("JDOM操作XML文档完毕Q?);
}

~程大本?/p>
}

  

   本页摘自URL地址Q?http://www.timihome.net/html/java/java_j2ee/20070625/3824.html


扬扬 2008-03-07 17:46 发表评论
]]>
使用JDOM操作XMLpd文章?q面式XML文g转层叠式XML文ghttp://www.aygfsteel.com/association/archive/2008/03/07/184565.html扬扬扬扬Fri, 07 Mar 2008 09:45:00 GMThttp://www.aygfsteel.com/association/archive/2008/03/07/184565.htmlhttp://www.aygfsteel.com/association/comments/184565.htmlhttp://www.aygfsteel.com/association/archive/2008/03/07/184565.html#Feedback0http://www.aygfsteel.com/association/comments/commentRss/184565.htmlhttp://www.aygfsteel.com/association/services/trackbacks/184565.html 使用JDOM操作XMLpd文章?q面式XML文g转层叠式XML文g
package jing.xml;
/**
* <p>Title: q面式XML文g转层叠式XML文g</p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2004</p>
* <p>Company: </p>
* @author Ƨ朝?13873195792
* @version 1.0
*/
import org.jdom.*;
import org.jdom.output.*;
import org.jdom.input.*;
import org.jdom.xpath.*;
import java.io.*;
import java.util.*;

public class xmltotree {
public SAXBuilder sb = null;
public Document doc = null;
public Element root = null;
public xmltotree() throws Exception {
sb = new SAXBuilder(); // 新徏立构造器
doc = sb.build(new FileInputStream("company.xml")); // d文g
root = doc.getRootElement(); // 获得根元素element

}

public void Listelemnet(String pid, Element element) throws Exception { 不能采集本站
List find = XPath.selectNodes(root, "/ROOT/ROW[@PID=&acute;" + pid + "&acute;]");
int rowcount = find.size();
for (int i = 0; i < rowcount; i++) {
Element findelement = (Element) find.get(i);
Element element0 = new Element("ROW");
List attrib = findelement.getAttributes();
int j = attrib.size();
for (int h = 0; h < j; h++) {
Attribute attribute = (Attribute) attrib.get(h);
element0.setAttribute(
attribute.getName(),
attribute.getValue());

}
element.addContent(element0);
Listelemnet(findelement.getAttributeValue("CID"), element0);
}
}

public static void main(String[] args) throws Exception {
xmltotree bb = new xmltotree();

Element roote = new Element("ROOT");
Document tdocument = new Document(roote); //创徏文档ROOT元素

bb.Listelemnet("0", roote);

XMLOutputter outp = new XMLOutputter(Format.getPrettyFormat()); //格式华输出,产生~进和换?
~程大本营HTTp://www.timihome.net

Format format = outp.getFormat();
format.setEncoding("GB2312"); //讄语言
format.setExpandEmptyElements(true); //讄输出I元素ؓ<sample></sample>格式
outp.setFormat(format);
outp.output(tdocument, new FileOutputStream("companytree.xml")); //输出XML文档
//outp.output(tdocument,System.out);
System.out.print("XML 文档生成完毕Q?);
}
} 
  

   本页摘自URL地址Q?http://www.timihome.net/html/java/java_j2ee/20070625/3823.html


扬扬 2008-03-07 17:45 发表评论
]]>
使用JDOM操作XMLpd文章?从数据库中读取记录集到^面式XML?/title><link>http://www.aygfsteel.com/association/archive/2008/03/07/184564.html</link><dc:creator>扬扬</dc:creator><author>扬扬</author><pubDate>Fri, 07 Mar 2008 09:43:00 GMT</pubDate><guid>http://www.aygfsteel.com/association/archive/2008/03/07/184564.html</guid><wfw:comment>http://www.aygfsteel.com/association/comments/184564.html</wfw:comment><comments>http://www.aygfsteel.com/association/archive/2008/03/07/184564.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/association/comments/commentRss/184564.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/association/services/trackbacks/184564.html</trackback:ping><description><![CDATA[  <p class="MsoNormal" style="text-align: left; mso-pagination: widow-orphan" align="left"><span style="font-size: 9pt; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">使用<span lang="EN-US">JDOM</span>操作<span lang="EN-US">XML</span>pd文章?从数据库中读取记录集到^面式<span lang="EN-US">XML</span>文g<span lang="EN-US"><br /> package jing.xml;<br /> <br /> /**<br /> * <p>Title: </span>从数据库中读取记录集到^面式<span lang="EN-US">XML</span>文g<span lang="EN-US"></p><br /> * <p>Description: </p><br /> * <p>Copyright: Copyright (c) 2004</p><br /> * <p>Company: </p><br /> * @author </span>Ƨ朝?span lang="EN-US"> 13873195792<br /> * @version 1.0<br /> */<br /> <br /> //</span>数据库表输Zؓ<span lang="EN-US">XML</span>文档<span lang="EN-US"><br /> import org.jdom.*;<br /> import org.jdom.output.*;<br /> import java.sql.*;<br /> import java.io.*;<br /> <br /> public class databasetoxml {<br /> public databasetoxml() {<br /> }<br /> <br /> public static void main(String[] args) throws Exception {<br /> Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();<br /> String url = "jdbc:oracle:thin:@192.168.128.250:1521:sample";<br /> Connection conn = DriverManager.getConnection(url, "scott", "tiger"); <o:p></o:p></span></span></p> <p class="MsoNormal" style="text-align: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="font-size: 9pt; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">PreparedStatement pstmt = conn.prepareStatement(<br /> "select * from company order by cid",<br /> ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);<br /> ResultSet rs = pstmt.executeQuery();<br /> Document document = new Document(new Element("ROOT")); //</span><span style="font-size: 9pt; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">创徏文档<span lang="EN-US">ROOT</span>元素<span lang="EN-US"><br /> ResultSetMetaData rmd = rs.getMetaData();<br /> int colcount = rmd.getColumnCount();<br /> Element elemnetcol = new Element("COLTYPE");<br /> for (int i = 1; i <= colcount; i++) { //</span>列属?span lang="EN-US"><br /> elemnetcol.setAttribute(rmd.getColumnName(i),<br /> rmd.getColumnTypeName(i));<br /> }<br /> document.getRootElement().addContent(elemnetcol);<br /> <br /> while (rs.next()) { //</span>不确定表生成<span lang="EN-US">XML</span>记录<span lang="EN-US"><br /> Element element0 = new Element("ROW");<br /> for (int i = 1; i <= colcount; i++) {<br /> element0.setAttribute(rmd.getColumnName(i),(rs.getString(i)==null?"":rs.getString(i)));<br /> }<br /> document.getRootElement().addContent(element0);<br /> }<br /> rs.close();<br /> pstmt.close();<br /> conn.close();<br /> XMLOutputter outp = new XMLOutputter(Format.getPrettyFormat()); //</span>格式华输出,产生~进和换?<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="text-align: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="font-size: 9pt; font-family: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">Format format = outp.getFormat();<br /> format.setEncoding("GB2312"); //</span><span style="font-size: 9pt; font-family: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">讄语言<span lang="EN-US"><br /> format.setExpandEmptyElements(true); //</span>讄输出I元素ؓ<span lang="EN-US"><sample></sample></span>格式<span lang="EN-US"><br /> outp.setFormat(format);<br /> <br /> outp.output(document, new FileOutputStream("company.xml")); //</span>输出<span lang="EN-US">XML</span>文档<span lang="EN-US"><br /> System.out.print("XML </span>文档生成完毕Q?span lang="EN-US">");<br /> }<br /> }</span> </span></p> 本页摘自URL地址Q?<script language="javascript">document.write(location.href);</script>http://www.timihome.net/html/java/java_j2ee/20070625/3822.html <img src ="http://www.aygfsteel.com/association/aggbug/184564.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/association/" target="_blank">扬扬</a> 2008-03-07 17:43 <a href="http://www.aygfsteel.com/association/archive/2008/03/07/184564.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用JDOM操作XMLpd文章一 http://www.aygfsteel.com/association/archive/2008/03/07/184563.html扬扬扬扬Fri, 07 Mar 2008 09:41:00 GMThttp://www.aygfsteel.com/association/archive/2008/03/07/184563.htmlhttp://www.aygfsteel.com/association/comments/184563.htmlhttp://www.aygfsteel.com/association/archive/2008/03/07/184563.html#Feedback0http://www.aygfsteel.com/association/comments/commentRss/184563.htmlhttp://www.aygfsteel.com/association/services/trackbacks/184563.html 
使用JDOM操作XMLpd文章一 从数据库中读取记录集到层叠式XML?/center>

注意本系列文件用环?ORACLE数据和JDOM1.0版本
总计四篇文g中都使用C下表和数据?
Oracle表结构如下:
/*此表中最关键的就是CID和PID两个字段Q其它的跟据需要可以增减字D?/
CREATE TABLE SCOTT.COMPANY
(
CID NUMBER(4) NOT NULL, /*记录ID?/
CNAME VARCHAR2(20) NOT NULL, /*名字*/
DESCPT VARCHAR2(40) NULL, /*描述*/
PID NUMBER(4) NULL /*父ID?/
);
/*向表中插入数?/
INSERT
INTO company( company.cid, company.cname, company.descpt, company.pid )
VALUES( 1, ´中南q特´, ´湖南省长沙市´, 0 );
INSERT
INTO company( company.cid, company.cname, company.descpt, company.pid )
VALUES( 2, ´pȝ集成´, ´各种pȝ集成´, 1 );
INSERT
INTO company( company.cid, company.cname, company.descpt, company.pid )
VALUES( 3, ´软g开?#180;, ´软g开?#180;, 1 );
INSERT
INTO company( company.cid, company.cname, company.descpt, company.pid )
VALUES( 6, ´NetOA开发组´, ´Net目开?#180;, 3 );
INSERT
INTO company( company.cid, company.cname, company.descpt, company.pid )
VALUES( 7, ´王军´, ´J2EEl王?#180;, 5 );
INSERT
INTO company( company.cid, company.cname, company.descpt, company.pid )
VALUES( 8, ´湘红´, ´J2EEl湘U?#180;, 5 );
INSERT
INTO company( company.cid, company.cname, company.descpt, company.pid )
VALUES( 9, ´Windows集成l?#180;, ´Windowspȝ集成´, 2 );
INSERT
INTO company( company.cid, company.cname, company.descpt, company.pid )
VALUES( 10, ´Linux集成l?#180;, ´Linux相关pȝ集成´, 2 );
INSERT
INTO company( company.cid, company.cname, company.descpt, company.pid )
VALUES( 11, ´王非´, ´Linuxl?#180;, 10 );
INSERT
INTO company( company.cid, company.cname, company.descpt, company.pid )
VALUES( 12, ´张万´, ´NetOAl?#180;, 6 );
INSERT
INTO company( company.cid, company.cname, company.descpt, company.pid )
VALUES( 13, ´李兵´, ´J2EE李兵´, 5 );
INSERT
INTO company( company.cid, company.cname, company.descpt, company.pid )
VALUES( 14, ´武成´, ´Linuxl?#180;, 10 );
INSERT
INTO company( company.cid, company.cname, company.descpt, company.pid )
VALUES( 4, ´Z?#180;, ´公司Z理部门´, 1 );
INSERT
INTO company( company.cid, company.cname, company.descpt, company.pid )
VALUES( 5, ´J2EE目l?#180;, ´J2EE目开?#180;, 3 );
INSERT
INTO company( company.cid, company.cname, company.descpt, company.pid )
VALUES( 15, ´王义´, ´J2EEl王?#180;, 5 );


package jing.xml;

/**
* <p>Title: 从数据库中读取记录集到层叠XML文g</p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2004</p>
* <p>Company: </p>
* @author Ƨ朝?13873195792
* @version 1.0
*/

//数据库表输ZؓXML文档
import org.jdom.*;
import org.jdom.output.*;
import java.sql.*;
import java.io.*;

public class dbtoxmltree {
public String url = null;
public Connection conn = null;
public Document document = null;
public dbtoxmltree() throws Exception {
Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
url = "jdbc:oracle:thin:@192.168.128.250:1521:sample";
conn = DriverManager.getConnection(url, "scott", "tiger");
}

public void digui(int pid,Element element) throws Exception {
String sql = "select * from company where pid=" + pid;
PreparedStatement pstmt = conn.prepareStatement(
sql,
ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
ResultSet rs = pstmt.executeQuery();
ResultSetMetaData rmd = rs.getMetaData();
int colcount = rmd.getColumnCount();
while (rs.next()) {
Element element0 = new Element("DSTree");
for(int i=1;i<=colcount;i++){
element0.setAttribute(rmd.getColumnName(i),
(rs.getString(i) == null ? "" :
rs.getString(i)));
}
element0.setAttribute("open","false");
element.addContent(element0);
digui(rs.getInt("CID"),element0);
}
rs.close();
pstmt.close();

}

public static void main(String[] args) throws Exception {
dbtoxmltree dbxml = new dbtoxmltree();
Element root=new Element("DSTreeRoot");
dbxml.document=new Document(root);//创徏文档ROOT元素
PreparedStatement pstmt = dbxml.conn.prepareStatement(
"select * from company order by cid",
ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
ResultSet rs = pstmt.executeQuery();

ResultSetMetaData rmd = rs.getMetaData();
int colcount = rmd.getColumnCount();
Element elementcol = new Element("COLTYPE");
for (int i = 1; i <= colcount; i++) { //列属?
elementcol.setAttribute(rmd.getColumnName(i),
rmd.getColumnTypeName(i));
}
root.addContent(elementcol);
rs.close();
pstmt.close();

dbxml.digui(0,root);

dbxml.conn.close();
XMLOutputter outp = new XMLOutputter(Format.getPrettyFormat()); //格式华输出,产生~进和换?
Format format = outp.getFormat();
format.setEncoding("GB2312"); //讄语言
format.setExpandEmptyElements(true); //讄输出I元素ؓ<sample></sample>格式
outp.setFormat(format);

outp.output(dbxml.document, new FileOutputStream("companytree.xml")); //输出XML文档

System.out.print("XML 文档生成完毕Q?);
}
}
摘自:
http://www.timihome.net/html/java/java_j2ee/20070625/3821.html



扬扬 2008-03-07 17:41 发表评论
]]>XPath定位路径http://www.aygfsteel.com/association/archive/2008/03/05/183856.html扬扬扬扬Wed, 05 Mar 2008 02:16:00 GMThttp://www.aygfsteel.com/association/archive/2008/03/05/183856.htmlhttp://www.aygfsteel.com/association/comments/183856.htmlhttp://www.aygfsteel.com/association/archive/2008/03/05/183856.html#Feedback0http://www.aygfsteel.com/association/comments/commentRss/183856.htmlhttp://www.aygfsteel.com/association/services/trackbacks/183856.htmlPrevious Next

一个定位\径表辑ּq回一个节炚w?/p>


定位路径表达?/h2>

一个定位\径可以是l对的或相对的?/p>

l对定位路径以一个斜U(/Q开_而相对定位\径没有。两U情况下Q定位\径由一个或多个定位步骤l成Q每个步骤由一个斜U分隔:

一个绝对定位\径:
/step/step/...
一个相对定位\径:
step/step/...

定位步骤从左到右Q依ơ按序计算。每个步骤根据当前节炚w的节点计。如果定位\径是l对的,那么当前节点集包含根节点。如果定位\径是相对的,那么当前节点集包含用表辑ּ的节炏V定位步骤包括:

  • 一个uQ指定当前定位步骤和当前节点选择的节炚w的树关系Q?
  • 一个节Ҏ试(指定定位步骤选择的节点的节点cd和扩展名Q?
  • 零或多个预测Q用表辑ּq一步抽取定位步骤选定的节炚wQ?

一个定位步骤的语法为:

轴名::节点试[预测]

CZ:

child::price[price=9.90]


轴和节点试

一个u定义相对于当前节点的节点集。节Ҏ试用于识别u内的一个节炏V我们可以通过名或cd来执行一个节Ҏ试?/p>
轴名 描述
ancestor

包含当前节点的所有祖先节?/p>

注意Q?/strong> 除非当前节点是根节点Q否则这个u始终包括根节?/p>

ancestor-or-self 包括当前节点和所有当前节点的先节点
attribute 包含当前节点所有的属?/td>
child 包含当前节点所有的子节?/td>
descendant

包含当前节点的所有后代节?/p>

注意Q?/strong>q个轴不包括属性或命名I间节点

descendant-or-self 包含当前节点本n和所有它的后代节?/td>
following 包含文档中当前节点的l束标记后所有节?/td>
following-sibling 包含当前节点后所有的同层节点

注意Q?/strong> 如果当前节点是属性节Ҏ命名I间节点Q那么这个u为空

namespace 包含当前节点的所有命名空间节?/td>
parent 包含当前节点的所有父节点
preceding 包含文档中当前节点的开始标C前的所有节?/td>
preceding-sibling 包含当前节点之前的所有同层节?

注意Q?/strong> 如果当前节点是一个属性节Ҏ者命名空间节点,那么q个轴ؓI?/p>

self 当前节点本n

CZ

CZ l果
child::cd 选择当前节点的子节点中所有的cd元素Q如果当前节Ҏ有cd子节点,那么返回一个空节点集)
attribute::src 选择当前节点的src属性(如果当前节点没有src属性,那么q回一个空节点集)
child::* 选择当前节点的所有子元素
attribute::* 选择当前节点的所有属?/td>
child::text() 选择当前节点的文本节点子节点
child::node() 选择当前节点的所有子节点
descendant::cd 选择当前节点的后代中所有cd元素
ancestor::cd 选择当前节点的祖先节点中所有cd元素
ancestor-or-self::cd 选择当前节点的祖先节点中所有cd元素Q如果当前节Ҏ一个cd元素Q那么也包括当前节点
child::*/child::price

选择当前节点的孙子节点中所有price元素

/ 选择文档?/td>


预测

一个预过滤一个节炚wZ个新的节炚w。预放在方括号Q[]Q中?/p>

CZ

CZ l果
child::price[price=9.90] 选择当前节点的子节点中price元素{于9.90的所有h格元?/td>
child::cd[position()=1] 选择当前节点的第一个cd子元?/td>
child::cd[position()=last()] 选择当前节点的最后一个cd子元?/td>
child::cd[position()=last()-1] 选择当前节点的倒第二个cd元素
child::cd[position()<6] 选择当前节点的前五个cd元素
/descendant::cd[position()=7] 选择文档中第七个cd元素
child::cd[attribute::type="classic"] 选择当前节点的所有type属性等于classic的cd子节?/td>


定位路径~写语法

定位路径可以用羃写表C?/p>

最重要的羃写ؓQchild::可以从一个定位步骤中省略?/p>
~写 含义 CZ
none child:: cd是child::cd的简?/td>
@ attribute:: cd[@type="classic"]是child::cd[attribute::type="classic"]的简?/td>
. self::node() .//cd是self::node()/descendant-or-self::node()/child::cd的简?/td>
.. parent::node()

../cd是parent::node()/child::cd的简?/p>

// /descendant-or-self::node()/ //cd?descendant-or-self::node()/child::cd的简?/td>

CZ

CZ l果
cd 选择当前节点的子节点中所有cd元素
* 选择当前节点的所有子元素
text() 选择当前节点的子节点中所有文本节?/td>
@src 选择当前节点的所有src属?/td>
@* 选择当前节点的所有属?/td>
cd[1] 选择当前节点的第一个cd子节?/td>
cd[last()] 选择当前节点的最后一个cd子节?/td>
*/cd 选择当前节点的所有cd孙子节点
/book/chapter[3]/para[1] 选择book节点的第三个chapter子节点的W一个para子节?/td>
//cd 选择所有文档根的所有cd元素后代Q因而在同一个文档选择所有的cd元素作ؓ当前节点
. 选择当前节点
.//cd 选择当前节点的cd元素后代
.. 选择当前节点的父亲节?/td>
../@src 选择当前节点的父节点的src属?/td>
cd[@type="classic"] 选择当前节点的子节点中type属性等于classic的所有cd子节?/td>
cd[@type="classic"][5] 选择当前节点的子节点中type属性等于classic的cd子节点中W五个节?/td>
cd[5][@type="classic"] 选择当前节点的第五个cd子节点,如果该子节点的type属性等于classic
cd[@type and @country] 选择当前节点的子节点中由type和country两个属性的所有cd子节?/td>
摘自:
http://61.139.52.111:8090/kj/Manfeel/oltl/session1/session1-p03.htm

Previous Next

扬扬 2008-03-05 10:16 发表评论
]]>
XPath语法http://www.aygfsteel.com/association/archive/2008/03/05/183853.html扬扬扬扬Wed, 05 Mar 2008 02:12:00 GMThttp://www.aygfsteel.com/association/archive/2008/03/05/183853.htmlhttp://www.aygfsteel.com/association/comments/183853.htmlhttp://www.aygfsteel.com/association/archive/2008/03/05/183853.html#Feedback0http://www.aygfsteel.com/association/comments/commentRss/183853.htmlhttp://www.aygfsteel.com/association/services/trackbacks/183853.htmlXPath语法 Previous Next

XPath使用路径表达式定位XML文档内的节点?/p>


XMLCZ文档

我们用如下的单XML文档描述XPath语法Q?/p>
<?xml version="1.0" encoding="ISO-8859-1"?>
            <catalog>
            <cd country="USA">
            <title>Empire Burlesque</title>
            <artist>Bob Dylan</artist>
            <price>10.90</price>
            </cd>
            <cd country="UK">
            <title>Hide your heart</title>
            <artist>Bonnie Tyler</artist>
            <price>9.90</price>
            </cd>
            <cd country="USA">
            <title>Greatest Hits</title>
            <artist>Dolly Parton</artist>
            <price>9.90</price>
            </cd>
            </catalog>


定位节点

XML文档可以看作是一个节ҎQ非常类g计算机的树Ş文g夹)?/p>

XPath使用模式表达式识别XML文档里的节点。一个XPath模式是一个以斜线分隔的子元素名列表,用于描述XML文档的一个\径。模式选择匚w该\径的元素?/p>

下面的XPath表达式选择catalog元素的所有cd元素的所有price元素Q?/p>

/catalog/cd/price

注意Q?/strong> 如果路径以一个斜U(/Q开始,代表相对于一个元素的l对路径Q?/strong>

注意Q?/strong> 如果路径以两个斜U开始,表示选择文档中所有符合该条g的元素(即它们在不同的XML树的U别Q!

下面的XPath表达式选择文档中所有的cd元素Q?/p>

//cd



选择未知元素

通配W(*Q用来选择未知XML元素?/p>

下面的XPath表达式选择catalog元素下所有cd元素的所有子元素Q?/p>

/catalog/cd/*

下面的XPath表达式选择catalog元素的孙子元素下所有的price元素Q?/p>

/catalog/*/price

下面的XPath表达式选择有两个祖先的所有price元素Q?/p>

/*/*/price

下面的XPath表达式选择文档中所有元素:

//*



选择分支

通过在XPath表达式中使用Ҏ号可以进一步地指定一个元素?/p>

下面的XPath表达式选择catalog元素的第一个cd子元素:

/catalog/cd[1]

下面的XPath表达式选择catalog元素的最后一个子元素Q注意:没有first()函数Q?

/catalog/cd[last()]

下面的XPath表达式选择catalog元素下含有price子元素的所有cd元素Q?/p>

/catalog/cd[price]

下面的XPath表达式选择catalog元素下子元素price值等?0.90的所有cd元素Q?/p>

/catalog/cd[price=10.90]

下面的XPath表达式选择catalog元素下price元素值等?0.90的所有cd元素的price元素Q?/p>

/catalog/cd[price=10.90]/price



选择多个路径

通过在XPath表达式中使用|操作W,可以选择多个路径?/p>

下面的XPath表达式选择catalog元素的子元素cd元素下所有的title和artist元素Q?/p>

/catalog/cd/title | /catalog/cd/artist

下面的XPath表达式选择文档中所有title元素和artist元素Q?/p>

//title | //artist

下面的XPath表达式选择文档中所有title、artist、price元素Q?/p>

//title | //artist | //price

下面的XPath表达式选择catalog元素的cd子元素下所有的title元素Q以及文档中所有的artist元素Q?/p>

/catalog/cd/title | //artist



选择属?/h2>

在XPath中,所有属性以前缀@指定?/p>

下面的XPath表达式选择所有名为country的属性:

//@country

下面的XPath表达式选择所有含有country属性的cd元素Q?/p>

//cd[@country]

下面的XPath表达式选择选择所有含有Q何属性的cd元素Q?/p>

//cd[@*]

下面的XPath表达式选择属性country{于UK的所有cd元素Q?/p>

//cd[@country='UK']

摘自:
http://61.139.52.111:8090/kj/Manfeel/oltl/session1/session1-p02.htm


扬扬 2008-03-05 10:12 发表评论
]]> վ֩ģ壺 | ͨ| ͩ| | Զ| Ȫ| | կ| | | | | | | | ɽ| ӳ| ɽ| ϼ| Ӽ| | Ƕ| з| | ȷɽ| | κ| ʱ| | | °Ͷ| º| | | | ˼| ֦| | | | ٳ|