﻿<?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基础知识</title><link>http://www.blogjava.net/nkjava/category/36597.html</link><description>置身浩瀚的沙漠，方向最为重要，希望此blog能向大漠驼铃一样，给我方向和指引。&lt;br/&gt;
Java,Php,Shell,Python,服务器运维,大数据，SEO, 网站开发、运维,云服务技术支持，IM服务供应商, FreeSwitch搭建，技术支持等. 技术讨论QQ群：428622099</description><language>zh-cn</language><lastBuildDate>Mon, 29 Aug 2016 19:27:25 GMT</lastBuildDate><pubDate>Mon, 29 Aug 2016 19:27:25 GMT</pubDate><ttl>60</ttl><item><title>Tomcat7.0修改内存的配置（如何设置Tomcat的堆内存）</title><link>http://www.blogjava.net/nkjava/archive/2016/08/29/431692.html</link><dc:creator>草原上的骆驼</dc:creator><author>草原上的骆驼</author><pubDate>Mon, 29 Aug 2016 05:55:00 GMT</pubDate><guid>http://www.blogjava.net/nkjava/archive/2016/08/29/431692.html</guid><wfw:comment>http://www.blogjava.net/nkjava/comments/431692.html</wfw:comment><comments>http://www.blogjava.net/nkjava/archive/2016/08/29/431692.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/nkjava/comments/commentRss/431692.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nkjava/services/trackbacks/431692.html</trackback:ping><description><![CDATA[Windows环境下在Tomcat/bin目录下创建setenv.bat, Linux环境下在Tomcat/bin目录下设置setenv.sh<br />注意只是后缀名称不同，为什么不同，注意查看catalina.bat或者catalina.sh。<br /><br />例如setenv.sh里添加下面的内容<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->export&nbsp;JAVA_OPTS="-Dfile.encoding=UTF-8&nbsp;-Xms2048m&nbsp;-Xmx2048m&nbsp;-XX:PermSize=256m&nbsp;-XX:MaxPermSize=256m"</div>Windows下的setenv.bat里添加下面的内容：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->set&nbsp;"JAVA_OPTS=%JAVA_OPTS%&nbsp;-Xms128m&nbsp;-Xmx1024m&nbsp;-XX:MaxPermSize=256m&nbsp;-server"</div><br /><br />然后重启Tomcat，查看堆内存的使用情况：<br /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->worker &nbsp; &nbsp; &nbsp;15061&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;0&nbsp;Aug25&nbsp;?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;00:04:21&nbsp;/usr/bin/java&nbsp;-Djava.util.logging.config.file=/home/work/apache-tomcat-7.0.53/conf/logging.properties&nbsp;-Djava.util.logging.manager=<span style="background-color: yellow;">org.apache.juli.ClassLoaderLogManager&nbsp;</span><span style="color: red; background-color: yellow;">-</span><span style="color: red; background-color: yellow;">Dfile.encoding</span><span style="color: red; background-color: yellow;">=</span><span style="color: red; background-color: yellow;">UTF</span><span style="color: red; background-color: yellow;">-</span><span style="color: red; background-color: yellow;">8</span>&nbsp;<span style="color: red; background-color: yellow;">-</span><span style="color: red; background-color: yellow;">Xms2048m&nbsp;</span><span style="color: red; background-color: yellow;">-</span><span style="color: red; background-color: yellow;">Xmx2048m&nbsp;</span><span style="color: red; background-color: yellow;">-</span><span style="color: red; background-color: yellow;">XX:PermSize</span><span style="color: red; background-color: yellow;">=</span><span style="color: red; background-color: yellow;">256m&nbsp;</span><span style="color: red; background-color: yellow;">-</span><span style="color: red; background-color: yellow;">XX:MaxPermSize</span><span style="color: red; background-color: yellow;">=</span><span style="color: red; background-color: yellow;">256m&nbsp;</span>-Djava.awt.headless=<span style="color: #0000FF; ">true</span>&nbsp;-Djava.endorsed.dirs=/home/work/apache-tomcat-7.0.53/endorsed&nbsp;-classpath /home/work/apache-tomcat-7.0.53/bin/bootstrap.jar:/home/work/apache-tomcat-7.0.53/bin/tomcat-juli.jar&nbsp;-Dcatalina.base=/home/work/apache-tomcat-7.0.53&nbsp;-Dcatalina.home=/home/work/apache-tomcat-7.0.53&nbsp;-Djava.io.tmpdir=/home/work/apache-tomcat-7.0.53/temp&nbsp;org.apache.catalina.startup.Bootstrap&nbsp;start</div><div><br />说明设置成功，很简单。<br /><br />后续我会写几篇Tomcat内存学习的文章，欢迎大家关注。<br /><br /></div><img src ="http://www.blogjava.net/nkjava/aggbug/431692.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nkjava/" target="_blank">草原上的骆驼</a> 2016-08-29 13:55 <a href="http://www.blogjava.net/nkjava/archive/2016/08/29/431692.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>To prevent a memory leak, the JDBC Driver has been forcibly unregistered--有关Tomcat自动宕机的解决方案</title><link>http://www.blogjava.net/nkjava/archive/2016/08/03/431436.html</link><dc:creator>草原上的骆驼</dc:creator><author>草原上的骆驼</author><pubDate>Wed, 03 Aug 2016 02:59:00 GMT</pubDate><guid>http://www.blogjava.net/nkjava/archive/2016/08/03/431436.html</guid><wfw:comment>http://www.blogjava.net/nkjava/comments/431436.html</wfw:comment><comments>http://www.blogjava.net/nkjava/archive/2016/08/03/431436.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/nkjava/comments/commentRss/431436.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nkjava/services/trackbacks/431436.html</trackback:ping><description><![CDATA[最近有几个服务的Tomcat总是无缘无故的宕机，到了不得不解决的地步。<br />
在Stackoverflow上找到比较有用的一篇文章，解决方案如下：<br />
<div><a href="http://stackoverflow.com/questions/3320400/to-prevent-a-memory-leak-the-jdbc-driver-has-been-forcibly-unregistered">http://stackoverflow.com/questions/3320400/to-prevent-a-memory-leak-the-jdbc-driver-has-been-forcibly-unregistered<br />
有以下几个解决途径：<br />
</a>
<ol style="margin: 0px 0px 1em 30px; padding: 0px; border: 0px; font-size: 15px; color: #242729; font-family: Arial, &quot;Helvetica Neue&quot;, Helvetica, sans-serif; line-height: 19.5px; background-color: #ffffff;">
     <li style="margin: 0px 0px 0.5em; padding: 0px; border: 0px; word-wrap: break-word;">
     <p style="margin: 0px; padding: 0px; border: 0px; clear: both;">Ignore those warnings. Tomcat is doing its job right. The actual bug is in someone else's code (the JDBC driver in question), not in yours. Be happy that Tomcat did its job properly and wait until the JDBC driver vendor get it fixed so that you can upgrade the driver. On the other hand, you aren't supposed to drop a JDBC driver in webapp's&nbsp;<code style="margin: 0px; padding: 1px 5px; border: 0px; font-size: 13px; font-family: Consolas, Menlo, Monaco, &quot;Lucida Console&quot;, &quot;Liberation Mono&quot;, &quot;DejaVu Sans Mono&quot;, &quot;Bitstream Vera Sans Mono&quot;, &quot;Courier New&quot;, monospace, sans-serif; white-space: pre-wrap; background-color: #eff0f1;">/WEB-INF/lib</code>, but only in server's&nbsp;<code style="margin: 0px; padding: 1px 5px; border: 0px; font-size: 13px; font-family: Consolas, Menlo, Monaco, &quot;Lucida Console&quot;, &quot;Liberation Mono&quot;, &quot;DejaVu Sans Mono&quot;, &quot;Bitstream Vera Sans Mono&quot;, &quot;Courier New&quot;, monospace, sans-serif; white-space: pre-wrap; background-color: #eff0f1;">/lib</code>. If you still keep it in webapp's&nbsp;<code style="margin: 0px; padding: 1px 5px; border: 0px; font-size: 13px; font-family: Consolas, Menlo, Monaco, &quot;Lucida Console&quot;, &quot;Liberation Mono&quot;, &quot;DejaVu Sans Mono&quot;, &quot;Bitstream Vera Sans Mono&quot;, &quot;Courier New&quot;, monospace, sans-serif; white-space: pre-wrap; background-color: #eff0f1;">/WEB-INF/lib</code>, then you should manually register and deregister it using a&nbsp;<code style="margin: 0px; padding: 1px 5px; border: 0px; font-size: 13px; font-family: Consolas, Menlo, Monaco, &quot;Lucida Console&quot;, &quot;Liberation Mono&quot;, &quot;DejaVu Sans Mono&quot;, &quot;Bitstream Vera Sans Mono&quot;, &quot;Courier New&quot;, monospace, sans-serif; white-space: pre-wrap; background-color: #eff0f1;">ServletContextListener</code>.<br />
     忽略警告。把WEB-INF/lib下的mysql驱动文件拷贝到Tomcat/lib下。如果仍然要放在WEB-INF/lib下，需要使用监听器手动的注册和注销。<br />
     下面的文章介绍如何写监听器，<a href="http://javabeat.net/servletcontextlistener-example/">http://javabeat.net/servletcontextlistener-example/， 当然如果是Servlet3.0， 使用注解方式设置监听也是可以的。<br />
     下面的代码是如何注销。<br />
     <br />
     </a></p>
     <div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
     <br />
     Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
     http://www.CodeHighlighter.com/<br />
     <br />
     --><strong><span style="color: #000000; ">Step&nbsp;</span><span style="color: #000000; ">1</span></strong><span style="color: #000000; "><strong>:&nbsp;Register&nbsp;a&nbsp;Listener</strong><br />
     web.xml<br />
     </span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">listener</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />
     &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">listener</span><span style="color: #000000; ">-</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">com.mysite.MySpecialListener</span><span style="color: #000000; ">&lt;/</span><span style="color: #000000; ">listener</span><span style="color: #000000; ">-</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />
     </span><span style="color: #000000; ">&lt;/</span><span style="color: #000000; ">listener</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />
     <strong>Step&nbsp;</strong></span><span style="color: #000000; "><strong>2</strong></span><span style="color: #000000; "><strong>:&nbsp;Implement&nbsp;the&nbsp;Listener</strong><br />
     <br />
     com.mysite.MySpecialListener.java<br />
     <br />
     </span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;MySpecialListener&nbsp;</span><span style="color: #0000FF; ">extends</span><span style="color: #000000; ">&nbsp;ApplicationContextListener&nbsp;{<br />
     <br />
     &nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
     &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;contextInitialized(ServletContextEvent&nbsp;sce)&nbsp;{<br />
     &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;On&nbsp;Application&nbsp;Startup,&nbsp;please&#8230;<br />
     <br />
     &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Usually&nbsp;I'll&nbsp;make&nbsp;a&nbsp;singleton&nbsp;in&nbsp;here,&nbsp;set&nbsp;up&nbsp;my&nbsp;pool,&nbsp;etc.</span><span style="color: #008000; "><br />
     </span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
     <br />
     &nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
     &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;contextDestroyed(ServletContextEvent&nbsp;sce)&nbsp;{<br />
     &nbsp; &nbsp; &nbsp;&nbsp;</span><span style="color: #000000; "><span style="font-family: verdana, &quot;courier new&quot;; line-height: 21px; color: #008000;">//</span><span style="font-family: verdana, &quot;courier new&quot;; line-height: 21px; color: #008000;">&nbsp;This&nbsp;manually&nbsp;deregisters&nbsp;JDBC&nbsp;driver,&nbsp;which&nbsp;prevents&nbsp;Tomcat&nbsp;7&nbsp;from&nbsp;complaining&nbsp;about&nbsp;memory&nbsp;leaks&nbsp;wrto&nbsp;this&nbsp;class</span><span style="font-family: verdana, &quot;courier new&quot;; line-height: 21px; color: #008000;"><br />
     </span><span style="font-family: verdana, &quot;courier new&quot;; line-height: 21px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Enumeration</span><span style="font-family: verdana, &quot;courier new&quot;; line-height: 21px;">&lt;</span><span style="font-family: verdana, &quot;courier new&quot;; line-height: 21px;">Driver</span><span style="font-family: verdana, &quot;courier new&quot;; line-height: 21px;">&gt;</span><span style="font-family: verdana, &quot;courier new&quot;; line-height: 21px;">&nbsp;drivers&nbsp;</span><span style="font-family: verdana, &quot;courier new&quot;; line-height: 21px;">=</span><span style="font-family: verdana, &quot;courier new&quot;; line-height: 21px;">&nbsp;DriverManager.getDrivers();</span><br style="font-family: verdana, &quot;courier new&quot;; line-height: 21px;" />
     <span style="font-family: verdana, &quot;courier new&quot;; line-height: 21px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-family: verdana, &quot;courier new&quot;; line-height: 21px; color: #0000ff;">while</span><span style="font-family: verdana, &quot;courier new&quot;; line-height: 21px;">&nbsp;(drivers.hasMoreElements())&nbsp;{</span><br style="font-family: verdana, &quot;courier new&quot;; line-height: 21px;" />
     <span style="font-family: verdana, &quot;courier new&quot;; line-height: 21px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Driver&nbsp;driver&nbsp;</span><span style="font-family: verdana, &quot;courier new&quot;; line-height: 21px;">=</span><span style="font-family: verdana, &quot;courier new&quot;; line-height: 21px;">&nbsp;drivers.nextElement();</span><br style="font-family: verdana, &quot;courier new&quot;; line-height: 21px;" />
     <span style="font-family: verdana, &quot;courier new&quot;; line-height: 21px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-family: verdana, &quot;courier new&quot;; line-height: 21px; color: #0000ff;">try</span><span style="font-family: verdana, &quot;courier new&quot;; line-height: 21px;">&nbsp;{</span><br style="font-family: verdana, &quot;courier new&quot;; line-height: 21px;" />
     <span style="font-family: verdana, &quot;courier new&quot;; line-height: 21px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DriverManager.deregisterDriver(driver);</span><br style="font-family: verdana, &quot;courier new&quot;; line-height: 21px;" />
     <span style="font-family: verdana, &quot;courier new&quot;; line-height: 21px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LOG.log(Level.INFO,&nbsp;String.format(</span><span style="font-family: verdana, &quot;courier new&quot;; line-height: 21px;">"</span><span style="font-family: verdana, &quot;courier new&quot;; line-height: 21px;">deregistering&nbsp;jdbc&nbsp;driver:&nbsp;%s</span><span style="font-family: verdana, &quot;courier new&quot;; line-height: 21px;">"</span><span style="font-family: verdana, &quot;courier new&quot;; line-height: 21px;">,&nbsp;driver));</span><br style="font-family: verdana, &quot;courier new&quot;; line-height: 21px;" />
     <span style="font-family: verdana, &quot;courier new&quot;; line-height: 21px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="font-family: verdana, &quot;courier new&quot;; line-height: 21px; color: #0000ff;">catch</span><span style="font-family: verdana, &quot;courier new&quot;; line-height: 21px;">&nbsp;(SQLException&nbsp;e)&nbsp;{</span><br style="font-family: verdana, &quot;courier new&quot;; line-height: 21px;" />
     <span style="font-family: verdana, &quot;courier new&quot;; line-height: 21px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LOG.log(Level.SEVERE,&nbsp;String.format(</span><span style="font-family: verdana, &quot;courier new&quot;; line-height: 21px;">"</span><span style="font-family: verdana, &quot;courier new&quot;; line-height: 21px;">Error&nbsp;deregistering&nbsp;driver&nbsp;%s</span><span style="font-family: verdana, &quot;courier new&quot;; line-height: 21px;">"</span><span style="font-family: verdana, &quot;courier new&quot;; line-height: 21px;">,&nbsp;driver),&nbsp;e);</span><br style="font-family: verdana, &quot;courier new&quot;; line-height: 21px;" />
     <span style="font-family: verdana, &quot;courier new&quot;; line-height: 21px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><br style="font-family: verdana, &quot;courier new&quot;; line-height: 21px;" />
     <br style="font-family: verdana, &quot;courier new&quot;; line-height: 21px;" />
     <span style="font-family: verdana, &quot;courier new&quot;; line-height: 21px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><br />
     &nbsp; &nbsp; }<br />
     <br />
     }</span></div>
     <div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"></div>
     </li>
     <li style="margin: 0px 0px 0.5em; padding: 0px; border: 0px; word-wrap: break-word;">
     <p style="margin: 0px; padding: 0px; border: 0px; clear: both;">Downgrade to Tomcat 6.0.23 or older so that you will not be bothered with those warnings. But it will silently keep leaking memory. Not sure if that's good to know after all. Those kind of memory leaks are one of the major causes behind&nbsp;<a href="http://wiki.apache.org/tomcat/OutOfMemory" style="margin: 0px; padding: 0px; border: 0px; color: #005999; text-decoration: none; cursor: pointer;"><code style="margin: 0px; padding: 1px 5px; border: 0px; font-size: 13px; font-family: Consolas, Menlo, Monaco, &quot;Lucida Console&quot;, &quot;Liberation Mono&quot;, &quot;DejaVu Sans Mono&quot;, &quot;Bitstream Vera Sans Mono&quot;, &quot;Courier New&quot;, monospace, sans-serif; white-space: pre-wrap; background-color: #eff0f1;">OutOfMemoryError</code>&nbsp;issues</a>&nbsp;during Tomcat hotdeployments.<br />
     把Tomcat降级到低版本（6.0.23以下），虽然不会报错，但是还是存在内存益出的问题，这并不是一个好的解决方案。<br />
     <br />
     </p>
     </li>
     <li style="margin: 0px; padding: 0px; border: 0px; word-wrap: break-word;">
     <p style="margin: 0px; padding: 0px; border: 0px; clear: both;">Move the JDBC driver to Tomcat's&nbsp;<code style="margin: 0px; padding: 1px 5px; border: 0px; font-size: 13px; font-family: Consolas, Menlo, Monaco, &quot;Lucida Console&quot;, &quot;Liberation Mono&quot;, &quot;DejaVu Sans Mono&quot;, &quot;Bitstream Vera Sans Mono&quot;, &quot;Courier New&quot;, monospace, sans-serif; white-space: pre-wrap; background-color: #eff0f1;">/lib</code>&nbsp;folder and have a connection pooled datasource to manage the driver. Note that Tomcat's builtin DBCP does not deregister drivers properly on close. See also bug&nbsp;<a href="https://issues.apache.org/jira/browse/DBCP-332" style="margin: 0px; padding: 0px; border: 0px; color: #005999; text-decoration: none; cursor: pointer;">DBCP-322</a>&nbsp;which is closed as WONTFIX. You would rather like to replace DBCP by another connection pool which is doing its job better then DBCP. For example<a href="http://brettwooldridge.github.io/HikariCP/" style="margin: 0px; padding: 0px; border: 0px; color: #005999; text-decoration: none; cursor: pointer;">HikariCP</a>,&nbsp;<a href="http://jolbox.com/" style="margin: 0px; padding: 0px; border: 0px; color: #005999; text-decoration: none; cursor: pointer;">BoneCP</a>, or perhaps&nbsp;<a href="http://people.apache.org/~fhanik/jdbc-pool/jdbc-pool.html" style="margin: 0px; padding: 0px; border: 0px; color: #005999; text-decoration: none; cursor: pointer;">Tomcat JDBC Pool</a>.<br />
     把驱动文件移到Tomcat/lib文件夹下，不用使用DBCP，使用以下的连接池库,HikariCP, BoneCP,或者Tomcat JDBC Pool.<br /><br />
     </p>
     </li>
     <li>MAVEN项目<br />
     <p style="margin: 0px 0px 1em; padding: 0px; border: 0px; clear: both;">If you are getting this message from a Maven built war change the scope of the JDBC driver to provided, and put a copy of it in the lib directory. Like this:<span style="font-size: 13px; color: #000000;">&lt;</span><span style="font-size: 13px; color: #000000;">dependency</span><span style="font-size: 13px; color: #000000;">&gt;，<br />
     对于MAVEN项目，由于Tomcat中存在mysql驱动文件（1中介绍），这样在部署时就不会把mysql带到打包文件里，注意是&lt;scope&gt;provided&lt;/scope&gt;。<br />
     </span></p>
     <div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">groupId</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">mysql</span><span style="color: #000000; ">&lt;/</span><span style="color: #000000; ">groupId</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />
     &nbsp;&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">artifactId</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">mysql</span><span style="color: #000000; ">-</span><span style="color: #000000; ">connector</span><span style="color: #000000; ">-</span><span style="color: #000000; ">java</span><span style="color: #000000; ">&lt;/</span><span style="color: #000000; ">artifactId</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />
     &nbsp;&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">version</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">5.1</span><span style="color: #000000; ">.</span><span style="color: #000000; ">18</span><span style="color: #000000; ">&lt;/</span><span style="color: #000000; ">version</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />
     &nbsp;&nbsp;</span><span style="color: #000000; ">&lt;!--</span><span style="color: #000000; ">&nbsp;put&nbsp;a&nbsp;copy&nbsp;in&nbsp;</span><span style="color: #000000; ">/</span><span style="color: #000000; ">usr</span><span style="color: #000000; ">/</span><span style="color: #000000; ">share</span><span style="color: #000000; ">/</span><span style="color: #000000; ">tomcat7</span><span style="color: #000000; ">/</span><span style="color: #000000; ">lib&nbsp;</span><span style="color: #000000; ">--&gt;</span><span style="color: #000000; "><br />
     &nbsp;&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">scope</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">provided</span><span style="color: #000000; ">&lt;/</span><span style="color: #000000; ">scope</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />
     </span><span style="color: #000000; ">&lt;/</span><span style="color: #000000; ">dependency</span><span style="color: #000000; ">&gt;</span></div>
     </li>
</ol>
</div>
好了，如果您遇到同样的问题，可以和我沟通，联系方式见头部。<img src ="http://www.blogjava.net/nkjava/aggbug/431436.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nkjava/" target="_blank">草原上的骆驼</a> 2016-08-03 10:59 <a href="http://www.blogjava.net/nkjava/archive/2016/08/03/431436.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA Iterator 转成 List</title><link>http://www.blogjava.net/nkjava/archive/2014/11/29/420850.html</link><dc:creator>草原上的骆驼</dc:creator><author>草原上的骆驼</author><pubDate>Sat, 29 Nov 2014 10:26:00 GMT</pubDate><guid>http://www.blogjava.net/nkjava/archive/2014/11/29/420850.html</guid><wfw:comment>http://www.blogjava.net/nkjava/comments/420850.html</wfw:comment><comments>http://www.blogjava.net/nkjava/archive/2014/11/29/420850.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/nkjava/comments/commentRss/420850.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nkjava/services/trackbacks/420850.html</trackback:ping><description><![CDATA[List转到Iterator容易，JDK本身就支持，反过来的实现方式如下：<br />
1.使用Apache Common Collections
<br />2.自己实现的方法转换<br />3.Guaa实现转换<br /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><br />
<br />
方式1：<br />
#Apache&nbsp;Commons&nbsp;Collections:<br />
<span style="color: #0000FF; ">import</span>&nbsp;org.apache.commons.collections.IteratorUtils;<br />
Iterator&lt;Element&gt;&nbsp;myIterator&nbsp;=&nbsp;<img src="http://www.blogjava.net/Images/dot.gif" alt="" /><span style="color: #008000; ">//</span><span style="color: #008000; ">some&nbsp;iterator</span><span style="color: #008000; "><br />
</span>List&lt;Element&gt;&nbsp;myList=IteratorUtils.toList(myIterator);&nbsp;&nbsp;&nbsp;<br />
<br />
<br />
方式二：<br />
或者自己转换<br />
<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;&lt;T&gt;&nbsp;List&lt;T&gt;&nbsp;copyIterator(Iterator&lt;T&gt;&nbsp;iter)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;List&lt;T&gt;&nbsp;copy&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ArrayList&lt;T&gt;();<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;(iter.hasNext())<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;copy.add(iter.next());<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;copy;<br />
}<br />
<br />
使用方式：<br />
List&lt;String&gt;&nbsp;list&nbsp;=&nbsp;Arrays.asList("1",&nbsp;"2",&nbsp;"3");<br />
Iterator&lt;String&gt;&nbsp;iter&nbsp;=&nbsp;list.iterator();<br />
List&lt;String&gt;&nbsp;copy&nbsp;=&nbsp;copyIterator(iter);<br />
<br />
方式3：<br />
#Guava<br />
<span style="color: #0000FF; ">import</span>&nbsp;com.google.common.collect.Lists;<br />
Iterator&lt;Element&gt;&nbsp;myIterator&nbsp;=&nbsp;<img src="http://www.blogjava.net/Images/dot.gif" alt="" />&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">some&nbsp;iterator</span><span style="color: #008000; "><br />
</span>List&lt;Element&gt;&nbsp;myList&nbsp;=&nbsp;Lists.newArrayList(myIterator);</div><img src ="http://www.blogjava.net/nkjava/aggbug/420850.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nkjava/" target="_blank">草原上的骆驼</a> 2014-11-29 18:26 <a href="http://www.blogjava.net/nkjava/archive/2014/11/29/420850.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MAVEN安装代码到本地库，安装jar, source, javadoc的方式</title><link>http://www.blogjava.net/nkjava/archive/2014/07/09/415634.html</link><dc:creator>草原上的骆驼</dc:creator><author>草原上的骆驼</author><pubDate>Wed, 09 Jul 2014 09:25:00 GMT</pubDate><guid>http://www.blogjava.net/nkjava/archive/2014/07/09/415634.html</guid><wfw:comment>http://www.blogjava.net/nkjava/comments/415634.html</wfw:comment><comments>http://www.blogjava.net/nkjava/archive/2014/07/09/415634.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/nkjava/comments/commentRss/415634.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nkjava/services/trackbacks/415634.html</trackback:ping><description><![CDATA[<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->mvn&nbsp;install:install-file&nbsp;-Dfile=D:/spymemcached-2.10.3.jar&nbsp;-DgroupId=net.spy&nbsp;-DartifactId=spymemcached&nbsp;-Dversion=2.10.3&nbsp;-Dpackaging=jar<br />mvn&nbsp;install:install-file&nbsp;-Dfile=D:/spymemcached-2.10.3-sources.jar&nbsp;-DgroupId=net.spy&nbsp;-DartifactId=spymemcached&nbsp;-Dversion=2.10.3&nbsp;-Dpackaging=jar&nbsp;-Dclassifier=sources<br />mvn&nbsp;install:install-file&nbsp;-Dfile=D:/spymemcached-2.10.3-javadoc.jar&nbsp;-DgroupId=net.spy&nbsp;-DartifactId=spymemcached&nbsp;-Dversion=2.10.3&nbsp;-Dpackaging=jar&nbsp;-Dclassifier=javadoc</div><img src ="http://www.blogjava.net/nkjava/aggbug/415634.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nkjava/" target="_blank">草原上的骆驼</a> 2014-07-09 17:25 <a href="http://www.blogjava.net/nkjava/archive/2014/07/09/415634.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JVM学习之-栈</title><link>http://www.blogjava.net/nkjava/archive/2012/03/15/371971.html</link><dc:creator>草原上的骆驼</dc:creator><author>草原上的骆驼</author><pubDate>Thu, 15 Mar 2012 11:39:00 GMT</pubDate><guid>http://www.blogjava.net/nkjava/archive/2012/03/15/371971.html</guid><wfw:comment>http://www.blogjava.net/nkjava/comments/371971.html</wfw:comment><comments>http://www.blogjava.net/nkjava/archive/2012/03/15/371971.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/nkjava/comments/commentRss/371971.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nkjava/services/trackbacks/371971.html</trackback:ping><description><![CDATA[<div>
<p style="margin-top:6.55pt;margin-right:0cm;margin-bottom:6.55pt;margin-left: 0cm;text-indent:18.35pt;line-height:17.0pt"><span>JVM</span></span><span style="font-size:9.0pt;color:#333333">栈解决程序的运行问题，即程序如何执行，或者说如何处理数据</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">;JVM</span><span style="font-size:9.0pt;color:#333333">堆解决的是数据存储的问题，即数据怎么放、放在哪儿，另外</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">堆中存的是对象。</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">栈中存的是基本数据类型和</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">堆中对象的引用。</span></p>
<p style="margin-top:6.55pt;margin-right:0cm;margin-bottom:6.55pt;margin-left: 0cm;text-indent:18.35pt;line-height:17.0pt"><strong><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">JVM</span></strong><strong><span style="font-size:9.0pt;font-family:宋体;color:#333333">基础概念：</span></strong><strong><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">JVM</span></strong><strong><span style="font-size:9.0pt;font-family:宋体;color:#333333">堆与</span></strong><strong><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">JVM</span></strong><strong><span style="font-size:9.0pt;font-family:宋体;color:#333333">栈</span></strong></p>
<p style="margin-top:6.55pt;margin-right:0cm;margin-bottom:6.55pt;margin-left: 0cm;text-indent:18.35pt;line-height:17.0pt"><strong><span style="font-size: 9.0pt;font-family:宋体;color:#333333">数据类型</span></strong></p>
<p style="margin-top:6.55pt;margin-right:0cm;margin-bottom:6.55pt;margin-left: 0cm;text-indent:18.35pt;line-height:17.0pt"><span style="font-size: 9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">Java</span><span style="font-size:9.0pt;color:#333333">虚拟机中，数据类型可以分为两类：基本类型和引用类型。基本类型的变量保存原始值，即：他代表的值就是数值本身</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">;</span><span style="font-size:9.0pt;color:#333333">而引用类型的变量保存引用值。</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">&#8220;</span><span style="font-size:9.0pt;color:#333333">引用值</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">&#8221;</span><span style="font-size:9.0pt;color:#333333">代表了某个对象的引用，而不是对象本身，对象本身存放在这个引用值所表示的地址的位置。</span></p>
<p style="margin-top:6.55pt;margin-right:0cm;margin-bottom:6.55pt;margin-left: 0cm;text-indent:18.35pt;line-height:17.0pt"><span style="font-size:9.0pt;color:#333333">基本类型包括：</span><span style="font-size:9.0pt; font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">byte,short,int,long,char,float,double,Boolean,returnAddress</span></p>
<p style="margin-top:6.55pt;margin-right:0cm;margin-bottom:6.55pt;margin-left: 0cm;text-indent:18.35pt;line-height:17.0pt"><span style="font-size:9.0pt;color:#333333">引用类型包括：类类型，接口类型和数组。</span></p>
<p style="margin-top:6.55pt;margin-right:0cm;margin-bottom:6.55pt;margin-left: 0cm;text-indent:18.35pt;line-height:17.0pt"><strong><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">JVM</span></strong><strong><span style="font-size:9.0pt;font-family:宋体;color:#333333">堆与</span></strong><strong><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">JVM</span></strong><strong><span style="font-size:9.0pt;font-family:宋体;color:#333333">栈</span></strong></p>
<p style="margin-top:6.55pt;margin-right:0cm;margin-bottom:6.55pt;margin-left: 0cm;text-indent:18.35pt;line-height:17.0pt"><span style="font-size: 9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">堆和</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">栈是程序运行的关键，很有必要把他们的关系说清楚。<br />
</span></p>
<div>
<p style="margin-top:6.55pt;margin-right:0cm;margin-bottom:6.55pt;margin-left: 0cm;text-indent:18.35pt;line-height:17.0pt"><span style="font-size: 9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">栈是运行时的单位，而</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">堆是存储的单位。</span></p>
<p style="margin-top:6.55pt;margin-right:0cm;margin-bottom:6.55pt;margin-left: 0cm;text-indent:18.35pt;line-height:17.0pt"><span style="font-size: 9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">栈解决程序的运行问题，即程序如何执行，或者说如何处理数据</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">;JVM</span><span style="font-size:9.0pt;color:#333333">堆解决的是数据存储的问题，即数据怎么放、放在哪儿。</span></p>
<p style="margin-top:6.55pt;margin-right:0cm;margin-bottom:6.55pt;margin-left: 0cm;text-indent:18.35pt;line-height:17.0pt"><span style="font-size:9.0pt;color:#333333">在</span><span style="font-size:9.0pt; font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">Java</span><span style="font-size:9.0pt;color:#333333">中一个线程就会相应有一个线程</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">栈与之对应，这点很容易理解，因为不同的线程执行逻辑有所不同，因此需要一个独立的线程</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">栈。而</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">堆则是所有线程共享的。</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">栈因为是运行单位，因此里面存储的信息都是跟当前线程</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">(</span><span style="font-size:9.0pt;color:#333333">或程序</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">)</span><span style="font-size:9.0pt;color:#333333">相关信息的。包括局部变量、程序运行状态、方法返回值等等</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">;</span><span style="font-size:9.0pt;color:#333333">而</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">堆只负责存储对象信息。</span></p>
<p style="margin-top:6.55pt;margin-right:0cm;margin-bottom:6.55pt;margin-left: 0cm;text-indent:18.35pt;line-height:17.0pt"><strong><span style="font-size: 9.0pt;font-family:宋体;color:#333333">为什么要把</span></strong><strong><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">JVM</span></strong><strong><span style="font-size:9.0pt;font-family:宋体;color:#333333">堆和</span></strong><strong><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">JVM</span></strong><strong><span style="font-size:9.0pt;font-family:宋体;color:#333333">栈区分出来呢</span></strong><strong><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">?JVM</span></strong><strong><span style="font-size:9.0pt;font-family:宋体;color:#333333">栈中不是也可以存储数据吗</span></strong><strong><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">?</span></strong></p>
<p style="margin-top:6.55pt;margin-right:0cm;margin-bottom:6.55pt;margin-left: 0cm;text-indent:18.35pt;line-height:17.0pt"><span style="font-size:9.0pt;color:#333333">第一，从软件设计的角度看，</span><span style="font-size: 9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">栈代表了处理逻辑，而</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">堆代表了数据。这样分开，使得处理逻辑更为清晰。分而治之的思想。这种隔离、模块化的思想在软件设计的方方面面都有体现。</span></p>
<p style="margin-top:6.55pt;margin-right:0cm;margin-bottom:6.55pt;margin-left: 0cm;text-indent:18.35pt;line-height:17.0pt"><span style="font-size:9.0pt;color:#333333">第二，</span><span style="font-size:9.0pt; font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">堆与</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">栈的分离，使得</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">堆中的内容可以被多个</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">栈共享</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">(</span><span style="font-size:9.0pt;color:#333333">也可以理解为多个线程访问同一个对象</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">)</span><span style="font-size:9.0pt;color:#333333">。这种共享的收益是很多的。一方面这种共享提供了一种有效的数据交互方式</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">(</span><span style="font-size:9.0pt;color:#333333">如：共享内存</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">)</span><span style="font-size:9.0pt;color:#333333">，另一方面，</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">堆中的共享常量和缓存可以被所有</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">栈访问，节省了空间。</span></p>
<p style="margin-top:6.55pt;margin-right:0cm;margin-bottom:6.55pt;margin-left: 0cm;text-indent:18.35pt;line-height:17.0pt"><span style="font-size:9.0pt;color:#333333">第三，</span><span style="font-size:9.0pt; font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">栈因为运行时的需要，比如保存系统运行的上下文，需要进行地址段的划分。由于</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">栈只能向上增长，因此就会限制住</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">栈存储内容的能力。而</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">堆不同，</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">堆中的对象是可以根据需要动态增长的，因此</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">栈和</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">堆的拆分，使得动态增长成为可能，相应</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">栈中只需记录</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">堆中的一个地址即可。</span></p>
<p style="margin-top:6.55pt;margin-right:0cm;margin-bottom:6.55pt;margin-left: 0cm;text-indent:18.35pt;line-height:17.0pt"><span style="font-size:9.0pt;color:#333333">第四，面向对象就是</span><span style="font-size:9.0pt; font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">堆和</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">栈的完美结合。其实，面向对象方式的程序与以前结构化的程序在执行上没有任何区别。但是，面向对象的引入，使得对待问题的思考方式发生了改变，而更接近于自然方式的思考。当我们把对象拆开，你会发现，对象的属性其实就是数据，存放在</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">堆中</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">;</span><span style="font-size:9.0pt;color:#333333">而对象的行为</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">(</span><span style="font-size:9.0pt;color:#333333">方法</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">)</span><span style="font-size:9.0pt;color:#333333">，就是运行逻辑，放在</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">栈中。我们在编写对象的时候，其实即编写了数据结构，也编写的处理数据的逻辑。不得不承认，面向对象的设计，确实很美。</span></p>
<p style="margin-top:6.55pt;margin-right:0cm;margin-bottom:6.55pt;margin-left: 0cm;text-indent:18.35pt;line-height:17.0pt"><strong><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">JVM</span></strong><strong><span style="font-size:9.0pt;font-family:宋体;color:#333333">堆中存什么</span></strong><strong><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">?JVM</span></strong><strong><span style="font-size:9.0pt;font-family:宋体;color:#333333">栈中存什么</span></strong><strong><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">?</span></strong></p>
<p style="margin-top:6.55pt;margin-right:0cm;margin-bottom:6.55pt;margin-left: 0cm;text-indent:18.35pt;line-height:17.0pt"><span style="font-size: 9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">堆中存的是对象。</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">栈中存的是基本数据类型和</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">堆中对象的引用。一个对象的大小是不可估计的，或者说是可以动态变化的，但是在</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">栈中，一个对象只对应了一个</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">4btye</span><span style="font-size:9.0pt;color:#333333">的引用</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">(JVM</span><span style="font-size:9.0pt;color:#333333">堆</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">栈分离的好处：</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">))</span><span style="font-size:9.0pt;color:#333333">。</span></p>
<p style="margin-top:6.55pt;margin-right:0cm;margin-bottom:6.55pt;margin-left: 0cm;text-indent:18.35pt;line-height:17.0pt"><span style="font-size:9.0pt;color:#333333">为什么不把基本类型放</span><span style="font-size:9.0pt; font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">堆中呢</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">?</span><span style="font-size:9.0pt;color:#333333">因为其占用的空间一般是</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">1~8</span><span style="font-size:9.0pt;color:#333333">个字节</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">&#8212;&#8212;</span><span style="font-size:9.0pt;color:#333333">需要空间比较少，而且因为是基本类型，所以不会出现动态增长的情况</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">&#8212;&#8212;</span><span style="font-size:9.0pt;color:#333333">长度固定，因此</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">栈中存储就够了，如果把他存在</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">堆中是没有什么意义的</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">(</span><span style="font-size:9.0pt;color:#333333">还会浪费空间，后面说明</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">)</span><span style="font-size:9.0pt;color:#333333">。可以这么说，基本类型和对象的引用都是存放在</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">栈中，而且都是几个字节的一个数，因此在程序运行时，他们的处理方式是统一的。但是基本类型、对象引用和对象本身就有所区别了，因为一个是</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">栈中的数据一个是</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">堆中的数据。最常见的一个问题就是，</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">Java</span><span style="font-size:9.0pt;color:#333333">中参数传递时的问题。</span></p>
<p style="margin-top:6.55pt;margin-right:0cm;margin-bottom:6.55pt;margin-left: 0cm;text-indent:18.35pt;line-height:17.0pt"><strong><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">Java</span></strong><strong><span style="font-size:9.0pt;font-family:宋体;color:#333333">中的参数传递时传值呢</span></strong><strong><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">?</span></strong><strong><span style="font-size:9.0pt;font-family:宋体;color:#333333">还是传引用</span></strong><strong><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">?</span></strong></p>
<p style="margin-top:6.55pt;margin-right:0cm;margin-bottom:6.55pt;margin-left: 0cm;text-indent:18.35pt;line-height:17.0pt"><span style="font-size:9.0pt;color:#333333">要说明这个问题，先要明确两点：</span></p>
<p style="margin-top:6.55pt;margin-right:0cm;margin-bottom:6.55pt;margin-left: 0cm;text-indent:18.35pt;line-height:17.0pt"><span style="font-size: 9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">1.</span><span style="font-size:9.0pt;color:#333333">不要试图与</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">C</span><span style="font-size:9.0pt;color:#333333">进行类比，</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">Java</span><span style="font-size:9.0pt;color:#333333">中没有指针的概念</span></p>
<p style="margin-top:6.55pt;margin-right:0cm;margin-bottom:6.55pt;margin-left: 0cm;text-indent:18.35pt;line-height:17.0pt"><span style="font-size: 9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">2.</span><span style="font-size:9.0pt;color:#333333">程序运行永远都是在</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">栈中进行的，因而参数传递时，只存在传递基本类型和对象引用的问题。不会直接传对象本身。</span></p>
<p style="margin-top:6.55pt;margin-right:0cm;margin-bottom:6.55pt;margin-left: 0cm;text-indent:18.35pt;line-height:17.0pt"><span style="font-size:9.0pt;color:#333333">明确以上两点后。</span><span style="font-size:9.0pt; font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">Java</span><span style="font-size:9.0pt;color:#333333">在方法调用传递参数时，因为没有指针，所以它都是进行传值调用</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">(</span><span style="font-size:9.0pt;color:#333333">这点可以参考</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">C</span><span style="font-size:9.0pt;color:#333333">的传值调用</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">)</span><span style="font-size:9.0pt;color:#333333">。因此，很多书里面都说</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">Java</span><span style="font-size:9.0pt;color:#333333">是进行传值调用，这点没有问题，而且也简化的</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">C</span><span style="font-size:9.0pt;color:#333333">中复杂性。</span></p>
<p style="margin-top:6.55pt;margin-right:0cm;margin-bottom:6.55pt;margin-left: 0cm;text-indent:18.35pt;line-height:17.0pt"><span style="font-size:9.0pt;color:#333333">但是传引用的错觉是如何造成的呢</span><span style="font-size: 9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">?</span><span style="font-size:9.0pt;color:#333333">在运行</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">栈中，基本类型和引用的处理是一样的，都是传值，所以，如果是传引用的方法调用，也同时可以理解为</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">&#8220;</span><span style="font-size:9.0pt;color:#333333">传引用值</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">&#8221;</span><span style="font-size:9.0pt;color:#333333">的传值调用，即引用的处理跟基本类型是完全一样的。但是当进入被调用方法时，被传递的这个引用的值，被程序解释</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">(</span><span style="font-size:9.0pt;color:#333333">或者查找</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">)</span><span style="font-size:9.0pt;color:#333333">到</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">堆中的对象，这个时候才对应到真正的对象。如果此时进行修改，修改的是引用对应的对象，而不是引用本身，即：修改的是</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">堆中的数据。所以这个修改是可以保持的了。</span></p>
<p style="margin-top:6.55pt;margin-right:0cm;margin-bottom:6.55pt;margin-left: 0cm;text-indent:18.35pt;line-height:17.0pt"><span style="font-size:9.0pt;color:#333333">对象，从某种意义上说，是由基本类型组成的。可以把一个对象看作为一棵树，对象的属性如果还是对象，则还是一颗树</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">(</span><span style="font-size:9.0pt;color:#333333">即非叶子节点</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">)</span><span style="font-size:9.0pt;color:#333333">，基本类型则为树的叶子节点。程序参数传递时，被传递的值本身都是不能进行修改的，但是，如果这个值是一个非叶子节点</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">(</span><span style="font-size:9.0pt;color:#333333">即一个对象引用</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">)</span><span style="font-size:9.0pt;color:#333333">，则可以修改这个节点下面的所有内容。</span></p>
<p style="margin-top:6.55pt;margin-right:0cm;margin-bottom:6.55pt;margin-left: 0cm;text-indent:18.35pt;line-height:17.0pt"><span style="font-size: 9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">堆和</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">栈中，</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">栈是程序运行最根本的东西。程序运行可以没有</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">堆，但是不能没有</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">栈。而</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">堆是为</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">栈进行数据存储服务，说白了</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">堆就是一块共享的内存。不过，正是因为</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">堆和</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">栈的分离的思想，才使得</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">Java</span><span style="font-size:9.0pt;color:#333333">的垃圾回收成为可能。</span></p>
<p style="margin-top:6.55pt;margin-right:0cm;margin-bottom:6.55pt;margin-left: 0cm;text-indent:18.35pt;line-height:17.0pt"><span style="font-size: 9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">Java</span><span style="font-size:9.0pt;color:#333333">中，</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">栈的大小通过</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">-Xss</span><span style="font-size:9.0pt;color:#333333">来设置，当</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">栈中存储数据比较多时，需要适当调大这个值，否则会出现</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">java.lang.StackOverflowError</span><span style="font-size:9.0pt;color:#333333">异常。常见的出现这个异常的是无法返回的递归，因为此时</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#333333">JVM</span><span style="font-size:9.0pt;color:#333333">栈中保存的信息都是方法返回的记录点。</span></p>
<p align="left" style="text-align:left;text-indent:20.25pt;"><strong><span style="font-size:12.0pt; font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:black;">java</span></strong><strong><span style="font-size:12.0pt; font-family:宋体;color:black;">栈的组成元素</span></strong><strong><span style="font-size:12.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:black;">&#8212;&#8212;</span></strong><strong><span style="font-size: 12.0pt;font-family:宋体;color:black;">栈帧</span></strong></p>
<p align="left" style="text-align:left;text-indent:20.25pt;"><span style="font-size:10.0pt;font-family:宋体;color:black;">栈帧由三部分组成：<strong>局部变量区、操作数栈、帧数据区</strong>。局部变量区和操作数栈的大小要视对应的方法而定，他们是按字长计算的。但调用一个方法时，它从类型信息中得到此方法局部变量区和操作数栈大小，并据此分配栈内存，然后压入</span><span style="font-size:10.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:black;">Java</span><span style="font-size:10.0pt; font-family:宋体;color:black;">栈。</span></p>
<p align="left" style="text-align:left;text-indent:20.25pt;"><strong><span style="font-size:10.0pt;font-family:宋体;color:black;">局部变量区</span></strong><strong><span style="font-size:10.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:black;">:</span></strong><span style="font-size:10.0pt;font-family:宋体;color:black;">局部变量区被组织为以一个字长为单位、从</span><span style="font-size:10.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:black;">0</span><span style="font-size:10.0pt; font-family:宋体;color:black;">开始计数的数组，类型为</span><span style="font-size:10.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:black;">short</span><span style="font-size:10.0pt; font-family:宋体;color:black;">、</span><span style="font-size:10.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:black;">byte</span><span style="font-size:10.0pt; font-family:宋体;color:black;">和</span><span style="font-size:10.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:black;">char</span><span style="font-size:10.0pt; font-family:宋体;color:black;">的值在存入数组前要被转换成</span><span style="font-size:10.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:black;">int</span><span style="font-size:10.0pt; font-family:宋体;color:black;">值，而</span><span style="font-size:10.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:black;">long</span><span style="font-size:10.0pt; font-family:宋体;color:black;">和</span><span style="font-size:10.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:black;">double</span><span style="font-size:10.0pt; font-family:宋体;color:black;">在数组中占据连续的两项，在访问局部变量中的</span><span style="font-size:10.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:black;">long</span><span style="font-size:10.0pt; font-family:宋体;color:black;">或</span><span style="font-size:10.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:black;">double</span><span style="font-size:10.0pt; font-family:宋体;color:black;">时，只需取出连续两项的第一项的索引值即可</span><span style="font-size:10.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:black;">,</span><span style="font-size:10.0pt; font-family:宋体;color:black;">如某个</span><span style="font-size:10.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:black;">long</span><span style="font-size:10.0pt; font-family:宋体;color:black;">值在局部变量区中占据的索引时</span><span style="font-size:10.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:black;">3</span><span style="font-size:10.0pt; font-family:宋体;color:black;">、</span><span style="font-size:10.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:black;">4</span><span style="font-size:10.0pt; font-family:宋体;color:black;">项，取值时，指令只需取索引为</span><span style="font-size:10.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:black;">3</span><span style="font-size:10.0pt; font-family:宋体;color:black;">的</span><span style="font-size:10.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:black;">long</span><span style="font-size:10.0pt; font-family:宋体;color:black;">值即可。</span></p>
<p align="left" style="text-align:left;"><span style="font-size:8.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:black;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size:10.0pt;font-family:宋体;color:black;">说再多也没用，下面就看个例子，好让大家对局部变量区有更深刻的认识。这个图来着《深入</span><span style="font-size:10.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:black;">JVM</span><span style="font-size: 10pt; font-family: 宋体; color: black; ">》：<br />
</span></p>
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><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; ">int</span><span style="color: #000000; ">&nbsp;runClassMethod(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;i,</span><span style="color: #0000FF; ">long</span><span style="color: #000000; ">&nbsp;l,</span><span style="color: #0000FF; ">float</span><span style="color: #000000; ">&nbsp;f,</span><span style="color: #0000FF; ">double</span><span style="color: #000000; ">&nbsp;d,Object&nbsp;o,</span><span style="color: #0000FF; ">byte</span><span style="color: #000000; ">&nbsp;b)&nbsp;{&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;runInstanceMethod(</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;c,</span><span style="color: #0000FF; ">double</span><span style="color: #000000; ">&nbsp;d,</span><span style="color: #0000FF; ">short</span><span style="color: #000000; ">&nbsp;s,</span><span style="color: #0000FF; ">boolean</span><span style="color: #000000; ">&nbsp;b)&nbsp;{&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;<br />
</span></div>
<img src="http://www.blogjava.net/images/blogjava_net/nkjava/1.jpg" width="642" height="278" alt="" /><br />
<br />
<div>
<p><strong><span style="font-family:&quot;Arial&quot;,&quot;sans-serif&quot;; color:red">runInstanceMethod</span></strong><span style="font-family:宋体;color:red">的局部变量区第一项是个</span><strong><span style="font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:red">reference</span></strong><span style="font-family:宋体;color:red">（引用），它指定的就是对象本身的引用，也就是我们常用的</span><strong><span style="font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:red">this,</span></strong><span style="font-family:宋体;color:red">但是在</span><span><span style="font-family:&quot;Arial&quot;,&quot;sans-serif&quot;; color:red">runClassMethod</span></span><span style="font-family:宋体;color:red">方法中，没这个引用，那是因为</span><span style="font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:red">runClassMethod</span><span style="font-family:宋体;color:red">是个静态方法</span><strong><span style="font-family:宋体;color:red">。</span></strong><strong></strong></p>
<p><strong>&nbsp;</strong></p>
<p align="left" style="text-align:left;"><strong><span style="font-size:10.0pt;font-family:宋体;color:black;">操作数栈</span></strong><span style="font-size:10.0pt;font-family: 宋体;color:black;">和局部变量区一样，操作数栈也被组织成一个以字长为单位的数组。但和前者不同的是，它不是通过索引来访问的，而是通过入栈和出栈来访问的。可把操作数栈理解为存储计算时，临时数据的存储区域。下面我们通过一段简短的程序片段外加一幅图片来了解下操作数栈的作用。</span></p>
<p align="left" style="text-align:left;"><strong><span style="font-size:10.0pt;font-family:宋体;color:black;">Int</span></strong> <span style="font-size:10.0pt;font-family:宋体; color:black;">a= 100;</span></p>
<p align="left" style="text-align:left;"><strong><span style="font-size:10.0pt;font-family:宋体;color:black;">Int </span></strong><span style="font-size:10.0pt;font-family:宋体; color:black;">b = 98;</span></p>
<p align="left" style="text-align:left;"><strong><span style="font-size:10.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:black;">Int</span></strong> <span style="font-size:10.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:black;">c = a+b;</span></p>
</div>
<img src="http://www.blogjava.net/images/blogjava_net/nkjava/2.jpg" width="627" height="286" alt="" /><br />
<div>
<p><span><span style="font-family:宋体; color:black">从图中可以得出：操作数栈其实就是个临时数据存储区域，它是通过入栈和出栈来进行操作的。</span></span></p>
<p><strong><span style="font-size:9.0pt;color:black">帧数据区</span></strong> <span style="font-size:9.0pt;color:black">除了局部变量区和操作数栈外，</span><span style="font-size:9.0pt; font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:black">java</span><span style="font-size:9.0pt;color:black">栈帧还需要一些数据来支持常量池解析、正常方法返回以及异常派发机制。这些数据都保存在</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:black">java</span><span style="font-size:9.0pt;color:black">栈帧的帧数据区中。当</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:black">JVM</span><span style="font-size:9.0pt;color:black">执行到需要常量池数据的指令时，它都会通过帧数据区中指向常量池的指针来访问它。</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:black"> </span></p>
<p><span style="font-size:9.0pt;color:black">除了处理常量池解析外，帧里的数据还要处理</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:black">java</span><span style="font-size:9.0pt;color:black">方法的正常结束和异常终止。如果是通过</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:black">return</span><span style="font-size:9.0pt;color:black">正常结束，则当前栈帧从</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:black">Java</span><span style="font-size:9.0pt;color:black">栈中弹出，恢复发起调用的方法的栈。如果方法又返回值，</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:black">JVM</span><span style="font-size:9.0pt;color:black">会把返回值压入到发起调用方法的操作数栈。</span></p>
<p><span style="font-size:9.0pt;color:black">为了处理</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:black">java</span><span style="font-size:9.0pt;color:black">方法中的异常情况，帧数据区还必须保存一个对此方法异常引用表的引用。当异常抛出时，</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:black">JVM</span><span style="font-size:9.0pt;color:black">给</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:black">catch</span><span style="font-size:9.0pt;color:black">块中的代码。如果没发现，方法立即终止，然后</span><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:black">JVM</span><span style="font-size:9.0pt;color:black">用帧区数据的信息恢复发起调用的方法的帧。然后再发起调用方法的上下文重新抛出同样的异常。</span></p>
</div>
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;Example3C{<br />
&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;addAndPrint(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">double</span><span style="color: #000000; ">&nbsp;result&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;addTwoTypes(</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,</span><span style="color: #000000; ">88.88</span><span style="color: #000000; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(result);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&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; ">double</span><span style="color: #000000; ">&nbsp;addTwoTypes(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;i,&nbsp;</span><span style="color: #0000FF; ">double</span><span style="color: #000000; ">&nbsp;d){<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;i</span><span style="color: #000000; ">+</span><span style="color: #000000; ">d;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
}</span></div>
<img src="http://www.blogjava.net/images/blogjava_net/nkjava/4.jpg" width="561" height="418" alt="" /><br />
<div>
<p><span style="font-size:10.0pt;font-family: &quot;Arial&quot;,&quot;sans-serif&quot;;color:red">1.</span><span style="font-size:10.0pt;color:red">只有在调用一个方法时，才为当前栈分配一个帧，然后将该帧压入栈</span></p>
<p><span style="font-size:10.0pt;font-family: &quot;Arial&quot;,&quot;sans-serif&quot;;color:red">2 </span><span style="font-size:10.0pt;color:red">帧中存储了对应方法的局部数据，方法执行完，对应的帧则从栈中弹出，并把返回结果存储在<strong><span style="font-family:宋体;">调用</span></strong></span><strong> </strong><strong><span style="font-size:10.0pt;font-family:宋体;color:red">方法的帧的操作数栈中</span></strong></p>
</div>
<br />
<p>&nbsp;</p>
</div>
<p>&nbsp;</p>
</div>
<img src ="http://www.blogjava.net/nkjava/aggbug/371971.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nkjava/" target="_blank">草原上的骆驼</a> 2012-03-15 19:39 <a href="http://www.blogjava.net/nkjava/archive/2012/03/15/371971.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JVM学习之-JVM内存结构</title><link>http://www.blogjava.net/nkjava/archive/2012/03/14/371831.html</link><dc:creator>草原上的骆驼</dc:creator><author>草原上的骆驼</author><pubDate>Wed, 14 Mar 2012 01:40:00 GMT</pubDate><guid>http://www.blogjava.net/nkjava/archive/2012/03/14/371831.html</guid><wfw:comment>http://www.blogjava.net/nkjava/comments/371831.html</wfw:comment><comments>http://www.blogjava.net/nkjava/archive/2012/03/14/371831.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/nkjava/comments/commentRss/371831.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nkjava/services/trackbacks/371831.html</trackback:ping><description><![CDATA[<img src="http://www.blogjava.net/images/blogjava_net/nkjava/jvmstructure.png" border="0" alt="" width="338" height="376" /><br /><br /><div><h2><span><span>1.1<span style="font:7.0pt &quot;Times New Roman&quot;">&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span>JVM<span style="font-family:宋体;">运行</span></h2>  <p><span>ClassLoader-&gt;RUNNTIME DATA AREA-&gt;EXECUTION ENGINE-&gt;NATIVE INTERFACE-&gt;NATIVE LIBRARIES</span></p>  <p>Class Loader:<span style="font-family: 宋体;">负责加载类到内存</span></p>  <p>RUNNTIME DATA AREA:<span style="font-family:宋体;">负责</span></p>  <p>EXECUTION ENGINE: &nbsp;<span style="font-family:宋体;">解释器</span>Interpreter,<span style="font-family:宋体;">负责解释命令，提交到操作系统</span></p>  <p>NATIVE INTERFACE: <span style="font-family:宋体;">在</span><span>NATIVE METHOD STATCK</span><span style="font-family:宋体;">中登记</span>NATIVE<span style="font-family:宋体;">方法，在</span>Executive Engine<span style="font-family:宋体;">执行时加载</span>native libraies.</p>  <p>&nbsp;</p>  <h2><span><span><span style="font:7.0pt &quot;Times New Roman&quot;">&nbsp;</span></span></span>CLassLoader</h2>  <p align="left" style="text-align:left;line-height:18.75pt;"><span style="font-size:12.0pt;font-family:宋体;color:black;">类加载器的作用是加载类文件到内存，比如编写一个HelloWord.java程序，然后通过javac编译成class文件，那怎么才能加载到内存中被执行呢？Class Loader承担的就是这个责任，那不可能随便建立一个.class文件就能被加载的，Class Loader加载的class文件是有格式要求，在《JVM Specification》中式这样定义Class文件的结构：</span></p>  <p align="left" style="text-align:left;text-indent:17.5pt; line-height:18.75pt;"><span style="font-size:10.0pt;font-family:&quot;Helvetica&quot;,&quot;sans-serif&quot;;">ClassFile {</span></p>  <p align="left" style="text-align:left;text-indent:17.5pt; line-height:18.75pt;">&nbsp;<span style="font-size:10.0pt;font-family:&quot;Helvetica&quot;,&quot;sans-serif&quot;;">u4 magic;</span></p>  <p align="left" style="text-align:left;text-indent:17.5pt; line-height:18.75pt;"><span style="font-size:10.0pt;font-family:&quot;Helvetica&quot;,&quot;sans-serif&quot;;">u2 minor_version;</span></p>  <p align="left" style="text-align:left;text-indent:17.5pt; line-height:18.75pt;"><span style="font-size:10.0pt;font-family:&quot;Helvetica&quot;,&quot;sans-serif&quot;;">u2 major_version;</span></p>  <p align="left" style="text-align:left;text-indent:17.5pt; line-height:18.75pt;"><span style="font-size:10.0pt;font-family:&quot;Helvetica&quot;,&quot;sans-serif&quot;;">u2 constant_pool_count;</span></p>  <p align="left" style="text-align:left;text-indent:17.5pt; line-height:18.75pt;"><span style="font-size:10.0pt;font-family:&quot;Helvetica&quot;,&quot;sans-serif&quot;;">cp_info constant_pool[constant_pool_count-1];</span></p>  <p align="left" style="text-align:left;text-indent:17.5pt; line-height:18.75pt;"><span style="font-size:10.0pt;font-family:&quot;Helvetica&quot;,&quot;sans-serif&quot;;">u2 access_flags;</span></p>  <p align="left" style="text-align:left;text-indent:17.5pt; line-height:18.75pt;"><span style="font-size:10.0pt;font-family:&quot;Helvetica&quot;,&quot;sans-serif&quot;;">u2 this_class;</span></p>  <p align="left" style="text-align:left;text-indent:17.5pt; line-height:18.75pt;"><span style="font-size:10.0pt;font-family:&quot;Helvetica&quot;,&quot;sans-serif&quot;;">u2 super_class;</span></p>  <p align="left" style="text-align:left;text-indent:17.5pt; line-height:18.75pt;"><span style="font-size:10.0pt;font-family:&quot;Helvetica&quot;,&quot;sans-serif&quot;;">u2 interfaces_count;</span></p>  <p align="left" style="text-align:left;text-indent:17.5pt; line-height:18.75pt;"><span style="font-size:10.0pt;font-family:&quot;Helvetica&quot;,&quot;sans-serif&quot;;">u2 interfaces[interfaces_count];</span></p>  <p align="left" style="text-align:left;text-indent:17.5pt; line-height:18.75pt;"><span style="font-size:10.0pt;font-family:&quot;Helvetica&quot;,&quot;sans-serif&quot;;">u2 fields_count;</span></p>  <p align="left" style="text-align:left;text-indent:17.5pt; line-height:18.75pt;"><span style="font-size:10.0pt;font-family:&quot;Helvetica&quot;,&quot;sans-serif&quot;;">field_info fields[fields_count];</span></p>  <p align="left" style="text-align:left;text-indent:17.5pt; line-height:18.75pt;"><span style="font-size:10.0pt;font-family:&quot;Helvetica&quot;,&quot;sans-serif&quot;;">u2 methods_count;</span></p>  <p align="left" style="text-align:left;text-indent:17.5pt; line-height:18.75pt;"><span style="font-size:10.0pt;font-family:&quot;Helvetica&quot;,&quot;sans-serif&quot;;">method_info methods[methods_count];</span></p>  <p align="left" style="text-align:left;text-indent:17.5pt; line-height:18.75pt;"><span style="font-size:10.0pt;font-family:&quot;Helvetica&quot;,&quot;sans-serif&quot;;">u2 attributes_count;</span></p>  <p align="left" style="text-align:left;text-indent:17.5pt; line-height:18.75pt;"><span style="font-size:10.0pt;font-family:&quot;Helvetica&quot;,&quot;sans-serif&quot;;">attribute_info attributes[attributes_count];</span></p>  <p align="left" style="text-align:left;text-indent:17.5pt; line-height:18.75pt;"><span style="font-size:10.0pt;font-family:&quot;Helvetica&quot;,&quot;sans-serif&quot;;">}</span></p>  <p align="left" style="text-align:left;line-height:18.75pt;"><span style="font-size:12.0pt;font-family:宋体;color:black;">需要详细了解的话，可以仔细阅读《JVM Specification》的第四章<span>&#8220;The class File Format&#8221;</span>，这里不再详细说明。</span></p>  <p align="left" style="text-align:left;line-height:18.75pt;"><span style="font-size:12.0pt;font-family:宋体;color:black;">友情提示：Class Loader只管加载，只要符合文件结构就加载，至于说能不能运行，则不是它负责的，那是由Execution Engine负责的。</span></p>  <h2>Execution Engine <span style="font-family:宋体;">执行引擎</span></h2>  <p><span style="font-family:宋体;">执行引擎也叫做解释器</span>(Interpreter)<span style="font-family:宋体;">，负责解释命令，提交操作系统执行。</span></p>  <h2>Native Interface<span style="font-family:宋体;">本地接口</span></h2>  <p><span style="font-family:宋体;">本地接口的作用是融合不同的编程语言为</span>Java<span style="font-family:宋体;">所用，它的初衷是融合</span>C/C++<span style="font-family:宋体;">程序，</span>Java<span style="font-family:宋体;">诞生的时候是</span>C/C++<span style="font-family:宋体;">横行的时候，要想立足，必须有一个聪明的、睿智的调用</span>C/C++<span style="font-family:宋体;">程序，于是就在内存中专门开辟了一块区域处理标记为</span>native<span style="font-family:宋体;">的代码，它的具体做法是</span>Native Method Stack<span style="font-family:宋体;">中登记</span>native<span style="font-family:宋体;">方法，在</span>Execution Engine<span style="font-family:宋体;">执行时加载</span>native libraies<span style="font-family:宋体;">。目前该方法使用的是越来越少了，除非是与硬件有关的应用，比如通过</span>Java<span style="font-family:宋体;">程序驱动打印机，或者</span>Java<span style="font-family:宋体;">系统管理生产设备，在企业级应用中已经比较少见，因为现在的异构领域间的通信很发达，比如可以使用</span>Socket<span style="font-family:宋体;">通信，也可以使用</span>Web Service<span style="font-family:宋体;">等等，不多做介绍。</span></p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;">在</span>NATIVE METHOD STATCK<span style="font-family:宋体;">中登记</span>NATIVE<span style="font-family:宋体;">方法，在</span>Executive Engine<span style="font-family:宋体;">执行时加载</span>native libraies.</p></div><div><h2><span><span>1.2<span style="font:7.0pt &quot;Times New Roman&quot;">&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span>RUNTIME<span style="font-family:宋体;">　</span>AREA</h2>  <p><span style="font-family:宋体;">运行数据区是整个</span>JVM<span style="font-family:宋体;">的重点。我们所有写的程序都被加载到这里，之后才开始运行，</span>Java<span style="font-family:宋体;">生态系统如此的繁荣，得益于该区域的优良自治。</span></p>  <table border="1" cellspacing="0" cellpadding="0" style="border-collapse:collapse;border:none;">  <tbody><tr>   <td width="215" valign="top" style="width:161.35pt;border:solid black 1.0pt;padding:0cm 5.4pt 0cm 5.4pt">   <p>&nbsp;</p>   </td>   <td width="331" valign="top" style="width:248.05pt;border:solid black 1.0pt;border-left:none;padding:0cm 5.4pt 0cm 5.4pt">   <p>&nbsp;</p>   </td>  </tr>  <tr>   <td width="215" valign="top" style="width:161.35pt;border:solid black 1.0pt;border-top:none;padding:0cm 5.4pt 0cm 5.4pt">   <p>PROGEAM COUNTER REGISTER</p>   </td>   <td width="331" valign="top" style="width:248.05pt;border-top:none;border-left:   none;border-bottom:solid black 1.0pt;   border-right:solid black 1.0pt;padding:0cm 5.4pt 0cm 5.4pt">   <p><span style="font-family:宋体;">线程私有、指向下一条要很执行的指令</span></p>   </td>  </tr>  <tr>   <td width="215" valign="top" style="width:161.35pt;border:solid black 1.0pt;border-top:none;padding:0cm 5.4pt 0cm 5.4pt">   <p>JAVA STACK</p>   </td>   <td width="331" valign="top" style="width:248.05pt;border-top:none;border-left:   none;border-bottom:solid black 1.0pt;   border-right:solid black 1.0pt;padding:0cm 5.4pt 0cm 5.4pt">   <p><span style="font-family:宋体;">线程私有、存储局部变量表、操作栈、动态链接、方法出口</span></p>   </td>  </tr>  <tr>   <td width="215" valign="top" style="width:161.35pt;border:solid black 1.0pt;border-top:none;padding:0cm 5.4pt 0cm 5.4pt">   <p>NATIVE METHOD STACK</p>   </td>   <td width="331" valign="top" style="width:248.05pt;border-top:none;border-left:   none;border-bottom:solid black 1.0pt;   border-right:solid black 1.0pt;padding:0cm 5.4pt 0cm 5.4pt">   <p><span style="font-family:宋体;">为虚拟机使用到的</span>Native <span style="font-family:宋体;">方法服务</span></p>   </td>  </tr>  <tr>   <td width="215" valign="top" style="width:161.35pt;border:solid black 1.0pt;border-top:none;padding:0cm 5.4pt 0cm 5.4pt">   <p>HEAP</p>   </td>   <td width="331" valign="top" style="width:248.05pt;border-top:none;border-left:   none;border-bottom:solid black 1.0pt;   border-right:solid black 1.0pt;padding:0cm 5.4pt 0cm 5.4pt">   <p><span style="font-family:宋体;">线程共享</span></p>   <p><span style="font-family:宋体;">所有的对象实例以及数组都要在堆上分配</span></p>   <p><span style="font-family:宋体;">回收器主要管理的对象</span></p>   <p>&nbsp;</p>   </td>  </tr>  <tr>   <td width="215" valign="top" style="width:161.35pt;border:solid black 1.0pt;border-top:none;padding:0cm 5.4pt 0cm 5.4pt">   <p>MEATHOD AREA</p>   </td>   <td width="331" valign="top" style="width:248.05pt;border-top:none;border-left:   none;border-bottom:solid black 1.0pt;   border-right:solid black 1.0pt;padding:0cm 5.4pt 0cm 5.4pt">   <p><span style="font-family:宋体;">线程共享的内存区域</span></p>   <p><span style="font-family:宋体;">非堆主要区域</span></p>   <p><span style="font-family:宋体;">存储类信息、常量、静态变量、即时编译器编译后的代码</span></p>   </td>  </tr> </tbody></table>  <p>&nbsp;</p>  <h3><span><span>1.2.1<span style="font:7.0pt &quot;Times New Roman&quot;">&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family:宋体;">程序计数器</span></h3>  <p><span style="font-family:宋体;">程序计数器（</span>Program Counter Register<span style="font-family:宋体;">）是一块较小的内存空间，它的作用可以看做是当前线程所执行的字节码的行号指示器。在虚拟机的概念模型里（仅是概念模型，各种虚拟机可能会通过一些更高效的方式去实现），字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令，分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。</span></p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;">由于</span>Java <span style="font-family:宋体;">虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现</span></p>  <p><span style="font-family:宋体;">的，在任何一个确定的时刻，一个处理器（对于多核处理器来说是一个内核）只会执行</span></p>  <p><span style="font-family:宋体;">一条线程中的指令。因此，为了线程切换后能恢复到正确的执行位置，每条线程都需要</span></p>  <p><span style="font-family:宋体;">有一个独立的程序计数器，各条线程之间的计数器互不影响，独立存储，我们称这类内</span></p>  <p><span style="font-family:宋体;">存区域为&#8220;线程私有&#8221;的内存。</span></p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;">如果线程正在执行的是一个</span>Java <span style="font-family:宋体;">方法，这个计数器记录的是正在执行的虚拟机字节</span></p>  <p><span style="font-family:宋体;">码指令的地址；如果正在执行的是</span>Natvie <span style="font-family:宋体;">方法，这个计数器值则为空（</span>Undefined<span style="font-family:宋体;">）。此</span></p>  <p><span style="font-family:宋体;">内存区域是唯一一个在</span>Java <span style="font-family:宋体;">虚拟机规范中没有规定任何</span>OutOfMemoryError <span style="font-family:宋体;">情况的区域。</span></p>  <p>&nbsp;</p>  <h3><span><span>1.2.2<span style="font:7.0pt &quot;Times New Roman&quot;">&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family:宋体;">栈</span></h3>  <p><span style="font-family:宋体;">与程序计数器一样，</span>Java <span style="font-family:宋体;">虚拟机栈（</span>Java Virtual Machine Stacks<span style="font-family:宋体;">）也是线程私有的，</span></p>  <p><span style="font-family:宋体;">它的生命周期与线程相同。虚拟机栈描述的是</span>Java <span style="font-family:宋体;">方法执行的内存模型：每个方法被执</span></p>  <p><span style="font-family:宋体;">行的时候都会同时创建一个栈帧（</span>Stack Frame<span style="font-family:宋体;">&#9312;）用于存储局部变量表、操作栈、动态链接、方法出口等信息。</span></p>  <p><span style="font-family:宋体;">每一个方法被调用直至执行完成的过程，就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。</span></p>  <p>&nbsp;<span style="font-family:宋体;">经常有人把</span>Java <span style="font-family:宋体;">内存区分为堆内存（</span>Heap<span style="font-family:宋体;">）和栈内存（</span>Stack<span style="font-family:宋体;">），这种分法比较粗</span></p>  <p><span style="font-family:宋体;">糙，</span>Java <span style="font-family:宋体;">内存区域的划分实际上远比这复杂。这种划分方式的流行只能说明大多数程序</span></p>  <p><span style="font-family:宋体;">员最关注的、与对象内存分配关系最密切的内存区域是这两块。</span></p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;">其中所指的&#8220;堆&#8221;在后面会专门讲述，而所指的&#8220;栈&#8221;就是现在讲的虚拟机栈，或者说是虚拟机栈中的局部变量表部分。</span></p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;">局部变量表存放了编译期可知的各种基本数据类型（</span>boolean<span style="font-family:宋体;">、</span>byte<span style="font-family:宋体;">、</span>char<span style="font-family:宋体;">、</span>short<span style="font-family:宋体;">、</span>int<span style="font-family:宋体;">、</span></p>  <p>float<span style="font-family:宋体;">、</span>long<span style="font-family:宋体;">、</span>double<span style="font-family:宋体;">）、对象引用（</span><span>reference </span><span style="font-family:宋体;">类型，它</span></p>  <p><span style="font-family:宋体;">不等同于对象本身，根据不同的虚拟机实现，它可能是一个指向对象起始地址的引用指针，也可能指向一个代表对象的句柄或者其他与此对象相关的位置）和</span>returnAddress <span style="font-family:宋体;">类型（指向了一条字节码指令的地址）。</span></p>  <p><span style="font-family:宋体;">其中</span>64 <span style="font-family:宋体;">位长度的</span>long <span style="font-family:宋体;">和</span>double <span style="font-family:宋体;">类型的数据会占用</span>2 <span style="font-family:宋体;">个局部变量空间（</span>Slot<span style="font-family:宋体;">），其余</span></p>  <p><span style="font-family:宋体;">的数据类型只占用</span>1 <span style="font-family:宋体;">个。</span></p>  <p><span style="font-family:宋体;">局部变量表所需的内存空间在编译期间完成分配，当进入一个方法时，这个方法需要在帧中分配多大的局部变量空间是完全确定的，在方法运行期间不会改变局部变量表的大小。</span></p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;">在</span>Java <span style="font-family:宋体;">虚拟机规范中，对这个区域规定了两种异常状况：如果线程请求的栈深度大</span></p>  <p><span style="font-family:宋体;">于虚拟机所允许的深度，将抛出</span>StackOverflowError <span style="font-family:宋体;">异常；如果虚拟机栈可以动态扩展</span></p>  <p><span style="font-family:宋体;">（当前大部分的</span>Java <span style="font-family:宋体;">虚拟机都可动态扩展，只不过</span>Java <span style="font-family:宋体;">虚拟机规范中也允许固定长度的</span></p>  <p><span style="font-family:宋体;">虚拟机栈），当扩展时无法申请到足够的内存时会抛出</span>OutOfMemoryError <span style="font-family:宋体;">异常。</span></p>  <p>&nbsp;</p>  <h3><span><span>1.2.3<span style="font:7.0pt &quot;Times New Roman&quot;">&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family:宋体;">本地方法栈</span></h3>  <p><span style="font-family:宋体;">本地方法栈（</span>Native Method Stacks<span style="font-family:宋体;">）与虚拟机栈所发挥的作用是非常相似的，其</span></p>  <p><span style="font-family:宋体;">区别不过是虚拟机栈为虚拟机执行</span>Java <span style="font-family:宋体;">方法（也就是字节码）服务，而本地方法栈则</span></p>  <p><span style="font-family:宋体;">是为虚拟机使用到的</span>Native <span style="font-family:宋体;">方法服务。虚拟机规范中对本地方法栈中的方法使用的语</span></p>  <p><span style="font-family:宋体;">言、使用方式与数据结构并没有强制规定，因此具体的虚拟机可以自由实现它。甚至</span></p>  <p><span style="font-family:宋体;">有的虚拟机（譬如</span>Sun HotSpot <span style="font-family:宋体;">虚拟机）直接就把本地方法栈和虚拟机栈合二为一。</span></p>  <p><span style="font-family:宋体;">与虚拟机栈一样，本地方法栈区域也会抛出</span>StackOverflowError <span style="font-family:宋体;">和</span>OutOfMemoryError</p>  <p><span style="font-family:宋体;">异常。</span></p>  <p>&nbsp;</p>  <h3><span><span>1.2.4<span style="font:7.0pt &quot;Times New Roman&quot;">&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span>Java <span style="font-family:宋体;">堆</span></h3>  <p><span style="font-family:宋体;">对于大多数应用来说，</span>Java <span style="font-family:宋体;">堆（</span>Java Heap<span style="font-family:宋体;">）是</span>Java <span style="font-family:宋体;">虚拟机所管理的内存中最大的</span></p>  <p><span style="font-family:宋体;">一块。</span></p>  <p>Java <span style="font-family:宋体;">堆是被所有线程共享的一块内存区域，在虚拟机启动时创建。此内存区域的</span></p>  <p><span style="font-family:宋体;">唯一目的就是存放对象实例，几乎所有的对象实例都在这里分配内存。这一点在</span>Java <span style="font-family:宋体;">虚</span></p>  <p><span style="font-family:宋体;">拟机规范中的描述是：所有的对象实例以及数组都要在堆上分配，但是随着</span>JIT <span style="font-family:宋体;">编译器</span></p>  <p><span style="font-family:宋体;">的发展与逃逸分析技术的逐渐成熟，栈上分配、标量替换优化技术将会导致一些微妙</span></p>  <p><span style="font-family:宋体;">的变化发生，所有的对象都分配在堆上也渐渐变得不是那么&#8220;绝对&#8221;了。</span></p>  <p>&nbsp;</p>  <p>Java <span style="font-family:宋体;">堆是垃圾收集器管理的主要区域，因此很多时候也被称做&#8220;</span>GC <span style="font-family:宋体;">堆&#8221;（</span>Garbage</p>  <p>Collected Heap<span style="font-family:宋体;">，幸好国内没翻译成&#8220;垃圾堆&#8221;）。如果从内存回收的角度看，由于现在</span></p>  <p><span style="font-family:宋体;">收集器基本都是采用的分代收集算法，所以</span>Java <span style="font-family:宋体;">堆中还可以细分为：新生代和老年代；</span></p>  <p><span style="font-family:宋体;">再细致一点的有</span>Eden <span style="font-family:宋体;">空间、</span>From Survivor <span style="font-family:宋体;">空间、</span>To Survivor <span style="font-family:宋体;">空间等。</span></p>  <p><span style="font-family:宋体;">如果从内存分配的角度看，线程共享的</span>Java <span style="font-family:宋体;">堆中可能划分出多个线程私有的分配缓冲区（</span>Thread LocalAllocation Buffer<span style="font-family:宋体;">，</span>TLAB<span style="font-family:宋体;">）。不过，无论如何划分，都与存放内容无关，无论哪个区域，存储的都仍然是对象实例，进一步划分的目的是为了更好地回收内存，或者更快地分配内存。</span></p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;">根据</span>Java <span style="font-family:宋体;">虚拟机规范的规定，</span>Java <span style="font-family:宋体;">堆可以处于物理上不连续的内存空间中，只要</span></p>  <p><span style="font-family:宋体;">逻辑上是连续的即可，就像我们的磁盘空间一样。在实现时，既可以实现成固定大小</span></p>  <p><span style="font-family:宋体;">的，也可以是可扩展的，不过当前主流的虚拟机都是按照可扩展来实现的（通过</span>-Xmx</p>  <p><span style="font-family:宋体;">和</span>-Xms <span style="font-family:宋体;">控制）。如果在堆中没有内存完成实例分配，并且堆也无法再扩展时，将会抛出</span></p>  <p>OutOfMemoryError <span style="font-family:宋体;">异常。</span></p>  <p>&nbsp;</p>  <h3><span><span>1.2.5<span style="font:7.0pt &quot;Times New Roman&quot;">&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family:宋体;">方法区</span></h3>  <p><span style="font-family:宋体;">方法区（</span>Method Area<span style="font-family:宋体;">）与</span>Java <span style="font-family:宋体;">堆一样，是各个线程共享的内存区域，它用于存</span></p>  <p><span style="font-family:宋体;">储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。虽</span></p>  <p><span style="font-family:宋体;">然</span>Java <span style="font-family:宋体;">虚拟机规范把方法区描述为堆的一个逻辑部分，但是它却有一个别名叫做</span>Non-</p>  <p>Heap<span style="font-family:宋体;">（非堆），目的应该是与</span>Java <span style="font-family:宋体;">堆区分开来。</span></p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;">对于习惯在</span>HotSpot <span style="font-family:宋体;">虚拟机上开发和部署程序的开发者来说，很多人愿意把方法区</span></p>  <p><span style="font-family:宋体;">称为&#8220;永久代&#8221;（</span>Permanent Generation<span style="font-family:宋体;">），本质上两者并不等价，仅仅是因为</span>HotSpot <span style="font-family:宋体;">虚</span></p>  <p><span style="font-family:宋体;">拟机的设计团队选择把</span>GC <span style="font-family:宋体;">分代收集扩展至方法区，或者说使用永久代来实现方法区而</span></p>  <p><span style="font-family:宋体;">已。对于其他虚拟机（如</span>BEA JRockit<span style="font-family:宋体;">、</span>IBM J9 <span style="font-family:宋体;">等）来说是不存在永久代的概念的。即</span></p>  <p><span style="font-family:宋体;">使是</span>HotSpot <span style="font-family:宋体;">虚拟机本身，根据官方发布的路线图信息，现在也有放弃永久代并&#8220;搬家&#8221;</span></p>  <p><span style="font-family:宋体;">至</span>Native Memory <span style="font-family:宋体;">来实现方法区的规划了。</span></p>  <p>&nbsp;</p>  <p>Java <span style="font-family:宋体;">虚拟机规范对这个区域的限制非常宽松，除了和</span><span>Java </span><span style="font-family:宋体;">堆一样不需要连续的内</span></p>  <p><span style="font-family:宋体;">存和可以选择固定大小或者可扩展外，还可以选择不实现垃圾收集。相对而言，垃圾</span></p>  <p><span style="font-family:宋体;">收集行为在这个区域是比较少出现的，但并非数据进入了方法区就如永久代的名字一</span></p>  <p><span style="font-family:宋体;">样&#8220;永久&#8221;存在了。这个区域的内存回收目标主要是针对常量池的回收和对类型的卸</span></p>  <p><span style="font-family:宋体;">载，一般来说这个区域的回收&#8220;成绩&#8221;比较难以令人满意，尤其是类型的卸载，条件</span></p>  <p><span style="font-family:宋体;">相当苛刻，但是这部分区域的回收确实是有必要的。在</span>Sun <span style="font-family:宋体;">公司的</span>BUG <span style="font-family:宋体;">列表中，曾出</span></p>  <p><span style="font-family:宋体;">现过的若干个严重的</span>BUG <span style="font-family:宋体;">就是由于低版本的</span>HotSpot <span style="font-family:宋体;">虚拟机对此区域未完全回收而导</span></p>  <p><span style="font-family:宋体;">致内存泄漏。</span></p>  <p><span style="font-family:宋体;">根据</span>Java <span style="font-family:宋体;">虚拟机规范的规定，</span> <span style="font-family:宋体;">当方法区无法满足内存分配需求时，</span> <span style="font-family:宋体;">将抛出</span></p>  <p>OutOfMemoryError <span style="font-family:宋体;">异常。</span></p>  <p>&nbsp;</p>  <h3><span><span>1.2.6<span style="font:7.0pt &quot;Times New Roman&quot;">&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family:宋体;">运行时常量池</span></h3>  <p>&nbsp;</p>  <p><span style="font-family:宋体;">运行时常量池（</span>Runtime Constant Pool<span style="font-family:宋体;">）是方法区的一部分。</span>Class <span style="font-family:宋体;">文件中除了有</span></p>  <p><span style="font-family:宋体;">类的版本、字段、方法、接口等描述等信息外，还有一项信息是常量池（</span>Constant Pool</p>  <p>Table<span style="font-family:宋体;">），用于存放编译期生成的各种字面量和符号引用，这部分内容将在类加载后存放</span></p>  <p><span style="font-family:宋体;">到方法区的运行时常量池中。</span></p>  <p>&nbsp;</p>  <p>Java <span style="font-family:宋体;">虚拟机对</span>Class <span style="font-family:宋体;">文件的每一部分（自然也包括常量池）的格式都有严格的规</span></p>  <p><span style="font-family:宋体;">定，每一个字节用于存储哪种数据都必须符合规范上的要求，这样才会被虚拟机认可、</span></p>  <p><span style="font-family:宋体;">装载和执行。但对于运行时常量池，</span>Java <span style="font-family:宋体;">虚拟机规范没有做任何细节的要求，不同的</span></p>  <p><span style="font-family:宋体;">提供商实现的虚拟机可以按照自己的需要来实现这个内存区域。不过，一般来说，除</span></p>  <p><span style="font-family:宋体;">了保存</span>Class <span style="font-family:宋体;">文件中描述的符号引用外，还会把翻译出来的直接引用也存储在运行时常</span></p>  <p><span style="font-family:宋体;">量池中。</span></p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;">运行时常量池相对于</span>Class <span style="font-family:宋体;">文件常量池的另外一个重要特征是具备动态性，</span>Java <span style="font-family:宋体;">语</span></p>  <p><span style="font-family:宋体;">言并不要求常量一定只能在编译期产生，也就是并非预置入</span>Class <span style="font-family:宋体;">文件中常量池的内容</span></p>  <p><span style="font-family:宋体;">才能进入方法区运行时常量池，运行期间也可能将新的常量放入池中，这种特性被开发</span></p>  <p><span style="font-family:宋体;">人员利用得比较多的便是</span>String <span style="font-family:宋体;">类的</span>intern() <span style="font-family:宋体;">方法。</span></p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;">既然运行时常量池是方法区的一部分，自然会受到方法区内存的限制，当常量池无</span></p>  <p><span style="font-family:宋体;">法再申请到内存时会抛出</span>OutOfMemoryError <span style="font-family:宋体;">异常</span></p>  <h3><span><span>1.2.7<span style="font:7.0pt &quot;Times New Roman&quot;">&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family:宋体;">直接内存</span></h3>  <p><span style="font-family:宋体;">直接内存（</span>Direct Memory<span style="font-family:宋体;">）并不是虚拟机运行时数据区的一部分，也不是</span>Java</p>  <p><span style="font-family:宋体;">虚拟机规范中定义的内存区域，但是这部分内存也被频繁地使用，而且也可能导致</span></p>  <p>OutOfMemoryError <span style="font-family:宋体;">异常出现，所以我们放到这里一起讲解。</span></p>  <p><span style="font-family:宋体;">在</span>JDK 1.4 <span style="font-family:宋体;">中新加入了</span>NIO<span style="font-family:宋体;">（</span>New Input/Output<span style="font-family:宋体;">）类，引入了一种基于通道（</span>Channel<span style="font-family:宋体;">）</span></p>  <p><span style="font-family:宋体;">与缓冲区（</span>Buffer<span style="font-family:宋体;">）的</span>I/O <span style="font-family:宋体;">方式，它可以使用</span>Native <span style="font-family:宋体;">函数库直接分配堆外内存，然</span></p>  <p><span style="font-family:宋体;">后通过一个存储在</span>Java <span style="font-family:宋体;">堆里面的</span>DirectByteBuffer <span style="font-family:宋体;">对象作为这块内存的引用进行</span></p>  <p><span style="font-family:宋体;">操作。这样能在一些场景中显著提高性能，因为避免了在</span>Java <span style="font-family:宋体;">堆和</span>Native <span style="font-family:宋体;">堆中来</span></p>  <p><span style="font-family:宋体;">回复制数据。</span></p>  <p><span style="font-family:宋体;">显然，本机直接内存的分配不会受到</span>Java <span style="font-family:宋体;">堆大小的限制，但是，既然是内存，则</span></p>  <p><span style="font-family:宋体;">肯定还是会受到本机总内存（包括</span>RAM <span style="font-family:宋体;">及</span>SWAP <span style="font-family:宋体;">区或者分页文件）的大小及处理器</span></p>  <p><span style="font-family:宋体;">寻址空间的限制。服务器管理员配置虚拟机参数时，一般会根据实际内存设置</span>-Xmx</p>  <p><span style="font-family:宋体;">等参数信息，但经常会忽略掉直接内存，使得各个内存区域的总和大于物理内存限制</span></p>  <p><span style="font-family:宋体;">（包括物理上的和操作系统级的限制），从而导致动态扩展时出现</span>OutOfMemoryError</p>  <p><span style="font-family:宋体;">异常。</span></p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;">好了，到现在为止，我们已经弄明白了</span>JVM<span style="font-family:宋体;">的内存结构，下一章将对堆内存进行深入的学习。</span></p></div><img src ="http://www.blogjava.net/nkjava/aggbug/371831.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nkjava/" target="_blank">草原上的骆驼</a> 2012-03-14 09:40 <a href="http://www.blogjava.net/nkjava/archive/2012/03/14/371831.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>即将推出JVM内存分析系列文章-请大家关注</title><link>http://www.blogjava.net/nkjava/archive/2012/03/14/371827.html</link><dc:creator>草原上的骆驼</dc:creator><author>草原上的骆驼</author><pubDate>Wed, 14 Mar 2012 00:40:00 GMT</pubDate><guid>http://www.blogjava.net/nkjava/archive/2012/03/14/371827.html</guid><wfw:comment>http://www.blogjava.net/nkjava/comments/371827.html</wfw:comment><comments>http://www.blogjava.net/nkjava/archive/2012/03/14/371827.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/nkjava/comments/commentRss/371827.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nkjava/services/trackbacks/371827.html</trackback:ping><description><![CDATA[主要包括：<br />1、JVM内存结构<br />2、JVM栈<br />3、JVM堆<br />4、JVM的GC及配置<br />5、JVM内存调优<br />6、JVM内存异常<br />7、JVM内存总结<img src ="http://www.blogjava.net/nkjava/aggbug/371827.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nkjava/" target="_blank">草原上的骆驼</a> 2012-03-14 08:40 <a href="http://www.blogjava.net/nkjava/archive/2012/03/14/371827.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>System.getProperty()记录</title><link>http://www.blogjava.net/nkjava/archive/2010/10/09/334063.html</link><dc:creator>草原上的骆驼</dc:creator><author>草原上的骆驼</author><pubDate>Sat, 09 Oct 2010 03:01:00 GMT</pubDate><guid>http://www.blogjava.net/nkjava/archive/2010/10/09/334063.html</guid><wfw:comment>http://www.blogjava.net/nkjava/comments/334063.html</wfw:comment><comments>http://www.blogjava.net/nkjava/archive/2010/10/09/334063.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/nkjava/comments/commentRss/334063.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nkjava/services/trackbacks/334063.html</trackback:ping><description><![CDATA[<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><span style="color: #000000;">java.version&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Java&nbsp;Runtime&nbsp;Environment&nbsp;version<br />
java.vendor&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Java&nbsp;Runtime&nbsp;Environment&nbsp;vendor<br />
java.vendor.url&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Java&nbsp;vendor&nbsp;URL<br />
java.home&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Java&nbsp;installation&nbsp;directory<br />
java.vm.specification.version&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Java&nbsp;Virtual&nbsp;Machine&nbsp;specification&nbsp;version<br />
java.vm.specification.vendor&nbsp;&nbsp;&nbsp; &nbsp; Java&nbsp;Virtual&nbsp;Machine&nbsp;specification&nbsp;vendor<br />
java.vm.specification.name&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; Java&nbsp;Virtual&nbsp;Machine&nbsp;specification&nbsp;name<br />
java.vm.version&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; Java&nbsp;Virtual&nbsp;Machine&nbsp;implementation&nbsp;version<br />
java.vm.vendor&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Java&nbsp;Virtual&nbsp;Machine&nbsp;implementation&nbsp;vendor<br />
java.vm.name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Java&nbsp;Virtual&nbsp;Machine&nbsp;implementation&nbsp;name<br />
java.specification.version&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; Java&nbsp;Runtime&nbsp;Environment&nbsp;specification&nbsp;version<br />
java.specification.vendor&nbsp;&nbsp;&nbsp; &nbsp; &nbsp;&nbsp; Java&nbsp;Runtime&nbsp;Environment&nbsp;specification&nbsp;vendor<br />
java.specification.name&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; Java&nbsp;Runtime&nbsp;Environment&nbsp;specification&nbsp;name<br />
java.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">.version&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Java&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;format&nbsp;version&nbsp;number<br />
java.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">.path&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Java&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;path<br />
java.library.path&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; List&nbsp;of&nbsp;paths&nbsp;to&nbsp;search&nbsp;when&nbsp;loading&nbsp;libraries<br />
java.io.tmpdir&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Default&nbsp;temp&nbsp;file&nbsp;path<br />
java.compiler&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Name&nbsp;of&nbsp;JIT&nbsp;compiler&nbsp;to&nbsp;use<br />
java.ext.dirs&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; Path&nbsp;of&nbsp;extension&nbsp;directory&nbsp;or&nbsp;directories<br />
os.name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Operating&nbsp;system&nbsp;name<br />
os.arch&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; Operating&nbsp;system&nbsp;architecture<br />
os.version&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Operating&nbsp;system&nbsp;version<br />
file.separator&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; File&nbsp;separator&nbsp;(</span><span style="color: #000000;">"</span><span style="color: #000000;">/</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;on&nbsp;UNIX)<br />
path.separator&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Path&nbsp;separator&nbsp;(</span><span style="color: #000000;">"</span><span style="color: #000000;">:</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;on&nbsp;UNIX)<br />
line.separator&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Line&nbsp;separator&nbsp;(</span><span style="color: #000000;">"</span><span style="color: #000000;">\n</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;on&nbsp;UNIX)<br />
user.name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; User</span><span style="color: #000000;">'</span><span style="color: #000000;">s&nbsp;account&nbsp;name</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">user.home&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; User</span><span style="color: #000000;">'</span><span style="color: #000000;">s&nbsp;home&nbsp;directory</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">user.dir&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; User</span><span style="color: #000000;">'</span><span style="color: #000000;">s&nbsp;current&nbsp;working&nbsp;directory</span></div>
<img src ="http://www.blogjava.net/nkjava/aggbug/334063.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nkjava/" target="_blank">草原上的骆驼</a> 2010-10-09 11:01 <a href="http://www.blogjava.net/nkjava/archive/2010/10/09/334063.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>开源搜索引擎的相关知识收集</title><link>http://www.blogjava.net/nkjava/archive/2010/09/30/333462.html</link><dc:creator>草原上的骆驼</dc:creator><author>草原上的骆驼</author><pubDate>Thu, 30 Sep 2010 02:23:00 GMT</pubDate><guid>http://www.blogjava.net/nkjava/archive/2010/09/30/333462.html</guid><wfw:comment>http://www.blogjava.net/nkjava/comments/333462.html</wfw:comment><comments>http://www.blogjava.net/nkjava/archive/2010/09/30/333462.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/nkjava/comments/commentRss/333462.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nkjava/services/trackbacks/333462.html</trackback:ping><description><![CDATA[最近对人民搜索的讨论比较多，对搜索引擎开源程序关注了一下。<br />
<br />
http://www.dbanotes.net/web/nutch.html Nutch初体验<br />
http://larbin.sourceforge.net/index-eng.html Multi-purpose web crawler<br />
<br />
NUTCH<br />
http://today.java.net/pub/a/today/2006/01/10/introduction-to-nutch-1.html<br />
http://today.java.net/pub/a/today/2006/02/16/introduction-to-nutch-2.html<br />
<br />
http://apache.etoak.com//nutch/<br />
<br />
<br />
Luck<br />
http://www.getopt.org/luke/<br />
<br />
对Nuch的评价较好，先做个标记，以后研究研究。<br />
<br />
<img src ="http://www.blogjava.net/nkjava/aggbug/333462.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nkjava/" target="_blank">草原上的骆驼</a> 2010-09-30 10:23 <a href="http://www.blogjava.net/nkjava/archive/2010/09/30/333462.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java程序运行时间</title><link>http://www.blogjava.net/nkjava/archive/2010/08/17/329143.html</link><dc:creator>草原上的骆驼</dc:creator><author>草原上的骆驼</author><pubDate>Tue, 17 Aug 2010 12:17:00 GMT</pubDate><guid>http://www.blogjava.net/nkjava/archive/2010/08/17/329143.html</guid><wfw:comment>http://www.blogjava.net/nkjava/comments/329143.html</wfw:comment><comments>http://www.blogjava.net/nkjava/archive/2010/08/17/329143.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/nkjava/comments/commentRss/329143.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nkjava/services/trackbacks/329143.html</trackback:ping><description><![CDATA[<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008000;">//</span><span style="color: #008000;">伪代码</span><span style="color: #008000;"><br />
</span><span style="color: #0000ff;">long</span><span style="color: #000000;">&nbsp;startTime</span><span style="color: #000000;">=</span><span style="color: #000000;">System.currentTimeMillis();&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">获取开始时间</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">doSomeThing();&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">测试的代码段</span><span style="color: #008000;"><br />
</span><span style="color: #0000ff;">long</span><span style="color: #000000;">&nbsp;endTime</span><span style="color: #000000;">=</span><span style="color: #000000;">System.currentTimeMillis();&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">获取结束时间</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">System.out.println(</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;">(end</span><span style="color: #000000;">-</span><span style="color: #000000;">start)</span><span style="color: #000000;">+</span><span style="color: #000000;">"</span><span style="color: #000000;">ms</span><span style="color: #000000;">"</span><span style="color: #000000;">);&nbsp; <br />
<br />
<br />
<br />
<br />
</span>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008000;">//</span><span style="color: #008000;">伪代码</span><span style="color: #008000;"><br />
</span><span style="color: #0000ff;">long</span><span style="color: #000000;">&nbsp;startTime</span><span style="color: #000000;">=</span><span style="color: #000000;">System.nanoTime();&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">获取开始时间</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">doSomeThing();&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">测试的代码段</span><span style="color: #008000;"><br />
</span><span style="color: #0000ff;">long</span><span style="color: #000000;">&nbsp;endTime</span><span style="color: #000000;">=</span><span style="color: #000000;">System.nanoTime();&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">获取结束时间</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">System.out.println(</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;">(end</span><span style="color: #000000;">-</span><span style="color: #000000;">start)</span><span style="color: #000000;">+</span><span style="color: #000000;">"</span><span style="color: #000000;">ns</span><span style="color: #000000;">"</span><span style="color: #000000;">); <br />
</span></div>
<br />
</div>
<img src ="http://www.blogjava.net/nkjava/aggbug/329143.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nkjava/" target="_blank">草原上的骆驼</a> 2010-08-17 20:17 <a href="http://www.blogjava.net/nkjava/archive/2010/08/17/329143.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA类，JSP，Servlet获取工程路径</title><link>http://www.blogjava.net/nkjava/archive/2010/08/17/329142.html</link><dc:creator>草原上的骆驼</dc:creator><author>草原上的骆驼</author><pubDate>Tue, 17 Aug 2010 12:16:00 GMT</pubDate><guid>http://www.blogjava.net/nkjava/archive/2010/08/17/329142.html</guid><wfw:comment>http://www.blogjava.net/nkjava/comments/329142.html</wfw:comment><comments>http://www.blogjava.net/nkjava/archive/2010/08/17/329142.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/nkjava/comments/commentRss/329142.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nkjava/services/trackbacks/329142.html</trackback:ping><description><![CDATA[<p>在jsp和class文件中调用的相对路径不同。 在jsp里，根目录是WebRoot 在class文件中，根目录是WebRoot/WEB-INF/classes 当然你也可以用System.getProperty("user.dir")获取你工程的绝对路径。</p>
<p>另:在Jsp,Servlet,Java中详细获得路径的方法!</p>
<p>1.jsp中取得路径：</p>
<p>以工程名为TEST为例：</p>
<p>(1)得到包含工程名的当前页面全路径：request.getRequestURI() <br />
结果：/TEST/test.jsp <br />
(2)得到工程名：request.getContextPath() <br />
结果：/TEST <br />
(3)得到当前页面所在目录下全名称：request.getServletPath() <br />
结果：如果页面在jsp目录下 /TEST/jsp/test.jsp <br />
(4)得到页面所在服务器的全路径：application.getRealPath("页面.jsp") <br />
结果：D:"resin"webapps"TEST"test.jsp <br />
(5)得到页面所在服务器的绝对路径：absPath=new java.io.File(application.getRealPath(request.getRequestURI())).getParent(); <br />
结果：D:"resin"webapps"TEST</p>
<p>2.在类中取得路径：</p>
<p>(1)类的绝对路径：Class.class.getClass().getResource("/").getPath() <br />
结果：/D:/TEST/WebRoot/WEB-INF/classes/pack/ <br />
(2)得到工程的路径：System.getProperty("user.dir") <br />
结果：D:"TEST</p>
<p>3.在Servlet中取得路径：</p>
(1)得到工程目录：request.getSession().getServletContext().getRealPath("") 参数可具体到包名。 <br />
结果：E:"Tomcat"webapps"TEST <br />
(2)得到IE地址栏地址：request.getRequestURL() <br />
结果：http://localhost:8080/TEST/test <br />
(3)得到相对地址：request.getRequestURI() <br />
结果：/TEST/test
<img src ="http://www.blogjava.net/nkjava/aggbug/329142.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nkjava/" target="_blank">草原上的骆驼</a> 2010-08-17 20:16 <a href="http://www.blogjava.net/nkjava/archive/2010/08/17/329142.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSTL 的 if else : 有 c:if 没有 else 的处理</title><link>http://www.blogjava.net/nkjava/archive/2010/08/03/327867.html</link><dc:creator>草原上的骆驼</dc:creator><author>草原上的骆驼</author><pubDate>Tue, 03 Aug 2010 13:06:00 GMT</pubDate><guid>http://www.blogjava.net/nkjava/archive/2010/08/03/327867.html</guid><wfw:comment>http://www.blogjava.net/nkjava/comments/327867.html</wfw:comment><comments>http://www.blogjava.net/nkjava/archive/2010/08/03/327867.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/nkjava/comments/commentRss/327867.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nkjava/services/trackbacks/327867.html</trackback:ping><description><![CDATA[<script type="text/javascript">
document.body.oncopy = function () {
if (window.clipboardData) {
setTimeout(function () {
var text = clipboardData.getData("text");
if (text && text.length > 300) {
text = text + ""r"n"n本文来自CSDN博客，转载请标明出处：" + location.href;
clipboardData.setData("text", text);
}
}, 100);
}
}
</script>
<script type="text/javascript">						function StorePage() { d = document; t = d.selection ? (d.selection.type != 'None' ? d.selection.createRange().text : '') : (d.getSelection ? d.getSelection() : ''); void (keyit = window.open('http://www.365key.com/storeit.aspx?t=' + escape(d.title) + '&u=' + escape(d.location.href) + '&c=' + escape(t), 'keyit', 'scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes')); keyit.focus(); }</script>
<p>jstl的c:if 没有else</p>
<p><br />
想要实现if...else...:</p>
<p>可以用下面的解决</p>
<p>--------------------------------------------------------------------</p>
<p>结构：</p>
<p><br />
&lt;c:choose&gt;<br />
<br />
&nbsp; &nbsp;&lt;c:when test=""&gt;&nbsp; &nbsp; 如果<br />
&nbsp;
&nbsp;&lt;/c:when&gt;<br />
&nbsp; &nbsp;<br />
&nbsp; &nbsp;&lt;c:otherwise&gt;&nbsp;&nbsp;否则<br />
&nbsp;
&nbsp;&lt;/c:otherwise&gt;<br />
&nbsp;&nbsp;<br />
&lt;/c:choose&gt;</p>
<p>代码：</p>
<p>&lt;c:choose&gt;</p>
<p>&nbsp;&nbsp;&nbsp; &lt;c:when test="${sessionScope.USERTYPE == 'inner'}"&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;c:set value="${context_root}/igmgr/MEB004.dow" var="action"
scope="page"/&gt;</p>
<p>&nbsp;&nbsp;&nbsp; &lt;/c:when&gt;</p>
<p>&nbsp;&nbsp;&nbsp; &lt;c:when test="${sessionScope.USERTYPE == 'merc'}"&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;c:set value="${context_root}/igmgr/MEB021.dow" var="action"
scope="page"/&gt;</p>
<p>&nbsp;&nbsp;&nbsp; &lt;/c:when&gt;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp; &lt;c:otherwise&gt;&nbsp;&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;c:set value="${context_root}/igmgr/MEB020.dow" var="action"
scope="page"/&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&lt;/c:otherwise&gt;</p>
<p>&nbsp; &lt;/c:choose&gt;</p>
<p>-------------------------------------------------------------------------</p>
<p>附：详解+代码</p>
<p>在同一个 &lt;c:choose&gt; 中，当所有 &lt;c:when&gt; 的条件都没有成立时，则执行
&lt;c:otherwise&gt; 的本体内容。</p>
<p>　　语法</p>
<p>　　&lt;c:otherwise&gt;</p>
<p>　　本体内容</p>
<p>　　&lt;/c:otherwise&gt;</p>
<p>　　属性</p>
<p>　　无</p>
<p>　　限制</p>
<p>　　&#183;&lt;c:otherwise&gt; 必须在 &lt;c:choose&gt; 和 &lt;/c:choose&gt;之间</p>
<p>　　&#183;在同一个 &lt;c:choose&gt; 中时，&lt;c:otherwise&gt; 必须为最后一个标签</p>
<p>　　说明</p>
<p>　　在同一个 &lt;c:choose&gt; 中，假若所有 &lt;c:when&gt; 的test属性都不为true时，则执行
&lt;c:otherwise&gt; 的本体内容。</p>
<p>　　范例</p>
<p>　　笔者举一个典型的 &lt;c:choose&gt;、&lt;c:when&gt;和&lt;c:otherwise&gt;范例：</p>
<p>　　&lt;c:choose&gt;</p>
<p>　　&lt;c:when test="${condition1}"&gt;</p>
<p>　　condition1为true</p>
<p>　　&lt;/c:when&gt;</p>
<p>　　&lt;c:when test="${ condition2}"&gt;</p>
<p>　　condition2为true</p>
<p>　　&lt;/c:when&gt;</p>
<p>　　&lt;c:otherwise&gt;</p>
<p>　　condition1和condition2都为false</p>
<p>　　&lt;/c:otherwise&gt;</p>
<p>　　&lt;/c:choose&gt;</p>
<p>　　范例说明：当condition1为true时，会显示&#8220;condition1为true&#8221;；当condition1为false且
condition2为true时，会显示&#8220;condition2为true&#8221;，如果两者都为false，则会显示&#8220;condition1和
condition2都为false&#8221;。</p>
<p>　　注意</p>
<p>　　假若condition1和condition2两者都为true时，此时只会显示"condition1为true"，这是因为在同一
个&lt;c:choose&gt;下，当有好几个&lt;c:when&gt;都符合条件时，只能有一个&lt;c:when&gt;成立。</p>
<img src ="http://www.blogjava.net/nkjava/aggbug/327867.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nkjava/" target="_blank">草原上的骆驼</a> 2010-08-03 21:06 <a href="http://www.blogjava.net/nkjava/archive/2010/08/03/327867.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ruby  on rails 尝试遇到的问题</title><link>http://www.blogjava.net/nkjava/archive/2009/12/10/305478.html</link><dc:creator>草原上的骆驼</dc:creator><author>草原上的骆驼</author><pubDate>Thu, 10 Dec 2009 12:33:00 GMT</pubDate><guid>http://www.blogjava.net/nkjava/archive/2009/12/10/305478.html</guid><wfw:comment>http://www.blogjava.net/nkjava/comments/305478.html</wfw:comment><comments>http://www.blogjava.net/nkjava/archive/2009/12/10/305478.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/nkjava/comments/commentRss/305478.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nkjava/services/trackbacks/305478.html</trackback:ping><description><![CDATA[<br />
<br />
新版Mysql密码算法不同导致&#8220;Client does not support authentication protocol requested by server&#8221;错误 <br />
MySql4.1.7密码算法不同，你可以做如下选择： <br />
<br />
2)将MySql的密码改用原来的那套算法(本文介绍)&nbsp;&nbsp;<br />
<br />
<br />
<br />
安装很顺利，登录到mysql <br />
<br />
G:\Mysql\bin&gt;mysql -uroot <br />
<br />
mysql&gt;...... <br />
<br />
然后删除一些不用的帐号，只留下了一个root帐号。 <br />
<br />
更新root密码： <br />
<br />
mysql&gt;update user set password=password('password') where host='localhost' and user='root'; <br />
<br />
成功！ <br />
<br />
退出并重新启动Mysql服务。 <br />
<br />
<br />
<br />
修改Mysql用户名、密码 <br />
<br />
<br />
结果很意外竟然弹出错误信息： <br />
<br />
Client does not support authentication protocol requested by server; <br />
<br />
<br />
<br />
后来，我用Google搜索错误信息中的部分内容，搜索到了Mysql的官方网站，一看，明白了，原来是password算法的问题，因为5.0.1版Mysql的password算法和3.23.44的算法不一样了 <br />
<br />
（原文地址：<a href="http://dev.mysql.com/doc/mysql/en/Old_client.html%EF%BC%89" target="_blank">http://dev.mysql.com/doc/mysql/en/Old_client.html）</a> <br />
<br />
采取官方网站的解决办法，一次搞定，嘿嘿 <br />
<br />
mysql&gt;SET PASSWORD FOR <br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&gt;'root'@'localhost' = OLD_PASSWORD('newpassword'); <br />
<br />
写此文章，仅希望有同样问题的朋友能尽快解决此问题。 <br />
<br />
<br />
<h1 class="xspace-title">解决rails2.x  no such file to load -- mysql的问题</h1>
启动后会提示：no such file to load -- mysql<span style="display: none;">51Testing软件测试网"v|?$Av'Zy'VR</span><br />
google了半天才找到了解决方案，如下：<span style="display: none;">nXOh iV3`0</span>
<p><span style="display: none;">5Nsm} vU]0</span>访问<a href="http://www.tmtm.org/en/ruby/mysql/" target="_blank" rel="nofollow">http://www.tmtm.org/en/ruby/mysql/</a> 下载<a href="http://www.tmtm.org/en/ruby/mysql/ruby-mysql-0.2.6.tar.gz">ruby-mysql-0.2.x.tar.gz</a>加压后，使用 ruby ./install.rb 命令安装mysql.rb .</p>
<span style="display: none;">n,@-OrT7Z9ZG0</span>
<p><span style="display: none;">;{pP6v)P+\0</span>感谢Weng Edagr提供的解决方案。 <br />
</p>
然后按照书上的例子，建数据库，生成AddressBook应用程序，运行Rails<br />
ruby script/server -d<br />
没运行起来，显示如下：<br />
<br />
c:/ruby/lib/ruby/1.8/yaml.rb:133:in `load': syntax error on line 18, col 2: `&nbsp; h<br />
ost: localhost' (ArgumentError)<br />
<br />
Baidu了一下，发现是数据库配置文件config/database.yml有问题<br />
<br />
development:<br />
&nbsp; adapter: mysql<br />
&nbsp; database: AddressBook<br />
&nbsp; username: root<br />
&nbsp; password: micronsky.net<br />
&nbsp; host: localhost<br />
<br />
:后面有一个空格<br />
修改过来，再次运行，还是没起来，显示：<br />
<br />
c:/ruby/lib/ruby/1.8/webrick/server.rb:29:in `fork': the fork() function is unim<br />
plemented on this machine (NotImplementedError)<br />
<br />
又搜了半天，没找到原因，心想不会是-d参数的问题吧，于是去掉，运行，OK！<br />
<br />
<br />
<img src ="http://www.blogjava.net/nkjava/aggbug/305478.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nkjava/" target="_blank">草原上的骆驼</a> 2009-12-10 20:33 <a href="http://www.blogjava.net/nkjava/archive/2009/12/10/305478.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java:重写equals()和hashCode()</title><link>http://www.blogjava.net/nkjava/archive/2009/10/31/300523.html</link><dc:creator>草原上的骆驼</dc:creator><author>草原上的骆驼</author><pubDate>Sat, 31 Oct 2009 14:27:00 GMT</pubDate><guid>http://www.blogjava.net/nkjava/archive/2009/10/31/300523.html</guid><wfw:comment>http://www.blogjava.net/nkjava/comments/300523.html</wfw:comment><comments>http://www.blogjava.net/nkjava/archive/2009/10/31/300523.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/nkjava/comments/commentRss/300523.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nkjava/services/trackbacks/300523.html</trackback:ping><description><![CDATA[<div style="text-indent: 21pt;">
<span style="font-family: 宋体;">以下内容总结自《</span><span xml:lang="EN-US" lang="EN-US">Effective Java</span><span style="font-family: 宋体;">》</span></div>
<div>
<strong><span style="font-size: 14pt;" xml:lang="EN-US" lang="EN-US">1.</span></strong><strong><span style="font-size: 14pt; font-family: 宋体;">何时需要重写</span></strong><strong><span style="font-size: 14pt;" xml:lang="EN-US" lang="EN-US">equals()</span></strong>
</div>
<div style="text-indent: 21pt;">
<span style="font-family: 宋体;">当一个类有自己特有的&#8220;逻辑相等&#8221;概念（不同于对象身份的概念）。</span>
</div>
<div>
<strong><span style="font-size: 14pt;" xml:lang="EN-US" lang="EN-US">2.</span></strong><strong><span style="font-size: 14pt; font-family: 宋体;">设计</span></strong><strong><span style="font-size: 14pt;" xml:lang="EN-US" lang="EN-US">equals()</span></strong>
</div>
<div>
<span xml:lang="EN-US" lang="EN-US">[1]</span><span style="font-family: 宋体;">使用</span><span xml:lang="EN-US" lang="EN-US">instanceof</span><span style="font-family: 宋体;">操作符检查&#8220;实参是否为正确的类型&#8221;。</span>
</div>
<div>
<span xml:lang="EN-US" lang="EN-US">[2]</span><span style="font-family: 宋体;">对于类中的每一个&#8220;关键域&#8221;，检查实参中的域与当前对象中对应的域值。</span>
</div>
<div style="text-indent: 21pt;">
<span xml:lang="EN-US" lang="EN-US">[2.1]</span><span style="font-family: 宋体;">对于非</span><span xml:lang="EN-US" lang="EN-US">float</span><span style="font-family: 宋体;">和</span><span xml:lang="EN-US" lang="EN-US">double</span><span style="font-family: 宋体;">类型的原语类型域，使用</span><span xml:lang="EN-US" lang="EN-US">==</span><span style="font-family: 宋体;">比较；</span>
</div>
<div style="text-indent: 21pt;">
<span xml:lang="EN-US" lang="EN-US">[2.2]</span><span style="font-family: 宋体;">对于对象引用域，递归调用</span><span xml:lang="EN-US" lang="EN-US">equals</span><span style="font-family: 宋体;">方法；</span>
</div>
<div style="text-indent: 21pt;">
<span xml:lang="EN-US" lang="EN-US">[2.3]</span><span style="font-family: 宋体;">对于</span><span xml:lang="EN-US" lang="EN-US">float</span><span style="font-family: 宋体;">域，使用</span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: black;" xml:lang="EN-US" lang="EN-US">Float.<em>floatToIntBits</em>(</span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: #0000c0;" xml:lang="EN-US" lang="EN-US">afloat</span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: black;" xml:lang="EN-US" lang="EN-US">)</span><span style="font-family: 宋体;">转换为</span><span xml:lang="EN-US" lang="EN-US">int</span><span style="font-family: 宋体;">，再使用</span><span xml:lang="EN-US" lang="EN-US">==</span><span style="font-family: 宋体;">比较；</span>
</div>
<div style="text-indent: 21pt;">
<span xml:lang="EN-US" lang="EN-US">[2.4]</span><span style="font-family: 宋体;">对于</span><span xml:lang="EN-US" lang="EN-US">double</span><span style="font-family: 宋体;">域，使用</span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: black;" xml:lang="EN-US" lang="EN-US">Double.<em>doubleToLongBits</em>(</span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: #0000c0;" xml:lang="EN-US" lang="EN-US">adouble</span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: black;" xml:lang="EN-US" lang="EN-US">)</span> <span style="font-family: 宋体;">转换为</span><span xml:lang="EN-US" lang="EN-US">int</span><span style="font-family: 宋体;">，再使用</span><span xml:lang="EN-US" lang="EN-US">==</span><span style="font-family: 宋体;">比较；</span>
</div>
<div style="text-indent: 21pt;">
<span xml:lang="EN-US" lang="EN-US">[2.5]</span><span style="font-family: 宋体;">对于数组域，调用</span><span xml:lang="EN-US" lang="EN-US">Arrays.equals</span><span style="font-family: 宋体;">方法。</span>
</div>
<div>
<strong><span style="font-size: 14pt;" xml:lang="EN-US" lang="EN-US">3.</span></strong><strong><span style="font-size: 14pt; font-family: 宋体;">当改写</span></strong><strong><span style="font-size: 14pt;" xml:lang="EN-US" lang="EN-US">equals()</span></strong><strong><span style="font-size: 14pt; font-family: 宋体;">的时候，总是要改写</span></strong><strong><span style="font-size: 14pt;" xml:lang="EN-US" lang="EN-US">hashCode()</span></strong>
</div>
<div style="text-indent: 21pt;">
<span style="font-family: 宋体;">根据一个类的</span><span xml:lang="EN-US" lang="EN-US">equals</span><span style="font-family: 宋体;">方法（改写后），两个截然不同的实例有可能在逻辑上是相等的，但是，根据</span><span xml:lang="EN-US" lang="EN-US">Object.hashCode</span><span style="font-family: 宋体;">方法，它们仅仅是两个对象。因此，违反了&#8220;相等的对象必须具有相等的散列码&#8221;。</span>
</div>
<div>
<strong><span style="font-size: 14pt;" xml:lang="EN-US" lang="EN-US">4.</span></strong><strong><span style="font-size: 14pt; font-family: 宋体;">设计</span></strong><strong><span style="font-size: 14pt;" xml:lang="EN-US" lang="EN-US">hashCode()</span></strong>
</div>
<div>
<span xml:lang="EN-US" lang="EN-US">[1]</span><span style="font-family: 宋体;">把某个非零常数值，例如</span><span xml:lang="EN-US" lang="EN-US">17</span><span style="font-family: 宋体;">，保存在</span><span xml:lang="EN-US" lang="EN-US">int</span><span style="font-family: 宋体;">变量</span><span xml:lang="EN-US" lang="EN-US">result</span><span style="font-family: 宋体;">中；</span>
</div>
<div>
<span xml:lang="EN-US" lang="EN-US">[2]</span><span style="font-family: 宋体;">对于对象中每一个关键域</span><span xml:lang="EN-US" lang="EN-US">f</span><span style="font-family: 宋体;">（指</span><span xml:lang="EN-US" lang="EN-US">equals</span><span style="font-family: 宋体;">方法中考虑的每一个域）：</span>
</div>
<div style="text-indent: 21pt;">
<span xml:lang="EN-US" lang="EN-US">[2.1]boolean</span><span style="font-family: 宋体;">型，计算</span><span xml:lang="EN-US" lang="EN-US">(f ? 0 : 1);</span>
</div>
<div style="text-indent: 21pt;">
<span xml:lang="EN-US" lang="EN-US">[2.2]byte,char,short</span><span style="font-family: 宋体;">型，计算</span><span xml:lang="EN-US" lang="EN-US">(int);</span>
</div>
<div style="text-indent: 21pt;">
<span xml:lang="EN-US" lang="EN-US">[2.3]long</span><span style="font-family: 宋体;">型，计算</span><span xml:lang="EN-US" lang="EN-US">(int) (f ^ (f&gt;&gt;&gt;32));</span>
</div>
<div style="text-indent: 21pt;">
<span xml:lang="EN-US" lang="EN-US">[2.4]float</span><span style="font-family: 宋体;">型，计算</span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: black;" xml:lang="EN-US" lang="EN-US">Float.<em>floatToIntBits</em>(</span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: #0000c0;" xml:lang="EN-US" lang="EN-US">afloat</span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: black;" xml:lang="EN-US" lang="EN-US">)</span><span xml:lang="EN-US" lang="EN-US">;</span>
</div>
<div style="text-indent: 21pt;">
<span xml:lang="EN-US" lang="EN-US">[2.5]double</span><span style="font-family: 宋体;">型，计算</span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: black;" xml:lang="EN-US" lang="EN-US">Double.<em>doubleToLongBits</em>(</span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: #0000c0;" xml:lang="EN-US" lang="EN-US">adouble</span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: black;" xml:lang="EN-US" lang="EN-US">)</span><span style="font-family: 宋体;">得到一个</span><span xml:lang="EN-US" lang="EN-US">long</span><span style="font-family: 宋体;">，再执行</span><span xml:lang="EN-US" lang="EN-US">[2.3];</span>
</div>
<div style="text-indent: 21pt;">
<span xml:lang="EN-US" lang="EN-US">[2.6]</span><span style="font-family: 宋体;">对象引用，递归调用它的</span><span xml:lang="EN-US" lang="EN-US">hashCode</span><span style="font-family: 宋体;">方法</span><span xml:lang="EN-US" lang="EN-US">;</span>
</div>
<div style="text-indent: 21pt;">
<span xml:lang="EN-US" lang="EN-US">[2.7]</span><span style="font-family: 宋体;">数组域，对其中每个元素调用它的</span><span xml:lang="EN-US" lang="EN-US">hashCode</span><span style="font-family: 宋体;">方法。</span>
</div>
<div>
<span xml:lang="EN-US" lang="EN-US">[3]</span><span style="font-family: 宋体;">将上面计算得到的散列码保存到</span><span xml:lang="EN-US" lang="EN-US">int</span><span style="font-family: 宋体;">变量</span><span xml:lang="EN-US" lang="EN-US">c</span><span style="font-family: 宋体;">，然后执行</span> <span xml:lang="EN-US" lang="EN-US">result=37*result+c;</span>
</div>
<div>
<span xml:lang="EN-US" lang="EN-US">[4]</span><span style="font-family: 宋体;">返回</span><span xml:lang="EN-US" lang="EN-US">result</span><span style="font-family: 宋体;">。</span>
</div>
<div>
<strong><span style="font-size: 14pt;" xml:lang="EN-US" lang="EN-US">5.</span></strong><strong><span style="font-size: 14pt; font-family: 宋体;">示例</span></strong>
</div>
<div style="text-indent: 21pt;">
<span style="font-family: 宋体;">下面的这个类遵循上面的设计原则，重写了类的</span><span xml:lang="EN-US" lang="EN-US">equals()</span><span style="font-family: 宋体;">和</span><span xml:lang="EN-US" lang="EN-US">hashCode()</span><span style="font-family: 宋体;">。<br />
</span>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">package</span><span style="color: #000000;">&nbsp;com.zj.unit;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.util.Arrays;<br />
&nbsp;<br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Unit&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">short</span><span style="color: #000000;">&nbsp;ashort;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;achar;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">byte</span><span style="color: #000000;">&nbsp;abyte;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">boolean</span><span style="color: #000000;">&nbsp;abool;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">long</span><span style="color: #000000;">&nbsp;along;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">float</span><span style="color: #000000;">&nbsp;afloat;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">double</span><span style="color: #000000;">&nbsp;adouble;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;Unit&nbsp;aObject;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">[]&nbsp;ints;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;Unit[]&nbsp;units;<br />
&nbsp;<br />
&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;equals(Object&nbsp;o)&nbsp;{<br />
&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;">(o&nbsp;</span><span style="color: #0000ff;">instanceof</span><span style="color: #000000;">&nbsp;Unit))<br />
&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 />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Unit&nbsp;unit&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(Unit)&nbsp;o;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;unit.ashort&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;ashort<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;unit.achar&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;achar<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;unit.abyte&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;abyte<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;unit.abool&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;abool<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;unit.along&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;along<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;Float.floatToIntBits(unit.afloat)&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;Float<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.floatToIntBits(afloat)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;Double.doubleToLongBits(unit.adouble)&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;Double<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.doubleToLongBits(adouble)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;unit.aObject.equals(aObject)<br />
</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;equalsInts(unit.ints)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;equalsUnits(unit.units);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">boolean</span><span style="color: #000000;">&nbsp;equalsInts(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">[]&nbsp;aints)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;Arrays.equals(ints,&nbsp;aints);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">boolean</span><span style="color: #000000;">&nbsp;equalsUnits(Unit[]&nbsp;aUnits)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;Arrays.equals(units,&nbsp;aUnits);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;hashCode()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;result&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">17</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">37</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;result&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">)&nbsp;ashort;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">37</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;result&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">)&nbsp;achar;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">37</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;result&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">)&nbsp;abyte;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">37</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;result&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;(abool&nbsp;</span><span style="color: #000000;">?</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;:&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">37</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;result&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">)&nbsp;(along&nbsp;</span><span style="color: #000000;">^</span><span style="color: #000000;">&nbsp;(along&nbsp;</span><span style="color: #000000;">&gt;&gt;&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">32</span><span style="color: #000000;">));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">37</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;result&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;Float.floatToIntBits(afloat);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">long</span><span style="color: #000000;">&nbsp;tolong&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Double.doubleToLongBits(adouble);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">37</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;result&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">)&nbsp;(tolong&nbsp;</span><span style="color: #000000;">^</span><span style="color: #000000;">&nbsp;(tolong&nbsp;</span><span style="color: #000000;">&gt;&gt;&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">32</span><span style="color: #000000;">));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">37</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;result&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;aObject.hashCode();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">37</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;result&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;intsHashCode(ints);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">37</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;result&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;unitsHashCode(units);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;result;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;intsHashCode(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">[]&nbsp;aints)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;result&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">17</span><span style="color: #000000;">;<br />
&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;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;aints.length;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">37</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;result&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;aints[i];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;result;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;unitsHashCode(Unit[]&nbsp;aUnits)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;result&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">17</span><span style="color: #000000;">;<br />
&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;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;aUnits.length;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">37</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;result&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;aUnits[i].hashCode();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;result;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
} <br />
</span></div>
<br />
</div>
<img src ="http://www.blogjava.net/nkjava/aggbug/300523.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nkjava/" target="_blank">草原上的骆驼</a> 2009-10-31 22:27 <a href="http://www.blogjava.net/nkjava/archive/2009/10/31/300523.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>解析Java对象的equals()和hashCode()的使用</title><link>http://www.blogjava.net/nkjava/archive/2009/10/31/300524.html</link><dc:creator>草原上的骆驼</dc:creator><author>草原上的骆驼</author><pubDate>Sat, 31 Oct 2009 14:27:00 GMT</pubDate><guid>http://www.blogjava.net/nkjava/archive/2009/10/31/300524.html</guid><wfw:comment>http://www.blogjava.net/nkjava/comments/300524.html</wfw:comment><comments>http://www.blogjava.net/nkjava/archive/2009/10/31/300524.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/nkjava/comments/commentRss/300524.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nkjava/services/trackbacks/300524.html</trackback:ping><description><![CDATA[原创 解析Java对象的equals()和hashCode()的使用 收藏<br />
<br />
解析Java对象的equals()和hashCode()的使用<br />
前言<br />
<br />
在Java语言中，equals()和hashCode()两个函数的使用是紧密配合的，你要是自己设计其中一个，就要设计另外一个。在多数情况下，这两
个函数是不用考虑的，直接使用它们的默认设计就可以了。但是在一些情况下，这两个函数最好是自己设计，才能确保整个程序的正常运行。最常见的是当一个对象
被加入收集对象（collection
object）时，这两个函数必须自己设计。更细化的定义是：如果你想将一个对象A放入另一个收集对象B里，或者使用这个对象A为查找一个元对象在收集对
象B里位置的钥匙，并支持是否容纳，删除收集对象B里的元对象这样的操作，那么，equals()和hashCode()函数必须开发者自己定义。其他情
况下，这两个函数是不需要定义的。<br />
equals():<br />
<br />
它是用于进行两个对象的比较的，是对象内容的比较，当然也能用于进行对象参阅值的比较。什么是对象参阅值的比较？就是两个参阅变量的值得比较，我们都知道
参阅变量的值其实就是一个数字，这个数字可以看成是鉴别不同对象的代号。两个对象参阅值的比较，就是两个数字的比较，两个代号的比较。这种比较是默认的对
象比较方式，在Object这个对象中，这种方式就已经设计好了。所以你也不用自己来重写，浪费不必要的时间。<br />
对象内容的比较才是设计equals()的真正目的，Java语言对equals()的要求如下，这些要求是必须遵循的。否则，你就不该浪费时间：<br />
<br />
* 对称性：如果x.equals(y)返回是&#8220;true&#8221;，那么y.equals(x)也应该返回是&#8220;true&#8221;。<br />
* 反射性：x.equals(x)必须返回是&#8220;true&#8221;。<br />
* 类推性：如果x.equals(y)返回是&#8220;true&#8221;，而且y.equals(z)返回是&#8220;true&#8221;，那么z.equals(x)也应该返回是&#8220;true&#8221;。<br />
* 还有一致性：如果x.equals(y)返回是&#8220;true&#8221;，只要x和y内容一直不变，不管你重复x.equals(y)多少次，返回都是&#8220;true&#8221;。<br />
* 任何情况下，x.equals(null)，永远返回是&#8220;false&#8221;；x.equals(和x不同类型的对象)永远返回是&#8220;false&#8221;。<br />
<br />
hashCode():<br />
这个函数返回的就是一个用来进行赫希操作的整型代号，请不要把这个代号和前面所说的参阅变量所代表的代号弄混了。后者不仅仅是个代号还具有在内存中才查找
对象的位置的功能。hashCode()所返回的值是用来分类对象在一些特定的收集对象中的位置。这些对象是HashMap, Hashtable,
HashSet，等等。这个函数和上面的equals()函数必须自己设计，用来协助HashMap, Hashtable,
HashSet，等等对自己所收集的大量对象进行搜寻和定位。<br />
<br />
这些收集对象究竟如何工作的，想象每个元对象hashCode是一个箱子的编码，按照编码，每个元对象就是根据hashCode()提供的代号归入相应的
箱子里。所有的箱子加起来就是一个HashSet，HashMap，或
Hashtable对象，我们需要寻找一个元对象时，先看它的代码，就是hashCode()返回的整型值，这样我们找到它所在的箱子，然后在箱子里，每
个元对象都拿出来一个个和我们要找的对象进行对比，如果两个对象的内容相等，我们的搜寻也就结束。这种操作需要两个重要的信息，一是对象的
hashCode()，还有一个是对象内容对比的结果。<br />
<br />
hashCode()的返回值和equals()的关系如下：<br />
<br />
* 如果x.equals(y)返回&#8220;true&#8221;，那么x和y的hashCode()必须相等。<br />
* 如果x.equals(y)返回&#8220;false&#8221;，那么x和y的hashCode()有可能相等，也有可能不等。<br />
<br />
<br />
为什么这两个规则是这样的，原因其实很简单，拿HashSet来说吧，HashSet可以拥有一个或更多的箱子，在同一个箱子中可以有一个或更多的独特元
对象（HashSet所容纳的必须是独特的元对象）。这个例子说明一个元对象可以和其他不同的元对象拥有相同的hashCode。但是一个元对象只能和拥
有同样内容的元对象相等。所以这两个规则必须成立。<br />
<br />
设计这两个函数所要注意到的：<br />
如果你设计的对象类型并不使用于收集性对象，那么没有必要自己再设计这两个函数的处理方式。这是正确的面向对象设计方法，任何用户一时用不到的功能，就先不要设计，以免给日后功能扩展带来麻烦。<br />
<br />
如果你在设计时想别出心裁，不遵守以上的两套规则，那么劝你还是不要做这样想入非非的事。我还没有遇到过哪一个开发者和我说设计这两个函数要违背前面说的两个规则，我碰到这些违反规则的情况时，都是作为设计错误处理。<br />
<br />
当一个对象类型作为收集型对象的元对象时，这个对象应该拥有自己处理equals()，和/或处理hashCode()的设计，而且要遵守前面所说的两种
原则。equals()先要查null和是否是同一类型。查同一类型是为了避免出现ClassCastException这样的异常给丢出来。查
null是为了避免出现NullPointerException这样的异常给丢出来。<br />
如果你的对象里面容纳的数据过多，那么这两个函数
equals()和hashCode()将会变得效率低。如果对象中拥有无法serialized的数据，equals()有可能在操作中出现错误。想象
一个对象x，它的一个整型数据是transient型（不能被serialize成二进制数据流）。然而equals()和hashCode()都有依靠
这个整型数据，那么，这个对象在serialization之前和之后，是否一样？答案是不一样。因为serialization之前的整型数据是有效的
数据，在serialization之后，这个整型数据的值并没有存储下来，再重新由二进制数据流转换成对象后，两者（对象在serialization
之前和之后）的状态已经不同了。这也是要注意的。<br />
<br />
知道以上这些能够帮助你：<br />
1. 进行更好的设计和开发。<br />
2. 进行更好的测试案例开发。<br />
3. 在面试过程中让面试者对你的学识渊博感到满意。
<img src ="http://www.blogjava.net/nkjava/aggbug/300524.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nkjava/" target="_blank">草原上的骆驼</a> 2009-10-31 22:27 <a href="http://www.blogjava.net/nkjava/archive/2009/10/31/300524.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>经典的农夫养牛问题</title><link>http://www.blogjava.net/nkjava/archive/2009/10/31/300521.html</link><dc:creator>草原上的骆驼</dc:creator><author>草原上的骆驼</author><pubDate>Sat, 31 Oct 2009 14:25:00 GMT</pubDate><guid>http://www.blogjava.net/nkjava/archive/2009/10/31/300521.html</guid><wfw:comment>http://www.blogjava.net/nkjava/comments/300521.html</wfw:comment><comments>http://www.blogjava.net/nkjava/archive/2009/10/31/300521.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/nkjava/comments/commentRss/300521.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nkjava/services/trackbacks/300521.html</trackback:ping><description><![CDATA[一个农夫养了一头牛，三年后，这头牛每年会生出1头牛，生出来的牛三年后，又可以每年生出一头牛&#8230;&#8230;问农夫10年后有多少头牛?n年呢？（用JAVA实现）<br />
很有名的一道题，11楼放出最经典的两种解题思路，大家先试试
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">.<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">package</span><span style="color: #000000;">&nbsp;cn.edu.nankai;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.util.HashSet;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.util.Set;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Cow<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;age;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Cow()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;age&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Cow&nbsp;bearCow()</span><span style="color: #008000;">//</span><span style="color: #008000;">生小牛</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&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;">new</span><span style="color: #000000;">&nbsp;Cow();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;grow()</span><span style="color: #008000;">//</span><span style="color: #008000;">每年牛龄加1</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;age&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;age&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;getAge()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;age;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Main&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;Set&nbsp;cowSet&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;HashSet&nbsp;();</span><span style="color: #008000;">//</span><span style="color: #008000;">牛圈，存放所有的牛</span><span style="color: #008000;"><br />
</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;">int</span><span style="color: #000000;">&nbsp;check()</span><span style="color: #008000;">//</span><span style="color: #008000;">每年检测一遍所有的牛，年龄要加一，并且够岁数了要生效牛</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Set&nbsp;newCowSet&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;HashSet&nbsp;();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">(Cow&nbsp;cow&nbsp;:&nbsp;cowSet)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cow.grow();</span><span style="color: #008000;">//</span><span style="color: #008000;">年龄加一</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(cow.getAge()&nbsp;</span><span style="color: #000000;">&gt;=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;newCowSet.add(cow.bearCow());</span><span style="color: #008000;">//</span><span style="color: #008000;">够岁数的生小牛</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cowSet.addAll(newCowSet);</span><span style="color: #008000;">//</span><span style="color: #008000;">把所有生出来的小牛放牛圈里</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;cowSet.size();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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[])<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Cow&nbsp;cow&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Cow();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cowSet.add(cow);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">(</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;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">10</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(i</span><span style="color: #000000;">+</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;:&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;check());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;回复评论<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;删除<br />
<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Smith的头像&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Smith&nbsp;</span><span style="color: #000000;">2009</span><span style="color: #000000;">/</span><span style="color: #000000;">10</span><span style="color: #000000;">/</span><span style="color: #000000;">31</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">21</span><span style="color: #000000;">:</span><span style="color: #000000;">12</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Cow&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;">int</span><span style="color: #000000;">&nbsp;coun&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Cow().cowY(</span><span style="color: #000000;">10</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(coun);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">System.out.println(Cow.getNum(10));</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;">int</span><span style="color: #000000;">&nbsp;getNum(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">)&nbsp;{<br />
&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: #000000;">1</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;getNum(i&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;getNum(i&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;cowY(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;year)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;age&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;(age&nbsp;</span><span style="color: #000000;">&lt;=</span><span style="color: #000000;">&nbsp;year)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;age</span><span style="color: #000000;">++</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(age&nbsp;</span><span style="color: #000000;">&lt;=</span><span style="color: #000000;">&nbsp;year&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;age&nbsp;</span><span style="color: #000000;">&gt;=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;coun</span><span style="color: #000000;">++</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cowY(year&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;age);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></div><img src ="http://www.blogjava.net/nkjava/aggbug/300521.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nkjava/" target="_blank">草原上的骆驼</a> 2009-10-31 22:25 <a href="http://www.blogjava.net/nkjava/archive/2009/10/31/300521.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java String 与 StringBuffer 用法区别</title><link>http://www.blogjava.net/nkjava/archive/2009/10/31/300522.html</link><dc:creator>草原上的骆驼</dc:creator><author>草原上的骆驼</author><pubDate>Sat, 31 Oct 2009 14:25:00 GMT</pubDate><guid>http://www.blogjava.net/nkjava/archive/2009/10/31/300522.html</guid><wfw:comment>http://www.blogjava.net/nkjava/comments/300522.html</wfw:comment><comments>http://www.blogjava.net/nkjava/archive/2009/10/31/300522.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/nkjava/comments/commentRss/300522.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nkjava/services/trackbacks/300522.html</trackback:ping><description><![CDATA[<h3 title="转载"><u><a href="http://msplinks.com.cn/MDFodHRwOi8vbGl1amlucGFuNzUuamF2YWV5ZS5jb20vYmxvZy80NzU0ODA="><span>String</span>类用来表示那些创建后就不会再改变的字符串，它是immutable的。而StringBuffer类用来表示内容可变的字符串，并提供了修改底层字符串的方法。<br />
<br />
－－当我们进行字符拼接时，请使用StringBuffer类而非<span>String</span>类，因为前者将比后者快上百倍。<br />
<br />
的确，在程序的太多场合我们都会进行字符串拼接工作，简单的代码示例如下：<br />
<br />
<span>String</span> str="You are nice.";<br />
str+="I love you so much.";<br />
<br />
如果用StringBuffer类的话，代码如下：<br />
<br />
StringBuffer str= new StringBuffer("You ar</a></u></h3>
<img src ="http://www.blogjava.net/nkjava/aggbug/300522.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nkjava/" target="_blank">草原上的骆驼</a> 2009-10-31 22:25 <a href="http://www.blogjava.net/nkjava/archive/2009/10/31/300522.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Arrays.sort用法</title><link>http://www.blogjava.net/nkjava/archive/2009/10/31/300519.html</link><dc:creator>草原上的骆驼</dc:creator><author>草原上的骆驼</author><pubDate>Sat, 31 Oct 2009 14:21:00 GMT</pubDate><guid>http://www.blogjava.net/nkjava/archive/2009/10/31/300519.html</guid><wfw:comment>http://www.blogjava.net/nkjava/comments/300519.html</wfw:comment><comments>http://www.blogjava.net/nkjava/archive/2009/10/31/300519.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/nkjava/comments/commentRss/300519.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nkjava/services/trackbacks/300519.html</trackback:ping><description><![CDATA[<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;"><br />
<br />
</span><span style="color: #0000ff;">package</span><span style="color: #000000;">&nbsp;test;<br />
<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.util.Arrays;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.util.Comparator;<br />
<br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;ArraySortDemo&nbsp;{<br />
</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
*&nbsp;整数型数组排序<br />
</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;sortIntArray()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">[]&nbsp;arrayToSort&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">[]&nbsp;{&nbsp;</span><span style="color: #000000;">48</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">5</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">89</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">80</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">81</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">23</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">45</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">16</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">&nbsp;};<br />
&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 />
&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;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;arrayToSort.length;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">){<br />
&nbsp;&nbsp;&nbsp;&nbsp;System.out.print(arrayToSort[i]</span><span style="color: #000000;">+</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;调用数组的静态排序方法sort</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;Arrays.sort(arrayToSort);<br />
&nbsp;&nbsp;&nbsp;System.out.println();<br />
&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 />
&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;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;arrayToSort.length;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">){<br />
&nbsp;&nbsp;&nbsp;&nbsp;System.out.print(arrayToSort[i]</span><span style="color: #000000;">+</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;}<br />
}<br />
<br />
</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
*&nbsp;字符型数组排序demo<br />
</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;sortStringArray()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;String[]&nbsp;arrayToSort&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;String[]&nbsp;{&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Oscar</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Charlie</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Ryan</span><span style="color: #000000;">"</span><span style="color: #000000;">,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Adam</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">David</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">"</span><span style="color: #000000;">aff</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">"</span><span style="color: #000000;">Aff</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;};<br />
&nbsp;&nbsp;&nbsp;System.out.println();<br />
&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 />
&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;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;arrayToSort.length;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">){<br />
&nbsp;&nbsp;&nbsp;&nbsp;System.out.print(arrayToSort[i]</span><span style="color: #000000;">+</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;System.out.println();<br />
&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 />
&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;调用数组的静态排序方法sort</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;Arrays.sort(arrayToSort);<br />
<br />
&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;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;arrayToSort.length;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">){<br />
&nbsp;&nbsp;&nbsp;&nbsp;System.out.print(arrayToSort[i]</span><span style="color: #000000;">+</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;}<br />
}<br />
<br />
</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
*&nbsp;对象数组排序demo<br />
</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;sortObjectArray()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;Dog&nbsp;o1&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Dog(</span><span style="color: #000000;">"</span><span style="color: #000000;">dog1</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;Dog&nbsp;o2&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Dog(</span><span style="color: #000000;">"</span><span style="color: #000000;">dog2</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">4</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;Dog&nbsp;o3&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Dog(</span><span style="color: #000000;">"</span><span style="color: #000000;">dog3</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">5</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;Dog&nbsp;o4&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Dog(</span><span style="color: #000000;">"</span><span style="color: #000000;">dog4</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;Dog&nbsp;o5&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Dog(</span><span style="color: #000000;">"</span><span style="color: #000000;">dog5</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;Dog[]&nbsp;dogs&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Dog[]&nbsp;{&nbsp;o1,&nbsp;o2,&nbsp;o3,&nbsp;o4,&nbsp;o5&nbsp;};<br />
&nbsp;&nbsp;&nbsp;System.out.println();<br />
&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 />
&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;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;dogs.length;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;Dog&nbsp;dog&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;dogs[i];<br />
&nbsp;&nbsp;&nbsp;&nbsp;System.out.print(dog.getName()</span><span style="color: #000000;">+</span><span style="color: #000000;">"</span><span style="color: #000000;">[</span><span style="color: #000000;">"</span><span style="color: #000000;">+</span><span style="color: #000000;">dog.getWeight()</span><span style="color: #000000;">+</span><span style="color: #000000;">"</span><span style="color: #000000;">],</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;Arrays.sort(dogs,&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ByWeightComparator());<br />
&nbsp;&nbsp;&nbsp;System.out.println();<br />
&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 />
&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;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;dogs.length;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;Dog&nbsp;dog&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;dogs[i];<br />
&nbsp;&nbsp;&nbsp;&nbsp;System.out.print(dog.getName()</span><span style="color: #000000;">+</span><span style="color: #000000;">"</span><span style="color: #000000;">[</span><span style="color: #000000;">"</span><span style="color: #000000;">+</span><span style="color: #000000;">dog.getWeight()</span><span style="color: #000000;">+</span><span style="color: #000000;">"</span><span style="color: #000000;">],</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;}<br />
}<br />
<br />
</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;{<br />
&nbsp;&nbsp;&nbsp;ArraySortDemo&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;ArraySortDemo();<br />
&nbsp;&nbsp;&nbsp;t.sortIntArray();<br />
&nbsp;&nbsp;&nbsp;t.sortStringArray();<br />
&nbsp;&nbsp;&nbsp;t.sortObjectArray();<br />
}<br />
}<br />
<br />
</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
*&nbsp;定义了一个Dog类<br />
</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Dog&nbsp;{<br />
</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;String&nbsp;name;<br />
</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;weight;<br />
<br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Dog(String&nbsp;name,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;weight)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.setName(name);<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.weight&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;weight;<br />
}<br />
<br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;getWeight()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;weight;<br />
}<br />
<br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setWeight(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;weight)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.weight&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;weight;<br />
}<br />
<br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setName(String&nbsp;name)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.name&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;name;<br />
}<br />
<br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;String&nbsp;getName()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;name;<br />
}<br />
}<br />
<br />
</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
*&nbsp;因为要对对象进行排序，所以要实现java.util.Comparator接口的compare(T&nbsp;o1,&nbsp;T&nbsp;o2)方法，在该方法中自定义排序算法。<br />
</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;ByWeightComparator&nbsp;</span><span style="color: #0000ff;">implements</span><span style="color: #000000;">&nbsp;Comparator&nbsp;{<br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">final</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;compare(Object&nbsp;pFirst,&nbsp;Object&nbsp;pSecond)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;aFirstWeight&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;((Dog)&nbsp;pFirst).getWeight();<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;aSecondWeight&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;((Dog)&nbsp;pSecond).getWeight();<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;diff&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;aFirstWeight&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;aSecondWeight;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(diff&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(diff&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br />
}<br />
}<br />
<br />
运行结果：<br />
<br />
整数型数组排序,排序前:<br />
</span><span style="color: #000000;">48</span><span style="color: #000000;">,</span><span style="color: #000000;">5</span><span style="color: #000000;">,</span><span style="color: #000000;">89</span><span style="color: #000000;">,</span><span style="color: #000000;">80</span><span style="color: #000000;">,</span><span style="color: #000000;">81</span><span style="color: #000000;">,</span><span style="color: #000000;">23</span><span style="color: #000000;">,</span><span style="color: #000000;">45</span><span style="color: #000000;">,</span><span style="color: #000000;">16</span><span style="color: #000000;">,</span><span style="color: #000000;">2</span><span style="color: #000000;">,<br />
排序后:<br />
</span><span style="color: #000000;">2</span><span style="color: #000000;">,</span><span style="color: #000000;">5</span><span style="color: #000000;">,</span><span style="color: #000000;">16</span><span style="color: #000000;">,</span><span style="color: #000000;">23</span><span style="color: #000000;">,</span><span style="color: #000000;">45</span><span style="color: #000000;">,</span><span style="color: #000000;">48</span><span style="color: #000000;">,</span><span style="color: #000000;">80</span><span style="color: #000000;">,</span><span style="color: #000000;">81</span><span style="color: #000000;">,</span><span style="color: #000000;">89</span><span style="color: #000000;">,<br />
字符型数组排序,排序前:<br />
Oscar,Charlie,Ryan,Adam,David,aff,Aff,<br />
排序后:<br />
Adam,Aff,Charlie,David,Oscar,Ryan,aff,<br />
对象数组排序排序前:<br />
dog1[</span><span style="color: #000000;">1</span><span style="color: #000000;">],dog2[</span><span style="color: #000000;">4</span><span style="color: #000000;">],dog3[</span><span style="color: #000000;">5</span><span style="color: #000000;">],dog4[</span><span style="color: #000000;">2</span><span style="color: #000000;">],dog5[</span><span style="color: #000000;">3</span><span style="color: #000000;">],<br />
排序后：<br />
dog1[</span><span style="color: #000000;">1</span><span style="color: #000000;">],dog4[</span><span style="color: #000000;">2</span><span style="color: #000000;">],dog5[</span><span style="color: #000000;">3</span><span style="color: #000000;">],dog2[</span><span style="color: #000000;">4</span><span style="color: #000000;">],dog3[</span><span style="color: #000000;">5</span><span style="color: #000000;">],<br />
</span></div>
地方<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">List&nbsp;list&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ArrayList()&nbsp;;<br />
list.add(</span><span style="color: #000000;">"</span><span style="color: #000000;">abcd</span><span style="color: #000000;">"</span><span style="color: #000000;">)&nbsp;;<br />
list.add(</span><span style="color: #000000;">"</span><span style="color: #000000;">abdc</span><span style="color: #000000;">"</span><span style="color: #000000;">)&nbsp;;<br />
list.add(</span><span style="color: #000000;">"</span><span style="color: #000000;">aadf</span><span style="color: #000000;">"</span><span style="color: #000000;">)&nbsp;;<br />
list.add(</span><span style="color: #000000;">"</span><span style="color: #000000;">aabf</span><span style="color: #000000;">"</span><span style="color: #000000;">)&nbsp;;<br />
</span><span style="color: #008000;">/*</span><span style="color: #008000;">将list转为数组</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
String[]&nbsp;strs&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;String[list.size()]&nbsp;;<br />
list.toArray(strs)&nbsp;;<br />
</span><span style="color: #008000;">/*</span><span style="color: #008000;">排序，只排2&lt;=索引&lt;4之间的数据</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
Arrays.sort(strs,</span><span style="color: #000000;">2</span><span style="color: #000000;">,</span><span style="color: #000000;">4</span><span style="color: #000000;">)&nbsp;;<br />
</span><span style="color: #0000ff;">for</span><span style="color: #000000;">(String&nbsp;str&nbsp;:&nbsp;strs){<br />
System.out.println(str)&nbsp;;<br />
}</span></div><img src ="http://www.blogjava.net/nkjava/aggbug/300519.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nkjava/" target="_blank">草原上的骆驼</a> 2009-10-31 22:21 <a href="http://www.blogjava.net/nkjava/archive/2009/10/31/300519.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>收藏一份 Log4j的配置文件</title><link>http://www.blogjava.net/nkjava/archive/2009/08/18/291611.html</link><dc:creator>草原上的骆驼</dc:creator><author>草原上的骆驼</author><pubDate>Tue, 18 Aug 2009 02:48:00 GMT</pubDate><guid>http://www.blogjava.net/nkjava/archive/2009/08/18/291611.html</guid><wfw:comment>http://www.blogjava.net/nkjava/comments/291611.html</wfw:comment><comments>http://www.blogjava.net/nkjava/archive/2009/08/18/291611.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/nkjava/comments/commentRss/291611.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nkjava/services/trackbacks/291611.html</trackback:ping><description><![CDATA[Log4J，<a title="点击下载log4j配置文件" target="_blank" href="http://www.blogjava.net/Files/nkjava/log4j.rar">点击下载log4j配置文件</a><br />
<img src ="http://www.blogjava.net/nkjava/aggbug/291611.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nkjava/" target="_blank">草原上的骆驼</a> 2009-08-18 10:48 <a href="http://www.blogjava.net/nkjava/archive/2009/08/18/291611.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ssh开发遇到的错误，不断更新中</title><link>http://www.blogjava.net/nkjava/archive/2009/05/25/277891.html</link><dc:creator>草原上的骆驼</dc:creator><author>草原上的骆驼</author><pubDate>Mon, 25 May 2009 11:51:00 GMT</pubDate><guid>http://www.blogjava.net/nkjava/archive/2009/05/25/277891.html</guid><wfw:comment>http://www.blogjava.net/nkjava/comments/277891.html</wfw:comment><comments>http://www.blogjava.net/nkjava/archive/2009/05/25/277891.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/nkjava/comments/commentRss/277891.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nkjava/services/trackbacks/277891.html</trackback:ping><description><![CDATA[javassist.util.proxy.MethodFilter<br />
<br />
缺少 javassit库，在pom.xml添加 <br />
&nbsp;&lt;dependency&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;groupId&gt;javassist&lt;/groupId&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;artifactId&gt;javassist&lt;/artifactId&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;version&gt;3.8.0.GA&lt;/version&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;type&gt;jar&lt;/type&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;scope&gt;compile&lt;/scope&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/dependency&gt;<br />
<br />
即可解决<br />
<img src ="http://www.blogjava.net/nkjava/aggbug/277891.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nkjava/" target="_blank">草原上的骆驼</a> 2009-05-25 19:51 <a href="http://www.blogjava.net/nkjava/archive/2009/05/25/277891.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>netbeans6.5 开发jsf helloword</title><link>http://www.blogjava.net/nkjava/archive/2009/05/15/270943.html</link><dc:creator>草原上的骆驼</dc:creator><author>草原上的骆驼</author><pubDate>Fri, 15 May 2009 14:17:00 GMT</pubDate><guid>http://www.blogjava.net/nkjava/archive/2009/05/15/270943.html</guid><wfw:comment>http://www.blogjava.net/nkjava/comments/270943.html</wfw:comment><comments>http://www.blogjava.net/nkjava/archive/2009/05/15/270943.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/nkjava/comments/commentRss/270943.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nkjava/services/trackbacks/270943.html</trackback:ping><description><![CDATA[&nbsp;
<p><span style="font-family: 宋体">JSF试图在不同的角度上提供网页设计人员、应用程序设计人员、组件开发人员解决方案，让不同技术的人员可以彼此合作又不互相干扰，它综合了各家厂商现有的技术特点，由</span>Java Community Process<span style="font-family: 宋体">（</span>JCP<span style="font-family: 宋体">）团队研拟出来的一套标准，并在</span>2004<span style="font-family: 宋体">年三月发表了</span>JavaServer Faces 1.0<span style="font-family: 宋体">实作成果。</span></p>
<p>JSF<span style="font-family: 宋体">的特点：</span></p>
<p><span style="font-family: 宋体">事件驱动</span></p>
<p><span style="font-family: 宋体">通用的</span>UI<span style="font-family: 宋体">组件</span></p>
<p><span style="font-family: 宋体">开发工具采用</span> Netbeans6.5.</p>
<p>File- New Project&#8212;Java WEB&#8212;Web Application-<span style="font-family: 宋体">点击</span> Next <span style="font-family: 宋体">进入<br />
</span></p>
<p><img alt="" src="http://www.blogjava.net/images/blogjava_net/nkjava/image001.jpg" border="0" /><br />
Project Name: hellojsf, <span style="font-family: 宋体">点击</span>Next<span style="font-family: 宋体">，进入<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/nkjava/image002.jpg" border="0" /><br />
</span></p>
<p><span style="font-family: 宋体">默认，这里用的是</span>Tomcat6.0<span style="font-family: 宋体">服务器，</span>&nbsp;<span style="font-family: 宋体">点击</span>Next<br />
</p>
<p><span style="font-family: 宋体"><img alt="" src="http://www.blogjava.net/images/blogjava_net/nkjava/image003.jpg" border="0" /><br />
<br />
这里我们勾选</span> JavaServer Faces, <span style="font-family: 宋体">点击</span>&nbsp;Finish<span style="font-family: 宋体">。</span></p>
<p><span style="font-family: 宋体">选中</span> Hellojsf<span style="font-family: 宋体">项目</span>, <span style="font-family: 宋体">运行该项目：<br />
</span></p>
<p><span style="font-family: 宋体"><img alt="" src="http://www.blogjava.net/images/blogjava_net/nkjava/image004.jpg" border="0" /><br />
显示界面如下：<br />
</span></p>
<p><br />
<br />
Web<span style="font-family: 宋体">应用程序的</span>web.xml<span style="font-family: 宋体">，使用</span>JSF<span style="font-family: 宋体">时，所有的请求都透过</span>FacesServlet<span style="font-family: 宋体">来处理，您可以如下定义：如下：</span></p>
<p>&lt;?xml version="1.0" encoding="UTF-8"?&gt;</p>
<p>&lt;web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"&gt;</p>
<p>&nbsp;&nbsp;&nbsp; &lt;context-param&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;com.sun.faces.verifyObjects&lt;/param-name&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;false&lt;/param-value&gt;</p>
<p>&nbsp;&nbsp;&nbsp; &lt;/context-param&gt;</p>
<p>&nbsp;&nbsp;&nbsp; &lt;context-param&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;com.sun.faces.validateXml&lt;/param-name&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;true&lt;/param-value&gt;</p>
<p>&nbsp;&nbsp;&nbsp; &lt;/context-param&gt;</p>
<p>&nbsp;&nbsp;&nbsp; &lt;context-param&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;javax.faces.STATE_SAVING_METHOD&lt;/param-name&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;client&lt;/param-value&gt;</p>
<p>&nbsp;&nbsp;&nbsp; &lt;/context-param&gt;</p>
<p>&nbsp;&nbsp;&nbsp; &lt;servlet&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;Faces Servlet&lt;/servlet-name&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-class&gt;javax.faces.webapp.FacesServlet&lt;/servlet-class&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;load-on-startup&gt;1&lt;/load-on-startup&gt;</p>
<p>&nbsp;&nbsp;&nbsp; &lt;/servlet&gt;</p>
<p>&nbsp;&nbsp;&nbsp; &lt;servlet-mapping&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;Faces Servlet&lt;/servlet-name&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;/faces/*&lt;/url-pattern&gt;</p>
<p>&nbsp;&nbsp;&nbsp; &lt;/servlet-mapping&gt;</p>
<p>&nbsp;&nbsp;&nbsp; &lt;session-config&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;session-timeout&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 30</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/session-timeout&gt;</p>
<p>&nbsp;&nbsp;&nbsp; &lt;/session-config&gt;</p>
<p>&nbsp;&nbsp;&nbsp; &lt;welcome-file-list&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;welcome-file&gt;faces/welcomeJSF.jsp&lt;/welcome-file&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/welcome-file-list&gt;</p>
<p style="text-indent: 21.75pt">&lt;/web-app&gt;</p>
<p style="text-indent: 21.75pt"><span style="font-family: 宋体">好了，先到这里，</span>netbeans<span style="font-family: 宋体">开发</span>jsf<span style="font-family: 宋体">是不是很简单？</span></p><img src ="http://www.blogjava.net/nkjava/aggbug/270943.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nkjava/" target="_blank">草原上的骆驼</a> 2009-05-15 22:17 <a href="http://www.blogjava.net/nkjava/archive/2009/05/15/270943.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Netbeans6.5  快捷键（不断总结中）</title><link>http://www.blogjava.net/nkjava/archive/2009/05/12/270271.html</link><dc:creator>草原上的骆驼</dc:creator><author>草原上的骆驼</author><pubDate>Tue, 12 May 2009 11:36:00 GMT</pubDate><guid>http://www.blogjava.net/nkjava/archive/2009/05/12/270271.html</guid><wfw:comment>http://www.blogjava.net/nkjava/comments/270271.html</wfw:comment><comments>http://www.blogjava.net/nkjava/archive/2009/05/12/270271.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/nkjava/comments/commentRss/270271.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nkjava/services/trackbacks/270271.html</trackback:ping><description><![CDATA[1、自动代码完成，NetBeans:
默认的为Ctrl+"和Ctrl+空格，习惯Alt+/的人也可以自己设置，在默认的快捷键设置里，Alt+/没有预置。可以在Tools-&gt;Options-&gt;Keymap-&gt;Other-&gt;Show
Code Completion Popup修改。 Eclipse快捷键为: Alt+/ <br />
2、Ctrl+O 查找与给定字符串相匹配的类
<br />
3、Shift+Ctrl+U生成该类的测试类 <br />
4、Shift+Ctrl+I 导入所有类所对应的包，换成eclipse是Shift+Ctrl+O
<br />
5、Shift+Ctrl+F 在工程里找与给定字符串所在的文件，可以设置文件的pattern <br />
6、Shift+Ctrl+H
在工程里找与给定字符串所在的文件，并替换该字符串。可以设置文件的pattern <br />
7、Shift+Alt+D 把某一文件单拿出来编辑<br />
<br />
8、Ctrl+E 删除整行<br />
<img src ="http://www.blogjava.net/nkjava/aggbug/270271.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nkjava/" target="_blank">草原上的骆驼</a> 2009-05-12 19:36 <a href="http://www.blogjava.net/nkjava/archive/2009/05/12/270271.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Eclipse+jetty+maven+Struts2+Spring2+Hibernate3+annotation注册系统V1.0 没有实现0配置</title><link>http://www.blogjava.net/nkjava/archive/2009/03/29/262708.html</link><dc:creator>草原上的骆驼</dc:creator><author>草原上的骆驼</author><pubDate>Sun, 29 Mar 2009 04:15:00 GMT</pubDate><guid>http://www.blogjava.net/nkjava/archive/2009/03/29/262708.html</guid><wfw:comment>http://www.blogjava.net/nkjava/comments/262708.html</wfw:comment><comments>http://www.blogjava.net/nkjava/archive/2009/03/29/262708.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/nkjava/comments/commentRss/262708.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nkjava/services/trackbacks/262708.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 主要是整合了开发环境，同时也有一些不足，用deploy.bat可以方便的进行部署。下面是我用的pom.xmlCode highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->&lt;project&nbsp;xmlns="http://mav...&nbsp;&nbsp;<a href='http://www.blogjava.net/nkjava/archive/2009/03/29/262708.html'>阅读全文</a><img src ="http://www.blogjava.net/nkjava/aggbug/262708.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nkjava/" target="_blank">草原上的骆驼</a> 2009-03-29 12:15 <a href="http://www.blogjava.net/nkjava/archive/2009/03/29/262708.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSTL session 很方便的进行session开发</title><link>http://www.blogjava.net/nkjava/archive/2009/03/16/259914.html</link><dc:creator>草原上的骆驼</dc:creator><author>草原上的骆驼</author><pubDate>Sun, 15 Mar 2009 23:18:00 GMT</pubDate><guid>http://www.blogjava.net/nkjava/archive/2009/03/16/259914.html</guid><wfw:comment>http://www.blogjava.net/nkjava/comments/259914.html</wfw:comment><comments>http://www.blogjava.net/nkjava/archive/2009/03/16/259914.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/nkjava/comments/commentRss/259914.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nkjava/services/trackbacks/259914.html</trackback:ping><description><![CDATA[<p>1.验证用户登录<br />
&lt;sql:query var="query" dataSource="${bookdev}"&gt; <br />
&nbsp; select * from user where userName='${param.userName}' and userPwd='${param.userPwd}' <br />
&lt;/sql:query&gt; </p>
<p>&lt;c:if test="${empty query.rows}"&gt;&nbsp; <br />
<span style="color: #0000ff;">&lt;!--验证没有通过,返回登录界面--&gt;</span> <br />
&nbsp; &lt;font color="red"&gt;用户名或密码错误&lt;/font&gt; <br />
&nbsp; &lt;a href="index.jsp"&gt;重新登录&lt;/a&gt; <br />
&lt;/c:if&gt; <br />
&lt;c:if test="${!empty query.rows}"&gt;&nbsp; <br />
<span style="color: #0000ff;">&lt;!--验证通过，保存用户信息到session中--&gt; <br />
</span>&lt;c:forEach var="row" items="${query.rows}"&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;c:set var="userName" value="${row.userName}" scope="session" /&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;c:set var="userLevel" value="${row.userLevel}" scope="session" /&gt;&nbsp; <br />
&nbsp;&lt;/c:forEach&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;c:set var="isLog" value="1" scope="session" /&gt;&nbsp; <br />
<span style="color: #0000ff;">&lt;!--页面发送到主页面--&gt;</span> <br />
&nbsp;&nbsp;&nbsp; &lt;c:redirect url="main.jsp" /&gt; <br />
&lt;/c:if&gt; <br />
<br />
2.session控制<br />
</p>
<p>&lt;c:if test="${empty sessionScope.isLog}"&gt; <br />
&nbsp;你没有登录或登录超时 <br />
&nbsp;&lt;a href="index.jsp"&gt;重新登录&lt;/a&gt; <br />
&lt;/c:if&gt; </p>
<img src ="http://www.blogjava.net/nkjava/aggbug/259914.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nkjava/" target="_blank">草原上的骆驼</a> 2009-03-16 07:18 <a href="http://www.blogjava.net/nkjava/archive/2009/03/16/259914.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java精选25道题 </title><link>http://www.blogjava.net/nkjava/archive/2009/03/06/258126.html</link><dc:creator>草原上的骆驼</dc:creator><author>草原上的骆驼</author><pubDate>Fri, 06 Mar 2009 01:59:00 GMT</pubDate><guid>http://www.blogjava.net/nkjava/archive/2009/03/06/258126.html</guid><wfw:comment>http://www.blogjava.net/nkjava/comments/258126.html</wfw:comment><comments>http://www.blogjava.net/nkjava/archive/2009/03/06/258126.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/nkjava/comments/commentRss/258126.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nkjava/services/trackbacks/258126.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 1.&nbsp;float型float&nbsp;f=3.4是否正确?　　答：不正确，应为float&nbsp;f=3.4f　　2.&nbsp;当一个对象被当作参数传递到一个方法后，此方法可改变这个对象的属性，并可返回变化后的结果，那么这里到底是值传递还是引用传递?　　答：是引用传递。　　3.&nbsp;在java中一个类被声明为final类型，表示了什么意思?　　答：表示该类...&nbsp;&nbsp;<a href='http://www.blogjava.net/nkjava/archive/2009/03/06/258126.html'>阅读全文</a><img src ="http://www.blogjava.net/nkjava/aggbug/258126.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nkjava/" target="_blank">草原上的骆驼</a> 2009-03-06 09:59 <a href="http://www.blogjava.net/nkjava/archive/2009/03/06/258126.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>javax.servlet.jsp.PageContext cannot be resolved to a type的解決之道</title><link>http://www.blogjava.net/nkjava/archive/2009/03/05/258073.html</link><dc:creator>草原上的骆驼</dc:creator><author>草原上的骆驼</author><pubDate>Thu, 05 Mar 2009 13:41:00 GMT</pubDate><guid>http://www.blogjava.net/nkjava/archive/2009/03/05/258073.html</guid><wfw:comment>http://www.blogjava.net/nkjava/comments/258073.html</wfw:comment><comments>http://www.blogjava.net/nkjava/archive/2009/03/05/258073.html#Feedback</comments><slash:comments>12</slash:comments><wfw:commentRss>http://www.blogjava.net/nkjava/comments/commentRss/258073.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nkjava/services/trackbacks/258073.html</trackback:ping><description><![CDATA[<span id="ctl00_MainContentPlaceholder_ctl01_ctl00_lblEntry">
<h4 id="subjcns!4AD532D0CD18A21D!644">javax.servlet.jsp.PageContext cannot be resolved to a type的解決之道</h4>
<div id="msgcns!4AD532D0CD18A21D!644" class="bvMsg">
<p>某個JSP內容如下，在Eclipse會出現JSP Problem如標題所示的javax.servlet.jsp.PageContext cannot be resolved to a type： </p>
<p>&lt;%@ taglib uri="/WEB-INF/tld/jstl/c.tld" prefix="c" %&gt; </p>
<p>&lt;c:set var="ctx" value="${pageContext.request.contextPath}"/&gt; </p>
<p>上
網查詢，解決之道是把&lt;c:set var="ctx"
value="${pageContext.request.contextPath}"/&gt;改為&lt;c:set var="ctx"
value="${pageContext.['request'].contextPath}"/&gt;，就不會出現這個problem，可是奇怪的
是，之後再改回&lt;c:set var="ctx"
value="${pageContext.request.contextPath}"/&gt;也沒再出現這個problem。Eclipse在
JSP的語法檢驗看來有未盡之處。</p>
</div>
</span>
<img src ="http://www.blogjava.net/nkjava/aggbug/258073.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nkjava/" target="_blank">草原上的骆驼</a> 2009-03-05 21:41 <a href="http://www.blogjava.net/nkjava/archive/2009/03/05/258073.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>URLRewrite 实现URL地址伪静态化</title><link>http://www.blogjava.net/nkjava/archive/2009/03/05/257933.html</link><dc:creator>草原上的骆驼</dc:creator><author>草原上的骆驼</author><pubDate>Thu, 05 Mar 2009 01:38:00 GMT</pubDate><guid>http://www.blogjava.net/nkjava/archive/2009/03/05/257933.html</guid><wfw:comment>http://www.blogjava.net/nkjava/comments/257933.html</wfw:comment><comments>http://www.blogjava.net/nkjava/archive/2009/03/05/257933.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/nkjava/comments/commentRss/257933.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nkjava/services/trackbacks/257933.html</trackback:ping><description><![CDATA[<p>1.首先在<a target="_blank" href="http://tuckey.org/urlrewrite/#download">http://tuckey.org/urlrewrite/#download</a>下载urlrewirtefilter</p>
<p>2.解压所下载的文件,把urlrewrite-2.6.0.jar复制到项目的WebRoot/WEB-INF/lib/目录下</p>
<p>3.把urlrewrite.xml复制到项目的WebRoot/WEB-INF/目录下</p>
<p>4.在web.xml文件中加入filter<br />
</p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">filter</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">filter-name</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">UrlRewriteFilter</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">filter-name</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">filter-class</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">filter-class</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">init-param</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">param-name</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">logLevel</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">param-name</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">param-value</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">WARN</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">param-value</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">init-param</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">filter</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">filter-mapping</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">filter-name</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">UrlRewriteFilter</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">filter-name</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">url-pattern</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">/*</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">url-pattern</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">filter-mapping</span><span style="color: #0000ff;">&gt;<br />
<br />
</span></div>
<br />
5.配置urlrewrite.xml<br />
<span style="color: #ff6600;">1.普通url静态化 例如:</span><br />
要把<a href="http://localhost:8080/prjtest/user/list.jsp"><span style="color: #0000ff;">http://localhost/prjtest/user/list.jsp</span></a>转换成<a href="http://localhost:8080/prjtest/user/list.html"><span style="color: #0000ff;">http://localhost/prjtest/user/list.html</span></a>这种是最简单的,当一个servlet跳转到list.jsp页面列出user列表时,在urlrewrite.xml中这样配置:<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">rule</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">from</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">^/user/list.html</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">from</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">to </span><code>type="redirect"</code><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">/user/list.jsp</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">to</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">rule</span><span style="color: #0000ff;">&gt;</span></div>
当请求/user/list.html这个页面时,实际上相当于请求/user/list.jsp页面,在servlet的跳转要这样写:response.sendRedirect("./user/list.html");<br />
<br />
2要把<a href="http://localhost/prjtest/user/view.jsp?cid=1&amp;amp;cname=admin">http://localhost/prjtest/user/view.jsp?cid=1&amp;cname=admin</a>转换成<a href="http://localhost/prjtest/user/view/1_admin.html">http://localhost/prjtest/user/view/1_admin.html</a>在urlrewrite.xml中这样配置:<br />
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">rule</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">from</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">^/user/view/([0-9]+)_([a-z]+).html$</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">from</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">to </span><code>type="redirect"</code><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">/user/view.jsp?cid=$1</span><span style="color: #ff0000;">&amp;cname</span><span style="color: #000000;">=$2</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">to</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">rule</span><span style="color: #0000ff;">&gt;</span></div>
<br />
6特别说明<br />
<font face="Courier New">为什么地址栏不变？<br />
</font><font color="#3366ff">原因就在于浏览器显示的是最后被给定的URL。当一个URL被提交后，在某一个组件返回一个相应给浏览器之
前，你的应用可能转发请求多次。所有这些都发生在服务器端，浏览器并不知道发生了什么事。当一个Http相应被放回时，它并没有包含地址信息，所以浏览器
仅仅显示用来作为初始请求的地址。<br />
<br />
要想让地址栏也变成静态化的URL，很简单，将&lt;to type="redirect"&gt;改成&lt;to type="forward"&gt;即可<br />
<br />
<br />
</font>
<br />
<br />
<img src ="http://www.blogjava.net/nkjava/aggbug/257933.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nkjava/" target="_blank">草原上的骆驼</a> 2009-03-05 09:38 <a href="http://www.blogjava.net/nkjava/archive/2009/03/05/257933.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java 线程学习（3）:sleep()和join()方法</title><link>http://www.blogjava.net/nkjava/archive/2009/02/26/256885.html</link><dc:creator>草原上的骆驼</dc:creator><author>草原上的骆驼</author><pubDate>Thu, 26 Feb 2009 11:44:00 GMT</pubDate><guid>http://www.blogjava.net/nkjava/archive/2009/02/26/256885.html</guid><wfw:comment>http://www.blogjava.net/nkjava/comments/256885.html</wfw:comment><comments>http://www.blogjava.net/nkjava/archive/2009/02/26/256885.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/nkjava/comments/commentRss/256885.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nkjava/services/trackbacks/256885.html</trackback:ping><description><![CDATA[&nbsp; sleep方法会使当前的线程暂停执行一定时间（给其它线程运行机会）。读者可以运行示例1，看看结果就明白了。sleep方法会抛出异常，必须提供捕获代码。<br />
实例一：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">public class ThreadTest implements Runnable{<br />
&nbsp;public void run(){<br />
&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">(int k</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">;k</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">5</span><span style="color: #000000;">;k</span><span style="color: #000000;">++</span><span style="color: #000000;">){<br />
&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(k</span><span style="color: #000000;">==</span><span style="color: #000000;">2</span><span style="color: #000000;">){<br />
&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">{<br />
&nbsp;Thread.currentThread().sleep(</span><span style="color: #000000;">5000</span><span style="color: #000000;">);<br />
&nbsp;}<br />
&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">(Exception e){}<br />
&nbsp;}<br />
&nbsp;System.out.println(Thread.currentThread().getName()<br />
&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">"</span><span style="color: #000000;">:</span><span style="color: #000000;">"</span><span style="color: #000000;">+</span><span style="color: #000000;">k);<br />
&nbsp;}<br />
&nbsp;}<br />
&nbsp;public static void main(String[] args){<br />
&nbsp;Runnable r</span><span style="color: #000000;">=</span><span style="color: #000000;">new ThreadTest();<br />
&nbsp;Threadt 1</span><span style="color: #000000;">=</span><span style="color: #000000;">new Thread(r,</span><span style="color: #000000;">"</span><span style="color: #000000;">t1_name</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;Threadt 2</span><span style="color: #000000;">=</span><span style="color: #000000;">new Thread(r,</span><span style="color: #000000;">"</span><span style="color: #000000;">t2_name</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;t1.setPriority(Thread.MAX_PRIORITY);<br />
&nbsp;t2.setPriority(Thread.MIN_PRIORITY);<br />
&nbsp;t1.start();<br />
&nbsp;t2.start();<br />
&nbsp;}<br />
}</span></div>
t1被设置了最高的优先级，t2被设置了最低的优先级。t1不执行完，t2就没有机会执行。但由于t1在执行的中途休息了5秒中，这使得t2就有机会执行了。<br />
<br />
实例二：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">public class ThreadTest implements Runnable{<br />
&nbsp;public synchronized void run(){<br />
&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">(int k</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">;k</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">5</span><span style="color: #000000;">;k</span><span style="color: #000000;">++</span><span style="color: #000000;">){<br />
&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(k</span><span style="color: #000000;">==</span><span style="color: #000000;">2</span><span style="color: #000000;">){<br />
&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">{<br />
&nbsp;Thread.currentThread().sleep(</span><span style="color: #000000;">5000</span><span style="color: #000000;">);<br />
&nbsp;}<br />
&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">(Exceptione){}<br />
&nbsp;}<br />
&nbsp;System.out.println(Thread.currentThread().getName()<br />
&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">"</span><span style="color: #000000;">:</span><span style="color: #000000;">"</span><span style="color: #000000;">+</span><span style="color: #000000;">k);<br />
&nbsp;}<br />
&nbsp;}<br />
&nbsp;publicstaticvoidmain(String[]args){<br />
&nbsp;Runnable r</span><span style="color: #000000;">=</span><span style="color: #000000;">new ThreadTest();<br />
&nbsp;Threadt 1</span><span style="color: #000000;">=</span><span style="color: #000000;">new Thread(r,</span><span style="color: #000000;">"</span><span style="color: #000000;">t1_name</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;Threadt 2</span><span style="color: #000000;">=</span><span style="color: #000000;">new Thread(r,</span><span style="color: #000000;">"</span><span style="color: #000000;">t2_name</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;t1.start();<br />
&nbsp;t2.start();<br />
&nbsp;}<br />
}</span></div>
请读者首先运行示例程序，从运行结果上看：一个线程在sleep的时候，并不会释放这个对象的锁标志。<br />
<br />
<br />
join（）方法：<br />
join()方法，它能够使调用该方法的线程在此之前执行完毕。<br />
实例a<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;ThreadTest&nbsp;</span><span style="color: #0000ff;">implements</span><span style="color: #000000;">&nbsp;Runnable{<br />
&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;">int</span><span style="color: #000000;">&nbsp;a</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br />
&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;run(){<br />
&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">(intk</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">;k</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">5</span><span style="color: #000000;">;k</span><span style="color: #000000;">++</span><span style="color: #000000;">){<br />
&nbsp;a</span><span style="color: #000000;">=</span><span style="color: #000000;">a</span><span style="color: #000000;">+</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br />
&nbsp;}<br />
&nbsp;}<br />
&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){<br />
&nbsp;Runnable&nbsp;r</span><span style="color: #000000;">=</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ThreadTest();<br />
&nbsp;Thread&nbsp;t</span><span style="color: #000000;">=</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Thread(r);<br />
&nbsp;t.start();<br />
&nbsp;System.out.println(a);<br />
&nbsp;}<br />
}</span></div>
运行结果不一定是5， 如果想让 输出的结果是5， 需要运用join，<br />
把上面的代码改成如下:<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;ThreadTest&nbsp;</span><span style="color: #0000ff;">implements</span><span style="color: #000000;">&nbsp;Runnable{<br />
&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;">int</span><span style="color: #000000;">&nbsp;a</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br />
&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;run(){<br />
&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">(intk</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">;k</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">5</span><span style="color: #000000;">;k</span><span style="color: #000000;">++</span><span style="color: #000000;">){<br />
&nbsp;a</span><span style="color: #000000;">=</span><span style="color: #000000;">a</span><span style="color: #000000;">+</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br />
&nbsp;}<br />
&nbsp;}<br />
&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){<br />
&nbsp;Runnable&nbsp;r</span><span style="color: #000000;">=</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ThreadTest();<br />
&nbsp;Thread&nbsp;t</span><span style="color: #000000;">=</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Thread(r);<br />
&nbsp;t.start();<br />
&nbsp;&nbsp;&nbsp;&nbsp; t.join();<br />
&nbsp;System.out.println(a);<br />
&nbsp;}<br />
}</span></div>
测试一下以上的代码即可，答案为输出5.join()方法会抛出异常，应该提供捕获代码。或留给JDK捕获。<br />
<br />
<img src ="http://www.blogjava.net/nkjava/aggbug/256885.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nkjava/" target="_blank">草原上的骆驼</a> 2009-02-26 19:44 <a href="http://www.blogjava.net/nkjava/archive/2009/02/26/256885.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java线程学习（2）：关键字synchronized</title><link>http://www.blogjava.net/nkjava/archive/2009/02/26/256884.html</link><dc:creator>草原上的骆驼</dc:creator><author>草原上的骆驼</author><pubDate>Thu, 26 Feb 2009 11:43:00 GMT</pubDate><guid>http://www.blogjava.net/nkjava/archive/2009/02/26/256884.html</guid><wfw:comment>http://www.blogjava.net/nkjava/comments/256884.html</wfw:comment><comments>http://www.blogjava.net/nkjava/archive/2009/02/26/256884.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/nkjava/comments/commentRss/256884.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nkjava/services/trackbacks/256884.html</trackback:ping><description><![CDATA[有了synchronized关键字，多线程程序的运行结果将变得可以控制。synchronized关键字用于保护共享数据。请大家注意"共享数据"，
你一定要分清哪些数据是共享数据，JAVA是面向对象的程序设计语言，所以初学者在编写多线程程序时，容易分不清哪些数据是共享数据。请看下面的例子：<br />
<br />
实例一：<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">&nbsp;FirstThread&nbsp;</span><span style="color: rgb(0, 0, 255);">implements</span><span style="color: rgb(0, 0, 0);">&nbsp;Runnable{<br />
</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">synchronized</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);">&nbsp;run(){<br />
</span><span style="color: rgb(0, 0, 255);">for</span><span style="color: rgb(0, 0, 0);">(</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">&nbsp;i</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">;i</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">10</span><span style="color: rgb(0, 0, 0);">;i</span><span style="color: rgb(0, 0, 0);">++</span><span style="color: rgb(0, 0, 0);">){<br />
System.out.println(</span><span style="color: rgb(0, 0, 0);">""</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">i);<br />
}<br />
}<br />
</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;FirstThread(){<br />
}<br />
</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);">&nbsp;main(String[]&nbsp;args){<br />
Runnable&nbsp;r1</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;FirstThread();<br />
Runnable&nbsp;r2</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;FirstThread();<br />
Thread&nbsp;t1</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;Thread(r1);<br />
Thread&nbsp;t2</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;Thread(r2);<br />
t1.start();<br />
t2.start();<br />
<br />
}<br />
<br />
}</span></div>
在这个程序中，run()被加上了synchronized关键字。在main方法中创建了两个线程。你可能会认为此程序的运行结果一定为：0123456789　　0123456789。答案不是这样子的，<strong>这个程序中synchronized关键字保护的不是共享数据（其实在这个程序中synchronized关
键字没有起到任何作用，此程序的运行结果是不可预先确定的）。这个程序中的t1,t2是两个对象（r1,r2）的线程。JAVA是面向对象的程序设计语
言，不同的对象的数据是不同的，r1,r2有各自的run()方法，而synchronized使同一个对象的多个线程，在某个时刻只有其中的一个线程可
以访问这个对象的synchronized数据。</strong>每个对象都有一个"锁标志"，当这个对象的一个线程访问这个对象的某个synchronized数据时，
这个对象的所有被synchronized修饰的数据将被上锁（因为"锁标志"被当前线程拿走了），只有当前线程访问完它要访问的
synchronized数据时，当前线程才会释放"锁标志"，这样同一个对象的其它线程才有机会访问synchronized数据。<br />
实例二：<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> SecondThread&nbsp;</span><span style="color: rgb(0, 0, 255);">implements</span><span style="color: rgb(0, 0, 0);">&nbsp;Runnable{<br />
</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">synchronized</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);">&nbsp;run(){<br />
</span><span style="color: rgb(0, 0, 255);">for</span><span style="color: rgb(0, 0, 0);">(</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">&nbsp;i</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">;i</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">10</span><span style="color: rgb(0, 0, 0);">;i</span><span style="color: rgb(0, 0, 0);">++</span><span style="color: rgb(0, 0, 0);">){<br />
System.out.println(</span><span style="color: rgb(0, 0, 0);">""</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">i);<br />
}<br />
}<br />
</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> SecondThread(){<br />
}<br />
</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);">&nbsp;main(String[]&nbsp;args){<br />
Runnable&nbsp;r</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> SecondThread();<br />
//Runnable&nbsp;r2</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;FirstThread();<br />
Thread&nbsp;t1</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;Thread(r);<br />
Thread&nbsp;t2</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;Thread(r);<br />
t1.start();<br />
t2.start();<br />
<br />
}<br />
<br />
}</span></div>
<br />
<p>如果你运行1000次这个程序，它的输出结果也一定每次都是：01234567890123456789。因为这里的synchronized保护的是共享数据。<strong>t1,t2是同一个对象（r）的两个线程，当其中的一个线程（例如：t1）开始执行run()方法时，由于run()受
synchronized保护，所以同一个对象的其他线程（t2）无法访问synchronized方法（run方法）。只有当t1执行完后t2才有机会
执行。</strong></p>
<p>实例三：</p>
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> ThreeThread&nbsp;</span><span style="color: rgb(0, 0, 255);">implements</span><span style="color: rgb(0, 0, 0);">&nbsp;Runnable{<br />
</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);">&nbsp;run(){<br />
</span><span style="color: rgb(0, 0, 255);">synchronized(this){</span><br />
<span style="color: rgb(0, 0, 255);">for</span><span style="color: rgb(0, 0, 0);">(</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">&nbsp;i</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">;i</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">10</span><span style="color: rgb(0, 0, 0);">;i</span><span style="color: rgb(0, 0, 0);">++</span><span style="color: rgb(0, 0, 0);">){<br />
System.out.println(</span><span style="color: rgb(0, 0, 0);">""</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">i);<br />
}}<br />
}<br />
</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> ThreeThread(){<br />
}<br />
</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);">&nbsp;main(String[]&nbsp;args){<br />
Runnable&nbsp;r</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;SecondThree();<br />
</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">Runnable&nbsp;r2=new&nbsp;FirstThread();</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 0, 0);">Thread&nbsp;t1</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;Thread(r);<br />
Thread&nbsp;t2</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;Thread(r);<br />
t1.start();<br />
t2.start();<br />
<br />
}<br />
<br />
}</span></div>
<p>这个程序与示例2的运行结果一样。在可能的情况下，应该把保护范围缩到最小，可以用示例3的形式，this代表"这个对象"。没有必要把整个run()保护起来，run()中的代码只有一个for循环，所以只要保护for循环就可以了。</p>
实例四：<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> FourThread&nbsp;</span><span style="color: rgb(0, 0, 255);">implements</span><span style="color: rgb(0, 0, 0);">&nbsp;Runnable{<br />
</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);">&nbsp;run(){<br />
</span><span style="color: rgb(0, 0, 255);">for</span><span style="color: rgb(0, 0, 0);">(</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">&nbsp;i</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">;i</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">10</span><span style="color: rgb(0, 0, 0);">;i</span><span style="color: rgb(0, 0, 0);">++</span><span style="color: rgb(0, 0, 0);">){<br />
System.out.println(</span>Thread.currentThread().getName()+<span style="color: rgb(0, 0, 0);">"forloop"</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">i);<br />
}</span><br />
<span style="color: rgb(0, 0, 255);">synchronized</span><span style="color: rgb(0, 0, 0);">(</span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">){<br />
</span><span style="color: rgb(0, 0, 255);">for</span><span style="color: rgb(0, 0, 0);">(</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">&nbsp;i</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">;i</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">10</span><span style="color: rgb(0, 0, 0);">;i</span><span style="color: rgb(0, 0, 0);">++</span><span style="color: rgb(0, 0, 0);">){<br />
System.out.println(</span>Thread.currentThread().getName()+<span style="color: rgb(0, 0, 0);">"synchronized"</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">i);<br />
}}<br />
}<br />
</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;SecondThread(){<br />
}<br />
</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);">&nbsp;main(String[]&nbsp;args){<br />
Runnable&nbsp;r</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> ThreeThread();<br />
</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">Runnable&nbsp;r2=new&nbsp;FirstThread();</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 0, 0);">Thread&nbsp;t1</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;Thread(r);<br />
Thread&nbsp;t2</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;Thread(r);<br />
t1.start();<br />
t2.start();<br />
<br />
}<br />
<br />
}</span></div>
t1_name:forloop:0<br />
t1_name:forloop:1<br />
t1_name:forloop:2<br />
t2_name:forloop:0<br />
t1_name:forloop:3<br />
t2_name:forloop:1<br />
t1_name:forloop:4<br />
t2_name:forloop:2<br />
t1_name:synchronizedforloop:0<br />
t2_name:forloop:3<br />
t1_name:synchronizedforloop:1<br />
t2_name:forloop:4<br />
t1_name:synchronizedforloop:2<br />
t1_name:synchronizedforloop:3<br />
t1_name:synchronizedforloop:4<br />
t2_name:synchronizedforloop:0<br />
t2_name:synchronizedforloop:1<br />
t2_name:synchronizedforloop:2<br />
t2_name:synchronizedforloop:3<br />
t2_name:synchronizedforloop:4<br />
第一个for循环没有受synchronized保护。对于第一个for循环，t1,t2可以同时访问。运行结果<br />
表明t1执行到了k=2 时，t2开始执行了。t1首先执行完了第一个for循环，此时还没有执行完第一个<br />
for循环（t2刚执行到k=2）。t1开始执行第二个for循环，当 t1的第二个for循环执行到k=1时，t2<br />
的第一个for循环执行完了。http://bianceng.cn(编程入门)<br />
t2想开始执行第二个for循环，但由于t1首先执行了第二个for循环，这个对象的锁标志自然在<br />
t1手中（synchronized方法的执行权也就落到了t1手中），在t1没执行完第二个for循环的时候，它<br />
是不会释放锁标志的。<br />
所以t2必须等到t1执行完第二个for循环后，它才可以执行第二个for循环<br />
<img src ="http://www.blogjava.net/nkjava/aggbug/256884.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nkjava/" target="_blank">草原上的骆驼</a> 2009-02-26 19:43 <a href="http://www.blogjava.net/nkjava/archive/2009/02/26/256884.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java 线程学习（1）</title><link>http://www.blogjava.net/nkjava/archive/2009/02/26/256881.html</link><dc:creator>草原上的骆驼</dc:creator><author>草原上的骆驼</author><pubDate>Thu, 26 Feb 2009 11:26:00 GMT</pubDate><guid>http://www.blogjava.net/nkjava/archive/2009/02/26/256881.html</guid><wfw:comment>http://www.blogjava.net/nkjava/comments/256881.html</wfw:comment><comments>http://www.blogjava.net/nkjava/archive/2009/02/26/256881.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/nkjava/comments/commentRss/256881.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nkjava/services/trackbacks/256881.html</trackback:ping><description><![CDATA[<div><strong>一、定义线程</strong><br />
<em>1、扩展java.lang.Thread类。</em><br />
此类中有个run()方法，应该注意其用法：<br />
public void <strong>run</strong>()<br />
如果该线程是使用独立的 <code><font face="新宋体">Runnable</font></code> 运行对象构造的，则调用该 <code><font face="新宋体">Runnable</font></code> 对象的 <code><font face="新宋体">run</font></code> 方法；否则，该方法不执行任何操作并返回。<br />
<code><font face="新宋体">Thread</font></code> 的子类应该重写该方法。<br />
<em>2、实现java.lang.Runnable接口。<br />
</em>&nbsp;void <strong>run</strong>()<br />
使用实现接口 <code><font face="新宋体">Runnable</font></code> 的对象创建一个线程时，启动该线程将导致在独立执行的线程中调用对象的 <code><font face="新宋体">run</font></code> 方法。<br />
<strong>二、实例化线程</strong><br />
1 Thread类实例化<br />
直接new即可<br />
2 Runnable实例化<br />
需要用Thread的构造函数实例化<strong><br />
</strong><br />
Thread(Runnable target)<br />
Thread(Runnable target, String name)<br />
Thread(ThreadGroup group, Runnable target)<br />
Thread(ThreadGroup group, Runnable target, String name)<br />
Thread(ThreadGroup group, Runnable target, String name, long stackSize) <br />
是个简单的多线程程序。run()和start()是大家都很熟悉的两个方法。把希望并行处理的代码都放在run()中；start()用于自动调用
run()，这是JAVA的内在机制规定的。并且run()的访问控制符必须是public，返回值必须是void（这种说法不准确，run()没有返回
值），run()不带参数。<br />
<strong>三</strong><em>、</em><strong>实例化代码</strong><br />
Thread实例化线程<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;FirstThread&nbsp;</span><span style="color: #0000ff;">extends</span><span style="color: #000000;">&nbsp;Thread{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;count</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">,&nbsp;number;<br />
&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;">int</span><span style="color: #000000;">&nbsp;x</span><span style="color: #000000;">=</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;FirstThread(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;number){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.number</span><span style="color: #000000;">=</span><span style="color: #000000;">number;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">create&nbsp;thread</span><span style="color: #000000;">"</span><span style="color: #000000;">+</span><span style="color: #000000;">number);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&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;run(){<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x=x+1;</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">(</span><span style="color: #0000ff;">true</span><span style="color: #000000;">)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("create&nbsp;thread"+x);</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&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;">线程&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">+</span><span style="color: #000000;">number</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;">count);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(</span><span style="color: #000000;">++</span><span style="color: #000000;">count</span><span style="color: #000000;">==</span><span style="color: #000000;">6</span><span style="color: #000000;">)</span><span style="color: #0000ff;">return</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</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){<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">(</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;</span><span style="color: #000000;">0</span><span style="color: #000000;">;i</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">5</span><span style="color: #000000;">;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;FirstThread(i</span><span style="color: #000000;">+</span><span style="color: #000000;">1</span><span style="color: #000000;">).start();<br />
}<br />
}</span></div>
输出：（每次输出不同，可见先建立的线程并不是先执行，比较混乱）<br />
create thread1<br />
create thread2<br />
create thread3<br />
线程 1:计数 1<br />
线程 1:计数 2<br />
create thread4<br />
线程 1:计数 3<br />
线程 2:计数 1<br />
线程 1:计数 4<br />
线程 2:计数 2<br />
线程 2:计数 3<br />
线程 2:计数 4<br />
线程 2:计数 5<br />
线程 3:计数 1<br />
线程 3:计数 2<br />
线程 3:计数 3<br />
create thread5<br />
线程 3:计数 4<br />
线程 4:计数 1<br />
线程 4:计数 2<br />
线程 4:计数 3<br />
线程 4:计数 4<br />
线程 4:计数 5<br />
线程 3:计数 5<br />
线程 1:计数 5<br />
线程 5:计数 1<br />
线程 5:计数 2<br />
线程 5:计数 3<br />
线程 5:计数 4<br />
线程 5:计数 5<br />
<br />
Runnable实例化代码<br />
<font color="black" size="2">如果类继承了别的类，就不能继承 Thread 了，就要实现 Runnable 接口了 </font><br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;FirstRunnale&nbsp;</span><span style="color: #0000ff;">implements</span><span style="color: #000000;">&nbsp;Runnable{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;number,count;<br />
&nbsp;&nbsp;&nbsp;&nbsp;FirstRunnale(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;number){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.number</span><span style="color: #000000;">=</span><span style="color: #000000;">number;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">create&nbsp;thread</span><span style="color: #000000;">"</span><span style="color: #000000;">+</span><span style="color: #000000;">number);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&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;run(){<br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">while</span><span style="color: #000000;">(</span><span style="color: #0000ff;">true</span><span style="color: #000000;">)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("create&nbsp;thread"+x);</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&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;">线程&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">+</span><span style="color: #000000;">number</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;">count);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(</span><span style="color: #000000;">++</span><span style="color: #000000;">count</span><span style="color: #000000;">==</span><span style="color: #000000;">6</span><span style="color: #000000;">)</span><span style="color: #0000ff;">return</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />
&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){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">;i</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">5</span><span style="color: #000000;">;i</span><span style="color: #000000;">++</span><span style="color: #000000;">){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Thread(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;FirstRunnale(i</span><span style="color: #000000;">+</span><span style="color: #000000;">1</span><span style="color: #000000;">)).start();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
}<br />
</span></div>
<strong>三、启动线程 </strong><br />
在线程的Thread对象上调用start()方法，而不是run()或者别的方法。<br />
在调用start()方法之前：线程处于新状态中，新状态指有一个Thread对象，但还没有一个真正的线程。 <br />
在调用start()方法之后：发生了一系列复杂的事情<br />
启动新的执行线程（具有新的调用栈）；<br />
该线程从新状态转移到可运行状态；<br />
当该线程获得机会执行时，其目标run()方法将运行。<br />
&nbsp;注意：对Java来说，run()方法没有任何特别之处。像main()方法一样，它只是新线程知道调用的方法名称(和签名)。因此，在Runnable上或者Thread上调用run方法是合法的。但并不启动新的线程。<br />
<strong>四、补充说明</strong><br />
1、线程的名字，一个运行中的线程总是有名字的，名字有两个来源，一个是虚拟机自己给的名字，<br />
<br />
一个是你自己的定的名字。在没有指定线程名字的情况下，虚拟机总会为线程指定名字，并且主线<br />
<br />
程的名字总是mian，非主线程的名字不确定。<br />
2、线程都可以设置名字，也可以获取线程的名字，连主线程也不例外。<br />
3、获取当前线程的对象的方法是：Thread.currentThread()；<br />
4、在上面的代码中，只能保证：每个线程都将启动，每个线程都将运行直到完成。一系列线程以某<br />
<br />
种顺序启动并不意味着将按该顺序执行。对于任何一组启动的线程来说，调度程序不能保证其执行<br />
<br />
次序，持续时间也无法保证。<br />
5、当线程目标run()方法结束时该线程完成。<br />
6、一旦线程启动，它就永远不能再重新启动。只有一个新的线程可以被启动，并且只能一次。一个<br />
<br />
可运行的线程或死线程可以被重新启动。<br />
7、线程的调度是JVM的一部分，在一个CPU的机器上上，实际上一次只能运行一个线程。一次只有一<br />
<br />
个线程栈执行。JVM线程调度程序决定实际运行哪个处于可运行状态的线程。<br />
众多可运行线程中的某一个会被选中做为当前线程。可运行线程被选择运行的顺序是没有保障的。<br />
8、尽管通常采用队列形式，但这是没有保障的。队列形式是指当一个线程完成&#8220;一轮&#8221;时，它移到<br />
<br />
可运行队列的尾部等待，直到它最终排队到该队列的前端为止，它才能被再次选中。事实上，我们<br />
<br />
把它称为可运行池而不是一个可运行队列，目的是帮助认识线程并不都是以某种有保障的顺序排列<br />
<br />
唱呢个一个队列的事实。<br />
9、尽管我们没有无法控制线程调度程序，但可以通过别的方式来影响线程调度的方式。<br />
</div>
<br />
<img src ="http://www.blogjava.net/nkjava/aggbug/256881.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nkjava/" target="_blank">草原上的骆驼</a> 2009-02-26 19:26 <a href="http://www.blogjava.net/nkjava/archive/2009/02/26/256881.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>