﻿<?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-挨踢step by step-文章分类-Java转贴</title><link>http://www.blogjava.net/aaronjin/category/17048.html</link><description>宁可挨踢，不可露怯。知耻而后勇！</description><language>zh-cn</language><lastBuildDate>Wed, 28 Feb 2007 04:19:51 GMT</lastBuildDate><pubDate>Wed, 28 Feb 2007 04:19:51 GMT</pubDate><ttl>60</ttl><item><title>Java程序中将数据写入注册表的方法</title><link>http://www.blogjava.net/aaronjin/articles/80170.html</link><dc:creator>AaronJin</dc:creator><author>AaronJin</author><pubDate>Thu, 09 Nov 2006 07:40:00 GMT</pubDate><guid>http://www.blogjava.net/aaronjin/articles/80170.html</guid><wfw:comment>http://www.blogjava.net/aaronjin/comments/80170.html</wfw:comment><comments>http://www.blogjava.net/aaronjin/articles/80170.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/aaronjin/comments/commentRss/80170.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/aaronjin/services/trackbacks/80170.html</trackback:ping><description><![CDATA[
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">我们经常需要将我们的程序中的设定，如窗口位置，开启过的文件，用户的选项设定等数据记录下来，以做便用户下一次开启程序能继续使用这些数据。 <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />以前我们通常的做法是使用Properties类，它提供以下方法: <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">void</span>
				<span style="COLOR: #000000"> load(InputStream inStream) <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">void</span>
				<span style="COLOR: #000000"> store(OutputStream out, String header) <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />String getProperty(String key, String defaultValue) <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />String getProperty(String key) <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />这些方法让我们很容易的存取设定数据。<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />另外的办法是使用ResourceBundle这个类来储存设定数据，甚至有些程序作者使用一个自定结构的文件来储存设定数据。 <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />   现在好了，JDK1.4为我们提供的java.util.prefs包，为我们提供了另一种选择，里面有一个Preferences类，能让以上的工作变得极其轻松</span>
				<span style="COLOR: #000000">!</span>
				<span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    写VB程序的人常常用SaveSetting函数和getSettging来存取注册表中的用户设定数据。而Java的Preferences类也提供了类似的机制。 <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />Preferences类在不同的平台中有不同的实现方式。而在Windows平台中，Preferences是将数据保存在注册表中的，而在其它平台中的实现我就不得而知了(我对Linux等系统都不太了解). <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />但不管怎样，都是通过相同的接口来使用的，程序作者可以不管实现细节。 <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />一、建立Preferences对象 <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />为了区分不同的应用程序的参数项，在建立Preferences时要指定一个节点路径。 <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />Preferences是一个抽象类，提供了一系列静态方法和抽象方法来操作参数项: <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />抽象方法: <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />Preferences userData </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> Preferences.userNodeForPackage(</span>
				<span style="COLOR: #0000ff">this</span>
				<span style="COLOR: #000000">); <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />Preferences sysData </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> Preferences.systemNodeForPackage(</span>
				<span style="COLOR: #0000ff">this</span>
				<span style="COLOR: #000000">); <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />这两个方法是从指定的类所在的包(</span>
				<span style="COLOR: #0000ff">package</span>
				<span style="COLOR: #000000">)返回一个节点路径，如this是javax.swing.JComponent,则返回</span>
				<span style="COLOR: #000000">/</span>
				<span style="COLOR: #000000">javax</span>
				<span style="COLOR: #000000">/</span>
				<span style="COLOR: #000000">swing <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />静态方法: <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />Preferences userData </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> Preferences.userRoot().node(</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">/com/sunway/spc</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">); <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />Preferences sysData </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> Preferences.systemRoot().node(</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">/com/sunway/spc</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">); <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />以上每种方式提供了两套操作方法。其中一套是用户参数项，另一套是系统参数项。 <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />在Windows平台中，用户参数项在注册表中的根节点是：<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />HKEY_CURRENT_USER\Software\JavaSoft\Prefs <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />系统参数项在注册表中的根节点是：<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Prefs <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />而我们指定的节点路径是位于这些根节点之下的. <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />二、如何读写数据 <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />Preferences提供了多种类型数据的读写方法。 先来看写(put)的方法：<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />put(String key, String value) <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />putBoolean(String key, </span>
				<span style="COLOR: #0000ff">boolean</span>
				<span style="COLOR: #000000"> value) <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />putByteArray(String key, </span>
				<span style="COLOR: #0000ff">byte</span>
				<span style="COLOR: #000000"> value[]) <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />putDouble(String key, </span>
				<span style="COLOR: #0000ff">double</span>
				<span style="COLOR: #000000"> value) <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />putFloat(String key, </span>
				<span style="COLOR: #0000ff">float</span>
				<span style="COLOR: #000000"> value) <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />putInt(String key, </span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000"> value) <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />putLong(String key, </span>
				<span style="COLOR: #0000ff">long</span>
				<span style="COLOR: #000000"> value) <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />下面的是读(get)的方法, <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />get(String key, String </span>
				<span style="COLOR: #0000ff">default</span>
				<span style="COLOR: #000000">) <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />getBoolean(String key, </span>
				<span style="COLOR: #0000ff">boolean</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">default</span>
				<span style="COLOR: #000000">) <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />getByteArray(String key, </span>
				<span style="COLOR: #0000ff">byte</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">default</span>
				<span style="COLOR: #000000">[]) <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />getDouble(String key, </span>
				<span style="COLOR: #0000ff">double</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">default</span>
				<span style="COLOR: #000000">) <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />getFloat(String key, </span>
				<span style="COLOR: #0000ff">float</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">default</span>
				<span style="COLOR: #000000">) <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />getInt(String key, </span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">default</span>
				<span style="COLOR: #000000">) <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />getLong(String key, </span>
				<span style="COLOR: #0000ff">long</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">default</span>
				<span style="COLOR: #000000">) <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />注意，每一种get方法的第二个参数需要我们为它指定缺省的参数。 <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />除了以上方式之外，Preferences还允许我们将它的数据导出到一个XML文件保存：<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">void</span>
				<span style="COLOR: #000000"> exportNode(OutputStream os) <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">void</span>
				<span style="COLOR: #000000"> exportSubtree(OutputStream os) <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />我们可以导出一个节点，或是导出整个子节点树。<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />三、Preferences的一个演示 <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />以上的讲解足可以写一个示例来看看Preferences是如何为我们工作的,看看下面的例子: <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">import</span>
				<span style="COLOR: #000000"> java.io.</span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">import</span>
				<span style="COLOR: #000000"> java.util.prefs.</span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img id="Codehighlighter1_2221_3037_Open_Image" onclick="this.style.display='none'; Codehighlighter1_2221_3037_Open_Text.style.display='none'; Codehighlighter1_2221_3037_Closed_Image.style.display='inline'; Codehighlighter1_2221_3037_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_2221_3037_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_2221_3037_Closed_Text.style.display='none'; Codehighlighter1_2221_3037_Open_Image.style.display='inline'; Codehighlighter1_2221_3037_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"> </span>
				<span style="COLOR: #0000ff">class</span>
				<span style="COLOR: #000000"> PrefsDemo </span>
				<span id="Codehighlighter1_2221_3037_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_2221_3037_Open_Text">
						<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  </span>
						<span style="COLOR: #0000ff">public</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">static</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">void</span>
						<span style="COLOR: #000000"> main(String args[])<br /><img id="Codehighlighter1_2266_3035_Open_Image" onclick="this.style.display='none'; Codehighlighter1_2266_3035_Open_Text.style.display='none'; Codehighlighter1_2266_3035_Closed_Image.style.display='inline'; Codehighlighter1_2266_3035_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_2266_3035_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_2266_3035_Closed_Text.style.display='none'; Codehighlighter1_2266_3035_Open_Image.style.display='inline'; Codehighlighter1_2266_3035_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />  </span>
						<span id="Codehighlighter1_2266_3035_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_2266_3035_Open_Text">
								<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    String keys[] </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000">
										<br />
										<img id="Codehighlighter1_2294_2324_Open_Image" onclick="this.style.display='none'; Codehighlighter1_2294_2324_Open_Text.style.display='none'; Codehighlighter1_2294_2324_Closed_Image.style.display='inline'; Codehighlighter1_2294_2324_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
										<img id="Codehighlighter1_2294_2324_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_2294_2324_Closed_Text.style.display='none'; Codehighlighter1_2294_2324_Open_Image.style.display='inline'; Codehighlighter1_2294_2324_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />      </span>
								<span id="Codehighlighter1_2294_2324_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_2294_2324_Open_Text">
										<span style="COLOR: #000000">{</span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000">sunway</span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000">,</span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000">copyright</span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000">,</span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000">author</span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000">}</span>
								</span>
								<span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    String values[] </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000">
										<br />
										<img id="Codehighlighter1_2355_2420_Open_Image" onclick="this.style.display='none'; Codehighlighter1_2355_2420_Open_Text.style.display='none'; Codehighlighter1_2355_2420_Closed_Image.style.display='inline'; Codehighlighter1_2355_2420_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
										<img id="Codehighlighter1_2355_2420_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_2355_2420_Closed_Text.style.display='none'; Codehighlighter1_2355_2420_Open_Image.style.display='inline'; Codehighlighter1_2355_2420_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />      </span>
								<span id="Codehighlighter1_2355_2420_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_2355_2420_Open_Text">
										<span style="COLOR: #000000">{</span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000">sunway technology company</span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000">,</span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000">copyright 2002</span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000">,</span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000">turbochen@163.com</span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000">}</span>
								</span>
								<span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img id="Codehighlighter1_2428_2469_Open_Image" onclick="this.style.display='none'; Codehighlighter1_2428_2469_Open_Text.style.display='none'; Codehighlighter1_2428_2469_Closed_Image.style.display='inline'; Codehighlighter1_2428_2469_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_2428_2469_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_2428_2469_Closed_Text.style.display='none'; Codehighlighter1_2428_2469_Open_Image.style.display='inline'; Codehighlighter1_2428_2469_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
								<span id="Codehighlighter1_2428_2469_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">/**/</span>
								<span id="Codehighlighter1_2428_2469_Open_Text">
										<span style="COLOR: #008000">/*</span>
										<span style="COLOR: #008000"> 建立一个位于user root下的/com/sunway/spc节点参数项</span>
										<span style="COLOR: #008000">*/</span>
								</span>
								<span style="COLOR: #000000">
										<br />
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    Preferences prefsdemo </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000">
										<br />
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />      Preferences.userRoot().node(</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">/com/sunway/spc</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img id="Codehighlighter1_2558_2567_Open_Image" onclick="this.style.display='none'; Codehighlighter1_2558_2567_Open_Text.style.display='none'; Codehighlighter1_2558_2567_Closed_Image.style.display='inline'; Codehighlighter1_2558_2567_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_2558_2567_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_2558_2567_Closed_Text.style.display='none'; Codehighlighter1_2558_2567_Open_Image.style.display='inline'; Codehighlighter1_2558_2567_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
								<span id="Codehighlighter1_2558_2567_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">/**/</span>
								<span id="Codehighlighter1_2558_2567_Open_Text">
										<span style="COLOR: #008000">/*</span>
										<span style="COLOR: #008000"> 储存参数项</span>
										<span style="COLOR: #008000">*/</span>
								</span>
								<span style="COLOR: #000000">
										<br />
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
								<span style="COLOR: #0000ff">for</span>
								<span style="COLOR: #000000"> (</span>
								<span style="COLOR: #0000ff">int</span>
								<span style="COLOR: #000000"> 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"> keys.length; i</span>
								<span style="COLOR: #000000">++</span>
								<span style="COLOR: #000000">)<br /><img id="Codehighlighter1_2614_2661_Open_Image" onclick="this.style.display='none'; Codehighlighter1_2614_2661_Open_Text.style.display='none'; Codehighlighter1_2614_2661_Closed_Image.style.display='inline'; Codehighlighter1_2614_2661_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_2614_2661_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_2614_2661_Closed_Text.style.display='none'; Codehighlighter1_2614_2661_Open_Image.style.display='inline'; Codehighlighter1_2614_2661_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
								<span id="Codehighlighter1_2614_2661_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_2614_2661_Open_Text">
										<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />      prefsdemo.put(keys[i], values[i]);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span>
								</span>
								<span style="COLOR: #000000">
										<br />
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
										<br />
										<img id="Codehighlighter1_2668_2681_Open_Image" onclick="this.style.display='none'; Codehighlighter1_2668_2681_Open_Text.style.display='none'; Codehighlighter1_2668_2681_Closed_Image.style.display='inline'; Codehighlighter1_2668_2681_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
										<img id="Codehighlighter1_2668_2681_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_2668_2681_Closed_Text.style.display='none'; Codehighlighter1_2668_2681_Open_Image.style.display='inline'; Codehighlighter1_2668_2681_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
								<span id="Codehighlighter1_2668_2681_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">/**/</span>
								<span id="Codehighlighter1_2668_2681_Open_Text">
										<span style="COLOR: #008000">/*</span>
										<span style="COLOR: #008000"> 导出到XML文件 </span>
										<span style="COLOR: #008000">*/</span>
								</span>
								<span style="COLOR: #000000">
										<br />
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
								<span style="COLOR: #0000ff">try</span>
								<span style="COLOR: #000000">
										<br />
										<img id="Codehighlighter1_2695_2802_Open_Image" onclick="this.style.display='none'; Codehighlighter1_2695_2802_Open_Text.style.display='none'; Codehighlighter1_2695_2802_Closed_Image.style.display='inline'; Codehighlighter1_2695_2802_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
										<img id="Codehighlighter1_2695_2802_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_2695_2802_Closed_Text.style.display='none'; Codehighlighter1_2695_2802_Open_Image.style.display='inline'; Codehighlighter1_2695_2802_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
								<span id="Codehighlighter1_2695_2802_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_2695_2802_Open_Text">
										<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />      FileOutputStream fos </span>
										<span style="COLOR: #000000">=</span>
										<span style="COLOR: #000000"> </span>
										<span style="COLOR: #0000ff">new</span>
										<span style="COLOR: #000000"> FileOutputStream(</span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000">prefsdemo.xml</span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />      prefsdemo.exportNode(fos);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span>
								</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #0000ff">catch</span>
								<span style="COLOR: #000000"> (Exception e)<br /><img id="Codehighlighter1_2828_2889_Open_Image" onclick="this.style.display='none'; Codehighlighter1_2828_2889_Open_Text.style.display='none'; Codehighlighter1_2828_2889_Closed_Image.style.display='inline'; Codehighlighter1_2828_2889_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_2828_2889_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_2828_2889_Closed_Text.style.display='none'; Codehighlighter1_2828_2889_Open_Image.style.display='inline'; Codehighlighter1_2828_2889_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
								<span id="Codehighlighter1_2828_2889_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_2828_2889_Open_Text">
										<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />      System.err.println(</span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000">Cannot export nodes: </span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000"> </span>
										<span style="COLOR: #000000">+</span>
										<span style="COLOR: #000000"> e);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span>
								</span>
								<span style="COLOR: #000000">
										<br />
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
										<br />
										<img id="Codehighlighter1_2896_2916_Open_Image" onclick="this.style.display='none'; Codehighlighter1_2896_2916_Open_Text.style.display='none'; Codehighlighter1_2896_2916_Closed_Image.style.display='inline'; Codehighlighter1_2896_2916_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
										<img id="Codehighlighter1_2896_2916_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_2896_2916_Closed_Text.style.display='none'; Codehighlighter1_2896_2916_Open_Image.style.display='inline'; Codehighlighter1_2896_2916_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
								<span id="Codehighlighter1_2896_2916_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">/**/</span>
								<span id="Codehighlighter1_2896_2916_Open_Text">
										<span style="COLOR: #008000">/*</span>
										<span style="COLOR: #008000"> 去掉注释可以清除注册表中的参数项</span>
										<span style="COLOR: #008000">*/</span>
								</span>
								<span style="COLOR: #000000">
										<br />
										<img id="Codehighlighter1_2922_3030_Open_Image" onclick="this.style.display='none'; Codehighlighter1_2922_3030_Open_Text.style.display='none'; Codehighlighter1_2922_3030_Closed_Image.style.display='inline'; Codehighlighter1_2922_3030_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
										<img id="Codehighlighter1_2922_3030_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_2922_3030_Closed_Text.style.display='none'; Codehighlighter1_2922_3030_Open_Image.style.display='inline'; Codehighlighter1_2922_3030_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
								<span id="Codehighlighter1_2922_3030_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">/**/</span>
								<span id="Codehighlighter1_2922_3030_Open_Text">
										<span style="COLOR: #008000">/*</span>
										<span style="COLOR: #008000">    try<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" />         prefsdemo.removeNode();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />      } catch (BackingStoreException e)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />      {<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />      } </span>
										<span style="COLOR: #008000">*/</span>
								</span>
								<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/ExpandedSubBlockEnd.gif" align="top" />  }</span>
						</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />运行的结果是在注册表中添加了相应数据：四、用下面方法可取回存在注册表中的数据：<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">import</span>
				<span style="COLOR: #000000"> java.io.</span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">import</span>
				<span style="COLOR: #000000"> java.util.prefs.</span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img id="Codehighlighter1_3151_3392_Open_Image" onclick="this.style.display='none'; Codehighlighter1_3151_3392_Open_Text.style.display='none'; Codehighlighter1_3151_3392_Closed_Image.style.display='inline'; Codehighlighter1_3151_3392_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_3151_3392_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_3151_3392_Closed_Text.style.display='none'; Codehighlighter1_3151_3392_Open_Image.style.display='inline'; Codehighlighter1_3151_3392_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"> </span>
				<span style="COLOR: #0000ff">class</span>
				<span style="COLOR: #000000"> PrefsDemo1 </span>
				<span id="Codehighlighter1_3151_3392_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_3151_3392_Open_Text">
						<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  </span>
						<span style="COLOR: #0000ff">public</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">static</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">void</span>
						<span style="COLOR: #000000"> main(String args[])<br /><img id="Codehighlighter1_3196_3390_Open_Image" onclick="this.style.display='none'; Codehighlighter1_3196_3390_Open_Text.style.display='none'; Codehighlighter1_3196_3390_Closed_Image.style.display='inline'; Codehighlighter1_3196_3390_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_3196_3390_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_3196_3390_Closed_Text.style.display='none'; Codehighlighter1_3196_3390_Open_Image.style.display='inline'; Codehighlighter1_3196_3390_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />  </span>
						<span id="Codehighlighter1_3196_3390_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_3196_3390_Open_Text">
								<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />   <br /><img id="Codehighlighter1_3206_3247_Open_Image" onclick="this.style.display='none'; Codehighlighter1_3206_3247_Open_Text.style.display='none'; Codehighlighter1_3206_3247_Closed_Image.style.display='inline'; Codehighlighter1_3206_3247_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_3206_3247_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_3206_3247_Closed_Text.style.display='none'; Codehighlighter1_3206_3247_Open_Image.style.display='inline'; Codehighlighter1_3206_3247_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
								<span id="Codehighlighter1_3206_3247_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">/**/</span>
								<span id="Codehighlighter1_3206_3247_Open_Text">
										<span style="COLOR: #008000">/*</span>
										<span style="COLOR: #008000"> 建立一个位于user root下的/com/sunway/spc节点参数项</span>
										<span style="COLOR: #008000">*/</span>
								</span>
								<span style="COLOR: #000000">
										<br />
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    Preferences prefsdemo </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000">
										<br />
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />      Preferences.userRoot().node(</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">/com/sunway/spc</span>
								<span style="COLOR: #000000">"</span>
								<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" />     System.out.println(prefsdemo.get(</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">sunway</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">,</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">OK</span>
								<span style="COLOR: #000000">"</span>
								<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/ExpandedSubBlockEnd.gif" align="top" />  }</span>
						</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />运行结果：C:\java</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">java   PrefsDemo1sunway technology company<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />C:\java<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />以上介绍了Preferences功能，要了解更多Preferences的方法，请 查阅JDK文档java.util.prefs.Preferences <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
		</div>
<img src ="http://www.blogjava.net/aaronjin/aggbug/80170.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/aaronjin/" target="_blank">AaronJin</a> 2006-11-09 15:40 <a href="http://www.blogjava.net/aaronjin/articles/80170.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>全面理解Java中String数据类型 </title><link>http://www.blogjava.net/aaronjin/articles/80148.html</link><dc:creator>AaronJin</dc:creator><author>AaronJin</author><pubDate>Thu, 09 Nov 2006 06:21:00 GMT</pubDate><guid>http://www.blogjava.net/aaronjin/articles/80148.html</guid><wfw:comment>http://www.blogjava.net/aaronjin/comments/80148.html</wfw:comment><comments>http://www.blogjava.net/aaronjin/articles/80148.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/aaronjin/comments/commentRss/80148.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/aaronjin/services/trackbacks/80148.html</trackback:ping><description><![CDATA[
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">1</span>
				<span style="COLOR: #000000">. 首先String不属于8种基本数据类型，String是一个对象。 <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　因为对象的默认值是null，所以String的默认值也是null；但它又是一种特殊的对象，有其它对象没有的一些特性。 <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　</span>
				<span style="COLOR: #000000">2</span>
				<span style="COLOR: #000000">. </span>
				<span style="COLOR: #0000ff">new</span>
				<span style="COLOR: #000000"> String()和new String(“”)都是申明一个新的空字符串，是空串不是null； <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　</span>
				<span style="COLOR: #000000">3</span>
				<span style="COLOR: #000000">. String str</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">”kvill”； <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />String str</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #0000ff">new</span>
				<span style="COLOR: #000000"> String (“kvill”);的区别： <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　在这里，我们不谈堆，也不谈栈，只先简单引入常量池这个简单的概念。 <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　常量池(constant pool)指的是在编译期被确定，并被保存在已编译的.class文件中的一些数据。它包括了关于类、方法、接口等中的常量，也包括字符串常量。 <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　看例1： <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />String s0</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">”kvill”; <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />String s1</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">”kvill”; <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />String s2</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">”kv” </span>
				<span style="COLOR: #000000">+</span>
				<span style="COLOR: #000000"> “ill”; <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />System.out.println( s0</span>
				<span style="COLOR: #000000">==</span>
				<span style="COLOR: #000000">s1 ); <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />System.out.println( s0</span>
				<span style="COLOR: #000000">==</span>
				<span style="COLOR: #000000">s2 ); <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　结果为： <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">true</span>
				<span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">true</span>
				<span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　首先，我们要知道Java会确保一个字符串常量只有一个拷贝。 <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　因为例子中的s0和s1中的”kvill”都是字符串常量，它们在编译期就被确定了，所以s0</span>
				<span style="COLOR: #000000">==</span>
				<span style="COLOR: #000000">s1为true；而”kv”和”ill”也都是字符串常量，当一个字符串由多个字符串常量连接而成时，它自己肯定也是字符串常量，所以s2也同样在编译期就被解析为一个字符串常量，所以s2也是常量池中”kvill”的一个引用。 <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　所以我们得出s0</span>
				<span style="COLOR: #000000">==</span>
				<span style="COLOR: #000000">s1</span>
				<span style="COLOR: #000000">==</span>
				<span style="COLOR: #000000">s2; <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　用new String() 创建的字符串不是常量，不能在编译期就确定，所以new String() 创建的字符串不放入常量池中，它们有自己的地址空间。 <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　看例2： <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />String s0</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">”kvill”; <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />String s1</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #0000ff">new</span>
				<span style="COLOR: #000000"> String(”kvill”); <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />String s2</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">”kv” </span>
				<span style="COLOR: #000000">+</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">new</span>
				<span style="COLOR: #000000"> String(“ill”); <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />System.out.println( s0</span>
				<span style="COLOR: #000000">==</span>
				<span style="COLOR: #000000">s1 ); <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />System.out.println( s0</span>
				<span style="COLOR: #000000">==</span>
				<span style="COLOR: #000000">s2 ); <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />System.out.println( s1</span>
				<span style="COLOR: #000000">==</span>
				<span style="COLOR: #000000">s2 ); <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　结果为： <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">false</span>
				<span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">false</span>
				<span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">false</span>
				<span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　例2中s0还是常量池中”kvill”的应用，s1因为无法在编译期确定，所以是运行时创建的新对象”kvill”的引用，s2因为有后半部分new String(“ill”)所以也无法在编译期确定，所以也是一个新创建对象”kvill”的应用;明白了这些也就知道为何得出此结果了。 <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　</span>
				<span style="COLOR: #000000">4</span>
				<span style="COLOR: #000000">. String.intern()： <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　再补充介绍一点：存在于.class文件中的常量池，在运行期被JVM装载，并且可以扩充。String的intern()方法就是扩充常量池的一个方法；当一个String实例str调用intern()方法时，Java查找常量池中是否有相同Unicode的字符串常量，如果有，则返回其的引用，如果没有，则在常量池中增加一个Unicode等于str的字符串并返回它的引用；看例3就清楚了 <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　例3： <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />String s0</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> “kvill”; <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />String s1</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #0000ff">new</span>
				<span style="COLOR: #000000"> String(”kvill”); <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />String s2</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #0000ff">new</span>
				<span style="COLOR: #000000"> String(“kvill”); <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />System.out.println( s0</span>
				<span style="COLOR: #000000">==</span>
				<span style="COLOR: #000000">s1 ); <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />System.out.println( “</span>
				<span style="COLOR: #000000">**********</span>
				<span style="COLOR: #000000">” ); <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />s1.intern(); <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />s2</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">s2.intern(); </span>
				<span style="COLOR: #008000">//</span>
				<span style="COLOR: #008000">把常量池中“kvill”的引用赋给s2 </span>
				<span style="COLOR: #008000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000">System.out.println( s0</span>
				<span style="COLOR: #000000">==</span>
				<span style="COLOR: #000000">s1); <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />System.out.println( s0</span>
				<span style="COLOR: #000000">==</span>
				<span style="COLOR: #000000">s1.intern() ); <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />System.out.println( s0</span>
				<span style="COLOR: #000000">==</span>
				<span style="COLOR: #000000">s2 ); <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　结果为： <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">false</span>
				<span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #000000">**********</span>
				<span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">false</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #008000">//</span>
				<span style="COLOR: #008000">虽然执行了s1.intern(),但它的返回值没有赋给s1 </span>
				<span style="COLOR: #008000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">true</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #008000">//</span>
				<span style="COLOR: #008000">说明s1.intern()返回的是常量池中”kvill”的引用 </span>
				<span style="COLOR: #008000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">true</span>
				<span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　最后我再破除一个错误的理解： <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　有人说，“使用String.intern()方法则可以将一个String类的保存到一个全局String表中，如果具有相同值的Unicode字符串已经在这个表中，那么该方法返回表中已有字符串的地址，如果在表中没有相同值的字符串，则将自己的地址注册到表中“如果我把他说的这个全局的String表理解为常量池的话，他的最后一句话，“如果在表中没有相同值的字符串，则将自己的地址注册到表中”是错的： <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　看例4： <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />String s1</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #0000ff">new</span>
				<span style="COLOR: #000000"> String(</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">kvill</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">); <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />String s2</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">s1.intern(); <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />System.out.println( s1</span>
				<span style="COLOR: #000000">==</span>
				<span style="COLOR: #000000">s1.intern() ); <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />System.out.println( s1</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">s2 ); <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />System.out.println( s2</span>
				<span style="COLOR: #000000">==</span>
				<span style="COLOR: #000000">s1.intern() ); <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　结果： <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">false</span>
				<span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />kvill kvill <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">true</span>
				<span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　在这个类中我们没有声名一个”kvill”常量，所以常量池中一开始是没有”kvill”的，当我们调用s1.intern()后就在常量池中新添加了一个”kvill”常量，原来的不在常量池中的”kvill”仍然存在，也就不是“将自己的地址注册到常量池中”了。 <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　s1</span>
				<span style="COLOR: #000000">==</span>
				<span style="COLOR: #000000">s1.intern()为false说明原来的“kvill”仍然存在； <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　s2现在为常量池中“kvill”的地址，所以有s2</span>
				<span style="COLOR: #000000">==</span>
				<span style="COLOR: #000000">s1.intern()为true。 <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　</span>
				<span style="COLOR: #000000">5</span>
				<span style="COLOR: #000000">. 关于equals()和</span>
				<span style="COLOR: #000000">==</span>
				<span style="COLOR: #000000">: <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　这个对于String简单来说就是比较两字符串的Unicode序列是否相当，如果相等返回true;而</span>
				<span style="COLOR: #000000">==</span>
				<span style="COLOR: #000000">是比较两字符串的地址是否相同，也就是是否是同一个字符串的引用。 <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　</span>
				<span style="COLOR: #000000">6</span>
				<span style="COLOR: #000000">. 关于String是不可变的 <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　这一说又要说很多，大家只要知道String的实例一旦生成就不会再改变了，比如说：String str</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">”kv”</span>
				<span style="COLOR: #000000">+</span>
				<span style="COLOR: #000000">”ill”</span>
				<span style="COLOR: #000000">+</span>
				<span style="COLOR: #000000">” “</span>
				<span style="COLOR: #000000">+</span>
				<span style="COLOR: #000000">”ans”; <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />就是有4个字符串常量，首先”kv”和”ill”生成了”kvill”存在内存中，然后”kvill”又和” “ 生成 ”kvill “存在内存中，最后又和生成了”kvill ans”;并把这个字符串的地址赋给了str,就是因为String的“不可变”产生了很多临时变量，这也就是为什么建议用StringBuffer的原因了，因为StringBuffer是可改变的</span>
		</div>
<img src ="http://www.blogjava.net/aaronjin/aggbug/80148.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/aaronjin/" target="_blank">AaronJin</a> 2006-11-09 14:21 <a href="http://www.blogjava.net/aaronjin/articles/80148.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA中正则表达式的应用</title><link>http://www.blogjava.net/aaronjin/articles/80147.html</link><dc:creator>AaronJin</dc:creator><author>AaronJin</author><pubDate>Thu, 09 Nov 2006 06:20:00 GMT</pubDate><guid>http://www.blogjava.net/aaronjin/articles/80147.html</guid><wfw:comment>http://www.blogjava.net/aaronjin/comments/80147.html</wfw:comment><comments>http://www.blogjava.net/aaronjin/articles/80147.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/aaronjin/comments/commentRss/80147.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/aaronjin/services/trackbacks/80147.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 现在JDK1.4里终于有了自己的正则表达式API包，JAVA程序员可以免去找第三方提供的正则表达式库的周折了，我们现在就马上来了解一下这个SUN提供的迟来恩物				-				 				-				对我来说确实如此。				1				.简介： java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包。它包括两个类：Pattern和Matche...&nbsp;&nbsp;<a href='http://www.blogjava.net/aaronjin/articles/80147.html'>阅读全文</a><img src ="http://www.blogjava.net/aaronjin/aggbug/80147.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/aaronjin/" target="_blank">AaronJin</a> 2006-11-09 14:20 <a href="http://www.blogjava.net/aaronjin/articles/80147.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA与正则表达式1</title><link>http://www.blogjava.net/aaronjin/articles/80142.html</link><dc:creator>AaronJin</dc:creator><author>AaronJin</author><pubDate>Thu, 09 Nov 2006 06:10:00 GMT</pubDate><guid>http://www.blogjava.net/aaronjin/articles/80142.html</guid><wfw:comment>http://www.blogjava.net/aaronjin/comments/80142.html</wfw:comment><comments>http://www.blogjava.net/aaronjin/articles/80142.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/aaronjin/comments/commentRss/80142.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/aaronjin/services/trackbacks/80142.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: §						1						黑暗岁月																		       								有一个				String				，如何查询其中是否有				y				和				f				字符？最黑暗的办法就是：																																		程序				1...&nbsp;&nbsp;<a href='http://www.blogjava.net/aaronjin/articles/80142.html'>阅读全文</a><img src ="http://www.blogjava.net/aaronjin/aggbug/80142.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/aaronjin/" target="_blank">AaronJin</a> 2006-11-09 14:10 <a href="http://www.blogjava.net/aaronjin/articles/80142.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>String对象的详细分析</title><link>http://www.blogjava.net/aaronjin/articles/80139.html</link><dc:creator>AaronJin</dc:creator><author>AaronJin</author><pubDate>Thu, 09 Nov 2006 06:04:00 GMT</pubDate><guid>http://www.blogjava.net/aaronjin/articles/80139.html</guid><wfw:comment>http://www.blogjava.net/aaronjin/comments/80139.html</wfw:comment><comments>http://www.blogjava.net/aaronjin/articles/80139.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/aaronjin/comments/commentRss/80139.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/aaronjin/services/trackbacks/80139.html</trackback:ping><description><![CDATA[
		<font size="1">
				<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						<span style="COLOR: #000000">首先大家知道，String既可以作为一个对象来使用，又可以作为一个基本类型来使用。这里指的作为一个基本类型来使用只是指使用方法上的，比如String s </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">Hello</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">，它的使用方法如同基本类型int一样，比如int i </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">1</span>
						<span style="COLOR: #000000">;，而作为一个对象来使用，则是指通过new关键字来创建一个新对象，比如String s </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">new</span>
						<span style="COLOR: #000000"> String(</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">Hello</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">)。但是它的内部动作其实还是创建了一个对象，这点稍后会说到。<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />其次，对String对象的比较方法需要了解。Java里对象之间的比较有两种概念，这里拿String对象来说：一种是用</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">==</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">来比较，这种比较是针对两个String类型的变量的引用，也就是说如果两个String类型的变量，它们所引用同一个String对象(即指向同一块内存堆)，则</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">==</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">比较的结果是true。另一种是用Object对象的equals()方法来比较，String对象继承自Object，并且对equals()方法进行了重写。两个String对象通过equals()方法来进行比较时，其实就是对String对象所封装的字符串内容进行比较，也就是说如果两个String对象所封装的字符串内容相同(包括大小写相同)，则equals()方法将返回true。<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />现在开始将对String对象的创建做具体的分析。<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />首先看以下代码段：<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />String s1 </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">new</span>
						<span style="COLOR: #000000"> String(</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">Hello</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />String s2 </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">new</span>
						<span style="COLOR: #000000"> String(</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">Hello</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />System.out.println(s1 </span>
						<span style="COLOR: #000000">==</span>
						<span style="COLOR: #000000"> s2);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />System.out.println(s1.equals(s2));<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />以上代码段的打印结果是：<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
						<span style="COLOR: #0000ff">false</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						</span>
						<span style="COLOR: #0000ff">true</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />这个结果相信大家很好理解，两个String类型的变量s1和s2都通过new关键字分别创建了一个新的String对象，这个new关键字为创建的每个对象分配一块新的、独立的内存堆。因此当通过</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">==</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">来比较它们所引用的是否是同一个对象时，将返回false。而通过equals()方法来比较时，则返回true，因为这两个对象所封装的字符串内容是完全相同的。<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />好，现在把上面的代码段修改如下：<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />String s1 </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">new</span>
						<span style="COLOR: #000000"> String(</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">Hello</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />String s2 </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> s1;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />System.out.println(s1 </span>
						<span style="COLOR: #000000">==</span>
						<span style="COLOR: #000000"> s2);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />System.out.println(s1.equals(s2));<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />以上代码段的打印结果是：<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
						<span style="COLOR: #0000ff">true</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						</span>
						<span style="COLOR: #0000ff">true</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />这个结果应该更好理解，变量s1还是通过new关键字来创建了一个新的String对象，但这里s2并没有通过new关键字来创建一个新的String对象，而是直接把s1赋值给了s2，即把s1的引用赋值给了s2，所以s2所引用的对象其实就是s1所引用的对象。所以通过</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">==</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">来比较时，返回true。既然它们引用的都是同一个对象，那么通过equals()方法来比较时，肯定也返回true，这里equals()方法其实在对同一个对象进行比较，自己肯定等于自己咯。<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />说到此，其实应该没什么大问题，因为这些都是标准的创建对象的动作，但是String对象还有另一种使用方法，也就是开头所提到的可以作为一个基本类型来使用，请看以下代码段：<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />String s </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">Hello</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />看到这里，相信一些初学的朋友或者对String对象还没搞清楚的朋友开始疑惑了，你肯定会问，这个使用方法在其内部到底发生了什么？其实这就是String对象容易混淆的关键！<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />其实在启动程序时，虚拟机会创建一块String对象的String缓冲池。当String对象作为一个基本类型来使用时，比如：String s </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">Hello</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">;，虚拟机会先在这个String缓冲池内寻找是否有相同值的String对象存在，如果存在，则把这个String对象的引用赋值给s。如果不存在，虚拟机会先在这个String缓冲池内创建此String对象，然后把引用赋值给s。<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />说到这里，相信大家已经开始明白了。那么请看下面的代码段：<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />String s1 </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">Hello</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />String s2 </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">Hello</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />System.out.println(s1 </span>
						<span style="COLOR: #000000">==</span>
						<span style="COLOR: #000000"> s2);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />System.out.println(s1.equals(s2));<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />以上代码段的打印结果是：<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
						<span style="COLOR: #0000ff">true</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						</span>
						<span style="COLOR: #0000ff">true</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />为什么这个结果？那么来分析一下。首先这两个String对象都是作为一个基本类型来使用的，而不是通过new关键字来创建的，因此虚拟机不会为这两个String对象分配新的内存堆，而是到String缓冲池中来寻找。<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />首先为s1寻找String缓冲池内是否有与</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">Hello</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">相同值的String对象存在，此时String缓冲池内是空的，没有相同值的String对象存在，所以虚拟机会在String缓冲池内创建此String对象，其动作就是new String(</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">Hello</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">);。然后把此String对象的引用赋值给s1。<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />接着为s2寻找String缓冲池内是否有与</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">Hello</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">相同值的String对象存在，此时虚拟机找到了一个与其相同值的String对象，这个String对象其实就是为s1所创建的String对象。既然找到了一个相同值的对象，那么虚拟机就不在为此创建一个新的String对象，而是直接把存在的String对象的引用赋值给s2。<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />这里既然s1和s2所引用的是同一个String对象，即自己等于自己，所以以上两种比较方法都返回ture。<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />到这里，对String对象的基本概念应该都已经理解了。现在我来小结一下：<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />针对String作为一个基本类型来使用：<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
						<span style="COLOR: #000000">1</span>
						<span style="COLOR: #000000">。如果String作为一个基本类型来使用，那么我们视此String对象是String缓冲池所拥有的。<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
						<span style="COLOR: #000000">2</span>
						<span style="COLOR: #000000">。如果String作为一个基本类型来使用，并且此时String缓冲池内不存在与其指定值相同的String对象，那么此时虚拟机将为此创建新的String对象，并存放在String缓冲池内。<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
						<span style="COLOR: #000000">3</span>
						<span style="COLOR: #000000">。如果String作为一个基本类型来使用，并且此时String缓冲池内存在与其指定值相同的String对象，那么此时虚拟机将不为此创建新的String对象，而直接返回已存在的String对象的引用。<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />针对String作为一个对象来使用：<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
						<span style="COLOR: #000000">1</span>
						<span style="COLOR: #000000">。如果String作为一个对象来使用，那么虚拟机将为此创建一个新的String对象，即为此对象分配一块新的内存堆，并且它并不是String缓冲池所拥有的，即它是独立的。<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />理解了以上内容后，请看以下代码段：<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />String s1 </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">Hello</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />String s2 </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">new</span>
						<span style="COLOR: #000000"> String(</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">Hello</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />System.out.println(s1 </span>
						<span style="COLOR: #000000">==</span>
						<span style="COLOR: #000000"> s2);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />System.out.println(s1.equals(s2));<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />以上代码段的打印结果是：<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
						<span style="COLOR: #0000ff">false</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						</span>
						<span style="COLOR: #0000ff">true</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />根据上面的小结来进行分析。第一行是把String作为一个基本类型来使用的，因此s1所引用的对象是属于String缓冲池内的。并且此时String缓冲池内并没有与其值相同的String对象存在，因此虚拟机会为此创建一个新的String对象，即new String(</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">Hello</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">);。第二行是把String作为一个对象来使用的，因此s2所引用的对象不属于String缓冲池内的，即它是独立的。通过new关键字，虚拟机会为此创建一个新的String对象，即为它分配了一块新的内存堆。因此</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">==</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">比较后的结果是false，因为s1和s2所引用的并不是同一个对象，它们是独立存在的。而equals()方法所返回的是true，因为这两个对象所封装的字符串内容是完全相同的。<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />现在，相信大家已经完全搞清楚String对象是怎么一回事了：）但是到此并没有结束，因为String对象还有更深层次的应用。<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />这里我将分析一下String对象的intern()方法的应用。<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />intern()方法将返回一个字符串对象的规范表示法，即一个同该字符串内容相同的字符串，但是来自于唯一字符串的String缓冲池。这听起来有点拗口，其实它的机制有如以下代码段：<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />String s </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">new</span>
						<span style="COLOR: #000000"> String(</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">Hello</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />s </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> s.intern();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />以上代码段的功能实现可以简单的看成如下代码段：<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />String s </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">Hello</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />你一定又开始疑惑了？那么你可以先看第二个代码段。第二个代码段的意思就是从String缓冲池内取出一个与其值相同的String对象的引用赋值给s。如果String缓冲池内没有与其相同值的String对象存在，则在其内为此创建一个新的String对象。那么第一段代码的意思又是什么呢？我们知道通过new关键字所创建出的对象，虚拟机会为它分配一块新的内存堆。如果平凡地创建相同内容的对象，虚拟机同样会为此分配许多新的内存堆，虽然它们的内容是完全相同的。拿String对象来说，如果连续创建10个相同内容的String对象(</span>
						<span style="COLOR: #0000ff">new</span>
						<span style="COLOR: #000000"> String(</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">Hello</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">))，那么虚拟机将为此分配10块独立的内存堆。假设所创建的String对象的字符串内容十分大，假设一个Stirng对象封装了1M大小的字符串内容，那么如果我们创建10个此相同String对象的话，我们将会毫无意义的浪费9M的内存空间。我们知道String是final类，它所封装的是字符串常量，因此String对象在创建后其内部(字符串)值不能改变，也因此String对象可以被共享。所以对于刚才提到的假设，我们所创建的10个相同内容的String对象，其实我们只需为此创建一个String对象，然后被其它String变量所共享。要实现这种机制，唯一的、简单的方法就是使用String缓冲池，因为String缓冲池内不会存在相同内容的String对象。而intern()方法就是使用这种机制的途径。在一个已实例化的String对象上调用intern()方法后，虚拟机会在String缓冲池内寻找与此Stirng对象所封装的字符串内容相同值的String对象，然后把引用赋值给引用原来的那个String对象的String类型变量。如果String缓冲池内没有与此String对象所封装的字符串内容相同值的String对象存在，那么虚拟机会为此创建一个新的String对象，并把其引用赋值给引用原来的那个String对象的String类型变量。这样就达到了共享同一个String对象的目的，而原先那个通过new关键字所创建出的String对象将被抛弃并被垃圾回收器回收掉。这样不但降低了内存的使用消耗，提高了性能，而且在String对象的比较上也同样更方便了，因为相同的String对象将被共享，所以要判断两个String对象是否相同，则只需要使用</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">==</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">来比较，而无需再使用equals()方法来比较，这样不但使用起来更方便，而且也提高了性能，因为String对象的equals()方法将会对字符串内容拆解，然后逐个进行比较，如果字符串内容十分大的话，那么这个比较动作则大大降低了性能。<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />说到此，大家可能对具体应用还有点模糊，那么我来举个简单的示例，以便阐述以上概念：<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />假设有一个类，它有一个接收消息的方法，这个方法记录用户传来的消息(假设消息内容可能较大，并且重复率较高)，并且把消息按接收顺序记录在一个列表中。我想有些朋友会这样设计：<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
						<span style="COLOR: #0000ff">import</span>
						<span style="COLOR: #000000"> java.util.</span>
						<span style="COLOR: #000000">*</span>
						<span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img id="Codehighlighter1_4815_4959_Open_Image" onclick="this.style.display='none'; Codehighlighter1_4815_4959_Open_Text.style.display='none'; Codehighlighter1_4815_4959_Closed_Image.style.display='inline'; Codehighlighter1_4815_4959_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_4815_4959_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_4815_4959_Closed_Text.style.display='none'; Codehighlighter1_4815_4959_Open_Image.style.display='inline'; Codehighlighter1_4815_4959_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"> </span>
						<span style="COLOR: #0000ff">class</span>
						<span style="COLOR: #000000"> Messages </span>
						<span id="Codehighlighter1_4815_4959_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_4815_4959_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" />ArrayList messages </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #0000ff">new</span>
								<span style="COLOR: #000000"> ArrayList();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img id="Codehighlighter1_4888_4909_Open_Image" onclick="this.style.display='none'; Codehighlighter1_4888_4909_Open_Text.style.display='none'; Codehighlighter1_4888_4909_Closed_Image.style.display='inline'; Codehighlighter1_4888_4909_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_4888_4909_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_4888_4909_Closed_Text.style.display='none'; Codehighlighter1_4888_4909_Open_Image.style.display='inline'; Codehighlighter1_4888_4909_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /></span>
								<span style="COLOR: #0000ff">public</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #0000ff">void</span>
								<span style="COLOR: #000000"> record(String msg) </span>
								<span id="Codehighlighter1_4888_4909_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_4888_4909_Open_Text">
										<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />messages.add(msg);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />}</span>
								</span>
								<span style="COLOR: #000000">
										<br />
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
										<br />
										<img id="Codehighlighter1_4938_4957_Open_Image" onclick="this.style.display='none'; Codehighlighter1_4938_4957_Open_Text.style.display='none'; Codehighlighter1_4938_4957_Closed_Image.style.display='inline'; Codehighlighter1_4938_4957_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
										<img id="Codehighlighter1_4938_4957_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_4938_4957_Closed_Text.style.display='none'; Codehighlighter1_4938_4957_Open_Image.style.display='inline'; Codehighlighter1_4938_4957_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />
								</span>
								<span style="COLOR: #0000ff">public</span>
								<span style="COLOR: #000000"> List getMessages() </span>
								<span id="Codehighlighter1_4938_4957_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_4938_4957_Open_Text">
										<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span>
										<span style="COLOR: #0000ff">return</span>
										<span style="COLOR: #000000"> messages;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />}</span>
								</span>
								<span style="COLOR: #000000">
										<br />
										<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
						</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />这种设计方案好吗？假设我们重复的发送给record()方法同一个消息(消息来自不同的用户，所以可以视每个消息为一个new String(</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">))，并且消息内容较大，那么这个设计将会大大浪费内存空间，因为消息列表中记录的都是新创建的、独立的String对象，虽然它们的内容都相同。那么怎么样可以对其进行优化呢，其实很简单，请看如下优化后的示例：<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
						<span style="COLOR: #0000ff">import</span>
						<span style="COLOR: #000000"> java.util.</span>
						<span style="COLOR: #000000">*</span>
						<span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img id="Codehighlighter1_5181_5334_Open_Image" onclick="this.style.display='none'; Codehighlighter1_5181_5334_Open_Text.style.display='none'; Codehighlighter1_5181_5334_Closed_Image.style.display='inline'; Codehighlighter1_5181_5334_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_5181_5334_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_5181_5334_Closed_Text.style.display='none'; Codehighlighter1_5181_5334_Open_Image.style.display='inline'; Codehighlighter1_5181_5334_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"> </span>
						<span style="COLOR: #0000ff">class</span>
						<span style="COLOR: #000000"> Messages </span>
						<span id="Codehighlighter1_5181_5334_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_5181_5334_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" />ArrayList messages </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #0000ff">new</span>
								<span style="COLOR: #000000"> ArrayList();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img id="Codehighlighter1_5254_5284_Open_Image" onclick="this.style.display='none'; Codehighlighter1_5254_5284_Open_Text.style.display='none'; Codehighlighter1_5254_5284_Closed_Image.style.display='inline'; Codehighlighter1_5254_5284_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_5254_5284_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_5254_5284_Closed_Text.style.display='none'; Codehighlighter1_5254_5284_Open_Image.style.display='inline'; Codehighlighter1_5254_5284_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /></span>
								<span style="COLOR: #0000ff">public</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #0000ff">void</span>
								<span style="COLOR: #000000"> record(String msg) </span>
								<span id="Codehighlighter1_5254_5284_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_5254_5284_Open_Text">
										<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />messages.add(msg.intern());<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />}</span>
								</span>
								<span style="COLOR: #000000">
										<br />
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
										<br />
										<img id="Codehighlighter1_5313_5332_Open_Image" onclick="this.style.display='none'; Codehighlighter1_5313_5332_Open_Text.style.display='none'; Codehighlighter1_5313_5332_Closed_Image.style.display='inline'; Codehighlighter1_5313_5332_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
										<img id="Codehighlighter1_5313_5332_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_5313_5332_Closed_Text.style.display='none'; Codehighlighter1_5313_5332_Open_Image.style.display='inline'; Codehighlighter1_5313_5332_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />
								</span>
								<span style="COLOR: #0000ff">public</span>
								<span style="COLOR: #000000"> List getMessages() </span>
								<span id="Codehighlighter1_5313_5332_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_5313_5332_Open_Text">
										<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span>
										<span style="COLOR: #0000ff">return</span>
										<span style="COLOR: #000000"> messages;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />}</span>
								</span>
								<span style="COLOR: #000000">
										<br />
										<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
						</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />正如你所看到的，原先record()方法中的messages.add(msg);代码段变成了messages.add(msg.intern());，仅仅对msg参数调用了intern()方法，这样将对重复的消息进行共享机制，从而降低了内存消耗，提高了性能。<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />这个例子的确有点牵强，但是这里只是为了阐述以上概念！<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />至此，String对象的迷雾都被消除了，大家只要牢记这些概念，以后再复杂的String应用都可以建立在此基础上来进行分析。</span>
				</div>
		</font>
<img src ="http://www.blogjava.net/aaronjin/aggbug/80139.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/aaronjin/" target="_blank">AaronJin</a> 2006-11-09 14:04 <a href="http://www.blogjava.net/aaronjin/articles/80139.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>性能优化：==代替equals </title><link>http://www.blogjava.net/aaronjin/articles/80138.html</link><dc:creator>AaronJin</dc:creator><author>AaronJin</author><pubDate>Thu, 09 Nov 2006 05:57:00 GMT</pubDate><guid>http://www.blogjava.net/aaronjin/articles/80138.html</guid><wfw:comment>http://www.blogjava.net/aaronjin/comments/80138.html</wfw:comment><comments>http://www.blogjava.net/aaronjin/articles/80138.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/aaronjin/comments/commentRss/80138.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/aaronjin/services/trackbacks/80138.html</trackback:ping><description><![CDATA[
		<font size="1">
				<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						<span style="COLOR: #000000">很多人都觉得对于基本类型用</span>
						<span style="COLOR: #000000">==</span>
						<span style="COLOR: #000000">，对于引用类型用equals(),为什么呢？ <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />对于引用类型如果可以用</span>
						<span style="COLOR: #000000">==</span>
						<span style="COLOR: #000000">代替equals()，可以大大提高效率。不用说了，我们不关心效率！但是如果能提高<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />100倍甚至1000倍你也不关心，那就不用往下看了。 <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />只举两例： <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
						<span style="COLOR: #000000">1</span>
						<span style="COLOR: #000000">.如何判断一个Class是否指定的类型 <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />如果你想到instanceof，说明你还是不错的，不过这里不能用instanceof,这里就判断是否String为例吧。<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />给定一个Class c，判断是否为String类的Class<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />方法1： <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
						<span style="COLOR: #0000ff">boolean</span>
						<span style="COLOR: #000000"> b</span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000">c.getName().equals(String.</span>
						<span style="COLOR: #0000ff">class</span>
						<span style="COLOR: #000000">.getName());<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />方法2：<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
						<span style="COLOR: #0000ff">boolean</span>
						<span style="COLOR: #000000"> b</span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000">(c</span>
						<span style="COLOR: #000000">==</span>
						<span style="COLOR: #000000">String.</span>
						<span style="COLOR: #0000ff">class</span>
						<span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />第一种方法太烂了，第二种方法至少快100倍，甚至1000倍或者10000倍，因为用</span>
						<span style="COLOR: #000000">==</span>
						<span style="COLOR: #000000">几乎不用时间<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />我们知道字符串的比较是一个字符一个字符比较。<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />结论：对于可以使用</span>
						<span style="COLOR: #000000">==</span>
						<span style="COLOR: #000000">的比较，不要使用equals();一般单例类的实例可以使用</span>
						<span style="COLOR: #000000">==</span>
						<span style="COLOR: #000000">，比如枚举类。 <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
						<span style="COLOR: #000000">2</span>
						<span style="COLOR: #000000">.对于字符串用</span>
						<span style="COLOR: #000000">==</span>
						<span style="COLOR: #000000">代替equals()</span>
						<span style="COLOR: #000000">?</span>
						<span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />既然</span>
						<span style="COLOR: #000000">==</span>
						<span style="COLOR: #000000">效率这么高，而且String是一个不可变的,可不可以用</span>
						<span style="COLOR: #000000">==</span>
						<span style="COLOR: #000000">代替equals呢？<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />String s1</span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">hello</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />String s2</span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">hello</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
						<span style="COLOR: #0000ff">boolean</span>
						<span style="COLOR: #000000"> eq</span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000">(s1</span>
						<span style="COLOR: #000000">==</span>
						<span style="COLOR: #000000">s2);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />这里当然可以用</span>
						<span style="COLOR: #000000">==</span>
						<span style="COLOR: #000000">代替,因为他们是同一个对象,但是如果用了new的话就不行了.<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />对于字符串从不用new生成是不是就可以用</span>
						<span style="COLOR: #000000">==</span>
						<span style="COLOR: #000000">代替equals呢</span>
						<span style="COLOR: #000000">?</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />还是不行,这里举一个例子吧:<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />String s1</span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">hello</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />StringBuffer sb</span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #0000ff">new</span>
						<span style="COLOR: #000000"> StringBuffer(s1);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />String s2</span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000">sb.toString();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
						<span style="COLOR: #0000ff">boolean</span>
						<span style="COLOR: #000000"> b</span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000">(s1</span>
						<span style="COLOR: #000000">==</span>
						<span style="COLOR: #000000">s2);</span>
						<span style="COLOR: #008000">//</span>
						<span style="COLOR: #008000">false</span>
						<span style="COLOR: #008000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						</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 /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
						<span style="COLOR: #000000">==</span>
						<span style="COLOR: #000000">代替equals，因为你这样写别人可能就看不懂了。<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
						<span style="COLOR: #000000">3</span>
						<span style="COLOR: #000000">.真的那么好用吗</span>
						<span style="COLOR: #000000">?</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />看到</span>
						<span style="COLOR: #000000">==</span>
						<span style="COLOR: #000000">的效率这么高,就一直想用,我就变通一下:<br /><img id="Codehighlighter1_932_995_Open_Image" onclick="this.style.display='none'; Codehighlighter1_932_995_Open_Text.style.display='none'; Codehighlighter1_932_995_Closed_Image.style.display='inline'; Codehighlighter1_932_995_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_932_995_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_932_995_Closed_Text.style.display='none'; Codehighlighter1_932_995_Open_Image.style.display='inline'; Codehighlighter1_932_995_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span>
						<span style="COLOR: #0000ff">boolean</span>
						<span style="COLOR: #000000"> eq(String s1,String s2)</span>
						<span id="Codehighlighter1_932_995_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_932_995_Open_Text">
								<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />     s1</span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000">s1.intern();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    s2</span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000">s2.intern();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
								<span style="COLOR: #0000ff">return</span>
								<span style="COLOR: #000000"> s1</span>
								<span style="COLOR: #000000">==</span>
								<span style="COLOR: #000000">s2; <br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
						</span>
						<span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />能想到这样使用真的不简单,但是这样不但没有提高效率,反而大大降低了效率.<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />因为intern本身就比equals来的慢，你这里还两次！<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />不过这种用法我在Class类的代码里看到过。<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				</div>
		</font>
<img src ="http://www.blogjava.net/aaronjin/aggbug/80138.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/aaronjin/" target="_blank">AaronJin</a> 2006-11-09 13:57 <a href="http://www.blogjava.net/aaronjin/articles/80138.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>