﻿<?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/longbow/category/2029.html</link><description>Make it work, make it right, make it fast and make it open。</description><language>zh-cn</language><lastBuildDate>Wed, 28 Feb 2007 04:12:23 GMT</lastBuildDate><pubDate>Wed, 28 Feb 2007 04:12:23 GMT</pubDate><ttl>60</ttl><item><title>String pool</title><link>http://www.blogjava.net/Longbow/archive/2005/07/15/7742.html</link><dc:creator>Java求索</dc:creator><author>Java求索</author><pubDate>Fri, 15 Jul 2005 01:31:00 GMT</pubDate><guid>http://www.blogjava.net/Longbow/archive/2005/07/15/7742.html</guid><wfw:comment>http://www.blogjava.net/Longbow/comments/7742.html</wfw:comment><comments>http://www.blogjava.net/Longbow/archive/2005/07/15/7742.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/Longbow/comments/commentRss/7742.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Longbow/services/trackbacks/7742.html</trackback:ping><description><![CDATA[<FONT face=Verdana size=2>今天写代码涉及到大量的String操作，突然间想起一些关于String与其它class的不同之处，我是我以前在一篇文章上看到的，具体出处实在记不得了，现在加上一点儿自己的理解记录下来，以作备忘。<BR><BR>String的特殊之处就是它可以像int等简单类型一样，使用“=”来生成一个Object，而不必用<STRONG><FONT style="BACKGROUND-COLOR: #ffffff" color=#000080>new</FONT></STRONG>这个关键字，为什么呢？先来看下面的代码：<BR>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #000000">import&nbsp;junit.framework.TestCase;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><BR><IMG id=Codehighlighter1_79_516_Open_Image onclick="this.style.display='none'; Codehighlighter1_79_516_Open_Text.style.display='none'; Codehighlighter1_79_516_Closed_Image.style.display='inline'; Codehighlighter1_79_516_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_79_516_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_79_516_Closed_Text.style.display='none'; Codehighlighter1_79_516_Open_Image.style.display='inline'; Codehighlighter1_79_516_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000">&nbsp;TestStringPool&nbsp;extends&nbsp;TestCase&nbsp;</SPAN><SPAN id=Codehighlighter1_79_516_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_79_516_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">private</SPAN><SPAN style="COLOR: #000000">&nbsp;String&nbsp;string1;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">private</SPAN><SPAN style="COLOR: #000000">&nbsp;String&nbsp;string2;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG id=Codehighlighter1_166_222_Open_Image onclick="this.style.display='none'; Codehighlighter1_166_222_Open_Text.style.display='none'; Codehighlighter1_166_222_Closed_Image.style.display='inline'; Codehighlighter1_166_222_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_166_222_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_166_222_Closed_Text.style.display='none'; Codehighlighter1_166_222_Open_Image.style.display='inline'; Codehighlighter1_166_222_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">protected</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;setUp()&nbsp;</SPAN><SPAN id=Codehighlighter1_166_222_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_166_222_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string1&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">abc</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string2&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">abc</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG id=Codehighlighter1_258_304_Open_Image onclick="this.style.display='none'; Codehighlighter1_258_304_Open_Text.style.display='none'; Codehighlighter1_258_304_Closed_Image.style.display='inline'; Codehighlighter1_258_304_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_258_304_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_258_304_Closed_Text.style.display='none'; Codehighlighter1_258_304_Open_Image.style.display='inline'; Codehighlighter1_258_304_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;testStringPool()&nbsp;</SPAN><SPAN id=Codehighlighter1_258_304_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_258_304_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assertTrue(string1&nbsp;</SPAN><SPAN style="COLOR: #000000">==</SPAN><SPAN style="COLOR: #000000">&nbsp;string2);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG id=Codehighlighter1_339_514_Open_Image onclick="this.style.display='none'; Codehighlighter1_339_514_Open_Text.style.display='none'; Codehighlighter1_339_514_Closed_Image.style.display='inline'; Codehighlighter1_339_514_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_339_514_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_339_514_Closed_Text.style.display='none'; Codehighlighter1_339_514_Open_Image.style.display='inline'; Codehighlighter1_339_514_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;testNewString()&nbsp;</SPAN><SPAN id=Codehighlighter1_339_514_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_339_514_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string1&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(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">abc</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string2&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(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">abc</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assertFalse(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">The&nbsp;objects&nbsp;don't&nbsp;use&nbsp;the&nbsp;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">string</SPAN><SPAN style="COLOR: #000000">&nbsp;pool</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">,&nbsp;string1&nbsp;==&nbsp;string2);</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</SPAN></SPAN></DIV></DIV></FONT>
<P><FONT face=Verdana><FONT size=2><SPAN style="FONT-SIZE: 9pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">这里用到了</SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana">JUnit</SPAN><SPAN style="FONT-SIZE: 9pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">，用来测试</SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana">String pool</SPAN><SPAN style="FONT-SIZE: 9pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana"></SPAN></FONT></FONT></P>
<P><FONT face=Verdana size=2></FONT>
<P><FONT face=Verdana><FONT size=2><SPAN style="FONT-SIZE: 9pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">第一个测试，说明两个</SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana">String</SPAN><SPAN style="FONT-SIZE: 9pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">是同一个</SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana">Object</SPAN><SPAN style="FONT-SIZE: 9pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">，（</SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana">==</SPAN><SPAN style="FONT-SIZE: 9pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">就是用来比较</SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana">object</SPAN><SPAN style="FONT-SIZE: 9pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana">reference</SPAN><SPAN style="FONT-SIZE: 9pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">）。而第二个测试则说明两个</SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana">String Object</SPAN><SPAN style="FONT-SIZE: 9pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">不同。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana"></SPAN></FONT></FONT></P>
<P><FONT face=Verdana size=2></FONT>
<P><FONT face=Verdana><FONT size=2><SPAN style="FONT-SIZE: 9pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">众所周知，</SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana"><a title="" href="http://java.sun.com" >Java</a></SPAN><SPAN style="FONT-SIZE: 9pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana">String</SPAN><SPAN style="FONT-SIZE: 9pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">是<SPAN class=postbody>不可改变的字符串对象。为了提高效率，</SPAN></SPAN><SPAN class=postbody><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana"><a title="" href="http://java.sun.com" >Java</a></SPAN></SPAN><SPAN class=postbody><SPAN style="FONT-SIZE: 9pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">为</SPAN></SPAN><SPAN class=postbody><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana">String</SPAN></SPAN><SPAN class=postbody><SPAN style="FONT-SIZE: 9pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">类提供了串池(String pool)。正如大家所看到的那样，在第一个</SPAN></SPAN><SPAN class=postbody><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana">test</SPAN></SPAN><SPAN class=postbody><SPAN style="FONT-SIZE: 9pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">中就使用了串池。当你重新声明一个</SPAN></SPAN><SPAN class=postbody><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana">String</SPAN></SPAN><SPAN class=postbody><SPAN style="FONT-SIZE: 9pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">型变量为</SPAN></SPAN><SPAN class=postbody><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana">abc</SPAN></SPAN><SPAN class=postbody><SPAN style="FONT-SIZE: 9pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">时，将使用串池里原来的那个</SPAN></SPAN><SPAN class=postbody><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana">abc</SPAN></SPAN><SPAN class=postbody><SPAN style="FONT-SIZE: 9pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">，而不重新分配内存，也就是说，</SPAN></SPAN><SPAN class=postbody><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana">string2</SPAN></SPAN><SPAN class=postbody><SPAN style="FONT-SIZE: 9pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">与</SPAN></SPAN><SPAN class=postbody><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana">string1</SPAN></SPAN><SPAN class=postbody><SPAN style="FONT-SIZE: 9pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">将会指向同一块内存。所以结果为</SPAN></SPAN><SPAN class=postbody><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana">true</SPAN></SPAN><SPAN class=postbody><SPAN style="FONT-SIZE: 9pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">。在</SPAN></SPAN><SPAN class=postbody><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana">第二个test case</SPAN></SPAN><SPAN class=postbody><SPAN style="FONT-SIZE: 9pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">中使用了普通对象的声明方式，系统将会为</SPAN></SPAN><SPAN class=postbody><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana">string1</SPAN></SPAN><SPAN class=postbody><SPAN style="FONT-SIZE: 9pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">和</SPAN></SPAN><SPAN class=postbody><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana">string2</SPAN></SPAN><SPAN class=postbody><SPAN style="FONT-SIZE: 9pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">各分配一块内存。所以结果为</SPAN></SPAN><SPAN class=postbody><SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana">false</SPAN></SPAN><SPAN class=postbody><SPAN style="FONT-SIZE: 9pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">。</SPAN><SPAN lang=EN-US></SPAN></SPAN></FONT></FONT></P>
<P><FONT face=Verdana size=2></FONT>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Tahoma; mso-bidi-font-family: 'Times New Roman'"><FONT face=Verdana size=2></FONT></SPAN>
<P><FONT face=Verdana size=2></FONT></P>
<P><FONT face=Verdana size=2>&nbsp;结论：我们比较两个String的值，最好用equals()方法，而最好不要使用==。这就避免了一些不必要的麻烦。另外，声明String的时候，最好用=，这样就可以体现String pool的作用了。</FONT></P><img src ="http://www.blogjava.net/Longbow/aggbug/7742.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Longbow/" target="_blank">Java求索</a> 2005-07-15 09:31 <a href="http://www.blogjava.net/Longbow/archive/2005/07/15/7742.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>windows IP影射</title><link>http://www.blogjava.net/Longbow/archive/2005/07/06/7216.html</link><dc:creator>Java求索</dc:creator><author>Java求索</author><pubDate>Wed, 06 Jul 2005 09:50:00 GMT</pubDate><guid>http://www.blogjava.net/Longbow/archive/2005/07/06/7216.html</guid><wfw:comment>http://www.blogjava.net/Longbow/comments/7216.html</wfw:comment><comments>http://www.blogjava.net/Longbow/archive/2005/07/06/7216.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/Longbow/comments/commentRss/7216.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Longbow/services/trackbacks/7216.html</trackback:ping><description><![CDATA[<P><FONT face=Verdana size=2>维护一个J2EE项目，经常需要修改client端所连接的server. 最麻烦的就是每次都需要把client里面的所有的config和properties文件里的IP地址改一遍。如果不小心忘掉几个，就会出现一些意想不到的错误。如果要避免这种麻烦的事情，可以用windows IP影射。</FONT></P>
<P><FONT face=Verdana size=2>具体方法：</FONT></P>
<P><FONT face=Verdana size=2>在windows安装目录修改\system32\drivers\etc\hosts:文件</FONT></P>
<P><FONT face=Verdana size=2>在文件里加上例如这样的字段</FONT></P>
<P><FONT face=Verdana size=2>123.456.0.1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; abcde</FONT></P>
<P><FONT face=Verdana size=2>前面一段为IP地址，后面为一个任意的server名字，可以是任意的字符串。然后，在所有的属性文件里使用这个名字。以后再想更改server，就只需要修改hosts文件就行了。</FONT></P><img src ="http://www.blogjava.net/Longbow/aggbug/7216.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Longbow/" target="_blank">Java求索</a> 2005-07-06 17:50 <a href="http://www.blogjava.net/Longbow/archive/2005/07/06/7216.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于Generics的一点儿理解</title><link>http://www.blogjava.net/Longbow/archive/2005/07/06/7201.html</link><dc:creator>Java求索</dc:creator><author>Java求索</author><pubDate>Wed, 06 Jul 2005 07:57:00 GMT</pubDate><guid>http://www.blogjava.net/Longbow/archive/2005/07/06/7201.html</guid><wfw:comment>http://www.blogjava.net/Longbow/comments/7201.html</wfw:comment><comments>http://www.blogjava.net/Longbow/archive/2005/07/06/7201.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/Longbow/comments/commentRss/7201.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Longbow/services/trackbacks/7201.html</trackback:ping><description><![CDATA[<P><FONT face=Verdana size=2>JDK5.0已经release很久了，但一直没机会好好学习一下，今天可有机会了。</FONT></P>
<P><FONT face=Verdana size=2>先来看一段代码：<BR></P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000">&nbsp;TestDate&nbsp;{<BR><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)&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Date&nbsp;date&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;Date();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;</SPAN><SPAN style="COLOR: #0000ff">object</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;Object();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Timestamp&nbsp;stamp&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;Timestamp(date.getTime());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.</SPAN><SPAN style="COLOR: #0000ff">out</SPAN><SPAN style="COLOR: #000000">.println(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">date&amp;stamp:</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000">&nbsp;date.compareTo(stamp));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.</SPAN><SPAN style="COLOR: #0000ff">out</SPAN><SPAN style="COLOR: #000000">.println(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">stamp&amp;date:</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000">&nbsp;stamp.compareTo(date));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.</SPAN><SPAN style="COLOR: #0000ff">out</SPAN><SPAN style="COLOR: #000000">.println(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">date&amp;object:</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000">&nbsp;date.compareTo(</SPAN><SPAN style="COLOR: #0000ff">object</SPAN><SPAN style="COLOR: #000000">));<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>}</SPAN></DIV></DIV>
<P><BR></P></FONT>
<P><FONT face=Verdana color=#000000 size=2>这段代码看上去很普通，但是如果用1.4和1.5分别编译就会出现不同的结果。先来说用1.4编译的情况：首先用1.4编译，编译器不会报错，如果运行的话，前面两个输出语句会分别打印“0，0”，而第三个会throw一个ClassCast exception. 因为Date不能与object比较，但是为什么能编译通过呢？察看JDK源代码就可以知道了，Date实现了Comparable接口，这个接口中的CompareTo()方法的参数就是Object。所以Date也不得不有一个以Object为参数的CompareTo()方法，但是这个方法是没有意义的，Date应该与Date比较，所以Date这个Class里面就出现了两个ComparaTo方法，一个是以Date为参数，另一个是以Object为参数，这是1.4以前，不得不采用的方法。不然Date就没法实现Comparable接口了。</FONT></P>
<P><FONT face=Verdana size=2>JDK1.5中Generics的出现解决了这个问题，如果看1.5中Date类的源代码的话，就会发现它只有一个CompareTo()方法了，那它怎么来实现Comparable接口呢，这就是Generics的功劳了。在Date声明时，实现Comparable接口是这么写的：...Comparable<DATE />...，并且Comparable接口的声明是这样的：Comparable<T />。这个T代表Type。它可以是任何Object。Comparable的实现类只要说明T是什么具体类型就可以了。因此，Date就可以只有一个CompareTo()方法，又可以实现Comparable接口了。如果用1.5编译上面的Code的话，就会发现这段Code是不能编译通过的，编译器会提示“Severity&nbsp;Description&nbsp;Resource&nbsp;In Folder&nbsp;Location&nbsp;Creation Time 2&nbsp;The method compareTo(Date) in the type Date is not applicable for the arguments (Object)”，这就避免了1.4中出现的问题。我想如果使用了1.5以后咱们编写代码时，出现ClassCastException的几率就会很小了，因为编译器会替你发现这样的错误。</FONT></P>
<P><FONT face=Verdana size=2>这就是Generics的好处了。</FONT></P>
<P><FONT face=Verdana size=2>但是还有一点值得考虑，如果我们去掉错误的那一行代码，在1.5中编译然后运行，会发现还有地方与1.4的不同。第一行输出语句会打印1，而不是0，这说明1.5认为具有相同时间的timestamp和date是不同的，但1.4认为它们相同。我有看了一下1.5和1.4的源代码，发现它们CompareTo(Date ...)的实现方法是不一样的，可能问题就出现在这里。我没有试着去读它的代码，等有时间，一定好好研究一下。</FONT></P>
<P><FONT face=Verdana size=2>最后，还有一个问题，如果用1.5编译并运行，会throw一个ClassCastException，而用1.4则不会出现这个问题。我想这是因为timestamp继承了Date的CompareTo()方法，所以一个timestamp就可以与Date比较了，但是应用了Generics以后这种情况是不允许的，而且代码也没有特殊处理，因此就会有Exception了。看来Generics也会带来一些其他的问题。</FONT></P>
<P><FONT face=Verdana size=2>我想这种情况是可以避免的，原则就是只比较具有相同类型的两个对象，而不与其父类或子类比较。如果必须比较的话，也应该用相应的方法转化为相同的类，再进行比较。</FONT></P><img src ="http://www.blogjava.net/Longbow/aggbug/7201.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Longbow/" target="_blank">Java求索</a> 2005-07-06 15:57 <a href="http://www.blogjava.net/Longbow/archive/2005/07/06/7201.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>