﻿<?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-wilsonyq-文章分类-Java</title><link>http://blogjava.net/wilsonyq/category/50765.html</link><description /><language>zh-cn</language><lastBuildDate>Sun, 27 Sep 2015 00:11:49 GMT</lastBuildDate><pubDate>Sun, 27 Sep 2015 00:11:49 GMT</pubDate><ttl>60</ttl><item><title>webservice 参考文章</title><link>http://www.blogjava.net/wilsonyq/articles/webservice.html</link><dc:creator>wilsonyq</dc:creator><author>wilsonyq</author><pubDate>Fri, 18 Sep 2015 10:14:00 GMT</pubDate><guid>http://www.blogjava.net/wilsonyq/articles/webservice.html</guid><wfw:comment>http://www.blogjava.net/wilsonyq/comments/427391.html</wfw:comment><comments>http://www.blogjava.net/wilsonyq/articles/webservice.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wilsonyq/comments/commentRss/427391.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wilsonyq/services/trackbacks/427391.html</trackback:ping><description><![CDATA[<div>http://my.oschina.net/u/658145/blog/111631</div><img src ="http://www.blogjava.net/wilsonyq/aggbug/427391.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wilsonyq/" target="_blank">wilsonyq</a> 2015-09-18 18:14 <a href="http://www.blogjava.net/wilsonyq/articles/webservice.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【转】tomcat 6 debug jpda 简单配置</title><link>http://www.blogjava.net/wilsonyq/articles/418961.html</link><dc:creator>wilsonyq</dc:creator><author>wilsonyq</author><pubDate>Thu, 23 Oct 2014 02:50:00 GMT</pubDate><guid>http://www.blogjava.net/wilsonyq/articles/418961.html</guid><wfw:comment>http://www.blogjava.net/wilsonyq/comments/418961.html</wfw:comment><comments>http://www.blogjava.net/wilsonyq/articles/418961.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wilsonyq/comments/commentRss/418961.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wilsonyq/services/trackbacks/418961.html</trackback:ping><description><![CDATA[<span style="color: #303030; font-family: 'Lucida Console'; font-size: 12px; line-height: 18px; text-align: justify; background-color: #ffffff;">今日在tomcat下开发，为避免在没有改变java方法和类名的情况下重新加载整个webapp，查阅了些资料后需要启用jvm的jpda，&nbsp; 同时要能远程debug；</span><br style="color: #303030; font-family: Verdana, Helvetica, Arial; font-size: 12px; line-height: 18px; text-align: justify; background-color: #ffffff;" /><span style="color: #303030; font-family: 'Lucida Console'; font-size: 12px; line-height: 18px; text-align: justify; background-color: #ffffff;">研究了半天发现其实很简单，人家已经做的很好了；只需要加jpda 4个字母就可以了；</span><br style="color: #303030; font-family: Verdana, Helvetica, Arial; font-size: 12px; line-height: 18px; text-align: justify; background-color: #ffffff;" /><br style="color: #303030; font-family: Verdana, Helvetica, Arial; font-size: 12px; line-height: 18px; text-align: justify; background-color: #ffffff;" /><span style="color: #303030; font-family: 'Lucida Console'; font-size: 12px; line-height: 18px; text-align: justify; background-color: #ffffff;">修改startup.bat 找到call "%EXECUTABLE%" start %CMD_LINE_ARGS% 改为call "%EXECUTABLE%" jpda start %CMD_LINE_ARGS% 即可；这样在java的方法里面修改代码就不需要费时费力的重新加载上下文，也不需要重新登录。</span><br style="color: #303030; font-family: Verdana, Helvetica, Arial; font-size: 12px; line-height: 18px; text-align: justify; background-color: #ffffff;" /><br style="color: #303030; font-family: Verdana, Helvetica, Arial; font-size: 12px; line-height: 18px; text-align: justify; background-color: #ffffff;" /><span style="color: #303030; font-family: 'Lucida Console'; font-size: 12px; line-height: 18px; text-align: justify; background-color: #ffffff;">如果需要修改debug端口，（默认8000），改catalina.bat 中set JPDA_ADDRESS=8000 处；</span><br style="color: #303030; font-family: Verdana, Helvetica, Arial; font-size: 12px; line-height: 18px; text-align: justify; background-color: #ffffff;" /><br style="color: #303030; font-family: Verdana, Helvetica, Arial; font-size: 12px; line-height: 18px; text-align: justify; background-color: #ffffff;" /><span style="color: #303030; font-family: 'Lucida Console'; font-size: 12px; line-height: 18px; text-align: justify; background-color: #ffffff;">启动命令方式如下：</span><br style="color: #303030; font-family: Verdana, Helvetica, Arial; font-size: 12px; line-height: 18px; text-align: justify; background-color: #ffffff;" /><span style="color: #303030; font-family: 'Lucida Console'; font-size: 12px; line-height: 18px; text-align: justify; background-color: #ffffff;">echo Usage:&nbsp; catalina ( commands ... )</span><br style="color: #303030; font-family: Verdana, Helvetica, Arial; font-size: 12px; line-height: 18px; text-align: justify; background-color: #ffffff;" /><span style="color: #303030; font-family: 'Lucida Console'; font-size: 12px; line-height: 18px; text-align: justify; background-color: #ffffff;">echo commands:</span><br style="color: #303030; font-family: Verdana, Helvetica, Arial; font-size: 12px; line-height: 18px; text-align: justify; background-color: #ffffff;" /><span style="color: #303030; font-family: 'Lucida Console'; font-size: 12px; line-height: 18px; text-align: justify; background-color: #ffffff;">echo&nbsp;&nbsp; debug&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Start Catalina in a debugger</span><br style="color: #303030; font-family: Verdana, Helvetica, Arial; font-size: 12px; line-height: 18px; text-align: justify; background-color: #ffffff;" /><span style="color: #303030; font-family: 'Lucida Console'; font-size: 12px; line-height: 18px; text-align: justify; background-color: #ffffff;">echo&nbsp;&nbsp; debug -security&nbsp;&nbsp; Debug Catalina with a security manager</span><br style="color: #303030; font-family: Verdana, Helvetica, Arial; font-size: 12px; line-height: 18px; text-align: justify; background-color: #ffffff;" /><span style="color: #303030; font-family: 'Lucida Console'; font-size: 12px; line-height: 18px; text-align: justify; background-color: #ffffff;">echo&nbsp;&nbsp; jpda start&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Start Catalina under JPDA debugger</span><br style="color: #303030; font-family: Verdana, Helvetica, Arial; font-size: 12px; line-height: 18px; text-align: justify; background-color: #ffffff;" /><span style="color: #303030; font-family: 'Lucida Console'; font-size: 12px; line-height: 18px; text-align: justify; background-color: #ffffff;">echo&nbsp;&nbsp; run&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Start Catalina in the current window</span><br style="color: #303030; font-family: Verdana, Helvetica, Arial; font-size: 12px; line-height: 18px; text-align: justify; background-color: #ffffff;" /><span style="color: #303030; font-family: 'Lucida Console'; font-size: 12px; line-height: 18px; text-align: justify; background-color: #ffffff;">echo&nbsp;&nbsp; run -security&nbsp;&nbsp;&nbsp;&nbsp; Start in the current window with security manager</span><br style="color: #303030; font-family: Verdana, Helvetica, Arial; font-size: 12px; line-height: 18px; text-align: justify; background-color: #ffffff;" /><span style="color: #303030; font-family: 'Lucida Console'; font-size: 12px; line-height: 18px; text-align: justify; background-color: #ffffff;">echo&nbsp;&nbsp; start&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Start Catalina in a separate window</span><br style="color: #303030; font-family: Verdana, Helvetica, Arial; font-size: 12px; line-height: 18px; text-align: justify; background-color: #ffffff;" /><span style="color: #303030; font-family: 'Lucida Console'; font-size: 12px; line-height: 18px; text-align: justify; background-color: #ffffff;">echo&nbsp;&nbsp; start -security&nbsp;&nbsp; Start in a separate window with security manager</span><br style="color: #303030; font-family: Verdana, Helvetica, Arial; font-size: 12px; line-height: 18px; text-align: justify; background-color: #ffffff;" /><span style="color: #303030; font-family: 'Lucida Console'; font-size: 12px; line-height: 18px; text-align: justify; background-color: #ffffff;">echo&nbsp;&nbsp; stop&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Stop Catalina</span><br style="color: #303030; font-family: Verdana, Helvetica, Arial; font-size: 12px; line-height: 18px; text-align: justify; background-color: #ffffff;" /><span style="color: #303030; font-family: 'Lucida Console'; font-size: 12px; line-height: 18px; text-align: justify; background-color: #ffffff;">echo&nbsp;&nbsp; version&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; What version of tomcat are you running?</span><img src ="http://www.blogjava.net/wilsonyq/aggbug/418961.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wilsonyq/" target="_blank">wilsonyq</a> 2014-10-23 10:50 <a href="http://www.blogjava.net/wilsonyq/articles/418961.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【转】JAVAEE 常见性能问题解决手册</title><link>http://www.blogjava.net/wilsonyq/articles/418933.html</link><dc:creator>wilsonyq</dc:creator><author>wilsonyq</author><pubDate>Wed, 22 Oct 2014 05:55:00 GMT</pubDate><guid>http://www.blogjava.net/wilsonyq/articles/418933.html</guid><wfw:comment>http://www.blogjava.net/wilsonyq/comments/418933.html</wfw:comment><comments>http://www.blogjava.net/wilsonyq/articles/418933.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wilsonyq/comments/commentRss/418933.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wilsonyq/services/trackbacks/418933.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: JAVAEE 常见性能问题解决手册 内存溢出错误  最常见的折磨着企业级应用程序的错误是让人恐惧的outofmemoryError(内存溢出错误) 这个错误引起下面这些典型的症状： ----应用服务器崩溃 ----性能下降 ----一个看起来好像无法结束的死循环在重复不断的执行垃圾收集，它会导致程序停止运行，并且经常导致应用服务器崩溃 不管症状是什么，如果你想让程序恢复正常运行，你一般都需要重新启...&nbsp;&nbsp;<a href='http://www.blogjava.net/wilsonyq/articles/418933.html'>阅读全文</a><img src ="http://www.blogjava.net/wilsonyq/aggbug/418933.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wilsonyq/" target="_blank">wilsonyq</a> 2014-10-22 13:55 <a href="http://www.blogjava.net/wilsonyq/articles/418933.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在Myeclipse安装Eclipse Color Themes插件</title><link>http://www.blogjava.net/wilsonyq/articles/400322.html</link><dc:creator>wilsonyq</dc:creator><author>wilsonyq</author><pubDate>Fri, 07 Jun 2013 01:25:00 GMT</pubDate><guid>http://www.blogjava.net/wilsonyq/articles/400322.html</guid><wfw:comment>http://www.blogjava.net/wilsonyq/comments/400322.html</wfw:comment><comments>http://www.blogjava.net/wilsonyq/articles/400322.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wilsonyq/comments/commentRss/400322.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wilsonyq/services/trackbacks/400322.html</trackback:ping><description><![CDATA[<p><span style="font-size: 18px; font-family: Comic Sans MS">1、去&nbsp;http://eclipsecolorthemes.org/?view=theme&amp;<span style="font-family: Comic Sans MS; color: rgb(255,0,0)">id=1</span></span><span style="font-size: 18px; font-family: Comic Sans MS">下载你需要的颜色，根据<span style="font-family: Comic Sans MS; color: rgb(255,0,0)">id</span></span><span style="font-size: 18px; font-family: Comic Sans MS">不同，配色方案不一样。</span></p>
<p><span style="font-size: 18px; font-family: Comic Sans MS">2、下载页面右侧的&#8220;Eclipse Preferences(EPF)-for Eclipse Import&#8221;。直接右键另存为，就可以下载到这个配色方案的epf文件。</span></p>
<p><span style="font-size: 18px; font-family: Comic Sans MS">3、将该epf文件存放在系统某目录下，我放在了E:\eclipse-color-themes。</span></p>
<p><span style="font-size: 18px"><span style="white-space: pre"></span></span><span style="font-size: 18px; font-family: Comic Sans MS">打开myeclipse-&gt;File-&gt;Import-&gt;General-&gt;Preferences.打开把&nbsp;E:\eclipse-color-themes\theme-1.epf写入，其他项默认。点击完成就ok了！</span></p>
<p><span style="font-size: 18px; font-family: Comic Sans MS">------------------------------------------------------------------------</span></p>
<p><span style="font-size: 18px"><span style="font-size: 14px; font-family: Comic Sans MS; line-height: 26px"><strong>Eclipse默认配色的恢复方法：</strong></span><br /></span></p>
<p><span style="font-size: 18px"><span style="font-size: 14px; font-family: Comic Sans MS; line-height: 26px"><strong>方法1：</strong></span></span></p>
<p><span style="font-family: Arial; line-height: 26px"><span style="font-size: 12px; font-family: Comic Sans MS">将&nbsp;<span style="font-family: Comic Sans MS; line-height: 26px">myeclipse的工作空间目录，也就是workspace，找到这个目录下&#8220;.metadata\.plugins\org.eclipse.core.runtime&#8221;，这里也有.setting文件夹，把里面文件全部删除；换成同事的默认的配色方案的.setting文件夹。</span></span></span></p>
<p><span style="font-size: 18px"><span style="font-size: 14px; font-family: Arial; line-height: 26px"><span style="font-size: 14px; font-family: Comic Sans MS; line-height: 26px"><strong>方法2：</strong></span></span></span></p>
<p><span style="font-size: 18px"><span style="font-size: 14px; font-family: Arial; line-height: 26px"><span style="font-size: 14px; font-family: Arial; line-height: 26px"><span style="font-size: 12px; font-family: Comic Sans MS; line-height: 25px">如果你在workspace中没有什么重要的东西，可以切换workspace或者将整个workspace 下的.metadata删除，就可以恢复。</span></span></span></span></p>
<p><span style="font-size: 18px"><span style="font-size: 14px; font-family: Arial; line-height: 26px"><span style="font-size: 14px; font-family: Arial; line-height: 26px"><span style="font-size: 12px; font-family: Comic Sans MS; line-height: 25px">原文地址：<a href="http://blog.csdn.net/jkunzhang/article/details/8027778"><span style="font-family: Comic Sans MS">http://blog.csdn.net/jkunzhang/article/details/8027778</span></a></span></span></span></span></p><img src ="http://www.blogjava.net/wilsonyq/aggbug/400322.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wilsonyq/" target="_blank">wilsonyq</a> 2013-06-07 09:25 <a href="http://www.blogjava.net/wilsonyq/articles/400322.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于Java 关于String</title><link>http://www.blogjava.net/wilsonyq/articles/String.html</link><dc:creator>wilsonyq</dc:creator><author>wilsonyq</author><pubDate>Tue, 14 Feb 2012 05:45:00 GMT</pubDate><guid>http://www.blogjava.net/wilsonyq/articles/String.html</guid><wfw:comment>http://www.blogjava.net/wilsonyq/comments/369933.html</wfw:comment><comments>http://www.blogjava.net/wilsonyq/articles/String.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wilsonyq/comments/commentRss/369933.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wilsonyq/services/trackbacks/369933.html</trackback:ping><description><![CDATA[<span style="font-family: Comic Sans MS; font-size: 12pt;"> </span><div><p><span style="font-family: Comic Sans MS;">对于这个系列里的问题，每个学Java的人都应该搞懂。当然，如果只是学Java玩玩就无所谓了。如果你认为自己已经超越初学者了，却不很懂这些问题，请将你自己重归初学者行列。内容均来自于CSDN的经典老贴。&nbsp;</span></p><p>&nbsp;</p><p><span style="font-family: Comic Sans MS;">问题一：我声明了什么！&nbsp;</span></p><p>&nbsp;</p><p><span style="font-family: Comic Sans MS;">String s = "Hello world!";&nbsp;</span></p><p>&nbsp;</p><p><span style="font-family: Comic Sans MS;">许多人都做过这样的事情，但是，我们到底声明了什么？回答通常是：一个String，内容是&#8220;Hello world!&#8221;。这样模糊的回答通常是概念不清的根源。如果要准确的回答，一半的人大概会回答错误。&nbsp;</span></p><p><span style="font-family: Comic Sans MS;">这 个语句声明的是一个指向对象的引用，名为&#8220;s&#8221;，可以指向类型为String的任何对象，目前指向"Hello  world!"这个String类型的对象。这就是真正发生的事情。我们并没有声明一个String对象，我们只是声明了一个只能指向String对象的 引用变量。所以，如果在刚才那句语句后面，如果再运行一句：&nbsp;</span></p><p>&nbsp;</p><p><span style="font-family: Comic Sans MS;">String string = s;&nbsp;</span></p><p>&nbsp;</p><p><span style="font-family: Comic Sans MS;">我们是声明了另外一个只能指向String对象的引用，名为string，并没有第二个对象产生，string还是指向原来那个对象，也就是，和s指向同一个对象。&nbsp;</span></p><p>&nbsp;</p><p><span style="font-family: Comic Sans MS;">问题二："=="和equals方法究竟有什么区别？&nbsp;</span></p><p>&nbsp;</p><p><span style="font-family: Comic Sans MS;">==操作符专门用来比较变量的值是否相等。比较好理解的一点是：&nbsp;</span></p><p><span style="font-family: Comic Sans MS;">int a=10;&nbsp;</span></p><p><span style="font-family: Comic Sans MS;">int b=10;&nbsp;</span></p><p><span style="font-family: Comic Sans MS;">则a==b将是true。&nbsp;</span></p><p><span style="font-family: Comic Sans MS;">但不好理解的地方是：&nbsp;</span></p><p><span style="font-family: Comic Sans MS;">String a=new String("foo");&nbsp;</span></p><p><span style="font-family: Comic Sans MS;">String b=new String("foo");&nbsp;</span></p><p><span style="font-family: Comic Sans MS;">则a==b将返回false。&nbsp;</span></p><p>&nbsp;</p><p><span style="font-family: Comic Sans MS;">根 据前一帖说过，对象变量其实是一个引用，它们的值是指向对象所在的内存地址，而不是对象本身。a和b都使用了new操作符，意味着将在内存中产生两个内容 为"foo"的字符串，既然是&#8220;两个&#8221;，它们自然位于不同的内存地址。a和b的值其实是两个不同的内存地址的值，所以使用"=="操作符，结果会是 false。诚然，a和b所指的对象，它们的内容都是"foo"，应该是&#8220;相等&#8221;，但是==操作符并不涉及到对象内容的比较。&nbsp;</span></p><p><span style="font-family: Comic Sans MS;">对象内容的比较，正是equals方法做的事。&nbsp;</span></p><p>&nbsp;</p><p><span style="font-family: Comic Sans MS;">看一下Object对象的equals方法是如何实现的：&nbsp;</span></p><p><span style="font-family: Comic Sans MS;">boolean equals(Object o){&nbsp;</span></p><p>&nbsp;</p><p><span style="font-family: Comic Sans MS;">return this==o;&nbsp;</span></p><p>&nbsp;</p><p><span style="font-family: Comic Sans MS;">}&nbsp;</span></p><p><span style="font-family: Comic Sans MS;">Object 对象默认使用了==操作符。所以如果你自创的类没有覆盖equals方法，那你的类使用equals和使用==会得到同样的结果。同样也可以看 出，Object的equals方法没有达到equals方法应该达到的目标：比较两个对象内容是否相等。因为答案应该由类的创建者决定，所以 Object把这个任务留给了类的创建者。&nbsp;</span></p><p>&nbsp;</p><p><span style="font-family: Comic Sans MS;">看一下一个极端的类：&nbsp;</span></p><p><span style="font-family: Comic Sans MS;">Class Monster{&nbsp;</span></p><p><span style="font-family: Comic Sans MS;">private String content;&nbsp;</span></p><p><span style="font-family: Comic Sans MS;">...&nbsp;</span></p><p><span style="font-family: Comic Sans MS;">boolean equals(Object another){ return true;}&nbsp;</span></p><p>&nbsp;</p><p><span style="font-family: Comic Sans MS;">}&nbsp;</span></p><p><span style="font-family: Comic Sans MS;">我覆盖了equals方法。这个实现会导致无论Monster实例内容如何，它们之间的比较永远返回true。&nbsp;</span></p><p>&nbsp;</p><p><span style="font-family: Comic Sans MS;">所 以当你是用equals方法判断对象的内容是否相等，请不要想当然。因为可能你认为相等，而这个类的作者不这样认为，而类的equals方法的实现是由他 掌握的。如果你需要使用equals方法，或者使用任何基于散列码的集合（HashSet,HashMap,HashTable），请察看一下java  doc以确认这个类的equals逻辑是如何实现的。&nbsp;</span></p><p>&nbsp;</p><p><span style="font-family: Comic Sans MS;">问题三：String到底变了没有？&nbsp;</span></p><p>&nbsp;</p><p><span style="font-family: Comic Sans MS;">没有。因为String被设计成不可变(immutable)类，所以它的所有对象都是不可变对象。请看下列代码：&nbsp;</span></p><p>&nbsp;</p><p><span style="font-family: Comic Sans MS;">String s = "Hello";&nbsp;</span></p><p><span style="font-family: Comic Sans MS;">s = s + " world!";&nbsp;</span></p><p>&nbsp;</p><p><span style="font-family: Comic Sans MS;">s 所指向的对象是否改变了呢？从本系列第一篇的结论很容易导出这个结论。我们来看看发生了什么事情。在这段代码中，s原先指向一个String对象，内容 是"Hello"，然后我们对s进行了+操作，那么s所指向的那个对象是否发生了改变呢？答案是没有。这时，s不指向原来那个对象了，而指向了另一个 String对象，内容为"Hello world!"，原来那个对象还存在于内存之中，只是s这个引用变量不再指向它了。&nbsp;</span></p><p><span style="font-family: Comic Sans MS;">通过上面的说 明，我们很容易导出另一个结论，如果经常对字符串进行各种各样的修改，或者说，不可预见的修改，那么使用String来代表字符串的话会引起很大的内存开 销。因为String对象建立之后不能再改变，所以对于每一个不同的字符串，都需要一个String对象来表示。这时，应该考虑使用 StringBuffer类，它允许修改，而不是每个不同的字符串都要生成一个新的对象。并且，这两种类的对象转换十分容易。&nbsp;</span></p><p><span style="font-family: Comic Sans MS;">同时，我们还可以知道，如果要使用内容相同的字符串，不必每次都new一个String。例如我们要在构造器中对一个名叫s的String引用变量进行初始化，把它设置为初始值，应当这样做：&nbsp;</span></p><p><span style="font-family: Comic Sans MS;">public class Demo {&nbsp;</span></p><p><span style="font-family: Comic Sans MS;">private String s;&nbsp;</span></p><p><span style="font-family: Comic Sans MS;">...&nbsp;</span></p><p><span style="font-family: Comic Sans MS;">public Demo {&nbsp;</span></p><p><span style="font-family: Comic Sans MS;">s = "Initial Value";&nbsp;</span></p><p><span style="font-family: Comic Sans MS;">}&nbsp;</span></p><p><span style="font-family: Comic Sans MS;">...&nbsp;</span></p><p><span style="font-family: Comic Sans MS;">}&nbsp;</span></p><p><span style="font-family: Comic Sans MS;">而非&nbsp;</span></p><p><span style="font-family: Comic Sans MS;">s = new String("Initial Value");&nbsp;</span></p><p><span style="font-family: Comic Sans MS;">后 者每次都会调用构造器，生成新对象，性能低下且内存开销大，并且没有意义，因为String对象不可改变，所以对于内容相同的字符串，只要一个 String对象来表示就可以了。也就说，多次调用上面的构造器创建多个对象，他们的String类型属性s都指向同一个对象。&nbsp;</span></p><p><span style="font-family: Comic Sans MS;">上面的结论还基于这样一个事实：对于字符串常量，如果内容相同，Java认为它们代表同一个String对象。而用关键字new调用构造器，总是会创建一个新的对象，无论内容是否相同。&nbsp;</span></p><p><span style="font-family: Comic Sans MS;">至 于为什么要把String类设计成不可变类，是它的用途决定的。其实不只String，很多Java标准类库中的类都是不可变的。在开发一个系统的时候， 我们有时候也需要设计不可变类，来传递一组相关的值，这也是面向对象思想的体现。不可变类有一些优点，比如因为它的对象是只读的，所以多线程并发访问也不 会有任何问题。当然也有一些缺点，比如每个不同的状态都要一个对象来代表，可能会造成性能上的问题。所以Java标准类库还提供了一个可变版本，即 StringBuffer。&nbsp;</span></p><p>&nbsp;</p><p><span style="font-family: Comic Sans MS;">问题四：final关键字到底修饰了什么？&nbsp;</span></p><p>&nbsp;</p><p><span style="font-family: Comic Sans MS;">final使得被修饰的变量"不变"，但是由于对象型变量的本质是&#8220;引用&#8221;，使得&#8220;不变&#8221;也有了两种含义：引用本身的不变，和引用指向的对象不变。&nbsp;</span></p><p>&nbsp;</p><p><span style="font-family: Comic Sans MS;">引用本身的不变：&nbsp;</span></p><p><span style="font-family: Comic Sans MS;">final StringBuffer a=new StringBuffer("immutable");&nbsp;</span></p><p><span style="font-family: Comic Sans MS;">final StringBuffer b=new StringBuffer("not immutable");&nbsp;</span></p><p><span style="font-family: Comic Sans MS;">a=b;//编译期错误&nbsp;</span></p><p>&nbsp;</p><p><span style="font-family: Comic Sans MS;">引用指向的对象不变：&nbsp;</span></p><p><span style="font-family: Comic Sans MS;">final StringBuffer a=new StringBuffer("immutable");&nbsp;</span></p><p><span style="font-family: Comic Sans MS;">a.append(" broken!"); //编译通过&nbsp;</span></p><p>&nbsp;</p><p><span style="font-family: Comic Sans MS;">可 见，final只对引用的&#8220;值&#8221;(也即它所指向的那个对象的内存地址)有效，它迫使引用只能指向初始指向的那个对象，改变它的指向会导致编译期错误。至于 它所指向的对象的变化，final是不负责的。这很类似==操作符：==操作符只负责引用的&#8220;值&#8221;相等，至于这个地址所指向的对象内容是否相等，==操作 符是不管的。&nbsp;</span></p><p>&nbsp;</p><p><span style="font-family: Comic Sans MS;">理解final问题有很重要的含义。许多程序漏洞都基于此----final只能保证引用永远指向固定对 象，不能保证那个对象的状态不变。在多线程的操作中,一个对象会被多个线程共享或修改，一个线程对对象无意识的修改可能会导致另一个使用此对象的线程崩 溃。一个错误的解决方法就是在此对象新建的时候把它声明为final，意图使得它&#8220;永远不变&#8221;。其实那是徒劳的。&nbsp;</span></p><p>&nbsp;</p><p><span style="font-family: Comic Sans MS;">问题五：到底要怎么样初始化！&nbsp;</span></p><p>&nbsp;</p><p><span style="font-family: Comic Sans MS;">本问题讨论变量的初始化，所以先来看一下Java中有哪些种类的变量。&nbsp;</span></p><p><span style="font-family: Comic Sans MS;">1. 类的属性，或者叫值域&nbsp;</span></p><p><span style="font-family: Comic Sans MS;">2. 方法里的局部变量&nbsp;</span></p><p><span style="font-family: Comic Sans MS;">3. 方法的参数&nbsp;</span></p><p>&nbsp;</p><p><span style="font-family: Comic Sans MS;">对于第一种变量，Java虚拟机会自动进行初始化。如果给出了初始值，则初始化为该初始值。如果没有给出，则把它初始化为该类型变量的默认初始值。&nbsp;</span></p><p>&nbsp;</p><p><span style="font-family: Comic Sans MS;">int类型变量默认初始值为0&nbsp;</span></p><p><span style="font-family: Comic Sans MS;">float类型变量默认初始值为0.0f&nbsp;</span></p><p><span style="font-family: Comic Sans MS;">double类型变量默认初始值为0.0&nbsp;</span></p><p><span style="font-family: Comic Sans MS;">boolean类型变量默认初始值为false&nbsp;</span></p><p><span style="font-family: Comic Sans MS;">char类型变量默认初始值为0(ASCII码)&nbsp;</span></p><p><span style="font-family: Comic Sans MS;">long类型变量默认初始值为0&nbsp;</span></p><p><span style="font-family: Comic Sans MS;">所有对象引用类型变量默认初始值为null，即不指向任何对象。注意数组本身也是对象，所以没有初始化的数组引用在自动初始化后其值也是null。&nbsp;</span></p><p>&nbsp;</p><p><span style="font-family: Comic Sans MS;">对 于两种不同的类属性，static属性与instance属性，初始化的时机是不同的。instance属性在创建实例的时候初始化，static属性在 类加载，也就是第一次用到这个类的时候初始化，对于后来的实例的创建，不再次进行初始化。这个问题会在以后的系列中进行详细讨论。&nbsp;</span></p><p>&nbsp;</p><p><span style="font-family: Comic Sans MS;">对 于第二种变量，必须明确地进行初始化。如果再没有初始化之前就试图使用它，编译器会抗议。如果初始化的语句在try块中或if块中，也必须要让它在第一次 使用前一定能够得到赋值。也就是说，把初始化语句放在只有if块的条件判断语句中编译器也会抗议，因为执行的时候可能不符合if后面的判断条件，如此一来 初始化语句就不会被执行了，这就违反了局部变量使用前必须初始化的规定。但如果在else块中也有初始化语句，就可以通过编译，因为无论如何，总有至少一 条初始化语句会被执行，不会发生使用前未被初始化的事情。对于try-catch也是一样，如果只有在try块里才有初始化语句，编译部通过。如果在 catch或finally里也有，则可以通过编译。总之，要保证局部变量在使用之前一定被初始化了。所以，一个好的做法是在声明他们的时候就初始化他 们，如果不知道要出事化成什么值好，就用上面的默认值吧！&nbsp;</span></p><p>&nbsp;</p><p><span style="font-family: Comic Sans MS;">其实第三种变量和第二种本质上是一样的，都是方法中的局部变量。只不过作为参数，肯定是被初始化过的，传入的值就是初始值，所以不需要初始化。&nbsp;</span></p><p>&nbsp;</p><p><span style="font-family: Comic Sans MS;">问题六：instanceof是什么东东？&nbsp;</span></p><p>&nbsp;</p><p><span style="font-family: Comic Sans MS;">instanceof是Java的一个二元操作符，和==，&gt;，&lt;是同一类东东。由于它是由字母组成的，所以也是Java的保留关键字。它的作用是测试它左边的对象是否是它右边的类的实例，返回boolean类型的数据。举个例子：&nbsp;</span></p><p>&nbsp;</p><p><span style="font-family: Comic Sans MS;">String s = "I AM an Object!";&nbsp;</span></p><p><span style="font-family: Comic Sans MS;">boolean isObject = s instanceof Object;&nbsp;</span></p><p>&nbsp;</p><p><span style="font-family: Comic Sans MS;">我们声明了一个String对象引用，指向一个String对象，然后用instancof来测试它所指向的对象是否是Object类的一个实例，显然，这是真的，所以返回true，也就是isObject的值为True。&nbsp;</span></p><p><span style="font-family: Comic Sans MS;">instanceof有一些用处。比如我们写了一个处理账单的系统，其中有这样三个类：&nbsp;</span></p><p>&nbsp;</p><p><span style="font-family: Comic Sans MS;">public class Bill {//省略细节}&nbsp;</span></p><p><span style="font-family: Comic Sans MS;">public class PhoneBill extends Bill {//省略细节}&nbsp;</span></p><p><span style="font-family: Comic Sans MS;">public class GasBill extends Bill {//省略细节}&nbsp;</span></p><p>&nbsp;</p><p><span style="font-family: Comic Sans MS;">在处理程序里有一个方法，接受一个Bill类型的对象，计算金额。假设两种账单计算方法不同，而传入的Bill对象可能是两种中的任何一种，所以要用instanceof来判断：&nbsp;</span></p><p>&nbsp;</p><p><span style="font-family: Comic Sans MS;">public double calculate(Bill bill) {&nbsp;</span></p><p><span style="font-family: Comic Sans MS;">if (bill instanceof PhoneBill) {&nbsp;</span></p><p><span style="font-family: Comic Sans MS;">//计算电话账单&nbsp;</span></p><p><span style="font-family: Comic Sans MS;">}&nbsp;</span></p><p><span style="font-family: Comic Sans MS;">if (bill instanceof GasBill) {&nbsp;</span></p><p><span style="font-family: Comic Sans MS;">//计算燃气账单&nbsp;</span></p><p><span style="font-family: Comic Sans MS;">}&nbsp;</span></p><p><span style="font-family: Comic Sans MS;">...&nbsp;</span></p><p><span style="font-family: Comic Sans MS;">}&nbsp;</span></p><p><span style="font-family: Comic Sans MS;">这样就可以用一个方法处理两种子类。&nbsp;</span></p><p>&nbsp;</p><p><span style="font-family: Comic Sans MS;">然而，这种做法通常被认为是没有好好利用面向对象中的多态性。其实上面的功能要求用方法重载完全可以实现，这是面向对象变成应有的做法，避免回到结构化编程模式。只要提供两个名字和返回值都相同，接受参数类型不同的方法就可以了：&nbsp;</span></p><p>&nbsp;</p><p><span style="font-family: Comic Sans MS;">public double calculate(PhoneBill bill) {&nbsp;</span></p><p><span style="font-family: Comic Sans MS;">//计算电话账单&nbsp;</span></p><p><span style="font-family: Comic Sans MS;">}&nbsp;</span></p><p>&nbsp;</p><p><span style="font-family: Comic Sans MS;">public double calculate(GasBill bill) {&nbsp;</span></p><p><span style="font-family: Comic Sans MS;">//计算燃气账单&nbsp;</span></p><p><span style="font-family: Comic Sans MS;">}&nbsp;</span></p><p>&nbsp;</p><p><span style="font-family: Comic Sans MS;">所以，使用instanceof在绝大多数情况下并不是推荐的做法，应当好好利用多态。</span></p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><p><span style="font-family: Comic Sans MS;">java方向及学习方法</span></p><p><span style="font-family: Comic Sans MS;">java分成J2ME（移动应用开发），J2SE（桌面应用开发），J2EE(Web企业级应用)，所以java并不是单机版的，只是面向对象语言。建议如果学习java体系的话可以这样去学习：&nbsp;</span></p><p><span style="font-family: Comic Sans MS;">*第一阶段：Java基础，包括java语法，面向对象特征，常见API，集合框架；&nbsp;</span></p><p><span style="font-family: Comic Sans MS;">*第二阶段：java界面编程，包括AWT，事件机制，SWING，这个部分也可以跳过，用的时候再看都能来及；&nbsp;</span></p><p><span style="font-family: Comic Sans MS;">*第三阶段：java API：输入输出，多线程，网络编程，反射注解等，java的精华部分；&nbsp;</span></p><p><span style="font-family: Comic Sans MS;">*第四阶段：数据库SQL基础，包括增删改查操作以及多表查询；&nbsp;</span></p><p><span style="font-family: Comic Sans MS;">*第五阶段：JDBC编程：包括JDBC原理，JDBC连接库，JDBC API，虽然现在Hibernate比JDBC要方便许多，但是JDBC技术仍然在使用，JDBC思想尤为重要；&nbsp;</span></p><p><span style="font-family: Comic Sans MS;">*第六阶段：JDBC深入理解高级特性：包括数据库连接池，存储过程，触发器，CRM思想；&nbsp;</span></p><p><span style="font-family: Comic Sans MS;">*第七阶段：HTML语言学习，包括HTML标签，表单标签以及CSS，这是Web应用开发的基础；&nbsp;</span></p><p><span style="font-family: Comic Sans MS;">*第八阶段：JavaScript脚本语言，包括javaScript语法和对象，就这两个方面的内容；&nbsp;</span></p><p><span style="font-family: Comic Sans MS;">*第九阶段：DOM编程，包括DOM原理，常用的DOM元素以及比较重要的DOM编程思想；&nbsp;</span></p><p><span style="font-family: Comic Sans MS;">*第十阶段：Servlet开发，从此开始踏入java开发的重要一步，包括XML，Tomcat服务器的安装使用操作，HTTP协议简单理解，Servlet API等，这个是java web开发的基础。&nbsp;</span></p><p><span style="font-family: Comic Sans MS;">*第十一阶段：JSP开发：JSP语法和标签，自定义标签，EL,JSTL库了解以及MVC三层架构的设计模式理念；&nbsp;</span></p><p><span style="font-family: Comic Sans MS;">*第十二阶段：AJAX开发：AJAX原理，请求响应处理，AJAX开发库；&nbsp;</span></p><p><span style="font-family: Comic Sans MS;">*第十三阶段：轻量级框架，三大框架之一Struts框架的学习，自此踏入java web开发的精华部分，包括Struts体系架构，各种组件，标签库和扩展性的学习；&nbsp;</span></p><p><span style="font-family: Comic Sans MS;">*第十四阶段：Hibernate框架学习，三大框架之一，包括检索映射技术，多表查询技术，缓存技术以及性能方面的优化；&nbsp;</span></p><p><span style="font-family: Comic Sans MS;">*第十五阶段：Spring框架的学习，三大框架之一，包括了IOC,AOP,DataSource，事务，SSH集成以及JPA集成；&nbsp;</span></p><span style="font-family: Comic Sans MS;">*最后呢，还有些java的技术，包括EJB3.0等，可以选择学习，与三大轻量级框架相比，EJB就是当之无愧的重量级了<br /><br /></span></div><img src ="http://www.blogjava.net/wilsonyq/aggbug/369933.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wilsonyq/" target="_blank">wilsonyq</a> 2012-02-14 13:45 <a href="http://www.blogjava.net/wilsonyq/articles/String.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ArrayList和 LinkedList区别</title><link>http://www.blogjava.net/wilsonyq/articles/ArrayList-LinkedList.html</link><dc:creator>wilsonyq</dc:creator><author>wilsonyq</author><pubDate>Wed, 08 Feb 2012 04:55:00 GMT</pubDate><guid>http://www.blogjava.net/wilsonyq/articles/ArrayList-LinkedList.html</guid><wfw:comment>http://www.blogjava.net/wilsonyq/comments/369587.html</wfw:comment><comments>http://www.blogjava.net/wilsonyq/articles/ArrayList-LinkedList.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wilsonyq/comments/commentRss/369587.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wilsonyq/services/trackbacks/369587.html</trackback:ping><description><![CDATA[<span style="font-family: Comic Sans MS;"> </span><p><span style="font-family: Comic Sans MS;">一般大家都知道ArrayList和LinkedList的大致区别： </span><br /> <span style="font-size: small; line-height: 1.5em; font-family: Comic Sans MS;">&nbsp;&nbsp;&nbsp;&nbsp;  1.ArrayList是实现了基于动态数组的数据结构，LinkedList基于链表的数据结构。</span> <br /> <span style="font-size: small; line-height: 1.5em; font-family: Comic Sans MS;">&nbsp;&nbsp;&nbsp;&nbsp;  2.对于随机访问get和set，ArrayList觉得优于LinkedList，因为LinkedList要移动指针。</span> <br /> <span style="font-size: small; line-height: 1.5em; font-family: Comic Sans MS;">&nbsp;&nbsp;&nbsp;&nbsp;  3.对于新增和删除操作add和remove，LinedList比较占优势，因为ArrayList要移动数据。</span> <br /> <br /> <span style="font-size: small; line-height: 1.5em; font-family: Comic Sans MS;">ArrayList和LinkedList 是两个集合  类，用于存储一系列的对象引用(references)。例如我们可以用ArrayList来存储一系列的String或者Integer。那么  ArrayList和LinkedList在性能上有什么差别呢？什么时候应该用ArrayList什么时候又该用LinkedList呢？</span></p> <p><br /> <span style="font-size: small; line-height: 1.5em; font-family: Comic Sans MS;"><strong>一．时间复 杂度</strong></span> <br /> <span style="font-size: small; line-height: 1.5em; font-family: Comic Sans MS;">首先一点关键的是，ArrayList的内 部实现是基于基础的对象数组的，因此，它使用get方法访问列表中的任意一个元素时 (random   access)，它的速度要比LinkedList快。LinkedList中的get方法是按照顺序从列表的一端开始检查，直到另外一端。对  LinkedList而言，访问列表中的某个指定元素没有更快的方法了。</span> <br /> <span style="font-size: small; line-height: 1.5em; font-family: Comic Sans MS;">假设我们有一个很大的列表，它里面的元素已 经排好序了，这个列表可能是ArrayList类型 的也可能是LinkedList类型的，现在我们对这个列表来进行二分查找(binary   search)，比较列表是ArrayList和LinkedList时的查询速度，看下面的程序：</span></p> <div> <div> <div><span style="font-family: Comic Sans MS;">Java代码</span></div> </div> <ol start="1"><li><span style="font-family: Comic Sans MS;">package&nbsp;com.mangocity.test;&nbsp;&nbsp;&nbsp;</span></li><li><span style="font-family: Comic Sans MS;">import&nbsp;java.util.LinkedList;&nbsp;&nbsp;&nbsp;</span></li><li><span style="font-family: Comic Sans MS;">import&nbsp;java.util.List;&nbsp;&nbsp;&nbsp;</span></li><li><span style="font-family: Comic Sans MS;">import&nbsp;java.util.Random;&nbsp;&nbsp;&nbsp;</span></li><li><span style="font-family: Comic Sans MS;">import&nbsp;java.util.ArrayList;&nbsp;&nbsp;&nbsp;</span></li><li><span style="font-family: Comic Sans MS;">import&nbsp;java.util.Arrays;&nbsp;&nbsp;&nbsp;</span></li><li><span style="font-family: Comic Sans MS;">import&nbsp;java.util.Collections;&nbsp;&nbsp;&nbsp;</span></li><li><span style="font-family: Comic Sans MS;">public&nbsp;class&nbsp;TestList&nbsp;...{&nbsp;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-family: Comic Sans MS;">public&nbsp;static&nbsp;final&nbsp;int&nbsp;N=50000;&nbsp;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-family: Comic Sans MS;">public&nbsp;static&nbsp;List&nbsp;values;&nbsp;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-family: Comic Sans MS;">static...{&nbsp;&nbsp;&nbsp;</span></li><li><span style="font-family: Comic Sans MS;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Integer&nbsp;vals[]=</span><span style="font-family: Comic Sans MS;">new&nbsp;Integer[N];&nbsp;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;</li><li><span style="font-family: Comic Sans MS;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Random&nbsp;r=</span><span style="font-family: Comic Sans MS;">new&nbsp;Random();&nbsp;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-family: Comic Sans MS;">for(int&nbsp;i=0,currval=0;i&lt;N;i++)...{&nbsp;&nbsp;&nbsp;</span></li><li><span style="font-family: Comic Sans MS;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vals=</span><span style="font-family: Comic Sans MS;">new&nbsp;Integer(currval);&nbsp;&nbsp;&nbsp;</span></li><li><span style="font-family: Comic Sans MS;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;currval+=r.nextInt(</span><span style="font-family: Comic Sans MS;">100)+1;&nbsp;&nbsp;&nbsp;</span></li><li><span style="font-family: Comic Sans MS;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;</li><li><span style="font-family: Comic Sans MS;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;values=Arrays.asList(vals);&nbsp;&nbsp;&nbsp;</span></li><li><span style="font-family: Comic Sans MS;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-family: Comic Sans MS;">static&nbsp;long&nbsp;timeList(List&nbsp;lst)...{&nbsp;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-family: Comic Sans MS;">long&nbsp;start=System.currentTimeMillis();&nbsp;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-family: Comic Sans MS;">for(int&nbsp;i=0;i&lt;N;i++)...{&nbsp;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-family: Comic Sans MS;">int&nbsp;index=Collections.binarySearch(lst,&nbsp;values.get(i));&nbsp;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-family: Comic Sans MS;">if(index!=i)&nbsp;&nbsp;&nbsp;</span></li><li><span style="font-family: Comic Sans MS;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="font-family: Comic Sans MS;">"***错误***");&nbsp;&nbsp;&nbsp;</span></li><li><span style="font-family: Comic Sans MS;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-family: Comic Sans MS;">return&nbsp;System.currentTimeMillis()-start;&nbsp;&nbsp;&nbsp;</span></li><li><span style="font-family: Comic Sans MS;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-family: Comic Sans MS;">public&nbsp;static&nbsp;void&nbsp;main(String&nbsp;args[])...{&nbsp;&nbsp;&nbsp;</span></li><li><span style="font-family: Comic Sans MS;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="font-family: Comic Sans MS;">"ArrayList消耗时间："+timeList(new&nbsp;ArrayList(values)));&nbsp;&nbsp;&nbsp;</span></li><li><span style="font-family: Comic Sans MS;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="font-family: Comic Sans MS;">"LinkedList消耗时间："+timeList(new&nbsp;LinkedList(values)));&nbsp;&nbsp;&nbsp;</span></li><li><span style="font-family: Comic Sans MS;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;</span></li><li><span style="font-family: Comic Sans MS;">}&nbsp;&nbsp;&nbsp;</span></li></ol> </div>  <p>&nbsp;<br /> <span style="font-size: small; line-height: 1.5em; font-family: Comic Sans MS;">我得到的输出 是：ArrayList消耗时间：15 </span><br /> <span style="font-size: small; line-height: 1.5em; font-family: Comic Sans MS;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LinkedList消耗时间：2596 </span><br /> <span style="font-size: small; line-height: 1.5em; font-family: Comic Sans MS;">这个结果不是固定的，但是基本上 ArrayList的  时间要明显小于LinkedList的时间。因此在这种情况下不宜用LinkedList。二分查找法使用的随机访问(random   access)策略，而LinkedList是不支持快速的随机访问的。对一个LinkedList做随机访问所消耗的时间与这个list的大小是成比例  的。而相应的，在ArrayList中进行随机访问所消耗的时间是固定的。 </span><br /> <span style="font-size: small; line-height: 1.5em; font-family: Comic Sans MS;">这是否表明ArrayList总是比 LinkedList性能要好呢？这并不一定，在某些情况  下LinkedList的表现要优于ArrayList，有些算法在LinkedList中实现时效率更高。比方说，利用  Collections.reverse方法对列表进行反转时，其性能就要好些。 </span><br /> <span style="font-size: small; line-height: 1.5em;"><span style="font-size: small; line-height: 1.5em; font-family: Comic Sans MS;">看这样一个例子，加入我们有一个列表，要对其进行大量的插入和删除操作，在这种情况下 LinkedList就是一个较好的选择。请看如下一个极端的例子，我们重复的在一个列表的开端插入一个元素：</span> </span><br /> <span style="font-size: small; line-height: 1.5em;"> </span></p><div> <div> <div><span style="font-family: Comic Sans MS;">Java代码</span></div> </div> <ol start="1"><li><span style="font-family: Comic Sans MS;">package&nbsp;com.mangocity.test;&nbsp;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;</li><li><span style="font-family: Comic Sans MS;">import&nbsp;java.util.*;&nbsp;&nbsp;&nbsp;</span></li><li><span style="font-family: Comic Sans MS;">public&nbsp;class&nbsp;ListDemo&nbsp;{&nbsp;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-family: Comic Sans MS;">static&nbsp;final&nbsp;int&nbsp;N=50000;&nbsp;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-family: Comic Sans MS;">static&nbsp;long&nbsp;timeList(List&nbsp;list){&nbsp;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-family: Comic Sans MS;">long&nbsp;start=System.currentTimeMillis();&nbsp;&nbsp;&nbsp;</span></li><li><span style="font-family: Comic Sans MS;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;o&nbsp;=&nbsp;</span><span style="font-family: Comic Sans MS;">new&nbsp;Object();&nbsp;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-family: Comic Sans MS;">for(int&nbsp;i=0;i&lt;N;i++)&nbsp;&nbsp;&nbsp;</span></li><li><span style="font-family: Comic Sans MS;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list.add(</span><span style="font-family: Comic Sans MS;">0,&nbsp;o);&nbsp;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-family: Comic Sans MS;">return&nbsp;System.currentTimeMillis()-start;&nbsp;&nbsp;&nbsp;</span></li><li><span style="font-family: Comic Sans MS;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-family: Comic Sans MS;">public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args)&nbsp;{&nbsp;&nbsp;&nbsp;</span></li><li><span style="font-family: Comic Sans MS;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="font-family: Comic Sans MS;">"ArrayList耗时："+timeList(new&nbsp;ArrayList()));&nbsp;&nbsp;&nbsp;</span></li><li><span style="font-family: Comic Sans MS;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="font-family: Comic Sans MS;">"LinkedList耗时："+timeList(new&nbsp;LinkedList()));&nbsp;&nbsp;&nbsp;</span></li><li><span style="font-family: Comic Sans MS;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;</span></li><li><span style="font-family: Comic Sans MS;">}&nbsp;&nbsp;&nbsp;</span></li></ol> </div>   <p><span style="font-family: Comic Sans MS;">&nbsp;这时我的输出结果是：ArrayList耗时：2463</span></p>  <p><br /> <span style="font-size: small; line-height: 1.5em; font-family: Comic Sans MS;">&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; LinkedList耗时：15</span> <br /> <span style="font-size: small; line-height: 1.5em; font-family: Comic Sans MS;">这和前面一个例子的结果截然相反，当一个元 素被加到ArrayList的最开端时，所有已经存在的元素都会后  移，这就意味着数据移动和复制上的开销。相反的，将一个元素加到LinkedList的最开端只是简单的未这个元素分配一个记录，然后调整两个连接。在  LinkedList的开端增加一个元素的开销是固定的，而在ArrayList的开端增加一个元素的开销是与ArrayList的大小成比例的。</span></p> <p><br /> <span style="font-size: small; line-height: 1.5em; font-family: Comic Sans MS;"><strong>二．空间复 杂度</strong></span> <br /> <span style="font-size: small; line-height: 1.5em; font-family: Comic Sans MS;">在LinkedList中有一个私有的内部类，定义如下：</span></p> <div> <div> <div><span style="font-family: Comic Sans MS;">Java代码</span></div> </div> <ol start="1"><li><span style="font-family: Comic Sans MS;">private&nbsp;static&nbsp;class&nbsp;Entry&nbsp;{&nbsp;&nbsp;&nbsp;</span></li><li><span style="font-family: Comic Sans MS;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;element;&nbsp;&nbsp;&nbsp;</span></li><li><span style="font-family: Comic Sans MS;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Entry&nbsp;next;&nbsp;&nbsp;&nbsp;</span></li><li><span style="font-family: Comic Sans MS;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Entry&nbsp;previous;&nbsp;&nbsp;&nbsp;</span></li><li><span style="font-family: Comic Sans MS;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;</span></li></ol> </div>  <p>&nbsp;<br /> <span style="font-size: small; line-height: 1.5em; font-family: Comic Sans MS;">每个Entry对象  reference列表中的一个元素，同时还有在LinkedList中它的上一个元素和下一个元素。一个有1000个元素的LinkedList对象将   有1000个链接在一起的Entry对象，每个对象都对应于列表中的一个元素。这样的话，在一个LinkedList结构中将有一个很大的空间开销，因为  它要存储这1000个Entity对象的相关信息。</span> <br /> <span style="font-size: small; line-height: 1.5em; font-family: Comic Sans MS;">ArrayList使用一个内置的数组来存 储元素，这个数组的起始容量是10.当数组需要增长时，新的容量按  如下公式获得：新容量=(旧容量*3)/2+1，也就是说每一次容量大概会增长50%。这就意味着，如果你有一个包含大量元素的ArrayList对象，   那么最终将有很大的空间会被浪费掉，这个浪费是由ArrayList的工作方式本身造成的。如果没有足够的空间来存放新的元素，数组将不得不被重新进行分   配以便能够增加新的元素。对数组进行重新分配，将会导致性能急剧下降。如果我们知道一个ArrayList将会有多少个元素，我们可以通过构造方法来指定  容量。我们还可以通过trimToSize方法在ArrayList分配完毕之后去掉浪费掉的空间。</span></p> <p><br /> <span style="font-size: small; line-height: 1.5em; font-family: Comic Sans MS;">三．总结</span> <br /> <span style="font-size: small; line-height: 1.5em; font-family: Comic Sans MS;">ArrayList和LinkedList在性能上各 有优缺点，都有各自所适用的地方，总的说来可以描述如下：</span> <br /> <span style="font-size: small; line-height: 1.5em; font-family: Comic Sans MS;">1．对ArrayList和 LinkedList而言，在列表末尾增加一个元素所花的开销都是固定的。对  ArrayList而言，主要是在内部数组中增加一项，指向所添加的元素，偶尔可能会导致对数组重新进行分配；而对LinkedList而言，这个开销是  统一的，分配一个内部Entry对象。</span></p> <p><br /> <span style="font-size: small; line-height: 1.5em; font-family: Comic Sans MS;">2．在ArrayList的 中间插入或删除一个元素意味着这个列表中剩余的元素都会被移动；而在LinkedList的中间插入或删除一个元素的开销是固定的。</span></p> <p><br /> <span style="font-size: small; line-height: 1.5em; font-family: Comic Sans MS;">3．LinkedList不 支持高效的随机元素访问。</span></p> <p><br /> <span style="font-size: small; line-height: 1.5em; font-family: Comic Sans MS;">4．ArrayList的空 间浪费主要体现在在list列表的结尾预留一定的容量空间，而LinkedList的空间花费则体现在它的每一个元素都需要消耗相当的空间</span></p> <p><br /> <span style="font-size: small; line-height: 1.5em; font-family: Comic Sans MS;">可以这样说：当操作是在一列 数据的后面添加数据而不是在前面或中间,并且需要随机地访问其中的元素时,使用ArrayList会提供比较好的性能；当你的操作是在一列数据的前面或中 间添加或删除数据,并且按照顺序访问其中的元素时,就应该使用LinkedList了。</span></p><img src ="http://www.blogjava.net/wilsonyq/aggbug/369587.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wilsonyq/" target="_blank">wilsonyq</a> 2012-02-08 12:55 <a href="http://www.blogjava.net/wilsonyq/articles/ArrayList-LinkedList.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java Collection 关系</title><link>http://www.blogjava.net/wilsonyq/articles/Collection.html</link><dc:creator>wilsonyq</dc:creator><author>wilsonyq</author><pubDate>Wed, 08 Feb 2012 02:53:00 GMT</pubDate><guid>http://www.blogjava.net/wilsonyq/articles/Collection.html</guid><wfw:comment>http://www.blogjava.net/wilsonyq/comments/369582.html</wfw:comment><comments>http://www.blogjava.net/wilsonyq/articles/Collection.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wilsonyq/comments/commentRss/369582.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wilsonyq/services/trackbacks/369582.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;只有注册用户登录后才能阅读该文。<a href='http://www.blogjava.net/wilsonyq/articles/Collection.html'>阅读全文</a><img src ="http://www.blogjava.net/wilsonyq/aggbug/369582.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wilsonyq/" target="_blank">wilsonyq</a> 2012-02-08 10:53 <a href="http://www.blogjava.net/wilsonyq/articles/Collection.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>