﻿<?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-java 友人帮-文章分类-java SE</title><link>http://www.blogjava.net/jzone/category/39472.html</link><description>java web, java wap ..My laboratory..</description><language>zh-cn</language><lastBuildDate>Mon, 14 Jun 2010 15:54:48 GMT</lastBuildDate><pubDate>Mon, 14 Jun 2010 15:54:48 GMT</pubDate><ttl>60</ttl><item><title>commons-lang-2.4.jar 包常用方法集锦</title><link>http://www.blogjava.net/jzone/articles/323107.html</link><dc:creator>Gavin.lee</dc:creator><author>Gavin.lee</author><pubDate>Tue, 08 Jun 2010 16:04:00 GMT</pubDate><guid>http://www.blogjava.net/jzone/articles/323107.html</guid><description><![CDATA[<p>import java.util.Iterator;<br />
import java.util.Map;</p>
<p>import org.apache.commons.lang.ArrayUtils;<br />
import org.apache.commons.lang.ClassUtils;<br />
import org.apache.commons.lang.RandomStringUtils;<br />
import org.apache.commons.lang.StringEscapeUtils;<br />
import org.apache.commons.lang.StringUtils;<br />
import org.apache.commons.lang.math.NumberUtils;</p>
<p>/**<br />
&nbsp;* commons-lang-2.4.jar 包常用方法集锦<br />
&nbsp;*<br />
&nbsp;*/<br />
public class CommonsLang {</p>
<p>&nbsp;public static void main(String[] args) {<br />
&nbsp;&nbsp;String[] test = {"33", "ddffd"};<br />
&nbsp;&nbsp;String[] test1 = {"ddffd", "33"};<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;// 1.判断两个数据是否相等<br />
&nbsp;&nbsp;System.out.println(ArrayUtils.isEquals(test, test1));<br />
&nbsp;&nbsp;// 2.{33,ddffd} 将数组内容以{,}形式输出．<br />
&nbsp;&nbsp;System.out.println(ArrayUtils.toString(test));<br />
&nbsp;&nbsp;Map map = ArrayUtils.toMap(new String[][] { { "RED", "#FF0000" }, { "GREEN", "#00FF00" }, { "BLUE", "#0000FF" } });<br />
&nbsp;&nbsp;// 3.toMap 一个数组，但每个元素 Each element of the array<br />
&nbsp;&nbsp;// must be either a {@link java.util.Map.Entry} or an Array,<br />
&nbsp;&nbsp;// 方式一 下面是遍历map的方式，取得其keySet.iterator();<br />
&nbsp;&nbsp;Iterator it = map.keySet().iterator();<br />
&nbsp;&nbsp;while (it.hasNext()) {<br />
&nbsp;&nbsp;&nbsp;String key = (String) it.next();<br />
&nbsp;&nbsp;&nbsp;// it.next()只包含key<br />
&nbsp;&nbsp;&nbsp;System.out.println("key:" + key + "value:" + map.get(key));<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;// 方式二,取得其entrySet()集合,<br />
&nbsp;&nbsp;Iterator it1 = map.entrySet().iterator();<br />
&nbsp;&nbsp;while (it.hasNext()) {<br />
&nbsp;&nbsp;&nbsp;Map.Entry entry = (Map.Entry) it1.next();<br />
&nbsp;&nbsp;&nbsp;// it1.next()中包含key和value<br />
&nbsp;&nbsp;&nbsp;System.out.println("key :" + entry.getKey() + "value :"&nbsp;+ entry.getValue());<br />
&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;// 4.取得类名<br />
&nbsp;&nbsp;System.out.println(ClassUtils.getShortClassName(Test.class));<br />
&nbsp;&nbsp;// 取得其包名<br />
&nbsp;&nbsp;System.out.println(ClassUtils.getPackageName(Test.class));<br />
&nbsp;&nbsp;// 5.NumberUtils<br />
&nbsp;&nbsp;System.out.println(NumberUtils.stringToInt("6"));<br />
&nbsp;&nbsp;System.out.println(NumberUtils.stringToInt("7", 10));<br />
&nbsp;&nbsp;// 6.五位的随机字母和数字<br />
&nbsp;&nbsp;System.out.println(RandomStringUtils.randomAlphanumeric(5));<br />
&nbsp;&nbsp;// 7.StringEscapeUtils<br />
&nbsp;&nbsp;System.out.println(StringEscapeUtils.escapeHtml("&lt;html&gt;"));<br />
&nbsp;&nbsp;// 输出结果为&amp;lt;html&amp;gt;<br />
&nbsp;&nbsp;System.out.println(StringEscapeUtils.escapeJava("String"));<br />
&nbsp;&nbsp;// 8.StringUtils,判断是否是空格字符<br />
&nbsp;&nbsp;System.out.println(StringUtils.isBlank("&nbsp;&nbsp; "));<br />
&nbsp;&nbsp;// 将数组中的内容以,分隔<br />
&nbsp;&nbsp;System.out.println(StringUtils.join(test, ","));<br />
&nbsp;&nbsp;// 在右边加下字符,使之总长度为6<br />
&nbsp;&nbsp;System.out.println(StringUtils.rightPad("abc", 6, 'T'));<br />
&nbsp;&nbsp;// 首字母大写<br />
&nbsp;&nbsp;System.out.println(StringUtils.capitalize("abc"));<br />
&nbsp;&nbsp;// Deletes all whitespaces from a String 删除所有空格<br />
&nbsp;&nbsp;System.out.println(StringUtils.deleteWhitespace("&nbsp;&nbsp; ab&nbsp; c&nbsp; "));<br />
&nbsp;&nbsp;// 判断是否包含这个字符<br />
&nbsp;&nbsp;System.out.println(StringUtils.contains("abc", "ba"));<br />
&nbsp;&nbsp;// 表示左边两个字符<br />
&nbsp;&nbsp;System.out.println(StringUtils.left("abc", 2));<br />
&nbsp;&nbsp;System.out.println(StringUtils.right("abcd", 3));<br />
&nbsp;}<br />
}<br />
</p>
<img src ="http://www.blogjava.net/jzone/aggbug/323107.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jzone/" target="_blank">Gavin.lee</a> 2010-06-09 00:04 <a href="http://www.blogjava.net/jzone/articles/323107.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>String&amp;InputStream的相互转化</title><link>http://www.blogjava.net/jzone/articles/311849.html</link><dc:creator>Gavin.lee</dc:creator><author>Gavin.lee</author><pubDate>Wed, 03 Feb 2010 14:15:00 GMT</pubDate><guid>http://www.blogjava.net/jzone/articles/311849.html</guid><description><![CDATA[1.InputStream ---&gt; String<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InputStream&nbsp;is&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;getMethod.getResponseBodyAsStream();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BufferedReader&nbsp;br&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;BufferedReader(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;InputStreamReader(is,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">UTF-8</span><span style="color: #000000">"</span><span style="color: #000000">));<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringBuffer&nbsp;buffer&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;StringBuffer();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;str&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">""</span><span style="color: #000000">,&nbsp;response&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">""</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_257_307_Open_Image" onclick="this.style.display='none'; Codehighlighter1_257_307_Open_Text.style.display='none'; Codehighlighter1_257_307_Closed_Image.style.display='inline'; Codehighlighter1_257_307_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_257_307_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_257_307_Closed_Text.style.display='none'; Codehighlighter1_257_307_Open_Image.style.display='inline'; Codehighlighter1_257_307_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">((str&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;br.readLine())</span><span style="color: #000000">!=</span><span style="color: #0000ff">null</span><span style="color: #000000">)</span><span id="Codehighlighter1_257_307_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_257_307_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">buffer.append(str).toString();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
<br />
2.String ---&gt;InputStream<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">InputStream&nbsp;stream&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ByteArrayInputStream(</span><span style="color: #000000">""</span><span style="color: #000000">.getBytes());</span></div>
ByteArrayInputStream 是InputStream 的子类<br />
<img src ="http://www.blogjava.net/jzone/aggbug/311849.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jzone/" target="_blank">Gavin.lee</a> 2010-02-03 22:15 <a href="http://www.blogjava.net/jzone/articles/311849.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java 堆与栈的详细介绍</title><link>http://www.blogjava.net/jzone/articles/309598.html</link><dc:creator>Gavin.lee</dc:creator><author>Gavin.lee</author><pubDate>Thu, 14 Jan 2010 15:10:00 GMT</pubDate><guid>http://www.blogjava.net/jzone/articles/309598.html</guid><description><![CDATA[<a href="http://yysct2005.javaeye.com/category/8938">http://yysct2005.javaeye.com/category/8938</a> 
<img src ="http://www.blogjava.net/jzone/aggbug/309598.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jzone/" target="_blank">Gavin.lee</a> 2010-01-14 23:10 <a href="http://www.blogjava.net/jzone/articles/309598.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HttpClient 一文通 （摘）</title><link>http://www.blogjava.net/jzone/articles/309594.html</link><dc:creator>Gavin.lee</dc:creator><author>Gavin.lee</author><pubDate>Thu, 14 Jan 2010 15:08:00 GMT</pubDate><guid>http://www.blogjava.net/jzone/articles/309594.html</guid><description><![CDATA[<p>原文出处--------http://hi.baidu.com/wader2006/blog/item/7e7b3a291f7801fd99250a91.html&nbsp;&nbsp;</p>
<p>虽然用telnet这样的程序都可把页面取回来，但是在与web服务器的交互中，如果涉及cookie或https或ssl等内容，一般功能相对完备的http客户端还是非常必要的。IE或NetScape等浏览器确实不错，可是如果为实现持续互动而在程序调用浏览器，我个人认为其中的工作量还是不小的，这还没考虑版权问题。最好的办法，就是能有一个开源的包，能实现http客户端的功能，供我们开发的程序调用。<a href="http://jakarta.apache.org/commons/httpclient/">httpclient</a>就是这么一个包，我相信可能有比它的实现更好的，但目前我只关注这个。：）<br />
<a name="more">　　下面是nogoop做的功能比较表：<br />
</p>
<table cellspacing="1" cellpadding="4" border="1">
    <tbody>
        <tr>
            <td>Features</td>
            <td>nogoop</td>
            <td>Sun JRE &lt; 1.4.2</td>
            <td>Sun JRE 1.4.2</td>
            <td>Innovation</td>
            <td>Apache/Jakarta</td>
        </tr>
        <tr>
            <td>cookies</td>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
            <td>X</td>
            <td>X</td>
        </tr>
        <tr>
            <td>plug compatible</td>
            <td>X</td>
            <td>X</td>
            <td>X</td>
            <td>X</td>
            <td>[partial]</td>
        </tr>
        <tr>
            <td>true request output stream</td>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
            <td>X</td>
            <td>X</td>
        </tr>
        <tr>
            <td>true response input stream</td>
            <td>X</td>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
            <td>X</td>
            <td>X</td>
        </tr>
        <tr>
            <td>connection keep alive</td>
            <td>X</td>
            <td>X</td>
            <td>X</td>
            <td>X</td>
            <td>X</td>
        </tr>
        <tr>
            <td>connection pool throttling</td>
            <td>X</td>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
            <td>X</td>
        </tr>
        <tr>
            <td>connection/request timeout</td>
            <td>X</td>
            <td>&nbsp;</td>
            <td>X [uns]</td>
            <td>X</td>
            <td>X</td>
        </tr>
        <tr>
            <td>idle connection timeout</td>
            <td>X</td>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
            <td>X</td>
        </tr>
        <tr>
            <td>pipelining of requests</td>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
            <td>X</td>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>alternate DNS resolution (dnsjava)</td>
            <td>X</td>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>SSL</td>
            <td>X</td>
            <td>X</td>
            <td>X</td>
            <td>X</td>
            <td>X</td>
        </tr>
        <tr>
            <td>basic authentication</td>
            <td>X</td>
            <td>X</td>
            <td>X</td>
            <td>X</td>
            <td>X</td>
        </tr>
        <tr>
            <td>digest authentication</td>
            <td>X</td>
            <td>X</td>
            <td>X</td>
            <td>X</td>
            <td>X</td>
        </tr>
        <tr>
            <td>NTLM authentication</td>
            <td>X</td>
            <td>&nbsp;</td>
            <td>[Windows only]</td>
            <td>&nbsp;</td>
            <td>X</td>
        </tr>
        <tr>
            <td>proxy authentication</td>
            <td>X</td>
            <td>X</td>
            <td>X</td>
            <td>X</td>
            <td>X</td>
        </tr>
        <tr>
            <td>minimum JRE version</td>
            <td>1.2</td>
            <td>1</td>
            <td>01年4月2日</td>
            <td>1.2</td>
            <td>1.2</td>
        </tr>
        <tr>
            <td>price</td>
            <td>$499</td>
            <td>free</td>
            <td>free</td>
            <td>free</td>
            <td>free</td>
        </tr>
        <tr>
            <td>source available</td>
            <td>X</td>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
            <td>X</td>
            <td>X</td>
        </tr>
        <tr>
            <td>diagnostic tracing</td>
            <td>X</td>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
            <td>X</td>
            <td>X</td>
        </tr>
        <tr>
            <td>actively supported</td>
            <td>X</td>
            <td>X</td>
            <td>X</td>
            <td>&nbsp;</td>
            <td>X</td>
        </tr>
        <tr>
            <td>fix turnaround</td>
            <td>fast</td>
            <td>slow</td>
            <td>slow</td>
            <td>none</td>
            <td>medium</td>
        </tr>
        <tr>
            <td>license</td>
            <td>purchase</td>
            <td>Sun JRE</td>
            <td>Sun JRE</td>
            <td>LGPL</td>
            <td>Apache</td>
        </tr>
    </tbody>
</table>
<p>
<h4>1、HttpClient的功能</h4>
<ol>
    <li>基于标准，纯正java，实现了http1.0和1.1。
    <li>在一个可扩展的OO框架内，实现了HTTP的全部方法(GET, POST, <br />
    PUT, DELETE, HEAD, OPTIONS, and TRACE)
    <li>支持HTTPS(ssl上的HTTP)的加密操作
    <li>透明地穿过HTTP代理建立连接
    <li>通过CONNECT方法，利用通过建立穿过HTTP代理的HTTPS连接
    <li>利用本地Java socket，透明地穿过SOCKS(版本5和4）代理建立连接
    <li>支持利用Basic、Digest和NTLM加密的认证
    <li>支持用于上传大文件的Multi-Part表单POST方法
    <li>插件式安全socket实现，易于使用第三方的解决方案
    <li>连接管理，支持多线程应用，支持设定单个主机总连接和最高连接数量,自动检测和关闭失效连接
    <li>直接将请求信息流送到服务器的端口
    <li>直接读取从服务器的端口送出的应答信息
    <li>支持HTTP/1.0中用KeepAlive和HTTP/1.1中用persistance设置的持久连接
    <li>直接访问由服务器送出的应答代码和头部信息
    <li>可设置连接超时时间
    <li>HttpMethods 实现Command Pattern，以允许并行请求或高效连接复用
    <li>遵循the Apache Software License协议，源码免费可得&nbsp;&nbsp;</li>
</ol>
<h4>2、预备工作</h4>
<p><br />
　　对jre1.3.*，如果要HttpClient支持https，则需要下载并安装<a href="http://java.sun.com/products/jsse/">jsse</a>和<a href="http://java.sun.com/products/jce/">jce</a>.安装的步骤如下：<br />
1)下载jsse和jce.<br />
2)检查CLASSPATH中没有与jsse和jce相关的jar包<br />
3)将 US_export_policy.jar、local_policy.jar、jsse.jar、jnet.jar、jce1_2_x.jar、sunjce_provider.jar、jcert.jar复制到目录：<br />
UNIX:$JDK_HOME/jre/lib/ext<br />
Windows:%JDK_HOME%\jre\lib\ext<br />
4)修改下述目录下的java.security文件。<br />
UNIX:$JDK_HOME/jre/lib/security/<br />
Windows:%JDK_HOME%\jre\lib\security\<br />
5)</p>
<div class="code">将<br />
#<br />
# List of providers and their preference orders:<br />
#<br />
security.provider.1=sun.security.provider.Sun<br />
security.provider.2=com.sun.rsajca.Provider<br />
改为：<br />
#<br />
# List of providers and their preference orders:<br />
#<br />
security.provider.1=com.sun.crypto.provider.SunJCE<br />
security.provider.2=sun.security.provider.Sun<br />
security.provider.3=com.sun.rsajca.Provider<br />
security.provider.4=com.sun.net.ssl.internal.ssl.Provider</div>
<p><br />
　　HttpClient还要求安装commons-logging，下面跟httpclient一块安装。</p>
<h4>3、取得源码&nbsp;</h4>
<div class="code">cvs -d :pserver:anoncvs@cvs.apache.org:/home/cvspublic login<br />
password: anoncvs<br />
cvs -d :pserver:anoncvs@cvs.apache.org:/home/cvspublic checkout jakarta-commons/logging<br />
cvs -d :pserver:anoncvs@cvs.apache.org:/home/cvspublic checkout jakarta-commons/httpclient</div>
<p><br />
　　编译：</p>
<div class="code">cd jakarta-commons/logging<br />
ant dist<br />
cp dis/*.jar ../httpclient/lib/<br />
cd ../httpclient<br />
ant dist</div>
<p>&nbsp;</p>
<h4>4、使用HttpClient编程的基本步聚&nbsp;</h4>
<ol>
    <li>创建 HttpClient 的一个实例.
    <li>创建某个方法（DeleteMethod，EntityEnclosingMethod，ExpectContinueMethod，GetMethod，HeadMethod，MultipartPostMethod，OptionsMethod，PostMethod，PutMethod，TraceMethod）的一个实例，一般可用要目标URL为参数。
    <li>让 HttpClient 执行这个方法.
    <li>读取应答信息.
    <li>释放连接.
    <li>处理应答. </li>
</ol>
<p><br />
　　在执行方法的过程中，有两种异常，一种是HttpRecoverableException，表示偶然性错误发生，一般再试可能成功，另一种是IOException，严重错误。<br />
　　这儿有这个教程中的一个例程，可以<a href="http://hedong.3322.org/archives/docs/HttpClientTutorial.java">下载</a>。</p>
<h4>5、认证</h4>
<p><br />
　　HttpClient三种不同的认证方案: Basic, Digest and NTLM. 这些方案可用于服务器或代理对客户端的认证，简称服务器认证或代理认证。<br />
1)服务器认证(Server Authentication)<br />
　　HttpClient处理服务器认证几乎是透明的，仅需要开发人员提供登录信息(login credentials)。登录信息保存在HttpState类的实例中，可以通过 setCredentials(String realm, Credentials cred)和getCredentials(String realm)来获取或设置。注意，设定对非特定站点访问所需要的登录信息，将realm参数置为null. HttpClient内建的自动认证，可以通过HttpMethod类的setDoAuthentication(boolean doAuthentication)方法关闭，而且这次关闭只影响HttpMethod当前的实例。<br />
　　抢先认证(Preemptive Authentication)可以通过下述方法打开.</p>
<div class="code">client.getState().setAuthenticationPreemptive(true);</div>
<p>　　在这种模式时，HttpClient会主动将basic认证应答信息传给服务器，即使在某种情况下服务器可能返回认证失败的应答，这样做主要是为了减少连接的建立。为使每个新建的 HttpState实例都实行抢先认证，可以如下设置系统属性。</p>
<div class="code">setSystemProperty(Authenticator.PREEMPTIVE_PROPERTY, "true");</div>
<p><br />
Httpclient实现的抢先认证遵循rfc2617.<br />
2)代理认证(proxy authentication)<br />
　　除了登录信息需单独存放以外，代理认证与服务器认证几乎一致。用 setProxyCredentials(String realm, Credentials cred)和 getProxyCredentials(String realm)设、取登录信息。<br />
3)认证方案(authentication schemes)<br />
　　Basic<br />
　　是HTTP中规定最早的也是最兼容(?)的方案，遗憾的是也是最不安全的一个方案，因为它以明码传送用户名和密码。它要求一个UsernamePasswordCredentials实例，可以指定服务器端的访问空间或采用默认的登录信息。<br />
　　Digest<br />
　　是在HTTP1.1中增加的一个方案，虽然不如Basic得到的软件支持多，但还是有广泛的使用。Digest方案比Basic方案安全得多，因它根本就不通过网络传送实际的密码，传送的是利用这个密码对从服务器传来的一个随机数(nonce)的加密串。它要求一个UsernamePasswordCredentials实例，可以指定服务器端的访问空间或采用默认的登录信息。<br />
　　NTLM<br />
　　这是HttpClient支持的最复杂的认证协议。它M$设计的一个私有协议，没有公开的规范说明。一开始由于设计的缺陷，NTLM的安全性比Digest差，后来经过一个ServicePack补丁后，安全性则比较Digest高。NTLM需要一个NTCredentials实例. 注意，由于NTLM不使用访问空间(realms)的概念，HttpClient利用服务器的域名作访问空间的名字。还需要注意，提供给NTCredentials的用户名，不要用域名的前缀 - 如: "adrian" 是正确的，而 "DOMAIN\adrian" 则是错的.<br />
　　NTLM认证的工作机制与basic和digest有很大的差别。这些差别一般由HttpClient处理，但理解这些差别有助避免在使用NTLM认证时出现错误。</p>
<ol>
    <li>从HttpClientAPI的角度来看，NTLM与其它认证方式一样的工作，差别是需要提供'NTCredentials'实例而不是'UsernamePasswordCredentials'(其实，前者只是扩展了后者)
    <li>对NTLM认证，访问空间是连接到的机器的域名，这对多域名主机会有一些麻烦.只有HttpClient连接中指定的域名才是认证用的域名。建议将realm设为null以使用默认的设置。
    <li>NTLM只是认证了一个连接而不是一请求，所以每当一个新的连接建立就要进行一次认证，且在认证的过程中保持连接是非常重要的。 因此，NTLM不能同时用于代理认证和服务器认证，也不能用于http1.0连接或服务器不支持持久连接的情况。 </li>
</ol>
<h4>6、重定向</h4>
<p><br />
　　由于技术限制，以及为保证2.0发布版API的稳定，HttpClient还不能自动处重定向，但对重定向到同一主机、同一端口且采用同一协议的情况HttpClient可以支持。不能自动的处理的情况，包括需要人工交互的情况，或超出httpclient的能力。<br />
　　当服务器重定向指令指到不同的主机时，HttpClient只是简单地将重定向状态码作为应答状态。所有的300到399（包含两端）的返回码，都表示是重定向应答。常见的有：</p>
<ol>
    <li>301 永久移动. HttpStatus.SC_MOVED_PERMANENTLY
    <li>302 临时移动. HttpStatus.SC_MOVED_TEMPORARILY
    <li>303 See Other. HttpStatus.SC_SEE_OTHER
    <li>307 临时重定向. HttpStatus.SC_TEMPORARY_REDIRECT </li>
</ol>
<p><br />
　　当收到简单的重定向时，程序应从HttpMethod对象中抽取新的URL并将其下载。另外,限制一下重定向次数是个好的主意，这可以避免递归循环。新的URL可以从头字段Location中抽取，如下：</p>
<div class="code">String redirectLocation;<br />
Header locationHeader = method.getResponseHeader("location");<br />
if (locationHeader != null) {<br />
redirectLocation = locationHeader.getValue();<br />
} else {<br />
// The response is invalid and did not provide the new location for<br />
// the resource. Report an error or possibly handle the response<br />
// like a 404 Not Found error.<br />
}</div>
<p><br />
特殊重定向：</p>
<ol>
    <li>300 多重选择. HttpStatus.SC_MULTIPLE_CHOICES
    <li>304 没有改动. HttpStatus.SC_NO T_MODIFIED
    <li>305 使用代理. HttpStatus.SC_USE_PROXY 　　</li>
</ol>
<h4>7、字符编码(character encoding)</h4>
<p><br />
　　一个HTTP协议的请求或应答的头部(在http协议中，数据包分为两部分，一部分是头部，由一些名值对构成，一部分是主体(body)，是真正传办理的数据（如HTML页面等）），必须以US-ASCII编码，这是因为头部不传数据而只描述被要传输的数据的一些信息，一个例外是cookie，它是数据但是通过头部进行传输的，所以它也要用US-ASCII编码。<br />
　　HTTP数据包的主体部分，可以用任何一种方式进行编码，默认是ISO-8859-1，具体可以用头部字段Content-Type指定。可以利用 addRequestHeader方法，设定编码方式；用 getResponseCharSet取得编码方式。对HTML或XML等类型的文档，它们的本身的Content-Type也可以指定编码方式，主要区分两者的作用范围以得到正确实的解码。<br />
　　URL的编码标准，由RFC1738指定为，只能是由可打印8位/字节的us-ascii字符组成，80-ff不是us-ascii字符，而00-1F是控制字符，这两个区域中用的字符都须加以编码(encoded)。<br />
　　</p>
<h4>8、Cookies</h4>
<p><br />
　　 HttpClient能自动管理cookie,包括允许服务器设置cookie并在需要的时候自动将cookie返回服务器，它也支持手工设置cookie后发送到服务器端。不幸的是，对如何处理cookie，有几个规范互相冲突：Netscape Cookie 草案, RFC2109, RFC2965，而且还有很大数量的软件商的cookie实现不遵循任何规范. 为了处理这种状况，HttpClient提供了策略驱动的cookie管理方式。HttpClient支持的cookie规范有：</p>
<ol>
    <li><a href="http://wp.netscape.com/newsref/std/%20_spec.html">Netscape cookie草案</a>，是最早的cookie规范，基于rfc2109。尽管这个规范与rc2109有较大的差别，这样做可以与一些服务器兼容。
    <li><a title="cookie specification" href="http://www.w3.org/Protocols/rfc2109/rfc2109.txt">rfc2109</a>，是w3c发布的第一个官方cookie规范。理论上讲，所有的服务器在处理cookie(版本1)时，都要遵循此规范，正因如此，HttpClient将其设为默认的规范。遗憾的是，这个规范太严格了，以致很多服务器不正确的实施了该规范或仍在作用Netscape规范。在这种情况下，应使用兼容规范。
    <li>兼容性规范，设计用来兼容尽可能多的服务器，即使它们并没有遵循标准规范。当解析cookie出现问题时，应考虑采用兼容性规范。 </li>
</ol>
<p><br />
　　 RFC2965规范暂时没有被HttpClient支持（在以后的版本为会加上），它定义了cookie版本2，并说明了版本1cookie的不足，RFC2965有意有久取代rfc2109.<br />
　　在HttpClient中，有两种方法来指定cookie规范的使用，</p>
<ol>
    <li>
    <div class="code">HttpClient client = new HttpClient();<br />
    client.getState().setCookiePolicy(CookiePolicy.COMPATIBILITY);</div>
    这种方法设置的规范只对当前的HttpState有效，参数可取值CookiePolicy.COMPATIBILITY，CookiePolicy.NETSCAPE_DRAFT或CookiePolicy.RFC2109。
    <li>
    <div class="code">System.setProperty("apache.commons.httpclient.cookiespec", "COMPATIBILITY");</div>
    此法指的规范，对以后每个新建立的HttpState对象都有效，参数可取值"COMPATIBILITY","NETSCAPE_DRAFT"或"RFC2109"。<br />
    　　常有不能解析cookie的问题，但更换到兼容规范大都能解决。 </li>
</ol>
<p>　　</p>
<h4>9、使用HttpClient遇到问题怎么办?&nbsp;</h4>
<ol>
    <li>用一个浏览器访问服务器，以确认服务器应答正常
    <li>如果在使代理，关掉代理试试
    <li>另找一个服务器来试试（如果运行着不同的服务器软件更好）
    <li>检查代码是否按教程中讲的思路编写
    <li>设置log级别为debug，找出问题出现的原因
    <li>打开wiretrace，来追踪客户端与服务器的通信，以确实问题出现在什么地方
    <li>用telnet或netcat手工将信息发送到服务器，适合于猜测已经找到了原因而进行试验时
    <li>将netcat以监听方式运行，用作服务器以检查httpclient如何处理应答的。
    <li>利用最新的httpclient试试，bug可能在最新的版本中修复了
    <li>向邮件列表求帮助
    <li>向bugzilla报告bug. 　　</li>
</ol>
<h4>10、SSL</h4>
<p><br />
　　借助Java Secure Socket Extension (JSSE)，HttpClient全面支持Secure Sockets Layer (SSL)或IETF Transport Layer Security (TLS)协议上的HTTP。JSSE已经jre1.4及以后的版本中，以前的版本则需要手工安装设置，具体过程参见<a href="http://java.sun.com/products/jsse/doc/guide/API_users_guide.html#Installation">Sun网站</a>或本学习笔记。<br />
　　HttpClient中使用SSL非常简单，参考下面两个例子:</p>
<div class="code">HttpClient httpclient = new HttpClient();<br />
GetMethod httpget = new GetMethod("https://www.verisign.com/"); <br />
httpclient.executeMethod(httpget);<br />
System.out.println(httpget.getStatusLine().toString());</div>
<p>，如果通过需要授权的代理，则如下：</p>
<div class="code">HttpClient httpclient = new HttpClient();<br />
httpclient.getHostConfiguration().setProxy("myproxyhost", 8080);<br />
httpclient.getState().setProxyCredentials("my-proxy-realm", " myproxyhost",<br />
new UsernamePasswordCredentials("my-proxy-username", "my-proxy-password"));<br />
GetMethod httpget = new GetMethod("https://www.verisign.com/"); <br />
httpclient.executeMethod(httpget);<br />
System.out.println(httpget.getStatusLine().toString());</div>
<p><br />
　　在HttpClient中定制SSL的步骤如下：</p>
<ol>
    <li>提供了一个实现了org.apache.commons.httpclient.protocol.SecureProtocolSocketFactory接口的socket factory。这个 socket factory负责打一个到服务器的端口，使用标准的或第三方的SSL函数库，并进行象连接握手等初始化操作。通常情况下，这个初始化操作在端口被创建时自动进行的。
    <li>实例化一个org.apache.commons.httpclient.protocol.Protocol对象。创建这个实例时，需要一个合法的协议类型(如https)，一个定制的socket factory，和一个默认的端中号(如https的443端口).
    <div class="code">Protocol myhttps = new Protocol("https", new MySSLSocketFactory(), 443);</div>
    然后，这个实例可被设置为协议的处理器。
    <div class="code">HttpClient httpclient = new HttpClient();<br />
    httpclient.getHostConfiguration().setHost("www.whatever.com", 443, myhttps);<br />
    GetMethod httpget = new GetMethod("/");<br />
    httpclient.executeMethod(httpget);</div>
    <li>通过调用Protocol.registerProtocol方法，将此定制的实例，注册为某一特定协议的默认的处理器。由此，可以很方便地定制自己的协议类型(如myhttps)。
    <div class="code">Protocol.registerProtocol("myhttps", <br />
    new Protocol("https", new MySSLSocketFactory(), 9443));<br />
    ...<br />
    HttpClient httpclient = new HttpClient();<br />
    GetMethod httpget = new GetMethod("myhttps://www.whatever.com/");<br />
    httpclient.executeMethod(httpget);</div>
    如果想用自己定制的处理器取代https默认的处理器，只需要将其注册为"https"即可。
    <div class="code">Protocol.registerProtocol("https", <br />
    new Protocol("https", new MySSLSocketFactory(), 443));<br />
    HttpClient httpclient = new HttpClient();<br />
    GetMethod httpget = new GetMethod("https://www.whatever.com/");<br />
    httpclient.executeMethod(httpget);</div>
    </li>
</ol>
<p><br />
　　已知的限制和问题</p>
<ol>
    <li>持续的SSL连接在Sun的低于1.4JVM上不能工作，这是由于JVM的bug造成。
    <li>通过代理访问服务器时，非抢先认证（ Non-preemptive authentication）会失败，这是由于HttpClient的设计缺陷造成的，以后的版本中会修改。 </li>
</ol>
<p><br />
　　遇到问题的处理<br />
　　很多问题，特别是在jvm低于1.4时，是由jsse的安装造成的。<br />
　　下面的代码，可作为最终的检测手段。</p>
<div class="code">import java.io.BufferedReader;<br />
import java.io.InputStreamReader;<br />
import java.io.OutputStreamWriter;<br />
import java.io.Writer;<br />
import java.net.Socket; import javax.net.ssl.SSLSocketFactory; public class Test {<br />
<br />
public static final String TARGET_HTTPS_SERVER = "www.verisign.com"; <br />
public static final int TARGET_HTTPS_PORT = 443; <br />
<br />
public static void main(String[] args) throws Exception {<br />
<br />
Socket socket = SSLSocketFactory.getDefault().<br />
createSocket(TARGET_HTTPS_SERVER, TARGET_HTTPS_PORT);<br />
try {<br />
Writer out = new OutputStreamWriter(<br />
socket.getOutputStream(), "ISO-8859-1");<br />
out.write("GET / HTTP/1.1\r\n"); <br />
out.write("Host: " + TARGET_HTTPS_SERVER + ":" + <br />
TARGET_HTTPS_PORT + "\r\n"); <br />
out.write("Agent: SSL-TEST\r\n"); <br />
out.write("\r\n"); <br />
out.flush(); <br />
BufferedReader in = new BufferedReader(<br />
new InputStreamReader(socket.getInputStream(), "ISO-8859-1"));<br />
String line = null;<br />
while ((line = in.readLine()) != null) {<br />
System.out.println(line);<br />
}<br />
} finally {<br />
socket.close(); <br />
}<br />
}<br />
}</div>
<p>1、httpclient的多线程处理</p>
<p><br />
　　使用多线程的主要目的，是为了实现并行的下载。在httpclient运行的过程中，每个http协议的方法，使用一个HttpConnection实例。由于连接是一种有限的资源，每个连接在某一时刻只能供一个线程和方法使用，所以需要确保在需要时正确地分配连接。HttpClient采用了一种类似jdbc连接池的方法来管理连接，这个管理工作由 MultiThreadedHttpConnectionManager完成。</p>
<div class="code">MultiThreadedHttpConnectionManager connectionManager = <br />
new MultiThreadedHttpConnectionManager();<br />
HttpClient client = new HttpClient(connectionManager);</div>
<p>此是，client可以在多个线程中被用来执行多个方法。每次调用HttpClient.executeMethod() 方法，都会去链接管理器申请一个连接实例，申请成功这个链接实例被签出(checkout)，随之在链接使用完后必须归还管理器。管理器支持两个设置： </p>
<table border="1">
    <tbody>
        <tr>
            <td>maxConnectionsPerHost</td>
            <td>每个主机的最大并行链接数，默认为2</td>
        </tr>
        <tr>
            <td>maxTotalConnections</td>
            <td>客户端总并行链接最大数，默认为20</td>
        </tr>
    </tbody>
</table>
<br />
　　管理器重新利用链接时，采取早归还者先重用的方式（least recently used approach）。<br />
　　由于是使用HttpClient的程序而不是HttpClient本身来读取应答包的主体，所以HttpClient无法决定什么时间连接不再使用了，这也就要求在读完应答包的主体后必须手工显式地调用releaseConnection()来释放申请的链接。
<p>
<div class="code">MultiThreadedHttpConnectionManager connectionManager = new MultiThreadedHttpConnectionManager();<br />
HttpClient client = new HttpClient(connectionManager);<br />
...<br />
// 在某个线程中。<br />
GetMethod get = new GetMethod("http://jakarta.apache.org/");<br />
try {<br />
client.executeMethod(get);<br />
// print response to stdout<br />
System.out.println(get.getResponseBodyAsStream());<br />
} finally {<br />
// be sure the connection is released back to the connection <br />
// manager<br />
get.releaseConnection();<br />
}</div>
<p>对每一个HttpClient.executeMethod须有一个method.releaseConnection()与之匹配.</p>
<h4>12、HTTP方法</h4>
<p><br />
　　HttpClient支持的HTTP方法有8种，下面分述之。<br />
<br />
　　1、Options<br />
<br />
　　HTTP方法Options用来向服务器发送请求，希望获得针对由请求URL(request url)标志的资源在请求/应答的通信过程可以使用的功能选项。通过这个方法，客户端可以在采取具体行动之前，就可对某一资源决定采取什么动作和/或以及一些必要条件，或者了解服务器提供的功能。这个方法最典型的应用，就是用来获取服务器支持哪些HTTP方法。<br />
　　HttpClient中有一个类叫OptionsMethod，来支持这个HTTP方法，利用这个类的getAllowedMethods方法，就可以很简单地实现上述的典型应用。</p>
<div class="code">OptionsMethod options = new OptionsMethod("http://jakarta.apache.org");<br />
// 执行方法并做相应的异常处理<br />
...<br />
Enumeration allowedMethods = options.getAllowedMethods();<br />
options.releaseConnection();</div>
<p><br />
　　2、Get<br />
<br />
　　 HTTP方法GET用来取回请求URI（request-URI）标志的任何信息（以实体(entity)的形式），"get"这个单词本意就是&#8221;获取&#8220;的意思。如果请求URI指向的一个数据处理过程，那这个过程生成的数据，在应答中以实体的形式被返回，而不是将这个过程的代码的返回。<br />
　　如果HTTP包中含有If-ModifiedSince, If-Unmodified-Since, If-Match, If-None-Match, 或 If-Range等头字段，则GET也就变成了&#8221;条件GET&#8220;，即只有满足上述字段描述的条件的实体才被取回，这样可以减少一些非必需的网络传输，或者减少为获取某一资源的多次请求（如第一次检查，第二次下载）。（一般的浏览器，都有一个临时目录，用来缓存一些网页信息，当再次浏览某个页面的时候，只下载那些修改过的内容，以加快浏览速度，就是这个道理。至于检查，则常用比GET更好的方法HEAD来实现。）如果HTTP包中含有Range头字段，那么请求URI指定的实体中，只有决定范围条件的那部分才被取回来。（用过多线程下载工具的朋友，可能比较容易理解这一点）<br />
　　这个方法的典型应用，用来从web服务器下载文档。HttpClient定义了一个类叫GetMethod来支持这个方法，用GetMethod类中getResponseBody, getResponseBodyAsStream 或 getResponseBodyAsString函数就可以取到应答包包体中的文档（如HTML页面）信息。这这三个函数中，getResponseBodyAsStream通常是最好的方法，主要是因为它可以避免在处理下载的文档之前缓存所有的下载的数据。</p>
<div class="code">GetMethod get = new GetMethod("http://jakarta.apache.org");<br />
// 执行方法，并处理失败的请求.<br />
...<br />
InputStream in = get.getResponseBodyAsStream();<br />
// 利用输入流来处理信息。<br />
get.releaseConnection();</div>
<p><br />
　　对GetMethod的最常见的不正确的使用，是没有将全部的应答主体的数据读出来。还有，必须注意要手工明确地将链接释放。<br />
<br />
　　3、Head<br />
<br />
　　HTTP的Head方法，与Get方法完全一致，唯一的差别是服务器不能在应答包中包含主体(message-body)，而且一定不能包含主体。使用这个方法，可以使得客户无需将资源下载回就可就以得到一些关于它的基本信息。这个方法常用来检查超链的可访问性以及资源最近有没有被修改。<br />
　　HTTP的head方法最典型的应用，是获取资源的基本信息。HttpClient定义了HeadMethod类支持这个方法，HeadMethod类与其它*Method类一样，用 getResponseHeaders()取回头部信息，而没有自己的特殊方法。</p>
<div class="code">HeadMethod head = new HeadMethod("http://jakarta.apache.org");<br />
// 执行方法，并处理失败的请求.<br />
...<br />
// 取回应答包的头字段信息.<br />
Header[] headers = head.getResponseHeaders(); // 只取回最后修改日期字段的信息.<br />
String lastModified = head.getResponseHeader("last-modified").getValue();</div>
<p><br />
<br />
　　4、Post<br />
<br />
　　Post在英文有&#8220;派驻&#8221;的意思，HTTP方法POST就是要求服务器接受请求包中的实体，并将其作为请求URI的下属资源。从本质上说，这意味着服务器要保存这个实体信息，而且通常由服务器端的程序进行处理。Post方法的设计意图，是要以一种统一的方式实现下列功能：</p>
<ol>
    <li>对已有的资源做评注
    <li>将信息发布到BBS、新闻组、邮件列表，或类似的文章组中
    <li>将一块数据，提交给数据处理进程
    <li>通过追加操作，来扩展一个数据库 </li>
</ol>
<p>　　这些都操作期待着在服务器端产生一定的&#8220;副作用&#8221;，如修改了数据库等。<br />
　　HttpClient定义PostMethod类以支持该HTTP方法，在httpclient中，使用post方法有两个基本的步骤：为请求包准备数据，然后读取服务器来的应答包的信息。通过调用 setRequestBody()函数，来为请求包提供数据，它可以接收三类参数：输入流、名值对数组或字符串。至于读取应答包需要调用 getResponseBody* 那一系列的方法，与GET方法处理应答包的方法相同。<br />
　　常见问题是，没有将全部应答读取（无论它对程序是否有用），或没有释放链接资源。</p>
<img src ="http://www.blogjava.net/jzone/aggbug/309594.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jzone/" target="_blank">Gavin.lee</a> 2010-01-14 23:08 <a href="http://www.blogjava.net/jzone/articles/309594.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java List 分页应用（二）</title><link>http://www.blogjava.net/jzone/articles/308885.html</link><dc:creator>Gavin.lee</dc:creator><author>Gavin.lee</author><pubDate>Sat, 09 Jan 2010 18:22:00 GMT</pubDate><guid>http://www.blogjava.net/jzone/articles/308885.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 应用类：package&nbsp;com.Gavin.tools.util;import&nbsp;java.util.*;/**&nbsp;*//**&nbsp;*&nbsp;为List分页&nbsp;*&nbsp;样式比较简单，适合WAP使用，直接输出页码到页面&nbsp;*/public&nbsp;class&nbsp;PagerUtil&nbsp;{...&nbsp;&nbsp;<a href='http://www.blogjava.net/jzone/articles/308885.html'>阅读全文</a><img src ="http://www.blogjava.net/jzone/aggbug/308885.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jzone/" target="_blank">Gavin.lee</a> 2010-01-10 02:22 <a href="http://www.blogjava.net/jzone/articles/308885.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java List 分页应用（一）</title><link>http://www.blogjava.net/jzone/articles/308842.html</link><dc:creator>Gavin.lee</dc:creator><author>Gavin.lee</author><pubDate>Sat, 09 Jan 2010 06:35:00 GMT</pubDate><guid>http://www.blogjava.net/jzone/articles/308842.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 应用类：package&nbsp;com.Gavin.tools.util;/**&nbsp;*//**&nbsp;&nbsp;&nbsp;*&nbsp;List分页&nbsp;*&nbsp;实现：利用List的获取子List方法，实现对List的分页&nbsp;*&nbsp;@author&nbsp;显武&nbsp;*&nbsp;@date&nbsp;2010-1-8...&nbsp;&nbsp;<a href='http://www.blogjava.net/jzone/articles/308842.html'>阅读全文</a><img src ="http://www.blogjava.net/jzone/aggbug/308842.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jzone/" target="_blank">Gavin.lee</a> 2010-01-09 14:35 <a href="http://www.blogjava.net/jzone/articles/308842.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java 有效的防止SQL注入</title><link>http://www.blogjava.net/jzone/articles/307959.html</link><dc:creator>Gavin.lee</dc:creator><author>Gavin.lee</author><pubDate>Thu, 31 Dec 2009 16:38:00 GMT</pubDate><guid>http://www.blogjava.net/jzone/articles/307959.html</guid><description><![CDATA[<p>归纳一下，主要有以下几点： <br />
1.永远不要信任用户的输入。对用户的输入进行校验，可以通过正则表达式，或限制长度；对单引号和双"-"进行转换等。 <br />
2.永远不要使用动态拼装sql，可以使用参数化的sql或者直接使用存储过程进行数据查询存取。 <br />
3.永远不要使用管理员权限的数据库连接，为每个应用使用单独的权限有限的数据库连接。 <br />
4.不要把机密信息直接存放，加密或者hash掉密码和敏感的信息。 <br />
5.应用的异常信息应该给出尽可能少的提示，最好使用自定义的错误信息对原始错误信息进行包装。 </p>
<p>参考： <br />
http://msdn.microsoft.com/en-us/magazine/cc163917.aspx <br />
http://www.unixwiz.net/techtips/sql-injection.html <br />
http://www.nextgenss.com/papers/more_advanced_sql_injection.pdf <br />
http://www.securiteam.com/securityreviews/5DP0N1P76E.html <br />
http://xkcd.com/327/ <br />
http://ferruh.mavituna.com/makale/sql-injection-cheatsheet/ <br />
<br />
<br />
<a href="http://bbs.xiakexing.com/cgi-bin/topic.cgi?forum=34&amp;topic=18&amp;show=0">http://bbs.xiakexing.com/cgi-bin/topic.cgi?forum=34&amp;topic=18&amp;show=0</a> <br />
<a href="http://www.cnblogs.com/iloveu/archive/2009/03/17/1414145.html">http://www.cnblogs.com/iloveu/archive/2009/03/17/1414145.html</a> <br />
<a href="http://dang.javaeye.com/blog/338367">http://dang.javaeye.com/blog/338367</a> </p>
<img src ="http://www.blogjava.net/jzone/aggbug/307959.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jzone/" target="_blank">Gavin.lee</a> 2010-01-01 00:38 <a href="http://www.blogjava.net/jzone/articles/307959.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java clone</title><link>http://www.blogjava.net/jzone/articles/307738.html</link><dc:creator>Gavin.lee</dc:creator><author>Gavin.lee</author><pubDate>Wed, 30 Dec 2009 04:27:00 GMT</pubDate><guid>http://www.blogjava.net/jzone/articles/307738.html</guid><description><![CDATA[<a href="http://lavasoft.blog.51cto.com/62575/43480">http://lavasoft.blog.51cto.com/62575/43480</a> 
<img src ="http://www.blogjava.net/jzone/aggbug/307738.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jzone/" target="_blank">Gavin.lee</a> 2009-12-30 12:27 <a href="http://www.blogjava.net/jzone/articles/307738.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java 序列化与反序列化</title><link>http://www.blogjava.net/jzone/articles/307577.html</link><dc:creator>Gavin.lee</dc:creator><author>Gavin.lee</author><pubDate>Mon, 28 Dec 2009 16:39:00 GMT</pubDate><guid>http://www.blogjava.net/jzone/articles/307577.html</guid><description><![CDATA[<a href="http://blog.csdn.net/longronglin/archive/2009/02/09/3871682.aspx">http://blog.csdn.net/longronglin/archive/2009/02/09/3871682.aspx</a> 
<img src ="http://www.blogjava.net/jzone/aggbug/307577.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jzone/" target="_blank">Gavin.lee</a> 2009-12-29 00:39 <a href="http://www.blogjava.net/jzone/articles/307577.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Junit 单元测试</title><link>http://www.blogjava.net/jzone/articles/307576.html</link><dc:creator>Gavin.lee</dc:creator><author>Gavin.lee</author><pubDate>Mon, 28 Dec 2009 16:38:00 GMT</pubDate><guid>http://www.blogjava.net/jzone/articles/307576.html</guid><description><![CDATA[<a href="http://blog.csdn.net/longronglin/archive/2008/04/15/2295237.aspx">http://blog.csdn.net/longronglin/archive/2008/04/15/2295237.aspx</a> 
<img src ="http://www.blogjava.net/jzone/aggbug/307576.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jzone/" target="_blank">Gavin.lee</a> 2009-12-29 00:38 <a href="http://www.blogjava.net/jzone/articles/307576.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>压缩 XML 文件以便有效地传输</title><link>http://www.blogjava.net/jzone/articles/307561.html</link><dc:creator>Gavin.lee</dc:creator><author>Gavin.lee</author><pubDate>Mon, 28 Dec 2009 13:32:00 GMT</pubDate><guid>http://www.blogjava.net/jzone/articles/307561.html</guid><description><![CDATA[<a href="http://www.ibm.com/developerworks/cn/xml/x-tipcomp.html">http://www.ibm.com/developerworks/cn/xml/x-tipcomp.html</a> 
<img src ="http://www.blogjava.net/jzone/aggbug/307561.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jzone/" target="_blank">Gavin.lee</a> 2009-12-28 21:32 <a href="http://www.blogjava.net/jzone/articles/307561.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java ClassLoader 类加载的学习</title><link>http://www.blogjava.net/jzone/articles/307447.html</link><dc:creator>Gavin.lee</dc:creator><author>Gavin.lee</author><pubDate>Sun, 27 Dec 2009 11:51:00 GMT</pubDate><guid>http://www.blogjava.net/jzone/articles/307447.html</guid><description><![CDATA[待续
<img src ="http://www.blogjava.net/jzone/aggbug/307447.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jzone/" target="_blank">Gavin.lee</a> 2009-12-27 19:51 <a href="http://www.blogjava.net/jzone/articles/307447.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用 XStream 在 JavaBean 与 XML/JSON 之间相互转换（摘）</title><link>http://www.blogjava.net/jzone/articles/307446.html</link><dc:creator>Gavin.lee</dc:creator><author>Gavin.lee</author><pubDate>Sun, 27 Dec 2009 11:40:00 GMT</pubDate><guid>http://www.blogjava.net/jzone/articles/307446.html</guid><description><![CDATA[<a href="http://www.blogjava.net/Unmi/archive/2009/08/11/290710.html">http://www.blogjava.net/Unmi/archive/2009/08/11/290710.html</a> 
<img src ="http://www.blogjava.net/jzone/aggbug/307446.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jzone/" target="_blank">Gavin.lee</a> 2009-12-27 19:40 <a href="http://www.blogjava.net/jzone/articles/307446.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用java构建http服务器（摘）</title><link>http://www.blogjava.net/jzone/articles/307398.html</link><dc:creator>Gavin.lee</dc:creator><author>Gavin.lee</author><pubDate>Sat, 26 Dec 2009 16:12:00 GMT</pubDate><guid>http://www.blogjava.net/jzone/articles/307398.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: web服务器大家都会用，可是它的实现原理是到底如何呢，其实只要读一下http协议，大家基本也能开发出一个简单的web服务器出来了。web请求分为如下几步1. 浏览器向服务建立TCP/IP连接，Java中通过java.net.Socket实现2. Web浏览器向Web服务器发送请求命令。通过Socket的输出流向服务器写如下信息：&nbsp; GET /uri HTTP/1.1，很显...&nbsp;&nbsp;<a href='http://www.blogjava.net/jzone/articles/307398.html'>阅读全文</a><img src ="http://www.blogjava.net/jzone/aggbug/307398.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jzone/" target="_blank">Gavin.lee</a> 2009-12-27 00:12 <a href="http://www.blogjava.net/jzone/articles/307398.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java 实现URL重写</title><link>http://www.blogjava.net/jzone/articles/307331.html</link><dc:creator>Gavin.lee</dc:creator><author>Gavin.lee</author><pubDate>Fri, 25 Dec 2009 17:56:00 GMT</pubDate><guid>http://www.blogjava.net/jzone/articles/307331.html</guid><description><![CDATA[java 实现URL重写
<img src ="http://www.blogjava.net/jzone/aggbug/307331.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jzone/" target="_blank">Gavin.lee</a> 2009-12-26 01:56 <a href="http://www.blogjava.net/jzone/articles/307331.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HttpsURLConnection 安全传输（HTTPS--Secure Hypertext Transfer Protocol-安全超文本传输协议）</title><link>http://www.blogjava.net/jzone/articles/307329.html</link><dc:creator>Gavin.lee</dc:creator><author>Gavin.lee</author><pubDate>Fri, 25 Dec 2009 16:56:00 GMT</pubDate><guid>http://www.blogjava.net/jzone/articles/307329.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: HttpsURLConnection 扩展 HttpURLConnection，支持各种特定于 https 功能。此类使用 HostnameVerifier 和 SSLSocketFactory。为这两个类都定义了默认实现。但是，可以根据每个类（静态的）或每个实例来替换该实现。所有新 HttpsURLConnection 实例在创建时将被分配&#8220;默认的&#8221;静态值，通过在连接前调...&nbsp;&nbsp;<a href='http://www.blogjava.net/jzone/articles/307329.html'>阅读全文</a><img src ="http://www.blogjava.net/jzone/aggbug/307329.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jzone/" target="_blank">Gavin.lee</a> 2009-12-26 00:56 <a href="http://www.blogjava.net/jzone/articles/307329.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Map&lt;K, V&gt;  遍历</title><link>http://www.blogjava.net/jzone/articles/306869.html</link><dc:creator>Gavin.lee</dc:creator><author>Gavin.lee</author><pubDate>Tue, 22 Dec 2009 01:21:00 GMT</pubDate><guid>http://www.blogjava.net/jzone/articles/306869.html</guid><description><![CDATA[<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;com.Gavin.tools.util;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.util.Hashtable;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.util.Iterator;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.util.Map;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.util.Set;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_131_222_Open_Image" onclick="this.style.display='none'; Codehighlighter1_131_222_Open_Text.style.display='none'; Codehighlighter1_131_222_Closed_Image.style.display='inline'; Codehighlighter1_131_222_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_131_222_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_131_222_Closed_Text.style.display='none'; Codehighlighter1_131_222_Open_Image.style.display='inline'; Codehighlighter1_131_222_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span id="Codehighlighter1_131_222_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**&nbsp;*/</span><span id="Codehighlighter1_131_222_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000">&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*&nbsp;</span><span style="color: #808080">@author</span><span style="color: #008000">&nbsp;Gavin.lee&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*&nbsp;@date&nbsp;2009-05-04&nbsp;11:45am<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*&nbsp;</span><span style="color: #808080">@param</span><span style="color: #008000">&nbsp;&lt;K&gt;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*&nbsp;</span><span style="color: #808080">@param</span><span style="color: #008000">&nbsp;&lt;V&gt;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_251_1739_Open_Image" onclick="this.style.display='none'; Codehighlighter1_251_1739_Open_Text.style.display='none'; Codehighlighter1_251_1739_Closed_Image.style.display='inline'; Codehighlighter1_251_1739_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_251_1739_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_251_1739_Closed_Text.style.display='none'; Codehighlighter1_251_1739_Open_Image.style.display='inline'; Codehighlighter1_251_1739_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;MapUtil</span><span style="color: #000000">&lt;</span><span style="color: #000000">K,&nbsp;V</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;</span><span id="Codehighlighter1_251_1739_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_251_1739_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_285_543_Open_Image" onclick="this.style.display='none'; Codehighlighter1_285_543_Open_Text.style.display='none'; Codehighlighter1_285_543_Closed_Image.style.display='inline'; Codehighlighter1_285_543_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_285_543_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_285_543_Closed_Text.style.display='none'; Codehighlighter1_285_543_Open_Image.style.display='inline'; Codehighlighter1_285_543_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;filter1(Map&nbsp;map)&nbsp;</span><span id="Codehighlighter1_285_543_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_285_543_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Iterator&nbsp;it&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;map.entrySet().iterator();<br />
<img id="Codehighlighter1_353_471_Open_Image" onclick="this.style.display='none'; Codehighlighter1_353_471_Open_Text.style.display='none'; Codehighlighter1_353_471_Closed_Image.style.display='inline'; Codehighlighter1_353_471_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_353_471_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_353_471_Closed_Text.style.display='none'; Codehighlighter1_353_471_Open_Image.style.display='inline'; Codehighlighter1_353_471_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(it.hasNext())&nbsp;</span><span id="Codehighlighter1_353_471_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_353_471_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Map.Entry&nbsp;me&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(Map.Entry)&nbsp;it.next();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">key:</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;me.getKey()&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">,value:</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;me.getValue());<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">************************************filter1</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_576_900_Open_Image" onclick="this.style.display='none'; Codehighlighter1_576_900_Open_Text.style.display='none'; Codehighlighter1_576_900_Closed_Image.style.display='inline'; Codehighlighter1_576_900_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_576_900_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_576_900_Closed_Text.style.display='none'; Codehighlighter1_576_900_Open_Image.style.display='inline'; Codehighlighter1_576_900_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;filter2(Map&nbsp;map)&nbsp;</span><span id="Codehighlighter1_576_900_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_576_900_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Hashtable</span><span style="color: #000000">&lt;</span><span style="color: #000000">String,&nbsp;String</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;ht&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Hashtable</span><span style="color: #000000">&lt;</span><span style="color: #000000">String,&nbsp;String</span><span style="color: #000000">&gt;</span><span style="color: #000000">();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ht.put(</span><span style="color: #000000">"</span><span style="color: #000000">Gavin</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Kathy</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ht.put(</span><span style="color: #000000">"</span><span style="color: #000000">杨过</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">小龙女</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_751_828_Open_Image" onclick="this.style.display='none'; Codehighlighter1_751_828_Open_Text.style.display='none'; Codehighlighter1_751_828_Closed_Image.style.display='inline'; Codehighlighter1_751_828_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_751_828_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_751_828_Closed_Text.style.display='none'; Codehighlighter1_751_828_Open_Image.style.display='inline'; Codehighlighter1_751_828_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(Map.Entry</span><span style="color: #000000">&lt;</span><span style="color: #000000">String,&nbsp;String</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;me&nbsp;:&nbsp;ht.entrySet())&nbsp;</span><span id="Codehighlighter1_751_828_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_751_828_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">key:</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;me.getKey()&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">,value:</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;me.getValue());<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">************************************filter2</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_933_1183_Open_Image" onclick="this.style.display='none'; Codehighlighter1_933_1183_Open_Text.style.display='none'; Codehighlighter1_933_1183_Closed_Image.style.display='inline'; Codehighlighter1_933_1183_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_933_1183_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_933_1183_Closed_Text.style.display='none'; Codehighlighter1_933_1183_Open_Image.style.display='inline'; Codehighlighter1_933_1183_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;filter3(Map&nbsp;map)&nbsp;</span><span id="Codehighlighter1_933_1183_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_933_1183_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Iterator&nbsp;it&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;map.keySet().iterator();<br />
<img id="Codehighlighter1_999_1111_Open_Image" onclick="this.style.display='none'; Codehighlighter1_999_1111_Open_Text.style.display='none'; Codehighlighter1_999_1111_Closed_Image.style.display='inline'; Codehighlighter1_999_1111_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_999_1111_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_999_1111_Closed_Text.style.display='none'; Codehighlighter1_999_1111_Open_Image.style.display='inline'; Codehighlighter1_999_1111_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(it.hasNext())&nbsp;</span><span id="Codehighlighter1_999_1111_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_999_1111_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;key;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;key&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(String)&nbsp;it.next();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">key:</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;key&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">,value:</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;map.get(key));<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">************************************filter3</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_1216_1386_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1216_1386_Open_Text.style.display='none'; Codehighlighter1_1216_1386_Closed_Image.style.display='inline'; Codehighlighter1_1216_1386_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_1216_1386_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1216_1386_Closed_Text.style.display='none'; Codehighlighter1_1216_1386_Open_Image.style.display='inline'; Codehighlighter1_1216_1386_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;filter4(Map&nbsp;map)&nbsp;</span><span id="Codehighlighter1_1216_1386_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1216_1386_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_1250_1314_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1250_1314_Open_Text.style.display='none'; Codehighlighter1_1250_1314_Closed_Image.style.display='inline'; Codehighlighter1_1250_1314_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_1250_1314_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1250_1314_Closed_Text.style.display='none'; Codehighlighter1_1250_1314_Open_Image.style.display='inline'; Codehighlighter1_1250_1314_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(Object&nbsp;o&nbsp;:&nbsp;map.keySet())&nbsp;</span><span id="Codehighlighter1_1250_1314_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1250_1314_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">key:</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;o&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">,value:</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;map.get(o));<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">************************************filter4</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_1391_1478_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1391_1478_Open_Text.style.display='none'; Codehighlighter1_1391_1478_Closed_Image.style.display='inline'; Codehighlighter1_1391_1478_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_1391_1478_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1391_1478_Closed_Text.style.display='none'; Codehighlighter1_1391_1478_Open_Image.style.display='inline'; Codehighlighter1_1391_1478_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_1391_1478_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**&nbsp;*/</span><span id="Codehighlighter1_1391_1478_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000">&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;获得Map中特定value的key值&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@param</span><span style="color: #008000">&nbsp;map&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@param</span><span style="color: #008000">&nbsp;value&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@return</span><span style="color: #008000">&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_1533_1736_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1533_1736_Open_Text.style.display='none'; Codehighlighter1_1533_1736_Closed_Image.style.display='inline'; Codehighlighter1_1533_1736_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_1533_1736_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1533_1736_Closed_Text.style.display='none'; Codehighlighter1_1533_1736_Open_Image.style.display='inline'; Codehighlighter1_1533_1736_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;K&nbsp;getMapKeyFromValue(Map</span><span style="color: #000000">&lt;</span><span style="color: #000000">K,&nbsp;V</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;map,&nbsp;V&nbsp;value)&nbsp;</span><span id="Codehighlighter1_1533_1736_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1533_1736_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Set&nbsp;set&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;map.keySet();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;K&nbsp;key&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Iterator&nbsp;it&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;set.iterator();<br />
<img id="Codehighlighter1_1632_1718_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1632_1718_Open_Text.style.display='none'; Codehighlighter1_1632_1718_Closed_Image.style.display='inline'; Codehighlighter1_1632_1718_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_1632_1718_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1632_1718_Closed_Text.style.display='none'; Codehighlighter1_1632_1718_Open_Image.style.display='inline'; Codehighlighter1_1632_1718_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(it.hasNext())&nbsp;</span><span id="Codehighlighter1_1632_1718_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1632_1718_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;key&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(K)&nbsp;it.next();<br />
<img id="Codehighlighter1_1693_1714_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1693_1714_Open_Text.style.display='none'; Codehighlighter1_1693_1714_Closed_Image.style.display='inline'; Codehighlighter1_1693_1714_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_1693_1714_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1693_1714_Closed_Text.style.display='none'; Codehighlighter1_1693_1714_Open_Image.style.display='inline'; Codehighlighter1_1693_1714_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(value.equals(map.get(key)))&nbsp;</span><span id="Codehighlighter1_1693_1714_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1693_1714_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;key;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<img src ="http://www.blogjava.net/jzone/aggbug/306869.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jzone/" target="_blank">Gavin.lee</a> 2009-12-22 09:21 <a href="http://www.blogjava.net/jzone/articles/306869.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Apache Common HttpClient的使用</title><link>http://www.blogjava.net/jzone/articles/305967.html</link><dc:creator>Gavin.lee</dc:creator><author>Gavin.lee</author><pubDate>Mon, 14 Dec 2009 14:38:00 GMT</pubDate><guid>http://www.blogjava.net/jzone/articles/305967.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: HttpClient 是 Apache Jakarta Common 下的子项目，可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包，并且它支持 HTTP 协议最新的版本和建议。HTTP 协议可能是现在 Internet 上使用得最多、最重要的协议了，越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源。虽然在 JDK 的 java.net 包中已...&nbsp;&nbsp;<a href='http://www.blogjava.net/jzone/articles/305967.html'>阅读全文</a><img src ="http://www.blogjava.net/jzone/aggbug/305967.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jzone/" target="_blank">Gavin.lee</a> 2009-12-14 22:38 <a href="http://www.blogjava.net/jzone/articles/305967.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Apache commons 各种组件（摘）</title><link>http://www.blogjava.net/jzone/articles/305966.html</link><dc:creator>Gavin.lee</dc:creator><author>Gavin.lee</author><pubDate>Mon, 14 Dec 2009 14:36:00 GMT</pubDate><guid>http://www.blogjava.net/jzone/articles/305966.html</guid><description><![CDATA[<p>原文：<a href="http://www.blogjava.net/fatbear/archive/2007/05/23/119346.html">http://www.blogjava.net/fatbear/archive/2007/05/23/119346.html</a> <strong><br />
Apache Commons </strong><font size="2">是一个非常有用的工具包，解决各种实际的通用问题，你会发现它们正是你冥思苦想所需要<br />
<br />
的东西。它们不是绝世武功，但确是个随手可用的擒拿手，Commons一出，问题手到擒来。</font></p>
<p><font size="2">下面是一个全面的简述表：</font></p>
<p>
<table cellspacing="0" cellpadding="0" width="80%" border="1">
    <tbody>
        <tr>
            <td>
            <p align="left"><font size="2"><strong>组件</strong></font></p>
            </td>
            <td><font size="2"><strong>说明</strong></font></td>
        </tr>
        <tr>
            <td width="100"><font size="2"><strong>BeanUtils</strong></font></td>
            <td><font size="2">Commons-BeanUtils 提供对 Java 反射和自省API的包装</font></td>
        </tr>
        <tr>
            <td><font size="2"><strong>Betwixt</strong></font></td>
            <td><font size="2">Betwixt提供将 JavaBean 映射至 XML 文档，以及相反映射的服务.</font></td>
        </tr>
        <tr>
            <td>
            <p align="left"><font size="2"><strong>Chain</strong></font></p>
            </td>
            <td>
            <p align="left"><font size="2">Chain 提供实现组织复杂的处理流程的&#8220;责任链模式&#8221;.</font></p>
            </td>
        </tr>
        <tr>
            <td>
            <p align="left"><font size="2"><strong>CLI</strong></font></p>
            </td>
            <td>
            <p align="left"><font size="2">CLI 提供针对命令行参数，选项，选项组，强制选项等的简单API.</font></p>
            </td>
        </tr>
        <tr>
            <td>
            <p align="left"><font size="2"><strong>Codec</strong>&nbsp;</font></p>
            </td>
            <td>
            <p align="left"><font size="2">Codec 包含一些通用的编码解码算法。包括一些语音编码器， Hex, Base64, 以及URL encoder.</font></p>
            </td>
        </tr>
        <tr>
            <td>
            <p align="left"><font size="2"><strong>Collections</strong>&nbsp;</font></p>
            </td>
            <td>
            <p align="left"><font size="2">Commons-Collections 提供一个类包来扩展和增加标准的 Java Collection框架</font></p>
            </td>
        </tr>
        <tr>
            <td>
            <p align="left"><font size="2"><strong>Configuration</strong></font></p>
            </td>
            <td>
            <p align="left"><font size="2">Commons-Configuration 工具对各种各式的配置和参考文件提供读取帮助.&nbsp;</font></p>
            </td>
        </tr>
        <tr>
            <td>
            <p align="left"><font size="2"><strong>Daemon</strong></font></p>
            </td>
            <td>
            <p align="left"><font size="2">一种 unix-daemon-like java 代码的替代机制</font></p>
            </td>
        </tr>
        <tr>
            <td>
            <p align="left"><font size="2"><strong>DBCP</strong>&nbsp;</font></p>
            </td>
            <td>
            <p align="left"><font size="2">Commons-DBCP 提供数据库连接池服务&nbsp;</font></p>
            </td>
        </tr>
        <tr>
            <td>
            <p align="left"><font size="2"><strong>DbUtils</strong>&nbsp;</font></p>
            </td>
            <td>
            <p align="left"><font size="2">DbUtils 是一个 JDBC helper 类库，完成数据库任务的简单的资源清除代码.&nbsp;</font></p>
            </td>
        </tr>
        <tr>
            <td>
            <p align="left"><font size="2"><strong>Digester</strong>&nbsp;</font></p>
            </td>
            <td>
            <p align="left"><font size="2">Commons-Digester 是一个 XML-Java对象的映射工具，用于解析 XML配置文件.&nbsp;</font></p>
            </td>
        </tr>
        <tr>
            <td>
            <p align="left"><font size="2"><strong>Discovery</strong></font></p>
            </td>
            <td><font size="2">Commons-Discovery 提供工具来定位资源 (包括类) ，通过使用各种模式来映射服务/引用名称和资源名称.</font></td>
        </tr>
        <tr>
            <td>
            <p align="left"><font size="2"><strong>EL</strong>&nbsp;</font></p>
            </td>
            <td>
            <p align="left"><font size="2">Commons-EL 提供在JSP2.0规范中定义的EL表达式的解释器.</font></p>
            </td>
        </tr>
        <tr>
            <td>
            <p align="left"><font size="2"><strong>FileUpload</strong>&nbsp;</font></p>
            </td>
            <td>
            <p align="left"><font size="2">FileUpload 使得在你可以在应用和Servlet中容易的加入强大和高性能的文件上传能力.</font></p>
            </td>
        </tr>
        <tr>
            <td>
            <p align="left"><font size="2"><strong>HttpClient</strong></font></p>
            </td>
            <td>
            <p align="left"><font size="2">Commons-HttpClient 提供了可以工作于HTTP协议客户端的一个框架.</font></p>
            </td>
        </tr>
        <tr>
            <td>
            <p align="left"><font size="2"><strong>IO</strong></font></p>
            </td>
            <td>
            <p align="left"><font size="2">IO 是一个 I/O 工具集.</font></p>
            </td>
        </tr>
        <tr>
            <td>
            <p align="left"><font size="2"><strong>Jelly</strong></font></p>
            </td>
            <td><font size="2">Jelly是一个基于 XML 的脚本和处理引擎。 Jelly 借鉴了 JSP 定指标签，Velocity, Cocoon和Xdoclet中的脚本引擎的许多优点。Jelly 可以用在命令行， Ant 或者 Servlet之中.</font></td>
        </tr>
        <tr>
            <td>
            <p align="left"><font size="2"><strong>Jexl</strong></font></p>
            </td>
            <td><font size="2">Jexl是一个表达式语言，通过借鉴来自于Velocity的经验扩展了JSTL定义的表达式语言.&nbsp;</font></td>
        </tr>
        <tr>
            <td>
            <p align="left"><font size="2"><strong>JXPath</strong></font></p>
            </td>
            <td><font size="2">Commons-JXPath 提供了使用Xpath语法操纵符合Java类命名规范的 JavaBeans的工具。也支持 maps, DOM 和其他对象模型.&nbsp;</font></td>
        </tr>
        <tr>
            <td>
            <p align="left"><font size="2"><strong>Lang</strong></font></p>
            </td>
            <td>
            <p align="left"><font size="2">Commons-Lang 提供了许多许多通用的工具类集，提供了一些java.lang中类的扩展功能.</font></p>
            </td>
        </tr>
        <tr>
            <td>
            <p align="left"><font size="2"><strong>Latka</strong></font></p>
            </td>
            <td>
            <p align="left"><font size="2">Commons-Latka 是一个HTTP 功能测试包，用于自动化的QA,验收和衰减测试.</font></p>
            </td>
        </tr>
        <tr>
            <td>
            <p align="left"><font size="2"><strong>Launcher</strong></font></p>
            </td>
            <td>
            <p align="left"><font size="2">Launcher 组件是一个交叉平台的Java 应用载入器。 Commons-launcher 消除了需要批处理或者Shell脚本来载入Java 类。.原始的 Java 类来自于Jakarta Tomcat 4.0 项目.</font></p>
            </td>
        </tr>
        <tr>
            <td>
            <p align="left"><font size="2"><strong>Logging</strong></font></p>
            </td>
            <td>
            <p align="left"><font size="2">Commons-Logging 是一个各种 logging API实现的包裹类.&nbsp;</font></p>
            </td>
        </tr>
        <tr>
            <td>
            <p align="left"><font size="2"><strong>Math</strong></font></p>
            </td>
            <td>
            <p align="left"><font size="2">Math 是一个轻量的，自包含的数学和统计组件，解决了许多非常通用但没有及时出现在Java标准语言中的实践问题.</font></p>
            </td>
        </tr>
        <tr>
            <td>
            <p align="left"><font size="2"><strong>Modeler</strong></font></p>
            </td>
            <td>
            <p align="left"><font size="2">Commons-Modeler 提供了建模兼容JMX规范的 Mbean的机制.</font></p>
            </td>
        </tr>
        <tr>
            <td>
            <p align="left"><font size="2"><strong>Net</strong></font></p>
            </td>
            <td><font size="2">Net 是一个网络工具集，基于 NetComponents 代码，包括 FTP 客户端等等.&nbsp;</font></td>
        </tr>
        <tr>
            <td>
            <p align="left"><font size="2"><strong>Pool</strong></font></p>
            </td>
            <td><font size="2">Commons-Pool 提供了通用对象池接口，一个用于创建模块化对象池的工具包，以及通常的对象池实现.</font></td>
        </tr>
        <tr>
            <td>
            <p align="left"><font size="2"><strong>Primitives</strong></font></p>
            </td>
            <td><font size="2">Commons-Primitives提供了一个更小，更快和更易使用的对Java基本类型的支持。当前主要是针对基本类型的 collection.</font></td>
        </tr>
        <tr>
            <td>
            <p align="left"><font size="2"><strong>Validator</strong></font></p>
            </td>
            <td><font size="2">The commons-validator提供了一个简单的，可扩展的框架来在一个XML文件中定义校验器 (校验方法)和校验规则。支持校验规则的和错误消息的国际化.</font></td>
        </tr>
    </tbody>
</table>
</p>
<p><font size="2">详细信息位于：<a href="http://jakarta.apache.org/commons/index.html"><u><font color="#0000ff">http://jakarta.apache.org/commons/index.html</font></u></a></font></p>
<p><font size="2">以及<a id="_da5a5345c8dc6105_HomePageDays_DaysList__ctl1_DayItem_DayList__ctl0_TitleUrl" href="http://blog.csdn.net/sswt/archive/2005/01/26/269516.aspx"><u><font color="#800080">Jakarta Commons:巧用类和组件</font></u></a></font></p>
<img src ="http://www.blogjava.net/jzone/aggbug/305966.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jzone/" target="_blank">Gavin.lee</a> 2009-12-14 22:36 <a href="http://www.blogjava.net/jzone/articles/305966.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java路径问题最终解决方案（可定位所有资源的相对路径寻址）</title><link>http://www.blogjava.net/jzone/articles/305753.html</link><dc:creator>Gavin.lee</dc:creator><author>Gavin.lee</author><pubDate>Sat, 12 Dec 2009 15:18:00 GMT</pubDate><guid>http://www.blogjava.net/jzone/articles/305753.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 摘自：http://www.matrix.org.cn/thread.shtml?topicId=6d0bbeed-9157-11db-ab77-2bbe780ebfbf&amp;forumId=19 Java的路径问题，非常难搞。最近的工作涉及到创建和读取文件的工作，这里我就给大家彻底得解决Java路径问题。我编写了一个方法，比ClassLoader.getResource(String...&nbsp;&nbsp;<a href='http://www.blogjava.net/jzone/articles/305753.html'>阅读全文</a><img src ="http://www.blogjava.net/jzone/aggbug/305753.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jzone/" target="_blank">Gavin.lee</a> 2009-12-12 23:18 <a href="http://www.blogjava.net/jzone/articles/305753.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>十四种Java开发工具 ---了解</title><link>http://www.blogjava.net/jzone/articles/304447.html</link><dc:creator>Gavin.lee</dc:creator><author>Gavin.lee</author><pubDate>Tue, 01 Dec 2009 14:54:00 GMT</pubDate><guid>http://www.blogjava.net/jzone/articles/304447.html</guid><description><![CDATA[<p>&nbsp;<br />
原文：<a href="http://www.yesky.com/471/1825471.shtml">http://www.yesky.com/471/1825471.shtml</a> </p>
1、JDK （Java Development Kit）<br />
2、Java Workshop <br />
3、NetBeans 与Sun Java Studio 5<br />
4、Borland 的JBuilder <br />
5、Oracle 的JDeveloper<br />
6、IBM的Visual Age for Java<br />
7、BEA 的 WebLogic Workshop<br />
8、WebGain 的Visual Cafe for Java<br />
9、Macromedia的JRUN<br />
10、JCreator<br />
11、Microsoft VJ++ <br />
12、Eclipse<br />
13、Ant Another Neat Tool(Ant)<br />
14、IntelliJ<br />
 <img src ="http://www.blogjava.net/jzone/aggbug/304447.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jzone/" target="_blank">Gavin.lee</a> 2009-12-01 22:54 <a href="http://www.blogjava.net/jzone/articles/304447.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java:线程堆---给自己系统中的线程命名，然后通过dump察看你的系统</title><link>http://www.blogjava.net/jzone/articles/304328.html</link><dc:creator>Gavin.lee</dc:creator><author>Gavin.lee</author><pubDate>Mon, 30 Nov 2009 15:41:00 GMT</pubDate><guid>http://www.blogjava.net/jzone/articles/304328.html</guid><description><![CDATA[集成开发环境（IDE）能给图形界面应用程序提供一个很好的调试工具，但是它却不能调试一个多线程的Java服务器程序。 　　　<br />
　　<br />
　　幸运的是，有几种工具，例如logging应用程序接口（API）或者Java Debugger可以用来调试Java服务器程序。开发者还能使用一个系统的线程堆在任何时候观察系统的状态。　　<br />
　　<br />
　　运行服务器，然后按[ctrl] [/]，会运行一个系统线程堆，这样将输出当前运行的所有线程，例如： 　　<br />
　　　　<br />
　　^\Full thread dump: 　　<br />
　　<br />
　　Thread-1" prio=5 tid=0x87fe0 nid=0x800013b8 waiting on monitor [0..0xbfffe9f8] 　　<br />
　　<br />
　　"Thread-0" prio=5 tid=0xafde0 nid=0x72a00 runnable [0x173f000..0x173fb48] <br />
　　<br />
　　at java.net.PlainSocketImpl.socketAccept(Native Method) <br />
　　<br />
　　at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:421) <br />
　　<br />
　　at java.net.ServerSocket.implAccept(ServerSocket.java:243) <br />
　　<br />
　　at java.net.ServerSocket.accept(ServerSocket.java:222) <br />
　　<br />
　　at com.generationjava.net.PortListener.run(PortListener.java:38) <br />
　　<br />
　　at java.lang.Thread.run(Thread.java:496) 　　　<br />
　　<br />
　　"Signal Dispatcher" daemon prio=10 tid=0xa5f80 nid=0x52af0 waiting on monitor [0..0] 　　　　<br />
　　<br />
　　"Finalizer" daemon prio=8 tid=0xa46c0 nid=0x4d930 waiting on monitor [0x10a8000..0x10a8b48] <br />
　　<br />
　　at java.lang.Object.wait(Native Method) <br />
　　<br />
　　at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:108) <br />
　　<br />
　　at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:123) <br />
　　<br />
　　at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:162) 　　　　<br />
　　<br />
　　"Reference Handler" daemon prio=10 tid=0xa3b70 nid=0x4cca0 waiting on monitor [0x1027000..0x1027b48] <br />
　　<br />
　　at java.lang.Object.wait(Native Method) <br />
　　<br />
　　at java.lang.Object.wait(Object.java:420) <br />
　　<br />
　　at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:110) 　　　　<br />
　　<br />
　　"VM Thread" prio=5 tid=0xa2de0 nid=0x4ca20 runnable 　　<br />
　　<br />
　　"VM Periodic Task Thread" prio=10 tid=0xa56b0 nid=0x52890 waiting on monitor 　　<br />
　　<br />
　　后面的四个线程是标准线程，而其他的则跟运行的服务器程序有关。这两个线程被命名为Thread-1和Thread-0，假如用Thread th = new Thread(runnable,"Server")代替Thread th = new Thread(runnable)去创建进程，你就可以命名自己要创建的线程。　　<br />
　　<br />
　　另外，假如你调用java.lang.Thread的setName(String)方法，你也能命名你的线程，并且可以很轻易从线程堆的输出中发现原来的Thread-0是服务器程序。　　<br />
　　<br />
　　"Server" prio=5 tid=0xafde0 nid=0x72a00 runnable [0x173f000..0x173fb48] 　　<br />
　　<br />
　　而原来的Thread-1线程现在变成了Thread-0。 　　　　<br />
　　<br />
　　通过命名线程和取得线程堆，开发者就能看到Java虚拟机（JVM）的内部状态。假如想得到更多信息的话，你就得去研究Java Debugger了。 <br />
资料来源:学网(www.xue5.com),原文地址:http://www.xue5.com/itedu/200702/91976.html 
<img src ="http://www.blogjava.net/jzone/aggbug/304328.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jzone/" target="_blank">Gavin.lee</a> 2009-11-30 23:41 <a href="http://www.blogjava.net/jzone/articles/304328.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java代码触发生成ThreadDump</title><link>http://www.blogjava.net/jzone/articles/304324.html</link><dc:creator>Gavin.lee</dc:creator><author>Gavin.lee</author><pubDate>Mon, 30 Nov 2009 15:13:00 GMT</pubDate><guid>http://www.blogjava.net/jzone/articles/304324.html</guid><description><![CDATA[ThreadDump对于JVM诊断和调优是个好东西. 以前, 我们生成ThreadDump, 一般都需要另外连到服务器上的进程管理器才行, 不管是Ctrl+Break还是kill &#8211;3, 比较不方便. 有时候, 也许想远程直接生成并检查一下服务器的ThreadDump, 这个怎么办呢? 幸好我们有以下代码可以做到:<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;yixun.wap.tools;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.util.Map;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img id="Codehighlighter1_49_208_Open_Image" onclick="this.style.display='none'; Codehighlighter1_49_208_Open_Text.style.display='none'; Codehighlighter1_49_208_Closed_Image.style.display='inline'; Codehighlighter1_49_208_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_49_208_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_49_208_Closed_Text.style.display='none'; Codehighlighter1_49_208_Open_Image.style.display='inline'; Codehighlighter1_49_208_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_49_208_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**&nbsp;*/</span><span id="Codehighlighter1_49_208_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000">&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;*&nbsp;使用&nbsp;Java&nbsp;远程代码生成&nbsp;ThreadDump.&nbsp;适用于&nbsp;JDK&nbsp;1.5+.&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;*&nbsp;参考:&nbsp;{</span><span style="color: #808080">@link</span><span style="color: #008000">&nbsp;ThreadgetStackTrace()}&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;*&nbsp;{</span><span style="color: #808080">@link</span><span style="color: #008000">&nbsp;ThrowablegetStackTrace()}&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;*&nbsp;</span><span style="color: #808080">@see</span><span style="color: #008000">&nbsp;StackTraceElement&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_241_1085_Open_Image" onclick="this.style.display='none'; Codehighlighter1_241_1085_Open_Text.style.display='none'; Codehighlighter1_241_1085_Closed_Image.style.display='inline'; Codehighlighter1_241_1085_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_241_1085_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_241_1085_Closed_Text.style.display='none'; Codehighlighter1_241_1085_Open_Image.style.display='inline'; Codehighlighter1_241_1085_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;ThreadDumpBuilder&nbsp;</span><span id="Codehighlighter1_241_1085_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_241_1085_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_244_292_Open_Image" onclick="this.style.display='none'; Codehighlighter1_244_292_Open_Text.style.display='none'; Codehighlighter1_244_292_Closed_Image.style.display='inline'; Codehighlighter1_244_292_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_244_292_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_244_292_Closed_Text.style.display='none'; Codehighlighter1_244_292_Open_Image.style.display='inline'; Codehighlighter1_244_292_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_244_292_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**&nbsp;*/</span><span id="Codehighlighter1_244_292_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000">&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;生成并返回&nbsp;Thread&nbsp;Dump.&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@return</span><span style="color: #008000">&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_317_588_Open_Image" onclick="this.style.display='none'; Codehighlighter1_317_588_Open_Text.style.display='none'; Codehighlighter1_317_588_Closed_Image.style.display='inline'; Codehighlighter1_317_588_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_317_588_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_317_588_Closed_Text.style.display='none'; Codehighlighter1_317_588_Open_Image.style.display='inline'; Codehighlighter1_317_588_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;build()&nbsp;</span><span id="Codehighlighter1_317_588_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_317_588_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringBuilder&nbsp;output&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;StringBuilder(</span><span style="color: #000000">1000</span><span style="color: #000000">);<br />
<img id="Codehighlighter1_438_557_Open_Image" onclick="this.style.display='none'; Codehighlighter1_438_557_Open_Text.style.display='none'; Codehighlighter1_438_557_Closed_Image.style.display='inline'; Codehighlighter1_438_557_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_438_557_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_438_557_Closed_Text.style.display='none'; Codehighlighter1_438_557_Open_Image.style.display='inline'; Codehighlighter1_438_557_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(Map.Entry&nbsp;stackTrace&nbsp;:&nbsp;Thread.getAllStackTraces().entrySet())&nbsp;</span><span id="Codehighlighter1_438_557_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_438_557_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;appendThreadStackTrace(output,&nbsp;(Thread)&nbsp;stackTrace.getKey(),<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(StackTraceElement[])&nbsp;stackTrace.getValue());<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;output.toString();<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img id="Codehighlighter1_592_741_Open_Image" onclick="this.style.display='none'; Codehighlighter1_592_741_Open_Text.style.display='none'; Codehighlighter1_592_741_Closed_Image.style.display='inline'; Codehighlighter1_592_741_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_592_741_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_592_741_Closed_Text.style.display='none'; Codehighlighter1_592_741_Open_Image.style.display='inline'; Codehighlighter1_592_741_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_592_741_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**&nbsp;*/</span><span id="Codehighlighter1_592_741_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000">&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;处理并输出堆栈信息.&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@param</span><span style="color: #008000">&nbsp;output&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;输出内容&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@param</span><span style="color: #008000">&nbsp;thread&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;线程&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@param</span><span style="color: #008000">&nbsp;stack&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;线程堆栈&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;appendThreadStackTrace(StringBuilder&nbsp;output,&nbsp;Thread&nbsp;thread,<br />
<img id="Codehighlighter1_847_1082_Open_Image" onclick="this.style.display='none'; Codehighlighter1_847_1082_Open_Text.style.display='none'; Codehighlighter1_847_1082_Closed_Image.style.display='inline'; Codehighlighter1_847_1082_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_847_1082_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_847_1082_Closed_Text.style.display='none'; Codehighlighter1_847_1082_Open_Image.style.display='inline'; Codehighlighter1_847_1082_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StackTraceElement[]&nbsp;stack)&nbsp;</span><span id="Codehighlighter1_847_1082_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_847_1082_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;忽略当前线程的堆栈信息&nbsp;&nbsp;&nbsp;</span><span style="color: #008000"><br />
<img id="Codehighlighter1_914_929_Open_Image" onclick="this.style.display='none'; Codehighlighter1_914_929_Open_Text.style.display='none'; Codehighlighter1_914_929_Closed_Image.style.display='inline'; Codehighlighter1_914_929_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_914_929_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_914_929_Closed_Text.style.display='none'; Codehighlighter1_914_929_Open_Image.style.display='inline'; Codehighlighter1_914_929_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(thread.equals(Thread.currentThread()))&nbsp;</span><span id="Codehighlighter1_914_929_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_914_929_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;output.append(thread).append(</span><span style="color: #000000">"</span><span style="color: #000000">&lt;br/&gt;</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img id="Codehighlighter1_1015_1079_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1015_1079_Open_Text.style.display='none'; Codehighlighter1_1015_1079_Closed_Image.style.display='inline'; Codehighlighter1_1015_1079_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1015_1079_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1015_1079_Closed_Text.style.display='none'; Codehighlighter1_1015_1079_Open_Image.style.display='inline'; Codehighlighter1_1015_1079_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(StackTraceElement&nbsp;element&nbsp;:&nbsp;stack)&nbsp;</span><span id="Codehighlighter1_1015_1079_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_1015_1079_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;output.append(</span><span style="color: #000000">"</span><span style="color: #000000">\t</span><span style="color: #000000">"</span><span style="color: #000000">).append(element).append(</span><span style="color: #000000">"</span><span style="color: #000000">\n&lt;br/&gt;</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div>
<br />
<pre>然后在一个JSP里或者Servlet中任意调用即可:
</pre>
<pre>&lt;%=new ThreadDumpBuilder().build() %&gt;
</pre>
<pre>===== END OF THREAD DUMP ===============
</pre>
<pre>参考资料:</pre>
<pre>1. <a href="http://www.atlassian.com/software/confluence"><strong><font color="#006bad">Atlassian Confluence</font></strong></a> 3.0 管理控制台</pre>
<pre>2. JDK的DEMO</pre>
<pre>jdk1.5.0\demo\management\FullThreadDump</pre>
<pre>原文：<a href="http://ajava.org/course/java/13843.html">http://ajava.org/course/java/13843.html</a> </pre>
<pre>java.lang<br />
类 StackTraceElement 方法：</pre>
<pre>&nbsp;boolean &nbsp;equals(Object obj)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果指定的对象是另一个 StackTraceElement 实例，并且该对象表示的执行点与该实例的相同，则返回 ture。<br />
&nbsp;String &nbsp;getClassName()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回类的完全限定名，该类包含由该堆栈跟踪元素所表示的执行点。<br />
&nbsp;String &nbsp;getFileName()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回源文件名，该文件包含由该堆栈跟踪元素所表示的执行点。<br />
&nbsp;int &nbsp;getLineNumber()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回源行的行号，该行包含由该堆栈该跟踪元素所表示的执行点。<br />
&nbsp;String &nbsp;getMethodName()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回方法名，此方法包含由该堆栈跟踪元素所表示的执行点。<br />
&nbsp;int &nbsp;hashCode()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回此堆栈跟踪元素的哈希码值。<br />
&nbsp;boolean &nbsp;isNativeMethod()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果包含由该堆栈跟踪元素所表示的执行点的方法是一个本机方法，则返回 true。<br />
&nbsp;String &nbsp;toString()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回表示该堆栈跟踪元素的字符串。</pre>
<pre>&nbsp;</pre>
<img src ="http://www.blogjava.net/jzone/aggbug/304324.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jzone/" target="_blank">Gavin.lee</a> 2009-11-30 23:13 <a href="http://www.blogjava.net/jzone/articles/304324.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA线程dump的分析 --- jstack pid</title><link>http://www.blogjava.net/jzone/articles/303979.html</link><dc:creator>Gavin.lee</dc:creator><author>Gavin.lee</author><pubDate>Fri, 27 Nov 2009 14:02:00 GMT</pubDate><guid>http://www.blogjava.net/jzone/articles/303979.html</guid><description><![CDATA[<p>&nbsp;</p>
<h3>Java 的线程</h3>
<br />
线程是指能独立于程序的其它部分运行的执行单元。 JAVA语言能够很好的实现多线程的程序。我们在调试程序，或者在开发后期需要做性能调优的时候，往往也需要了解当前程序正在运行的线程的状态，正在执行的操作，从而分析系统可能存在的问题。 <br />
<br />
在阅读本文之间，应对 Java线程的编程原理，同步机制有一定了解 . <br />
<br />
<h3>产生 JAVA线程 dump</h3>
<br />
JAVA 的线程 DUMP，就象当前 JAVA进程的一个快照，打印出所有线程的状态和调用堆栈，以及 Monitor的状态。在不同的操作系统下，产生线程 DUMP的方式是不同的。 <br />
<br />
<ul>
    <li><span lang="EN-US" style="font-size: 10pt; font-family: Symbol">&#183;</span>在 windows环境中， </li>
</ul>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; 在启动程序的控制台里敲： Ctrl - Break，线程的 dump会产生在标准输出中（ 缺省标准输出就是控制台，如果对输出进行了重定向，则要查看输出文件）。
<ul>
    <li>在 unix， linux和 MacOS 环境中， </li>
</ul>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 在控制台中敲： Ctrl-\，或者， <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 用 &#8220;kill -3 &lt;pid&gt;&#8221; ，或者 &#8220;kill &#8211; QUIT &lt;pid&gt;&#8221;。 Pid是用所关注的 JAVA进程号，您可以用 &#8220;ps -ef | grep java&#8221; 找到，或者使用 JDK 5.0中的 &#8220;jps -v&#8221; 命令获得。 <br />
<ul>
    <li>在各个操作系统平台，都可以用 JDK 5.0工具包中的 jstack &lt;pid&gt; </li>
</ul>
<br />
这里要注意的是： <br />
<br />
1.&nbsp;&nbsp;&nbsp;&nbsp; 不同的 JAVA虚机的线程 DUMP的创建方法和文件格式是不一样的，不同的 JVM版本， dump信息也有差别。本文中，只以 SUN的 hotspot JVM 5.0_06 为例。 <br />
<br />
2.&nbsp;&nbsp;&nbsp;&nbsp; 在实际运行中，往往一次 dump的信息，还不足以确认问题。建议产生三次 dump信息，如果每次 dump都指向同一个问题，我们才确定问题的典型性。 <br />
<br />
<h3>线程分析 ：</h3>
<br />
1.&nbsp;&nbsp;&nbsp;&nbsp; JVM 线程 <br />
在线程中，有一些 JVM内部的后台线程，来执行譬如垃圾回收，或者低内存的检测等等任务，这些线程往往在 JVM初始化的时候就存在，如下所示： <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Low Memory Detector" daemon prio=10 tid=0x081465f8 nid=0x7 runnable [0x00000000..0x00000000] <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "CompilerThread0" daemon prio=10 tid=0x08143c58 nid=0x6 waiting on condition [0x00000000..0xfb5fd798] <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Signal Dispatcher" daemon prio=10 tid=0x08142f08 nid=0x5 waiting on condition [0x00000000..0x00000000] <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Finalizer" daemon prio=10 tid=0x08137ca0 nid=0x4 in Object.wait() [0xfbeed000..0xfbeeddb8] <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at java.lang.Object.wait(Native Method) <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - waiting on &lt;0xef600848&gt; (a java.lang.ref.ReferenceQueue$Lock) <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:116) <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - locked &lt;0xef600848&gt; (a java.lang.ref.ReferenceQueue$Lock) <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:132) <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:159) <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Reference Handler" daemon prio=10 tid=0x081370f0 nid=0x3 in Object.wait() [0xfbf4a000..0xfbf4aa38] <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at java.lang.Object.wait(Native Method) <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - waiting on &lt;0xef600758&gt; (a java.lang.ref.Reference$Lock) <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at java.lang.Object.wait(Object.java:474) <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:116) <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - locked &lt;0xef600758&gt; (a java.lang.ref.Reference$Lock) <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "VM Thread" prio=10 tid=0x08134878 nid=0x2 runnable <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "VM Periodic Task Thread" prio=10 tid=0x08147768 nid=0x8 waiting on condition <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我们更多的是要观察用户级别的线程，如下所示： <br />
<br />
&nbsp; <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Thread-1" prio=10 tid=0x08223860 nid=0xa waiting on condition [0xef47a000..0xef47ac38] <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at java.lang.Thread.sleep(Native Method) <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at testthread.MySleepingThread.method2(MySleepingThread.java:53) <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - locked &lt;0xef63d600&gt; (a testthread.MySleepingThread) <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at testthread.MySleepingThread.run(MySleepingThread.java:35) <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at java.lang.Thread.run(Thread.java:595) <br />
<br />
&nbsp; <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我们能看到： <br />
<br />
<ul>
    <li>线程的状态： waiting on condition </li>
</ul>
<ul>
    <li>线程的调用栈 </li>
</ul>
<ul>
    <li>线程的当前锁住的资源： &lt;0xef63d600&gt; </li>
</ul>
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这些信息对我们随后的分析都有用处。 <br />
<br />
2.&nbsp;&nbsp;&nbsp;&nbsp; 线程的状态分析 <br />
<br />
正如我们刚看到的那样，线程的状态是一个重要的指标，它会显示在线程 Stacktrace的头一行结尾的地方。那么线程常见的有哪些状态呢？线程在什么样的情况下会进入这种状态呢？我们能从中发现什么线索？&lt; /span&gt; <br />
<br />
1.1 Runnable <br />
<br />
该状态表示线程具备所有运行条件，在运行队列中准备操作系统的调度，或者正在运行。 <br />
<br />
1.2 Wait on condition <br />
<br />
该状态出现在线程等待某个条件的发生。具体是什么原因，可以结合 stacktrace来分析。最常见的情况是线程在等待网络的读写，比如当网络数据没有准备好读时，线程处于这种等待状态，而一旦有数据准备好读之后，线程会重新激活，读取并处理数据。在 Java引入 NewIO之前，对于每个网络连接，都有一个对应的线程来处理网络的读写操作，即使没有可读写的数据，线程仍然阻塞在读写操作上，这样有可能造成资源浪费，而且给操作系统的线程调度也带来压力。在 NewIO里采用了新的机制，编写的服务器程序的性能和可扩展性都得到提高。 <br />
<br />
如果发现有大量的线程都在处在 Wait on condition，从线程 stack看， 正等待网络读写，这可能是一个网络瓶颈的征兆。因为网络阻塞导致线程无法执行。一种情况是网络非常忙，几 乎消耗了所有的带宽，仍然有大量数据等待网络读 写；另一种情况也可能是网络空闲，但由于路由等问题，导致包无法正常的到达。所以要结合系统的一些性能观察工具来综合分析，比如 netstat统计单位时间的发送包的数目，如果很明显超过了所在网络带宽的限制 ; 观察 cpu的利用率，如果系统态的 CPU时间，相对于用户态的 CPU时间比例较高；如果程序运行在 Solaris 10平台上，可以用 dtrace工具看系统调用的情况，如果观察到 read/write的系统调用的次数或者运行时间遥遥领先；这些都指向由于网络带宽所限导致的网络瓶颈。 <br />
<br />
另外一种出现 Wait on condition的常见情况是该线程在 sleep，等待 sleep的时间到了时候，将被唤醒。 <br />
<br />
1.3 Waiting for monitor entry 和 in Object.wait() <br />
<br />
在多线程的 JAVA程序中，实现线程之间的同步，就要说说 Monitor。 Monitor是 Java中用以实现线程之间的互斥与协作的主要手段，它可以看成是对象或者 Class的锁。每一个对象都有，也仅有一个 monitor。下 面这个图，描述了线程和 Monitor之间关系，以 及线程的状态转换图：&nbsp;<br />
<img height="371" alt="" src="http://www.blogjava.net/images/blogjava_net/jzone/200911/thread.jpg" width="500" border="0" /> <br />
<br />
从图中可以看出，每个 Monitor在某个时刻，只能被一个线程拥有，该线程就是 &#8220;Active Thread&#8221;，而其它线程都是 &#8220;Waiting Thread&#8221;，分别在两个队列 &#8220; Entry Set&#8221;和 &#8220;Wait Set&#8221;里面等候。在 &#8220;Entry Set&#8221;中等待的线程状态是 &#8220;Waiting for monitor entry&#8221;，而在 &#8220;Wait Set&#8221;中等待的线程状态是 &#8220;in Object.wait()&#8221;。 <br />
<br />
先看 &#8220;Entry Set&#8221;里面的线程。我们称被 synchronized保护起来的代码段为临界区。当一个线程申请进入临界区时，它就进入了 &#8220;Entry Set&#8221;队列。对应的 code就像： <br />
<br />
synchronized(obj) { <br />
......... <br />
<br />
} <br />
<br />
这时有两种可能性： <br />
<br />
&#183;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 该 monitor不被其它线程拥有， Entry Set里面也没有其它等待线程。本线程即成为相应类或者对象的 Monitor的 Owner，执行临界区的代码 <br />
<br />
&#183;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 该 monitor被其它线程拥有，本线程在 Entry Set队列中等待。 <br />
<br />
在第一种情况下，线程将处于 &#8220;Runnable&#8221;的状态，而第二种情况下，线程 DUMP会显示处于 &#8220;waiting for monitor entry&#8221;。如下所示： <br />
<br />
&nbsp; <br />
<br />
"Thread-0" prio=10 tid=0x08222eb0 nid=0x9 waiting for monitor entry [0xf927b000..0xf927bdb8] <br />
<br />
at testthread.WaitThread.run(WaitThread.java:39) <br />
<br />
- waiting to lock &lt;0xef63bf08&gt; (a java.lang.Object) <br />
<br />
- locked &lt;0xef63beb8&gt; (a java.util.ArrayList) <br />
<br />
at java.lang.Thread.run(Thread.java:595) <br />
<br />
&nbsp; <br />
<br />
临界区的设置，是为了保证其内部的代码执行的原子性和完整性。但是因为临界区在任何时间只允许线程串行通过，这 和我们多线程的程序的初衷是相反的。 如果在多线程的程序中，大量使用 synchronized，或者不适当的使用了它，会造成大量线程在临界区的入口等待，造成系统的性能大幅下降。如果在线程 DUMP中发现了这个情况，应该审查源码，改进程序。 <br />
<br />
现在我们再来看现在线程为什么会进入 &#8220;Wait Set&#8221;。当线程获得了 Monitor，进入了临界区之后，如果发现线程继续运行的条件没有满足，它则调用对象（一般就是被 synchronized 的对象）的 wait() 方法，放弃了 Monitor，进入 &#8220;Wait Set&#8221;队列。只有当别的线程在该对象上调用了 notify() 或者 notifyAll() ， &#8220; Wait Set&#8221;队列中线程才得到机会去竞争，但是只有一个线程获得对象的 Monitor，恢复到运行态。在 &#8220;Wait Set&#8221;中的线程， DUMP中表现为： in Object.wait()，类似于： <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Thread-1" prio=10 tid=0x08223250 nid=0xa in Object.wait() [0xef47a000..0xef47aa38] <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at java.lang.Object.wait(Native Method) <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - waiting on &lt;0xef63beb8&gt; (a java.util.ArrayList) <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at java.lang.Object.wait(Object.java:474) <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at testthread.MyWaitThread.run(MyWaitThread.java:40) <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - locked &lt;0xef63beb8&gt; (a java.util.ArrayList) <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at java.lang.Thread.run(Thread.java:595) <br />
<br />
&nbsp; <br />
仔细观察上面的 DUMP信息，你会发现它有以下两行： <br />
<br />
- locked &lt;0xef63beb8&gt; (a java.util.ArrayList) <br />
<br />
- waiting on &lt;0xef63beb8&gt; (a java.util.ArrayList) <br />
<br />
这里需要解释一下，为什么先 lock了这个对象，然后又 waiting on同一个对象呢？让我们看看这个线程对应的代码： <br />
<br />
&nbsp; <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; synchronized(obj) { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ......... <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; obj.wait(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ......... <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />
<br />
线程的执行中，先用 synchronized 获得了这个对象的 Monitor（对应于 locked &lt;0xef63beb8&gt; ）。当执行到 obj.wait(), 线程即放弃了 Monitor的所有权，进入 &#8220;wait set&#8221;队列（对应于 waiting on &lt;0xef63beb8&gt; ）。 <br />
<br />
往往在你的程序中，会出现多个类似的线程，他们都有相似的 DUMP信息。这也可能是正常的。比如，在程序中，有多个服务线程，设计成从一个队列里面读取请求数据。这个队列就是 lock以及 waiting on的对象。当队列为空的时候，这些线程都会在这个队列上等待，直到队列有了数据，这些线程被 Notify，当然只有一个线程获得了 lock，继续执行，而其它线程继续等待。 <br />
<br />
3.&nbsp;&nbsp;&nbsp;&nbsp; JDK 5.0 的 lock <br />
<br />
上面我们提到如果 synchronized和 monitor机制运用不当，可能会造成多线程程序的性能问题。在 JDK 5.0中，引入了 Lock机制，从而使开发者能更灵活的开发高性能的并发多线程程序，可以替代以往 JDK中的 synchronized和 Monitor的 机制。但是，要注意的是，因为 Lock类只是一个普通类， JVM无从得知 Lock对象的占用情况，所以在线程 DUMP中，也不会包含关于 Lock的信息， 关于死锁等问题，就不如用 synchronized的编程方式容易识别。 <br />
<br />
<h3>案例分析</h3>
<br />
1.&nbsp;&nbsp;&nbsp;&nbsp; 死锁 <br />
<br />
在多线程程序的编写中，如果不适当的运用同步机制，则有可能造成程序的死锁，经常表现为程序的停顿，或者不再响应用户的请求。 <br />
<br />
比如在下面这个示例中，是个较为典型的死锁情况： <br />
<br />
&nbsp; <br />
<br />
"Thread-1" prio=5 tid=0x00acc490 nid=0xe50 waiting for monitor entry [0x02d3f000 <br />
<br />
..0x02d3fd68] <br />
<br />
at deadlockthreads.TestThread.run(TestThread.java:31) <br />
<br />
- waiting to lock &lt;0x22c19f18&gt; (a java.lang.Object) <br />
<br />
- locked &lt;0x22c19f20&gt; (a java.lang.Object) <br />
<br />
&nbsp; <br />
<br />
"Thread-0" prio=5 tid=0x00accdb0 nid=0xdec waiting for monitor entry [0x02cff000 <br />
<br />
..0x02cff9e8] <br />
<br />
at deadlockthreads.TestThread.run(TestThread.java:31) <br />
<br />
- waiting to lock &lt;0x22c19f20&gt; (a java.lang.Object) <br />
<br />
- locked &lt;0x22c19f18&gt; (a java.lang.Object) <br />
<br />
在 JAVA 5中加强了对死锁的检测。线程 Dump中可以直接报告出 Java级别的死锁，如下所示： <br />
<br />
&nbsp; <br />
<br />
Found one Java-level deadlock: <br />
<br />
============================= <br />
<br />
"Thread-1": <br />
<br />
waiting to lock monitor 0x0003f334 (object 0x22c19f18, a java.lang.Object), <br />
<br />
which is held by "Thread-0" <br />
<br />
"Thread-0": <br />
<br />
waiting to lock monitor 0x0003f314 (object 0x22c19f20, a java.lang.Object), <br />
<br />
which is held by "Thread-1" <br />
<br />
2.&nbsp;&nbsp;&nbsp;&nbsp; 热锁 <br />
<br />
热锁，也往往是导致系统性能瓶颈的主要因素。其表现特征为，由于多个线程对临界区，或者锁的竞争，可能出现：&amp; amp; lt; /span&gt; <br />
<br />
<ul>
    <li>频繁的线程的上下文切换：从操作系统对线程的调度来看，当 线程在等待资源而阻塞的时候，操作系统会将之切换出来，放到等待的队列，当线程获得资源之后，调度算法会将这个线程切换进去，放到执行队列中。&amp; amp; amp; amp; lt; /li&gt; </li>
</ul>
<ul>
    <li>大量的系统调用：因为线程的上下文切换，以及热锁的竞争，或 者临界区的频繁的进出，都可能导致大量的系统调用。M t &lt; /span&gt; </li>
</ul>
<ul>
    <li>大部分 CPU开销用在 &#8220;系统态 &#8221;：线程上下文切换，和系统调用，都会导致 CPU在 &#8220;系统态 &#8221;运行，换而言之，虽然系统很忙碌，但是 CPU用在 &#8220;用户态 &#8221;的比例较小，应用程序得不到充分的 CPU资源。 </li>
</ul>
<ul>
    <li>随着 CPU数目的增多，系统的性能反而下降。因为 CPU数目多，同 时运行的线程就越多，可能就会造成更频繁的线程上下文切换和系统态的 CPU开销，从而导致更糟糕的性能。 </li>
</ul>
<br />
上面的描述，都是一个 scalability（可扩展性）很差的系统的表现。从整体的性能指标看，由于线程热锁的存在，程序的响应时间会变长，吞吐量会降低。&lt; /span&gt; <br />
<br />
那么，怎么去了解 &#8220;热锁 &#8221;出现在什么地方呢？一个重要的方法还是结合操作系统的各种工具观察系统资源使用状况，以及收集 Java线程的 DUMP信息，看线程都阻塞在什么方法上，了解原因，才能找到对应的解决方法。 <br />
<br />
我们曾经遇到过这样的例子，程序运行时，出现了以上指出的各种现象，通过观察操作系统的资源使用统计信息，以及线程 DUMP信息，确定了程序中热锁的存在，并发现大多数的线程状态都是 Waiting for monitor entry或者 Wait on monitor，且是阻塞在压缩和解压缩的方法上。后来采用第三方的压缩包 javalib替代 JDK自带的压缩包后，系统的性能提高了几倍。 <br />
<br />
<h3>总结</h3>
<br />
本文就介绍了 Java线程 DUMP的基本知识和分析的基本方法，并且解释了如何利用线程的 DUMP信息，以及结合操作系统的各种资源使用情况，分析程序的性能问题，从而达到改进程序，提高性能的目的。 
<img src ="http://www.blogjava.net/jzone/aggbug/303979.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jzone/" target="_blank">Gavin.lee</a> 2009-11-27 22:02 <a href="http://www.blogjava.net/jzone/articles/303979.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>判断字符串是否是数字串</title><link>http://www.blogjava.net/jzone/articles/303312.html</link><dc:creator>Gavin.lee</dc:creator><author>Gavin.lee</author><pubDate>Mon, 23 Nov 2009 03:33:00 GMT</pubDate><guid>http://www.blogjava.net/jzone/articles/303312.html</guid><description><![CDATA[在我们日常开发过程中，为了安全考虑，会用到对传值进行限制，下面这段是先人用的4个方法，都是可行了，现贴如下<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #008000">//</span><span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;1.使用Character.isDigit(char)判断&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000"><br />
<img id="Codehighlighter1_73_264_Open_Image" onclick="this.style.display='none'; Codehighlighter1_73_264_Open_Text.style.display='none'; Codehighlighter1_73_264_Closed_Image.style.display='inline'; Codehighlighter1_73_264_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_73_264_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_73_264_Closed_Text.style.display='none'; Codehighlighter1_73_264_Open_Image.style.display='inline'; Codehighlighter1_73_264_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">boolean</span><span style="color: #000000">&nbsp;isNumeric(String&nbsp;str)&nbsp;</span><span id="Codehighlighter1_73_264_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_73_264_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_112_133_Open_Image" onclick="this.style.display='none'; Codehighlighter1_112_133_Open_Text.style.display='none'; Codehighlighter1_112_133_Closed_Image.style.display='inline'; Codehighlighter1_112_133_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_112_133_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_112_133_Closed_Text.style.display='none'; Codehighlighter1_112_133_Open_Image.style.display='inline'; Codehighlighter1_112_133_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(str&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">||</span><span style="color: #000000">&nbsp;str.equals(</span><span style="color: #000000">""</span><span style="color: #000000">))&nbsp;</span><span id="Codehighlighter1_112_133_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_112_133_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_175_246_Open_Image" onclick="this.style.display='none'; Codehighlighter1_175_246_Open_Text.style.display='none'; Codehighlighter1_175_246_Closed_Image.style.display='inline'; Codehighlighter1_175_246_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_175_246_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_175_246_Closed_Text.style.display='none'; Codehighlighter1_175_246_Open_Image.style.display='inline'; Codehighlighter1_175_246_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;str.length();&nbsp;</span><span style="color: #000000">--</span><span style="color: #000000">i&nbsp;</span><span style="color: #000000">&gt;=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;)&nbsp;</span><span id="Codehighlighter1_175_246_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_175_246_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_219_242_Open_Image" onclick="this.style.display='none'; Codehighlighter1_219_242_Open_Text.style.display='none'; Codehighlighter1_219_242_Closed_Image.style.display='inline'; Codehighlighter1_219_242_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_219_242_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_219_242_Closed_Text.style.display='none'; Codehighlighter1_219_242_Open_Image.style.display='inline'; Codehighlighter1_219_242_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">!</span><span style="color: #000000">Character.isDigit(str.charAt(i)))&nbsp;</span><span id="Codehighlighter1_219_242_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_219_242_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;2.使用类型转换判断</span><span style="color: #008000"><br />
<img id="Codehighlighter1_324_435_Open_Image" onclick="this.style.display='none'; Codehighlighter1_324_435_Open_Text.style.display='none'; Codehighlighter1_324_435_Closed_Image.style.display='inline'; Codehighlighter1_324_435_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_324_435_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_324_435_Closed_Text.style.display='none'; Codehighlighter1_324_435_Open_Image.style.display='inline'; Codehighlighter1_324_435_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">boolean</span><span style="color: #000000">&nbsp;isNumeric2&nbsp;(String&nbsp;str)&nbsp;</span><span id="Codehighlighter1_324_435_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_324_435_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_332_383_Open_Image" onclick="this.style.display='none'; Codehighlighter1_332_383_Open_Text.style.display='none'; Codehighlighter1_332_383_Closed_Image.style.display='inline'; Codehighlighter1_332_383_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_332_383_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_332_383_Closed_Text.style.display='none'; Codehighlighter1_332_383_Open_Image.style.display='inline'; Codehighlighter1_332_383_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000">&nbsp;</span><span id="Codehighlighter1_332_383_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_332_383_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Integer.valueOf(str);&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">;<br />
<img id="Codehighlighter1_405_430_Open_Image" onclick="this.style.display='none'; Codehighlighter1_405_430_Open_Text.style.display='none'; Codehighlighter1_405_430_Closed_Image.style.display='inline'; Codehighlighter1_405_430_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_405_430_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_405_430_Closed_Text.style.display='none'; Codehighlighter1_405_430_Open_Image.style.display='inline'; Codehighlighter1_405_430_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;(Exception&nbsp;e)&nbsp;</span><span id="Codehighlighter1_405_430_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_405_430_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;3.使用正则表达式判断</span><span style="color: #008000"><br />
<img id="Codehighlighter1_492_617_Open_Image" onclick="this.style.display='none'; Codehighlighter1_492_617_Open_Text.style.display='none'; Codehighlighter1_492_617_Closed_Image.style.display='inline'; Codehighlighter1_492_617_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_492_617_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_492_617_Closed_Text.style.display='none'; Codehighlighter1_492_617_Open_Image.style.display='inline'; Codehighlighter1_492_617_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">boolean</span><span style="color: #000000">&nbsp;isNumeric3(String&nbsp;str)&nbsp;</span><span id="Codehighlighter1_492_617_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_492_617_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;str.matches(</span><span style="color: #000000">"</span><span style="color: #000000">[0-9]+</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;+表示1个或多个（如"3"或"225"），*表示0个或多个（[0-9]*）（如""或"1"或"22"），?表示0个或1个([0-9]?)(如""或"7")&nbsp;&nbsp;&nbsp;</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;4.使用Pattern类和Matcher</span><span style="color: #008000"><br />
<img id="Codehighlighter1_684_828_Open_Image" onclick="this.style.display='none'; Codehighlighter1_684_828_Open_Text.style.display='none'; Codehighlighter1_684_828_Closed_Image.style.display='inline'; Codehighlighter1_684_828_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_684_828_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_684_828_Closed_Text.style.display='none'; Codehighlighter1_684_828_Open_Image.style.display='inline'; Codehighlighter1_684_828_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">boolean</span><span style="color: #000000">&nbsp;isNumeric4(String&nbsp;str)&nbsp;</span><span id="Codehighlighter1_684_828_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_684_828_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Pattern&nbsp;pattern&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Pattern.compile(</span><span style="color: #000000">"</span><span style="color: #000000">[0-9]+</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Matcher&nbsp;matcher&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;pattern.matcher((CharSequence)&nbsp;str);&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;matcher.matches();&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
<img src ="http://www.blogjava.net/jzone/aggbug/303312.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jzone/" target="_blank">Gavin.lee</a> 2009-11-23 11:33 <a href="http://www.blogjava.net/jzone/articles/303312.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>BigDecimal --判断两数相除是否为无穷</title><link>http://www.blogjava.net/jzone/articles/299218.html</link><dc:creator>Gavin.lee</dc:creator><author>Gavin.lee</author><pubDate>Wed, 21 Oct 2009 08:27:00 GMT</pubDate><guid>http://www.blogjava.net/jzone/articles/299218.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: import&nbsp;java.math.BigDecimal;public&nbsp;class&nbsp;Test&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;main(String&nbsp;args[])&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n...&nbsp;&nbsp;<a href='http://www.blogjava.net/jzone/articles/299218.html'>阅读全文</a><img src ="http://www.blogjava.net/jzone/aggbug/299218.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jzone/" target="_blank">Gavin.lee</a> 2009-10-21 16:27 <a href="http://www.blogjava.net/jzone/articles/299218.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Math 取整函数</title><link>http://www.blogjava.net/jzone/articles/298677.html</link><dc:creator>Gavin.lee</dc:creator><author>Gavin.lee</author><pubDate>Sat, 17 Oct 2009 05:42:00 GMT</pubDate><guid>http://www.blogjava.net/jzone/articles/298677.html</guid><description><![CDATA[<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_0_14_Open_Image" onclick="this.style.display='none'; Codehighlighter1_0_14_Open_Text.style.display='none'; Codehighlighter1_0_14_Closed_Image.style.display='inline'; Codehighlighter1_0_14_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_0_14_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_0_14_Closed_Text.style.display='none'; Codehighlighter1_0_14_Open_Image.style.display='inline'; Codehighlighter1_0_14_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /><span id="Codehighlighter1_0_14_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**&nbsp;*/</span><span id="Codehighlighter1_0_14_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*&nbsp;取整函数<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_37_394_Open_Image" onclick="this.style.display='none'; Codehighlighter1_37_394_Open_Text.style.display='none'; Codehighlighter1_37_394_Closed_Image.style.display='inline'; Codehighlighter1_37_394_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_37_394_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_37_394_Closed_Text.style.display='none'; Codehighlighter1_37_394_Open_Image.style.display='inline'; Codehighlighter1_37_394_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;QuZheng&nbsp;</span><span id="Codehighlighter1_37_394_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_37_394_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_79_392_Open_Image" onclick="this.style.display='none'; Codehighlighter1_79_392_Open_Text.style.display='none'; Codehighlighter1_79_392_Closed_Image.style.display='inline'; Codehighlighter1_79_392_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_79_392_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_79_392_Closed_Text.style.display='none'; Codehighlighter1_79_392_Open_Image.style.display='inline'; Codehighlighter1_79_392_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String[]&nbsp;args)&nbsp;</span><span id="Codehighlighter1_79_392_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_79_392_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">四舍五入&nbsp;&nbsp;&nbsp;</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(Math.round(</span><span style="color: #000000">3.40d</span><span style="color: #000000">));&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">3</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(Math.round(</span><span style="color: #000000">3.60d</span><span style="color: #000000">));&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">4<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">上取整&nbsp;&nbsp;&nbsp;</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(Math.ceil(</span><span style="color: #000000">3.4</span><span style="color: #000000">));&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">4.0<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">下取整&nbsp;&nbsp;&nbsp;</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(Math.floor(</span><span style="color: #000000">3.40</span><span style="color: #000000">));&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">3.0</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println((</span><span style="color: #0000ff">int</span><span style="color: #000000">)</span><span style="color: #000000">3.45</span><span style="color: #000000">);&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">3</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
<img src ="http://www.blogjava.net/jzone/aggbug/298677.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jzone/" target="_blank">Gavin.lee</a> 2009-10-17 13:42 <a href="http://www.blogjava.net/jzone/articles/298677.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DecimalFormat  数据格式化类的使用小结</title><link>http://www.blogjava.net/jzone/articles/292581.html</link><dc:creator>Gavin.lee</dc:creator><author>Gavin.lee</author><pubDate>Tue, 25 Aug 2009 16:06:00 GMT</pubDate><guid>http://www.blogjava.net/jzone/articles/292581.html</guid><description><![CDATA[<p>api：<code>DecimalFormat</code> 是 <code>NumberFormat</code> 的一个具体子类，用于格式化十进制数字。该类设计有各种功能，使其能够解析和格式化任意语言环境中的数，包括对西方语言、阿拉伯语和印度语数字的支持。它还支持不同类型的数，包括整数 (123)、定点数 (123.4)、科学记数法表示的数 (1.23E4)、百分数 (12%) 和金额 ($123)。所有这些内容都可以本地化。</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.text.DecimalFormat;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.util.Random;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.util.Locale;<br />
<img id="Codehighlighter1_112_1741_Open_Image" onclick="this.style.display='none'; Codehighlighter1_112_1741_Open_Text.style.display='none'; Codehighlighter1_112_1741_Closed_Image.style.display='inline'; Codehighlighter1_112_1741_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_112_1741_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_112_1741_Closed_Text.style.display='none'; Codehighlighter1_112_1741_Open_Image.style.display='inline'; Codehighlighter1_112_1741_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;TestNumberFormat&nbsp;</span><span id="Codehighlighter1_112_1741_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_112_1741_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_154_1739_Open_Image" onclick="this.style.display='none'; Codehighlighter1_154_1739_Open_Text.style.display='none'; Codehighlighter1_154_1739_Closed_Image.style.display='inline'; Codehighlighter1_154_1739_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_154_1739_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_154_1739_Closed_Text.style.display='none'; Codehighlighter1_154_1739_Open_Image.style.display='inline'; Codehighlighter1_154_1739_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String[]&nbsp;args)&nbsp;</span><span id="Codehighlighter1_154_1739_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_154_1739_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">double</span><span style="color: #000000">&nbsp;pi&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">3.1415927</span><span style="color: #000000">;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;圆周率<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;取一位整数</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;DecimalFormat(</span><span style="color: #000000">"</span><span style="color: #000000">0</span><span style="color: #000000">"</span><span style="color: #000000">).format(pi));&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;3<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;取一位整数和两位小数</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;DecimalFormat(</span><span style="color: #000000">"</span><span style="color: #000000">0.00</span><span style="color: #000000">"</span><span style="color: #000000">).format(pi));&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;3.14&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;取两位整数和三位小数，整数不足部分以0填补。</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;DecimalFormat(</span><span style="color: #000000">"</span><span style="color: #000000">00.000</span><span style="color: #000000">"</span><span style="color: #000000">).format(pi));&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;03.142<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;取所有整数部分</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;DecimalFormat(</span><span style="color: #000000">"</span><span style="color: #000000">#</span><span style="color: #000000">"</span><span style="color: #000000">).format(pi));&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;3<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;以百分比方式计数，并取两位小数</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;DecimalFormat(</span><span style="color: #000000">"</span><span style="color: #000000">#.##%</span><span style="color: #000000">"</span><span style="color: #000000">).format(pi));&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;314.16%</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;c&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">299792458</span><span style="color: #000000">;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;光速<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;显示为科学计数法，并取五位小数</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;DecimalFormat(</span><span style="color: #000000">"</span><span style="color: #000000">#.#####E0</span><span style="color: #000000">"</span><span style="color: #000000">).format(c));&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;2.99792E8<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;显示为两位整数的科学计数法，并取四位小数</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;DecimalFormat(</span><span style="color: #000000">"</span><span style="color: #000000">00.####E0</span><span style="color: #000000">"</span><span style="color: #000000">).format(c));&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;29.9792E7<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;每三位以逗号进行分隔。</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;DecimalFormat(</span><span style="color: #000000">"</span><span style="color: #000000">,###</span><span style="color: #000000">"</span><span style="color: #000000">).format(c));&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;299,792,458<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;将格式嵌入文本</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;DecimalFormat(</span><span style="color: #000000">"</span><span style="color: #000000">光速大小为每秒,###米。</span><span style="color: #000000">"</span><span style="color: #000000">).format(c));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">光速大小为每秒299,792,458米。<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">直接截取</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(Math.floor(</span><span style="color: #000000">24.335</span><span style="color: #000000">*</span><span style="color: #000000">100</span><span style="color: #000000">)</span><span style="color: #000000">/</span><span style="color: #000000">100</span><span style="color: #000000">);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">24.33</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println((</span><span style="color: #0000ff">int</span><span style="color: #000000">)Math.floor(</span><span style="color: #000000">23.45</span><span style="color: #000000">));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">截取整数&nbsp;&nbsp;&nbsp;&nbsp;23</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println((</span><span style="color: #0000ff">int</span><span style="color: #000000">)Math.ceil(</span><span style="color: #000000">23.2</span><span style="color: #000000">));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">凑整&nbsp;&nbsp;&nbsp;&nbsp;24</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println((</span><span style="color: #0000ff">int</span><span style="color: #000000">)Math.rint(</span><span style="color: #000000">23.567</span><span style="color: #000000">));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">四舍五入取整&nbsp;&nbsp;&nbsp;&nbsp;24</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;DecimalFormat(</span><span style="color: #000000">"</span><span style="color: #000000">0</span><span style="color: #000000">"</span><span style="color: #000000">).format(</span><span style="color: #000000">25.5</span><span style="color: #000000">));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">四舍五入取整&nbsp;&nbsp;&nbsp;&nbsp;26</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(Math.random());&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">随机double&nbsp;0.9786833725139645</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Random().nextFloat());&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">随机浮点数&nbsp;0.5196178</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Random().nextBoolean());&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">随机boolean<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Locale.setDefault(Locale.ENGLISH);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DecimalFormat&nbsp;df&nbsp;=&nbsp;new&nbsp;DecimalFormat();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;df.applyPattern("00.00");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(df.format(4.2355));</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
<img src ="http://www.blogjava.net/jzone/aggbug/292581.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jzone/" target="_blank">Gavin.lee</a> 2009-08-26 00:06 <a href="http://www.blogjava.net/jzone/articles/292581.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>多态总结</title><link>http://www.blogjava.net/jzone/articles/292310.html</link><dc:creator>Gavin.lee</dc:creator><author>Gavin.lee</author><pubDate>Sun, 23 Aug 2009 14:42:00 GMT</pubDate><guid>http://www.blogjava.net/jzone/articles/292310.html</guid><description><![CDATA[多态性是指&#8220;多种形式&#8221;<br />
它使用不同的实例而执行不同操作<br />
多态包括静态多态性和动态多态性<br />
<br />
1).静态多态性---编译时多态<br />
即用相同的方法名定义不同的方法内容。编译时根据它们的特征来进行编译. 即：方法重载<br />
<br />
2).动态多态性---运行时多态<br />
一种在运行时调用重写方法的机制。子类对象可以作为父类对象使用，这是因为子类通过继承具备了父类的所有属性。在程序中凡是可以使用父类对象的地方，都有可以用子类对象来代替。<br />
<br />
Java提供了 instanceof 运算符，来判断一个对象属于哪个类的实例。 <br />
<br />
(重载是根据需要重写一个方法或在其中加功能&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
多态是根据需要传入不同参数构建不同的实例)<br />
<br />
重写：动态多态性---运行时多态
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;com.yixun.wap;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img id="Codehighlighter1_37_103_Open_Image" onclick="this.style.display='none'; Codehighlighter1_37_103_Open_Text.style.display='none'; Codehighlighter1_37_103_Closed_Image.style.display='inline'; Codehighlighter1_37_103_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_37_103_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_37_103_Closed_Text.style.display='none'; Codehighlighter1_37_103_Open_Image.style.display='inline'; Codehighlighter1_37_103_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Father&nbsp;</span><span id="Codehighlighter1_37_103_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_37_103_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_66_101_Open_Image" onclick="this.style.display='none'; Codehighlighter1_66_101_Open_Text.style.display='none'; Codehighlighter1_66_101_Closed_Image.style.display='inline'; Codehighlighter1_66_101_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_66_101_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_66_101_Closed_Text.style.display='none'; Codehighlighter1_66_101_Open_Image.style.display='inline'; Codehighlighter1_66_101_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;showInfo()&nbsp;</span><span id="Codehighlighter1_66_101_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_66_101_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">Father</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img id="Codehighlighter1_131_253_Open_Image" onclick="this.style.display='none'; Codehighlighter1_131_253_Open_Text.style.display='none'; Codehighlighter1_131_253_Closed_Image.style.display='inline'; Codehighlighter1_131_253_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_131_253_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_131_253_Closed_Text.style.display='none'; Codehighlighter1_131_253_Open_Image.style.display='inline'; Codehighlighter1_131_253_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Son&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;Father&nbsp;</span><span id="Codehighlighter1_131_253_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_131_253_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_160_192_Open_Image" onclick="this.style.display='none'; Codehighlighter1_160_192_Open_Text.style.display='none'; Codehighlighter1_160_192_Closed_Image.style.display='inline'; Codehighlighter1_160_192_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_160_192_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_160_192_Closed_Text.style.display='none'; Codehighlighter1_160_192_Open_Image.style.display='inline'; Codehighlighter1_160_192_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;showInfo()&nbsp;</span><span id="Codehighlighter1_160_192_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_160_192_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">Son</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img id="Codehighlighter1_221_251_Open_Image" onclick="this.style.display='none'; Codehighlighter1_221_251_Open_Text.style.display='none'; Codehighlighter1_221_251_Closed_Image.style.display='inline'; Codehighlighter1_221_251_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_221_251_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_221_251_Closed_Text.style.display='none'; Codehighlighter1_221_251_Open_Image.style.display='inline'; Codehighlighter1_221_251_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;showSex()&nbsp;</span><span id="Codehighlighter1_221_251_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_221_251_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">男</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img id="Codehighlighter1_286_413_Open_Image" onclick="this.style.display='none'; Codehighlighter1_286_413_Open_Text.style.display='none'; Codehighlighter1_286_413_Closed_Image.style.display='inline'; Codehighlighter1_286_413_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_286_413_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_286_413_Closed_Text.style.display='none'; Codehighlighter1_286_413_Open_Image.style.display='inline'; Codehighlighter1_286_413_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Daughter&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;Father&nbsp;</span><span id="Codehighlighter1_286_413_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_286_413_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_315_352_Open_Image" onclick="this.style.display='none'; Codehighlighter1_315_352_Open_Text.style.display='none'; Codehighlighter1_315_352_Closed_Image.style.display='inline'; Codehighlighter1_315_352_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_315_352_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_315_352_Closed_Text.style.display='none'; Codehighlighter1_315_352_Open_Image.style.display='inline'; Codehighlighter1_315_352_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;showInfo()&nbsp;</span><span id="Codehighlighter1_315_352_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_315_352_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">Daughter</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img id="Codehighlighter1_381_411_Open_Image" onclick="this.style.display='none'; Codehighlighter1_381_411_Open_Text.style.display='none'; Codehighlighter1_381_411_Closed_Image.style.display='inline'; Codehighlighter1_381_411_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_381_411_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_381_411_Closed_Text.style.display='none'; Codehighlighter1_381_411_Open_Image.style.display='inline'; Codehighlighter1_381_411_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;showSex()&nbsp;</span><span id="Codehighlighter1_381_411_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_381_411_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">女</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_415_743_Open_Image" onclick="this.style.display='none'; Codehighlighter1_415_743_Open_Text.style.display='none'; Codehighlighter1_415_743_Closed_Image.style.display='inline'; Codehighlighter1_415_743_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_415_743_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_415_743_Closed_Text.style.display='none'; Codehighlighter1_415_743_Open_Image.style.display='inline'; Codehighlighter1_415_743_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_415_743_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**&nbsp;*/</span><span id="Codehighlighter1_415_743_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;*&nbsp;******************************************<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;*&nbsp;@descripte&nbsp;运行时多态，动态多态性<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;*&nbsp;父类引用指向子类对象，实际对象为子类<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;*&nbsp;java的这种机制遵循一个原则：当超类对象引用变量引用子类对象时,&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;*&nbsp;是被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;*&nbsp;但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法。<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;*&nbsp;</span><span style="color: #808080">@author</span><span style="color: #008000">&nbsp;Gavin.lee<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;*&nbsp;@date&nbsp;2009-8-24下午05:21:49<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;*&nbsp;</span><span style="color: #808080">@version</span><span style="color: #008000">&nbsp;1.0<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;*<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;********************************************<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_766_1008_Open_Image" onclick="this.style.display='none'; Codehighlighter1_766_1008_Open_Text.style.display='none'; Codehighlighter1_766_1008_Closed_Image.style.display='inline'; Codehighlighter1_766_1008_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_766_1008_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_766_1008_Closed_Text.style.display='none'; Codehighlighter1_766_1008_Open_Image.style.display='inline'; Codehighlighter1_766_1008_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;TestSon&nbsp;</span><span id="Codehighlighter1_766_1008_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_766_1008_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_808_1006_Open_Image" onclick="this.style.display='none'; Codehighlighter1_808_1006_Open_Text.style.display='none'; Codehighlighter1_808_1006_Closed_Image.style.display='inline'; Codehighlighter1_808_1006_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_808_1006_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_808_1006_Closed_Text.style.display='none'; Codehighlighter1_808_1006_Open_Image.style.display='inline'; Codehighlighter1_808_1006_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String&nbsp;args[])&nbsp;</span><span id="Codehighlighter1_808_1006_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_808_1006_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Father&nbsp;fa;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fa&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Son();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">向上转型，父类引用指向子类对象</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fa.showInfo();<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fa.showSex();&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">无法调用，父类无此方法&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Son&nbsp;son&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(Son)fa;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">向下转型</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;son.showSex();<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fa&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Daughter();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fa.showInfo();<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_1010_1073_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1010_1073_Open_Text.style.display='none'; Codehighlighter1_1010_1073_Closed_Image.style.display='inline'; Codehighlighter1_1010_1073_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_1010_1073_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1010_1073_Closed_Text.style.display='none'; Codehighlighter1_1010_1073_Open_Image.style.display='inline'; Codehighlighter1_1010_1073_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_1010_1073_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**&nbsp;*/</span><span id="Codehighlighter1_1010_1073_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;Son<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;男<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;Daughter<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;*同一个引用调用了相同名称的方法，结果却不一样---多态的体现<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div>
 <img src ="http://www.blogjava.net/jzone/aggbug/292310.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jzone/" target="_blank">Gavin.lee</a> 2009-08-23 22:42 <a href="http://www.blogjava.net/jzone/articles/292310.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java enum 类</title><link>http://www.blogjava.net/jzone/articles/289678.html</link><dc:creator>Gavin.lee</dc:creator><author>Gavin.lee</author><pubDate>Mon, 03 Aug 2009 14:49:00 GMT</pubDate><guid>http://www.blogjava.net/jzone/articles/289678.html</guid><description><![CDATA[<a href="http://zhangli-lisa.javaeye.com/blog/394951">http://zhangli-lisa.javaeye.com/blog/394951</a> 关于enum的详细介绍了，<br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;com.Gavin.testenum;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_50_86_Open_Image" onclick="this.style.display='none'; Codehighlighter1_50_86_Open_Text.style.display='none'; Codehighlighter1_50_86_Closed_Image.style.display='inline'; Codehighlighter1_50_86_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_50_86_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_50_86_Closed_Text.style.display='none'; Codehighlighter1_50_86_Open_Image.style.display='inline'; Codehighlighter1_50_86_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">enum</span><span style="color: #000000">&nbsp;TestEnum&nbsp;</span><span id="Codehighlighter1_50_86_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_50_86_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />one,two,three,middle,four,five;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;com.Gavin.testenum;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.apache.log4j.Logger;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_80_839_Open_Image" onclick="this.style.display='none'; Codehighlighter1_80_839_Open_Text.style.display='none'; Codehighlighter1_80_839_Closed_Image.style.display='inline'; Codehighlighter1_80_839_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_80_839_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_80_839_Closed_Text.style.display='none'; Codehighlighter1_80_839_Open_Image.style.display='inline'; Codehighlighter1_80_839_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Test&nbsp;</span><span id="Codehighlighter1_80_839_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_80_839_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;Logger&nbsp;logger&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Logger.getLogger(Test.</span><span style="color: #0000ff">class</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_187_367_Open_Image" onclick="this.style.display='none'; Codehighlighter1_187_367_Open_Text.style.display='none'; Codehighlighter1_187_367_Closed_Image.style.display='inline'; Codehighlighter1_187_367_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_187_367_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_187_367_Closed_Text.style.display='none'; Codehighlighter1_187_367_Open_Image.style.display='inline'; Codehighlighter1_187_367_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String[]&nbsp;args)&nbsp;</span><span id="Codehighlighter1_187_367_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_187_367_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Test&nbsp;t&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Test();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.debug(TestEnum.one);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">one</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.debug(TestEnum.values().length);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">5</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t.enumvalues();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">依次打印</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.debug(t.getRandomEnum());<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_397_465_Open_Image" onclick="this.style.display='none'; Codehighlighter1_397_465_Open_Text.style.display='none'; Codehighlighter1_397_465_Closed_Image.style.display='inline'; Codehighlighter1_397_465_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_397_465_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_397_465_Closed_Text.style.display='none'; Codehighlighter1_397_465_Open_Image.style.display='inline'; Codehighlighter1_397_465_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;enumvalues()&nbsp;</span><span id="Codehighlighter1_397_465_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_397_465_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_437_462_Open_Image" onclick="this.style.display='none'; Codehighlighter1_437_462_Open_Text.style.display='none'; Codehighlighter1_437_462_Closed_Image.style.display='inline'; Codehighlighter1_437_462_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_437_462_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_437_462_Closed_Text.style.display='none'; Codehighlighter1_437_462_Open_Image.style.display='inline'; Codehighlighter1_437_462_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">(TestEnum&nbsp;te:&nbsp;TestEnum.values())&nbsp;</span><span id="Codehighlighter1_437_462_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_437_462_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.debug(te);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;number&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;TestEnum.values().length&nbsp;;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">枚举类的数目</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_568_832_Open_Image" onclick="this.style.display='none'; Codehighlighter1_568_832_Open_Text.style.display='none'; Codehighlighter1_568_832_Closed_Image.style.display='inline'; Codehighlighter1_568_832_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_568_832_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_568_832_Closed_Text.style.display='none'; Codehighlighter1_568_832_Open_Image.style.display='inline'; Codehighlighter1_568_832_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;TestEnum&nbsp;getRandomEnum()</span><span id="Codehighlighter1_568_832_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_568_832_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;random&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;System.currentTimeMillis()&nbsp;</span><span style="color: #000000">%</span><span style="color: #000000">&nbsp;number;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_654_825_Open_Image" onclick="this.style.display='none'; Codehighlighter1_654_825_Open_Text.style.display='none'; Codehighlighter1_654_825_Closed_Image.style.display='inline'; Codehighlighter1_654_825_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_654_825_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_654_825_Closed_Text.style.display='none'; Codehighlighter1_654_825_Open_Image.style.display='inline'; Codehighlighter1_654_825_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">switch</span><span style="color: #000000">&nbsp;((</span><span style="color: #0000ff">int</span><span style="color: #000000">)&nbsp;random)</span><span id="Codehighlighter1_654_825_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_654_825_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">case</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">:&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;TestEnum.one;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">case</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">:&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;TestEnum.two;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">case</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">:&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;TestEnum.three;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">default</span><span style="color: #000000">:<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;TestEnum.middle;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<img src ="http://www.blogjava.net/jzone/aggbug/289678.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jzone/" target="_blank">Gavin.lee</a> 2009-08-03 22:49 <a href="http://www.blogjava.net/jzone/articles/289678.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>