﻿<?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-faintbear-随笔分类-JAVA</title><link>http://www.blogjava.net/faintbear/category/703.html</link><description>小风嗖嗖的刮着......</description><language>zh-cn</language><lastBuildDate>Wed, 28 Feb 2007 13:15:06 GMT</lastBuildDate><pubDate>Wed, 28 Feb 2007 13:15:06 GMT</pubDate><ttl>60</ttl><item><title>MIDP2.0及其移植技术分析(转)</title><link>http://www.blogjava.net/faintbear/archive/2006/07/12/57798.html</link><dc:creator>小力力力</dc:creator><author>小力力力</author><pubDate>Wed, 12 Jul 2006 06:32:00 GMT</pubDate><guid>http://www.blogjava.net/faintbear/archive/2006/07/12/57798.html</guid><wfw:comment>http://www.blogjava.net/faintbear/comments/57798.html</wfw:comment><comments>http://www.blogjava.net/faintbear/archive/2006/07/12/57798.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/faintbear/comments/commentRss/57798.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/faintbear/services/trackbacks/57798.html</trackback:ping><description><![CDATA[
		<p>
				<b>摘要：</b>MIDP即移动信息设备规范，是专门基于资源和网络连接有限的移动设备之上的J2ME应用规范。本文在分析MIDP2.0的基础上，详细阐述MIDP的事件处理、文件系统、用户图形接口和网络等主要部分在不同平台间移植的实现过程。 
</p>
		<p class="MsoNormal">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">    <b>关键词：</b></span>J2ME MIDP 移植 平台无关 本地代码</p>
		<p style="TEXT-INDENT: 0px">
				<b>1 MIDP2.0简介</b>
		</p>
		<p style="TEXT-INDENT: 30px">随着现代信息化社会的发展，小型移动通信设备已经从最初的一种单纯的通信工具转变成如今集通信、工作、娱乐等功能为一体的综合设备；但仅有这些还不能满足用户的要求。个性永远是千变万化的，时尚也不会始终为一种模式。因此，在移动终端上开发通用的、丰富的应用已成为必然的趋势。这些应用可以按用户的意愿随时安装和删除。</p>
		<p style="TEXT-INDENT: 30px">J2ME（JAVA2 Micro Edition）正是这样一种JAVA应用开发平台。实际上，JAVA语言从其诞生起就以其运行的平台无关性这一强大的优势而成为网络应用的宠儿。J2ME是JAVA2标准版本的微型版本，专门为小型移动设备所设计。这些设备处理器的处理能力都不强，可使用的资源也有限。因此，J2ME只包含了J2SE中在移动通信设备上所必需的功能和组件，使其能够在移动设备及其有限的资源上开发出丰富多彩且平台无关的应用。J2ME在结构上分为CDC（Connecte Device Configuration）和基于其上，以Foundation Profile为主的规范，以及CLDC（Connecte Limited Device Configuration）和基于其上，以MIDP为主的规范。</p>
		<p style="TEXT-INDENT: 30px">MIDP（Mobile Information Device Profile）是移信息设备规范的简称。规范具体定义了J2ME适用的硬件和软件框架，并提供了这个框架要实现的基本功能及其标准接口；而应用开发者就可以基于这个框架开发出各种应用。2000年9月，SUN公司发布了MIDP的第一个正式版本MIDP1.0。它将J2ME适用的设备定位在至少拥有数百KB RAM和ROM，并具有基本网络和显示功能的移动通信设备上；在该基础上定义了一系列软件接的移动通信设备上；在该上基础上定义了一系列软件接口，其中包括基本输入输出、图形化用户接口（GUI）、网络、事件机制、文件系统、应用管理系统（AMS）等之后，随着JAVA技术的不断发展和用户需求的不断提高，SUN公司又于2002年11月发布了MIDP2.0。它对设备的内存资源和处理能力的要求较1.0要高，但MIDP2.0也为应用开发者提供了更方便、更丰富多彩的软件包，主要增加了游戏接口的实现、声音输出接口的实现安全网络机制的实现。MIDP2.0的这些特性将使基于移动设备的JAVA应用具有更加广阔的前景，也必将使新一代的移动设备发生革命性的变化并领导时尚潮流。MIDP2.0接口包如表1所列。<br /><br /><b>表1 MIDP2.0接口包及其功能</b></p>
		<table bordercolordark="#ffffff" width="100%" bordercolorlight="#000000" border="1">
				<tbody>
						<tr class="main">
								<td align="middle" width="45%">包</td>
								<td align="middle" width="55%">功      能</td>
						</tr>
						<tr class="main">
								<td width="45%">javax.microedition.lcdui</td>
								<td align="middle" width="55%">提供一系列用户界面接口</td>
						</tr>
						<tr class="main">
								<td width="45%">javax.microedition.lcdui.game</td>
								<td align="middle" width="55%">专门用于游戏设计的接口</td>
						</tr>
						<tr class="main">
								<td width="45%">javax.microedition.rms</td>
								<td align="middle" width="55%">数据管理，用于保存数据记录</td>
						</tr>
						<tr class="main">
								<td width="45%">javax.microedition.midlet</td>
								<td align="middle" width="55%">JAVA应用管理接口</td>
						</tr>
						<tr class="main">
								<td width="45%">javax.microedition.io</td>
								<td align="middle" width="55%">基本网络连接接口</td>
						</tr>
						<tr class="main">
								<td width="45%">javax.microedition.media</td>
								<td align="middle" width="55%">媒体接口规范（JSR-135）的实现包</td>
						</tr>
						<tr class="main">
								<td width="45%">javax.microedition.media.control</td>
								<td align="middle" width="55%">媒体播放器的控制类</td>
						</tr>
						<tr class="main">
								<td width="45%">javax.microedition.pki</td>
								<td align="middle" width="55%">数字签名规范的实现接口（用于安全网络）</td>
						</tr>
						<tr class="main">
								<td width="45%">java.io</td>
								<td align="middle" width="55%">JAVA基本输入输出接口</td>
						</tr>
						<tr class="main">
								<td width="45%">java.lang</td>
								<td align="middle" width="55%">JAVA基本数据类型接口</td>
						</tr>
						<tr class="main">
								<td width="45%">java.util</td>
								<td align="middle" width="55%">JAVA基本应用接口</td>
						</tr>
				</tbody>
		</table>
		<p style="TEXT-INDENT: 0px">
				<b>2 MIDP2.0的移植</b>
		</p>
		<p style="TEXT-INDENT: 30px">既然MIDP2.0是定位在移动通信设备之上的一系列JAVA应用开发接口，我们就必须考虑如何将整个MIDP系统嵌入到特定的硬件设备和其上的操作系统中。只有这样，JAVA应用程序才能运行在该设备上，并利用MIDP提供的强大功能将用户带入一个全新的JAVA世界。在一个完全不同的操作系统平台上，用该平台上对应的系统API调用（或一系列操作），替换MIDP参考实现中所有与操作平台相关的调用（或操作），使MIDP能在目标平台上正确地执行所有要求的功能；同时，调用该平台上特有的能充分发挥目标设备硬件特性的接口，替换参考实现中相应的接口，使MIDP能在目标平台上更高效地运行，这个过程就称为MIDP的移植。</p>
		<p style="TEXT-INDENT: 30px">MIDP由许多不同的部分组成，每一部分完成MIDP一个特定的功能接口。其中需要移植的部分主要包括事件处理、文件系统、用户图形化接口、网络、AMS、多媒体。它们都分为高端的JAVA层和低端的本地方法层。JAVA层是用JAVA语言实现的，由KVM解释执行；因此没有涉及到与操作系统平台相关的调用和操作，可以不经修改就在任何操作平台上运行，是平台无关的（PlateForm Independent）。它的移植主要是为满足用户的特殊要求而进行的个性化工作。本地方法层（NativeCode）是指为提高代码的执行效率，保持JAVA语言的平台无关性而使用C语言实现的部分MIDP功能的代码。本地即是指它是与当前的操作平台相关的，它的移植才是涉及到具体平台和执行效率而进行的具体调用和操作的替换过程，其结构如图1所示。</p>
		<p style="TEXT-INDENT: 30px">下面，我们就具体到MIDP的每一个部分的移植进行讨论。</p>
		<p style="TEXT-INDENT: 30px">2.1 事件处理</p>
		<p style="TEXT-INDENT: 30px">MIDP的事件处理部分要处理的事件主要来自两个方面：①来自虚拟机底层的事件，如虚拟机的异常消息；②来自MIDP内部的事件，如屏幕刷新、按键消息、触控笔点击消息、时钟消息等。由于不同的平台可能使用不同的事件消息获取和传递机制，因此MIDP事件处理的移植也集中在这上面，其实现被放在本地方法层的文件nativeGUI.c中的函数GetAndStoreKVMEvent中。我们只需根据目标平台获取和传递事件的要求修改该文件中的相应函数即可。</p>
		<p style="TEXT-INDENT: 30px">例如，Windows采用消息响应机制来处理各种事件，所有消息都可以通过系统API调用GetMessage获取，系统会调用消息处理函数WndProc(HWND hwnd、UINTiMsg、WPARAM wParam、LRARAM 1Param)，在其中处理和传递不同的事件。其大致实现过程如下：</p>
		<p style="TEXT-INDENT: 30px">void</p>
		<p style="TEXT-INDENT: 30px">GetAndStoreNextKVMEvent(bool_t forever,ulong64 waitUntil){</p>
		<p style="TEXT-INDENT: 30px">MSG msg；</p>
		<p style="TEXT-INDENT: 30px">……</p>
		<p style="TEXT-INDENT: 30px">while(GetMessage(&amp;msg,NULL,0,0)){</p>
		<p style="TEXT-INDENT: 30px">……</p>
		<p style="TEXT-INDENT: 30px">TranslateMessage(&amp;msg);</p>
		<p style="TEXT-INDENT: 30px">DispatchMessage(&amp;msg);</p>
		<p style="TEXT-INDENT: 30px">if(gotEvent){</p>
		<p style="TEXT-INDENT: 30px">StoreMIDPEvent(&amp;kvmEvent);</p>
		<p style="TEXT-INDENT: 30px">Return;</p>
		<p style="TEXT-INDENT: 30px">}</p>
		<p style="TEXT-INDENT: 30px">}</p>
		<p style="TEXT-INDENT: 30px">return;</p>
		<p style="TEXT-INDENT: 30px">}</p>
		<p style="TEXT-INDENT: 30px">static LRESULT CALLBACK</p>
		<p style="TEXT-INDENT: 30px">WndProc (HWND hwnd,UINT iMsg,WPARAM wParam,LPARAM lParam){</p>
		<p style="TEXT-INDENT: 30px">……</p>
		<p style="TEXT-INDENT: 30px">switch(iMsg){</p>
		<p style="TEXT-INDENT: 30px">case WM_CREATE:</p>
		<p style="TEXT-INDENT: 30px">……</p>
		<p style="TEXT-INDENT: 30px">case WM_KEYDOWN:</p>
		<p style="TEXT-INDENT: 30px">case WM_KEYUP:</p>
		<p style="TEXT-INDENT: 30px">……</p>
		<p style="TEXT-INDENT: 30px">}</p>
		<p style="TEXT-INDENT: 30px">}</p>
		<p style="TEXT-INDENT: 30px">MIDP在GetAndStoreNextKVMEvent中获取事件后，就完全独立地传递和处理事件消息，与平台无关，因此无需移植。<br /><img height="249" hspace="10" src="http://www.embed-dsp.com/Files/image/2006-4/18/0641822021626193.gif" width="549" vspace="10" border="0" /><br /><font size="3">    </font><span class="main1">2.2 文件系统</span></p>
		<p style="TEXT-INDENT: 30px">基于MIDP的JAVA应用以及MIDP本身在某些时候要求数据能够长期保存，即使在应用退出或系统掉电的情况下，数据也不能丢失。这就必须借助于MIDP的文件系统。MIDP的文件系统同样分为JAVA层（称为RMS，即Record Manage System）和本地方法层。一般情况下，文件系统的JAVA层不用移植就可以在任何平台上运行，但如果目标平台的文件系统较为特殊，例如采用数据库的记录方式保存数据，甚至根本就没有提供高效的数据存取接口，我们就必须自己实现数据存取接口。这样，JAVA层就需要跳过RMS而直接通过本地方法调用本地接口，相应的RMS的JAVA代码就可以从MIDP中删去。</p>
		<p style="TEXT-INDENT: 30px">而在文件系统的本地方法层，MIDP会调用目标平台的数据存取接口来实现MIDP本身的数据存取。这些接口是平台相关的，是文件系统中需要移植的部分。这些调用被放在文件src/share/native/storage.c中，主要包括文件的打开（open）、文件的关闭（close）、文件的读写（read、write）、文件属性的获取（size、freesize等）、文件的删除（delete）、文件的定位（seek）、文件的删节（truncate）等。以下便是MIDP文件系统在Windows下的部分实现。</p>
		<p style="TEXT-INDENT: 30px">文件的打开：</p>
		<p style="TEXT-INDENT: 30px">int storageOpen(char**ppszError,char*pszAsciiFilename,int ioMode){</p>
		<p style="TEXT-INDENT: 30px">……</p>
		<p style="TEXT-INDENT: 30px">handle=open(pszAsciiFilename,flags,creationMode)；</p>
		<p style="TEXT-INDENT: 30px">……</p>
		<p style="TEXT-INDENT: 30px">}</p>
		<p style="TEXT-INDENT: 30px">文件的关闭：</p>
		<p style="TEXT-INDENT: 30px">void storageClose(char**ppszError,int handle){</p>
		<p style="TEXT-INDENT: 30px">……</p>
		<p style="TEXT-INDENT: 30px">status=close(handle)；</p>
		<p style="TEXT-INDENT: 30px">……</p>
		<p style="TEXT-INDENT: 30px">}</p>
		<p style="TEXT-INDENT: 30px">文件的读取：</p>
		<p style="TEXT-INDENT: 30px">int storageRead(char**ppszError,int handle,char*buffer,int length)</p>
		<p style="TEXT-INDENT: 30px">{</p>
		<p style="TEXT-INDENT: 30px">……</p>
		<p style="TEXT-INDENT: 30px">bytesRead=read(handle,buffer,length);</p>
		<p style="TEXT-INDENT: 30px">……</p>
		<p style="TEXT-INDENT: 30px">}</p>
		<p style="TEXT-INDENT: 30px">文件的写入：</p>
		<p style="TEXT-INDENT: 30px">void storageWrite(char**ppszError,int handle,char*buffer,int length){</p>
		<p style="TEXT-INDENT: 30px">……</p>
		<p style="TEXT-INDENT: 30px">bytesWritten=write(handle,buffer,length);</p>
		<p style="TEXT-INDENT: 30px">……</p>
		<p style="TEXT-INDENT: 30px">}</p>
		<p style="TEXT-INDENT: 30px">还有许多其它有关文件的操作，移植时只需使用目标平台的API替换以上的Widnows调用，这里就不再逐一列举。</p>
		<p style="TEXT-INDENT: 30px">2.3 用户图形化接口</p>
		<p style="TEXT-INDENT: 30px">用户图形化接口包括画点、画线、作圆、作椭圆、位图拷贝等基本作图函数（可在GRAPHICS.C中找到）；有关定时器、屏幕刷新和键盘触控笔消息等有关与用户交互的操作（可在TEXT.C中找到），它是整个MIDP移植中工作量最大，也是对上层应用的执行效率影响最大的一个部分。这是因为用户在应用中看到的各种图形和文字都是调用底层的图形函数在屏幕上作图的结果。由于屏幕要频繁刷新，图形函数也就成为应用调用最多的接口。因此，移植者必须使每一个底层作图函数与硬件设备紧密配合起来，并使用最高效的算法。</p>
		<p style="TEXT-INDENT: 30px">在不同的平台上，能最大地发挥其作图功能的函数和算法不尽相，这就要求移植者作大量细致的工作，按照MIDP规范的要求逐一重新实现每一个作图函数和屏幕刷新函 数。下面我们就以将画线函数和位图拷贝函数在Windows上的实现为例，简单说明移植要做的工作（键盘、触控笔是以事件消息的方式实现的，它们的移植与事件消息的移植相同）。</p>
		<p style="TEXT-INDENT: 30px">Windows的画线函数接口：</p>
		<p style="TEXT-INDENT: 30px">Void LCDUIdrawLine(int pixel,short*clip,void*dst,int dotted,int x1,int y1,int x2,int y2){</p>
		<p style="TEXT-INDENT: 30px">……</p>
		<p style="TEXT-INDENT: 30px">Polyline(hdc,pts,2);/*绘x1,y1点像素信号*/</p>
		<p style="TEXT-INDENT: 30px">……</p>
		<p style="TEXT-INDENT: 30px">}</p>
		<p style="TEXT-INDENT: 30px">Windwos的屏幕刷新函数：</p>
		<p style="TEXT-INDENT: 30px">Void refreshPaintWindow(int x1,int y1,int x2,int y2){</p>
		<p style="TEXT-INDENT: 30px">RECT r；</p>
		<p style="TEXT-INDENT: 30px">If(x1&lt;x2){</p>
		<p style="TEXT-INDENT: 30px">r.left=x1+x_offset;r.right=x2+x_offset;</p>
		<p style="TEXT-INDENT: 30px">}else{</p>
		<p style="TEXT-INDENT: 30px">r.left=x2+x_offset;r.right=x1+x_offset;</p>
		<p style="TEXT-INDENT: 30px">}</p>
		<p style="TEXT-INDENT: 30px">if(y1&lt;y2){</p>
		<p style="TEXT-INDENT: 30px">r.top=y1+y_offset;r.bottom=y2+y_offset;</p>
		<p style="TEXT-INDENT: 30px">}else{</p>
		<p style="TEXT-INDENT: 30px">r.top=y2+y_offset;r.bottom=y1+y_offset；</p>
		<p style="TEXT-INDENT: 30px">}</p>
		<p style="TEXT-INDENT: 30px">++r.bottom;++r.right;</p>
		<p style="TEXT-INDENT: 30px">InvalidateRect(hMainWindow,&amp;r,KNI_TRUE);</p>
		<p style="TEXT-INDENT: 30px">}</p>
		<p style="TEXT-INDENT: 30px">如果目标平台对这些GUI接口函数有不同实现法，可以用这些方法替换以上的Windows系统调用，这样才能使MIDP图形化用户接口正确地工作，并充分发挥目标平台的工作效率。</p>
		<p style="TEXT-INDENT: 30px">2.4 网络</p>
		<p style="TEXT-INDENT: 30px">MIDP的网络功能是指基于MIDP的J2ME应用可以通过HTTP等网络协议进行下载安装，不同的MIDlet实体也可以通过它交换信息，实现资源共享。遵循HTTP协议的规定，移植者必须利用目标平台的底层网络接口重新实现网络的初始化（networkInit）、建立连接（open0）、断开连接（close0）、接收数据（read0）、获取缓冲区的剩余空间（available0）、关闭发送（shutdownOutput）。如果目标设备具有服务器功能，还要实现serversocket所有上述功能。所有上述接口都在文件socketProtocol_md.c中实现。</p>
		<p style="TEXT-INDENT: 30px">Windwos中获取IP地址的实现：</p>
		<p style="TEXT-INDENT: 30px">Int prim_com_sun_midp_io_j2me_socket_Protocol_getIpNumber</p>
		<p style="TEXT-INDENT: 30px">(char*host)</p>
		<p style="TEXT-INDENT: 30px">{</p>
		<p style="TEXT-INDENT: 30px">……</p>
		<p style="TEXT-INDENT: 30px">hp=gethostbyname(host);</p>
		<p style="TEXT-INDENT: 30px">……</p>
		<p style="TEXT-INDENT: 30px">}</p>
		<p style="TEXT-INDENT: 30px">如果目标平台还需要其它网络协议（datagram、comm），其移植过程与Socket的移植基本相同。</p>
		<p style="TEXT-INDENT: 30px">2.5 应用管理系统（AMS）</p>
		<p style="TEXT-INDENT: 30px">MIDP的应用管理系统(application management system)负责管理当前设备中安装的J2ME应用，其功能包括MIDlet的加载、安装、显示、更新和删除。AMS从main.c中的函数main()开始执行，根据其输入初始化一些系统参数，包括系统路径（classJ2ME MIDP 移植 平台无关 本地代码）、堆空间大小（heapsize）、命令行（command line）等，然后就启动KVM，而KVM就会从AMS的JAVA界面main.java开始解释执行java代码。AMS的所有管理功能都是用JAVA语言实现的，因此AMS的实现是与平台无关的。但不同的平台可能有不同的系统参数和格式，对AMS的界面网络也可能有不同的要求。所以，移植者有可能要修改main.c中解析系统参数的部分，保证AMS能正确解析目标平台的所有参数；同时修改AMS的JAVA层，使其界面网络满足用户的需求。</p>
		<p style="TEXT-INDENT: 30px">2.6 多媒体</p>
		<p style="TEXT-INDENT: 30px">MIDP2.0较MIDP1.0最大的改变就是在MIDP2.0中向应用提供了音频接口（Audio API）的支持。音频接口是移动设备媒体接口MMAPI（Mobile Media API）的一部分。音频的播放过程为5个部分（unrealized、realized、prefetched、started、closed），同时它有自己的音频播放事件的传道和处理过程。MIDP音频播放部分所要做的移植工作就主要集中在声音播放接口，事件的处理方式和兼容不同的音频文件格式上。</p>
		<p style="TEXT-INDENT: 30px">播放接口的移植：不同的目标平台，提供的音频系统API是不同的，有的系统甚至根本没有提供播放音频的API。这时，移植者就要根据目标平台的实现情况替换或自己实现音频的播放接口。</p>
		<p style="TEXT-INDENT: 30px">Windows的音频播放接口（win32/native/MMATONE.C）：</p>
		<p style="TEXT-INDENT: 30px">Java_javax_microedition_media_Manager_nPlayTone(KNITRAPS)</p>
		<p style="TEXT-INDENT: 30px">{</p>
		<p style="TEXT-INDENT: 30px">……</p>
		<p style="TEXT-INDENT: 30px">chn1=getMidiChnl();</p>
		<p style="TEXT-INDENT: 30px">if(chnl==-1){</p>
		<p style="TEXT-INDENT: 30px">KNI_ReturnInt(0)；</p>
		<p style="TEXT-INDENT: 30px">}</p>
		<p style="TEXT-INDENT: 30px">tones[chn].msg=((note&amp;0xff)&lt;&lt;8)|0x00000090|(chnl&amp;0xf);</p>
		<p style="TEXT-INDENT: 30px">msg=((vol&amp;0xff)&lt;&lt;16)|((note&amp;0xff)&lt;&lt;8)|0x90|(chnl &amp;0xf);</p>
		<p style="TEXT-INDENT: 30px">midiOutShortMsg(midiOut,msg);</p>
		<p style="TEXT-INDENT: 30px">timerID=timeSetEvent(dur,TIMERES,(LPTIME CALLBACK)timeToneProc,(DWORD)chnl,TIME_ONESHOT);</p>
		<p style="TEXT-INDENT: 30px">tones[chnl].timerID=timerID;</p>
		<p style="TEXT-INDENT: 30px">……</p>
		<p style="TEXT-INDENT: 30px">}</p>
		<p style="TEXT-INDENT: 30px">事件传递的移植：MIDP中音频播放结束的事件（EOM）是专门通过系统的消息机制传递，而不是通过MIDP的事件传递，因此也需要移植：</p>
		<p style="TEXT-INDENT: 30px">Windows---OM的传递（win32/native/MMAEVT.C）:void injectNativeEvent(int pID,int curMTime){</p>
		<p style="TEXT-INDENT: 30px">PostMessage(hMain Window,WM_APP,(WPARAM)(pID),(LPARAM)(curMTime));</p>
		<p style="TEXT-INDENT: 30px">return;</p>
		<p style="TEXT-INDENT: 30px">}</p>
		<p style="TEXT-INDENT: 0px">
				<b>3 总结</b>
		</p>
		<p style="TEXT-INDENT: 30px">综上所述，MID2.0的移植要以两个方面为出发点：①兼容性。移植后的MIDP实现必须能够在目标平台上正常运行，所有与目标平台不兼容的调用都必须替换为能完成相同功能且兼容的目标平台的系统调用或过程。②高效性。移植后的MIDP实现必须能充分发挥目标平台的效率和特性，用最小的代价完成MIDP的功能。另外，MIDP的移植还要分满足最终用户的个性化要求，为它们设计出丰富多彩的界面网络。 </p>
<img src ="http://www.blogjava.net/faintbear/aggbug/57798.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/faintbear/" target="_blank">小力力力</a> 2006-07-12 14:32 <a href="http://www.blogjava.net/faintbear/archive/2006/07/12/57798.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java性能的优化(转)</title><link>http://www.blogjava.net/faintbear/archive/2005/08/31/11615.html</link><dc:creator>小力力力</dc:creator><author>小力力力</author><pubDate>Wed, 31 Aug 2005 03:40:00 GMT</pubDate><guid>http://www.blogjava.net/faintbear/archive/2005/08/31/11615.html</guid><wfw:comment>http://www.blogjava.net/faintbear/comments/11615.html</wfw:comment><comments>http://www.blogjava.net/faintbear/archive/2005/08/31/11615.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/faintbear/comments/commentRss/11615.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/faintbear/services/trackbacks/11615.html</trackback:ping><description><![CDATA[<CENTER>
<H4><FONT size=2>Java性能的优化</FONT></H4></CENTER><BR><FONT size=2>(来源：http://www.ccw.com.cn) <BR><BR>Java在九十年代中期出现以后，在赢得赞叹的同时，也引来了一些批评。赢得的赞叹主要是Java的跨平台的操作性，即所谓的”Write Once,Run Anywhere”.但由于Java的性能和运行效率同C相比，仍然有很大的差距，从而引来了很多的批评。</FONT>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>对于服务器端的应用程序，由于不大涉及到界面设计和程序的频繁重启，Java的性能问题看似不大明显，从而一些Java的技术，如JSP,Servlet,EJB等在服务器端编程方面得到了很大的应用，但实际上，Java的性能问题在服务器端依然存在。下面我将分四个方面来讨论Java的性能和执行效率以及提高Java性能的一些方法。</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><B><FONT size=2>一．关于性能的基本知识</FONT></B></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><B><FONT size=2>1．性能的定义</FONT></B></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>在我们讨论怎样提高Java的性能之前，我们需要明白“性能“的真正含义。我们一般定义如下五个方面作为评判性能的标准。</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>1） 运算的性能----哪一个算法的执行性能最好</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>2） 内存的分配----程序需要分配多少内存，运行时的效率和性能最高。</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>3） 启动的时间----程序启动需要多少时间。</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>4） 程序的可伸缩性-----程序在用户负载过重的情况下的表现。</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>5） 性能的认识------用户怎样才能认识到程序的性能。</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>对于不同的应用程序，对性能的要求也不同。例如，大部分的应用程序在启动时需要较长的时间，从而对启动时间的要求有所降低；服务器端的应用程序通常都分配有较大的内存空间，所以对内存的要求也有所降低。但是，这并不是所这两方面的性能可以被忽略。其次，算法的性能对于那些把商务逻辑运用到事务性操作的应用程序来讲非常重要。总的来讲，对应用程序的要求将决定对各个性能的优先级。</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><B><FONT size=2>2．怎样才能提高JAVA的性能</FONT></B></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>提高JAVA的性能，一般考虑如下的四个主要方面：</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><I><FONT size=2>（1） 程序设计的方法和模式</FONT></I></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>一个良好的设计能提高程序的性能，这一点不仅适用于JAVA，也适用也任何的编程语言。因为它充分利用了各种资源，如内存，CPU,高速缓存，对象缓冲池及多线程，从而设计出高性能和可伸缩性强的系统。</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>当然，为了提高程序的性能而改变原来的设计是比较困难的，但是，程序性能的重要性常常要高于设计上带来的变化。因此，在编程开始之前就应该有一个好的设计模型和方法。</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><I><FONT size=2>（2） JAVA布署的环境。</FONT></I></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>JAVA布署的环境就是指用来解释和执行JAVA字节码的技术，一般有如下五种。即解释指令技术(Interpreter Technology)，及时编译的技术(Just In Time Compilier Technology), 适应性优化技术（Adaptive Optimization Technology）, 动态优化，提前编译为机器码的技术（Dynamic Optimization,Ahead Of Time Technology）和编译为机器码的技术（Translator Technology）.</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>这些技术一般都通过优化线程模型，调整堆和栈的大小来优化JAVA的性能。在考虑提高JAVA的性能时，首先要找到影响JAVA性能的瓶颈（BottleNecks），在确认了设计的合理性后，应该调整JAVA布署的环境，通过改变一些参数来提高JAVA应用程序的性能。具体内容见第二节。</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><I><FONT size=2>（3） JAVA应用程序的实现</FONT></I></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>当讨论应用程序的性能问题时，大多数的程序员都会考虑程序的代码，这当然是对的，当更重要的是要找到影响程序性能的瓶颈代码。为了找到这些瓶颈代码，我们一般会使用一些辅助的工具，如Jprobe,Optimizit,Vtune以及一些分析的工具如TowerJ Performance等。这些辅助的工具能跟踪应用程序中执行每个函数或方法所消耗掉的时间，从而改善程序的性能。</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><I><FONT size=2>(4) 硬件和操作系统</FONT></I></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>为了提高JAVA应用程序的性能，而采用跟快的CPU和更多的内存，并认为这是提高程序性能的唯一方法，但事实并非如此。实践经验和事实证明，只有遭到了应用程序性能的瓶颈，从而采取适当得方法，如设计模式，布署的环境，操作系统的调整，才是最有效的。</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><B><FONT size=2>3．程序中通常的性能瓶颈。</FONT></B></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>所有的应用程序都存在性能瓶颈，为了提高应用程序的性能，就要尽可能的减少程序的瓶颈。以下是在JAVA程序中经常存在的性能瓶颈。</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14>
<P align=center><FONT size=2><IMG src="http://www.huihoo.com/java/performance/i/01_7_9_3a.gif" border=0></FONT></P></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>了解了这些瓶颈后，就可以有针对性的减少这些瓶颈，从而提高JAVA应用程序的性能</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><B><FONT size=2>4. 提高JAVA程序性能的步骤</FONT></B></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>为了提高JAVA程序的性能，需要遵循如下的六个步骤。</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><I><FONT size=2>a) 明确对性能的具体要求</FONT></I></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>在实施一个项目之前，必须要明确该项目对于程序性能的具体要求，如：这个应用程序要支持5000个并发的用户，并且响应时间要在5秒钟之内。但同时也要明白对于性能的要求不应该同对程序的其他要求冲突。</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><I><FONT size=2>b) 了解当前程序的性能</FONT></I></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>你应该了解你的应用程序的性能同项目所要求性能之间的差距。通常的指标是单位时间内的处理数和响应时间，有时还会比较CPU和内存的利用率。</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><I><FONT size=2>c) 找到程序的性能瓶颈</FONT></I></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>为了发现程序中的性能瓶颈，通常会使用一些分析工具，如：TowerJ Application Performance Analyzer或VTune来察看和分析程序堆栈中各个元素的消耗时间，从而正确的找到并改正引起性能降低的瓶颈代码，从而提高程序的性能。这些工具还能发现诸如过多的异常处理，垃圾回收等潜在的问题。</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><I><FONT size=2>d) 采取适当的措施来提高性能</FONT></I></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>找到了引起程序性能降低的瓶颈代码后，我们就可以用前面介绍过的提高性能的四个方面，即设计模式，JAVA代码的实现，布署JAVA的环境和操作系统来提高应用程序的性能。具体内容将在下面的内容中作详细说明。</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><I><FONT size=2>e) 只进行某一方面的修改来提高性能</FONT></I></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>一次只改变可能引起性能降低的某一方面，然后观察程序的性能是否有所提高，而不应该一次改变多个方面，因为这样你将不知道到底哪个方面的改变提高了程序的性能，哪个方面没有，即不能知道程序瓶颈在哪。</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><I><FONT size=2>f) 返回到步骤c,继续作类似的工作，一直达到要求的性能为止。</FONT></I></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2></FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><B><FONT size=2>二． JAVA布署的环境和编译技术</FONT></B></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>　开发JAVA应用程序时，首先把JAVA的源程序编译为与平台无关的字节码。这些字节码就可以被各种基于JVM的技术所执行。这些技术主要分为两个大类。即基于解释的技术和基于提前编译为本地码的技术。其示意图如下：</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14>
<P align=center><FONT size=2><IMG src="http://www.huihoo.com/java/performance/i/01_7_9_3b.gif" border=0></FONT></P></TD></TR>
<TR>
<TD class=a14><FONT size=2>具体可分为如下的五类：　　</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>a) 解释指令技术</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>其结构图和执行过程如下：</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14>
<P align=center><FONT size=2><IMG src="http://www.huihoo.com/java/performance/i/01_7_9_3c.gif" border=0> </FONT></P></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>　JAVA的编译器首先把JAVA源文件编译为字节码。这些字节码对于JAVA虚拟机(JVM)来讲就是机器的指令码。然后，JAVA的解释器不断的循环取出字节码进行解释并执行。</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>　这样做的优点是可以实现JAVA语言的跨平台，同时生成的字节码也比较紧凑。JAVA的一些优点，如安全性，动态性都得保持；但缺点是省生成的字节码没有经过什么优化，同全部编译好的本地码相比，速度比较慢。</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>b) 及时编译技术（Just In Time）</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>　　及时编译技术是为了解决指令解释技术效率比较低，速度比较慢的情况下提出的，其结构图如下所示。</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14>
<P align=center><FONT size=2><IMG src="http://www.huihoo.com/java/performance/i/01_7_9_3d.gif" border=0> </FONT></P></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>其主要变化是在JAVA程序执行之前，又JIT编译器把JAVA的字节码编译为机器码。从而在程序运行时直接执行机器码，而不用对字节码进行解释。同时对代码也进行了部分的优化。</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>这样做的优点是大大提高了JAVA程序的性能。同时，由于编译的结果并不在程序运行间保存，因此也节约了存储空间了加载程序的时间；缺点是由于JIT编译器对所有的代码都想优化，因此也浪费了很多的时间。</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>IBM和SUN公司都提供了相关的JIT产品。</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>c) 适应性优化技术（Adaptive Optimization Technology）</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>同JIT技术相比，适应性优化技术并不对所有的字节码进行优化。它会跟踪程序运行的成个过程，从而发现需要优化的代码，对代码进行动态的优化。对优化的代码，采取80/20的策略。从理论上讲，程序运行的时间越长，代码就越优化。其结构图如下：</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14>
<P align=center><FONT size=2><IMG src="http://www.huihoo.com/java/performance/i/01_7_9_3e.gif" border=0> </FONT></P></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>其优点是适应性优化技术充分利用了程序执行时的信息，发行程序的性能瓶颈，从而提高程序的性能；其缺点是在进行优化时可能会选择不当，发而降低了程序的性能。</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>其主要产品又IBM,SUN的HotSpot.</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>d) 动态优化，提前编译为机器码的技术（Dynamic Optimization,Ahead Of Time）</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>动态优化技术充分利用了JAVA源码编译，字节码编译，动态编译和静态编译的技术。其输入时JAVA的原码或字节码，而输出是经过高度优化的可执行代码和个来动态库的混合(Window中是DLL文件，UNIX中是共享库.a .so文件)。其结构如下：</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14>
<P align=center><FONT size=2><IMG src="http://www.huihoo.com/java/performance/i/01_7_9_3f.gif" border=0> </FONT></P></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>其优点是能大大提高程序的性能；缺点是破坏了JAVA的可移植性，也对JAVA的安全带来了一定的隐患。</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>其主要产品是TowerJ3.0. <BR><BR>三．优化JAVA程序设计和编码，提高JAVA程序性能的一些方法。</FONT></B></FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>通过使用一些前面介绍过的辅助性工具来找到程序中的瓶颈，然后就可以对瓶颈部分的代码进行优化。一般有两种方案：即优化代码或更改设计方法。我们一般会选择后者，因为不去调用以下代码要比调用一些优化的代码更能提高程序的性能。而一个设计良好的程序能够精简代码，从而提高性能。</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>下面将提供一些在JAVA程序的设计和编码中，为了能够提高JAVA程序的性能，而经常采用的一些方法和技巧。</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><B><FONT size=2>1．对象的生成和大小的调整。</FONT></B></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>JAVA程序设计中一个普遍的问题就是没有好好的利用JAVA语言本身提供的函数，从而常常会生成大量的对象（或实例）。由于系统不仅要花时间生成对象，以后可能还需花时间对这些对象进行垃圾回收和处理。因此，生成过多的对象将会给程序的性能带来很大的影响。</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>例1：关于String ,StringBuffer，+和append</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>JAVA语言提供了对于String类型变量的操作。但如果使用不当，会给程序的性能带来影响。如下面的语句：</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>String name=new String(“HuangWeiFeng”);</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>System.out.println(name+”is my name”);</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>看似已经很精简了，其实并非如此。为了生成二进制的代码，要进行如下的步骤和操作。</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>（1） 生成新的字符串 new String(STR_1);</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>（2） 复制该字符串。</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>（3） 加载字符串常量”HuangWeiFeng”(STR_2);</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>（4） 调用字符串的构架器（Constructor）;</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>（5） 保存该字符串到数组中（从位置0开始）</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>（6） 从java.io.PrintStream类中得到静态的out变量</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>（7） 生成新的字符串缓冲变量new StringBuffer(STR_BUF_1);</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>（8） 复制该字符串缓冲变量</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>（9） 调用字符串缓冲的构架器（Constructor）;</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>（10） 保存该字符串缓冲到数组中（从位置1开始）</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>（11） 以STR_1为参数，调用字符串缓冲(StringBuffer)类中的append方法。</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>（12） 加载字符串常量”is my name”(STR_3);</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>（13） 以STR_3为参数，调用字符串缓冲(StringBuffer)类中的append方法。</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>（14） 对于STR_BUF_1执行toString命令。</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>（15） 调用out变量中的println方法，输出结果。</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>由此可以看出，这两行简单的代码，就生成了STR_1,STR_2,STR_3,STR_4和STR_BUF_1五个对象变量。这些生成的类的实例一般都存放在堆中。堆要对所有类的超类，类的实例进行初始化，同时还要调用类极其每个超类的构架器。而这些操作都是非常消耗系统资源的。因此，对对象的生成进行限制，是完全有必要的。</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>经修改，上面的代码可以用如下的代码来替换。</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>StringBuffer name=new StringBuffer(“HuangWeiFeng”);</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>System.out.println(name.append(“is my name.”).toString());</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>系统将进行如下的操作。</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>(1) 生成新的字符串缓冲变量new StringBuffer(STR_BUF_1);</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>(2) 复制该字符串缓冲变量</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>(3) 加载字符串常量”HuangWeiFeng”(STR_1);</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>(4) 调用字符串缓冲的构架器（Constructor）;</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>(5) 保存该字符串缓冲到数组中（从位置1开始）</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>(6) 从java.io.PrintStream类中得到静态的out变量</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>(7) 加载STR_BUF_1;</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>(8) 加载字符串常量”is my name”(STR_2);</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>(9) 以STR_2为参数，调用字符串缓冲(StringBuffer)实例中的append方法。</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>(10) 对于STR_BUF_1执行toString命令。(STR_3)</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>(11)调用out变量中的println方法，输出结果。</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>由此可以看出，经过改进后的代码只生成了四个对象变量：STR_1,STR_2,STR_3和STR_BUF_1.你可能觉得少生成一个对象不会对程序的性能有很大的提高。但下面的代码段2的执行速度将是代码段1的2倍。因为代码段1生成了八个对象，而代码段2只生成了四个对象。</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>代码段1：</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>String name= new StringBuffer(“HuangWeiFeng”);</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>name+=”is my”;</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>name+=”name”;</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>代码段2：</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>StringBuffer name=new StringBuffer(“HuangWeiFeng”);</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>name.append(“is my”);</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>name.append(“name.”).toString();</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>因此，充分的利用JAVA提供的库函数来优化程序，对提高JAVA程序的性能时非常重要的.其注意点主要有如下几方面；</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>（1） 尽可能的使用静态变量（Static Class Variables）</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>如果类中的变量不会随他的实例而变化，就可以定义为静态变量，从而使他所有的实例都共享这个变量。</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>例：</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>public class foo</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>{</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>SomeObject so=new SomeObject();</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>}</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>就可以定义为：</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>public class foo</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>{</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>static SomeObject so=new SomeObject();</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>} </FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>（2） 不要对已生成的对象作过多的改变。</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>对于一些类(如：String类)来讲，宁愿在重新生成一个新的对象实例，而不应该修改已经生成的对象实例。</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>例：</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>String name=”Huang”;</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>name=”Wei”;</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>name=”Feng”;</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>上述代码生成了三个String类型的对象实例。而前两个马上就需要系统进行垃圾回收处理。如果要对字符串进行连接的操作，性能将得更差。因为系统将不得为此生成更多得临时变量。如上例1所示。 </FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>（3） 生成对象时，要分配给它合理的空间和大小</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>JAVA中的很多类都有它的默认的空间分配大小。对于StringBuffer类来讲，默认的分配空间大小是16个字符。如果在程序中使用StringBuffer的空间大小不是16个字符，那么就必须进行正确的初始化。</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>（4） 避免生成不太使用或生命周期短的对象或变量。</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>对于这种情况，因该定义一个对象缓冲池。以为管理一个对象缓冲池的开销要比频繁的生成和回收对象的开销小的多。</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>（5） 只在对象作用范围内进行初始化。</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>JAVA允许在代码的任何地方定义和初始化对象。这样，就可以只在对象作用的范围内进行初始化。从而节约系统的开销。</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>例：</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>SomeObject so=new SomeObject();</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>If(x==1) then</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>{</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>Foo=so.getXX();</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>}</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>可以修改为：</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>if(x==1) then</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>{</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>SomeObject so=new SomeObject();</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>Foo=so.getXX();</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>}</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><B><FONT size=2>2．异常(Exceptions)</FONT></B></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>JAVA语言中提供了try/catch来发方便用户捕捉异常，进行异常的处理。但是如果使用不当，也会给JAVA程序的性能带来影响。因此，要注意以下两点。</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>(1) 避免对应用程序的逻辑使用try/catch</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>如果可以用if,while等逻辑语句来处理，那么就尽可能的不用try/catch语句</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>(2) 重用异常</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>在必须要进行异常的处理时，要尽可能的重用已经存在的异常对象。以为在异常的处理中，生成一个异常对象要消耗掉大部分的时间。</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><B><FONT size=2>3. 线程(Threading)</FONT></B></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>一个高性能的应用程序中一般都会用到线程。因为线程能充分利用系统的资源。在其他线程因为等待硬盘或网络读写而 时，程序能继续处理和运行。但是对线程运用不当，也会影响程序的性能。</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>例2：正确使用Vector类</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>Vector主要用来保存各种类型的对象（包括相同类型和不同类型的对象）。但是在一些情况下使用会给程序带来性能上的影响。这主要是由Vector类的两个特点所决定的。第一，Vector提供了线程的安全保护功能。即使Vector类中的许多方法同步。但是如果你已经确认你的应用程序是单线程，这些方法的同步就完全不必要了。第二，在Vector查找存储的各种对象时，常常要花很多的时间进行类型的匹配。而当这些对象都是同一类型时，这些匹配就完全不必要了。因此，有必要设计一个单线程的，保存特定类型对象的类或集合来替代Vector类.用来替换的程序如下（StringVector.java）：</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>public class StringVector </FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>{</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>private String [] data;</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>private int count;</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>public StringVector() { this(10); // default size is 10 }</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>public StringVector(int initialSize) </FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>{</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>data = new String[initialSize];</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>}</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>public void add(String str) </FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>{</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>// ignore null strings</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>if(str == null) { return; }</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>ensureCapacity(count + 1);</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>data[count++] = str;</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>}</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2></FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>private void ensureCapacity(int minCapacity) </FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>{</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>int oldCapacity = data.length;</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>if (minCapacity &gt; oldCapacity) </FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>{</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>String oldData[] = data;</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>int newCapacity = oldCapacity * 2;</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>data = new String[newCapacity];</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>System.arraycopy(oldData, 0, data, 0, count);</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>}</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>}</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>public void remove(String str) </FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>{</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>if(str == null) { return // ignore null str }</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>for(int i = 0; i &lt; count; i++) </FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>{ </FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>// check for a match</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>if(data[i].equals(str)) </FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>{</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>System.arraycopy(data,i+1,data,i,count-1); // copy data </FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>// allow previously valid array element be gc'd</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>data[--count] = null;</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>return;</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>}</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>}</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>}</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>public final String getStringAt(int index) {</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>if(index &lt; 0) { return null; } </FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>else if(index &gt; count)</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>{ </FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>return null; // index is &gt; # strings</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>}</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>else { return data[index]; // index is good }</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>}</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>/* * * * * * * * * * * * * * * *StringVector.java * * * * * * * * * * * * * * * * */</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>因此，代码：</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>Vector Strings=new Vector();</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>Strings.add(“One”);</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>Strings.add(“Two”);</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>String Second=(String)Strings.elementAt(1);</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>可以用如下的代码替换：</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>StringVector Strings=new StringVector();</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>Strings.add(“One”);</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>Strings.add(“Two”);</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>String Second=Strings.getStringAt(1); </FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>这样就可以通过优化线程来提高JAVA程序的性能。用于测试的程序如下（TestCollection.java）: </FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>import java.util.Vector;</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>public class TestCollection </FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>{</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>public static void main(String args []) </FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>{</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>TestCollection collect = new TestCollection();</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>if(args.length == 0) </FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>{</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>System.out.println(</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>"Usage: java TestCollection [ vector | stringvector ]");</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>System.exit(1);</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>}</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>if(args[0].equals("vector")) </FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>{</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>Vector store = new Vector();</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>long start = System.currentTimeMillis();</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>for(int i = 0; i &lt; 1000000; i++) </FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>{ </FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>store.addElement("string");</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>}</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>long finish = System.currentTimeMillis();</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>System.out.println((finish-start));</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>start = System.currentTimeMillis();</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>for(int i = 0; i &lt; 1000000; i++) </FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>{</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>String result = (String)store.elementAt(i);</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>}</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>finish = System.currentTimeMillis();</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>System.out.println((finish-start));</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>}</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>else if(args[0].equals("stringvector")) </FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>{</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>StringVector store = new StringVector();</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>long start = System.currentTimeMillis();</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>for(int i = 0; i &lt; 1000000; i++) { store.add("string"); }</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>long finish = System.currentTimeMillis();</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>System.out.println((finish-start));</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>start = System.currentTimeMillis();</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>for(int i = 0; i &lt; 1000000; i++) {</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>String result = store.getStringAt(i);</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>}</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>finish = System.currentTimeMillis();</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>System.out.println((finish-start));</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>}</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>}</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>}</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>/* * * * * * * * * * * * * * * *TestCollection.java * * * * * * * * * * * * * * * * */</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>测试的结果如下（假设标准的时间为１，越小性能越好）：</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14>
<P align=center><FONT size=2><IMG src="http://www.huihoo.com/java/performance/i/01_7_9_4.gif" border=0></FONT></P></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>关于线程的操作，要注意如下几个方面。 </FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>(1) 防止过多的同步</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>如上所示，不必要的同步常常会造成程序性能的下降。因此，如果程序是单线程，则一定不要使用同步。</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>(2) 同步方法而不要同步整个代码段</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>　　　对某个方法或函数进行同步比对整个代码段进行同步的性能要好。</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>(3) 对每个对象使用多”锁”的机制来增大并发。</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>一般每个对象都只有一个”锁”，这就表明如果两个线程执行一个对象的两个不同的同步方法时，会发生”死锁”。即使这两个方法并不共享任何资源。为了避免这个问题，可以对一个对象实行”多锁”的机制。如下所示：</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>class foo</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>{</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>private static int var1;</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>private static Object lock1=new Object();</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>private static int var2;</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>private static Object lock2=new Object();</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>public static void increment1()</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>{</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>synchronized(lock1)</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>{</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>var1++;</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>}</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>}</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>public static void increment2()</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>{</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>synchronized(lock2)</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>{</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>var2++;</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>}</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>}</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>}</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><B><FONT size=2>4．输入和输出(I/O)</FONT></B></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>输入和输出包括很多方面，但涉及最多的是对硬盘，网络或数据库的读写操作。对于读写操作，又分为有缓存和没有缓存的；对于数据库的操作，又可以有多种类型的JDBC驱动器可以选择。但无论怎样，都会给程序的性能带来影响。因此，需要注意如下几点：</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>(1) 使用输入输出缓冲</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>　　　尽可能的多使用缓存。但如果要经常对缓存进行刷新（flush）,则建议不要使用缓存。</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>(2) 输出流(Output Stream)和Unicode字符串 </FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>　　　当时用Output Stream和Unicode字符串时，Write类的开销比较大。因为它要实现Unicode到字节(byte)的转换.因此，如果可能的话,在使用Write类之前就实现转换或用OutputStream类代替Writer类来使用。</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>(3) 当需序列化时使用transient</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>　　　当序列化一个类或对象时，对于那些原子类型（atomic）或可以重建的原素要表识为transient类型。这样就不用每一次都进行序列化。如果这些序列化的对象要在网络上传输，这一小小的改变对性能会有很大的提高。　　</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>(4) 使用高速缓存（Cache）</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>　　　对于那些经常要使用而又不大变化的对象或数据，可以把它存储在高速缓存中。这样就可以提高访问的速度。这一点对于从数据库中返回的结果集尤其重要。</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>(5) 使用速度快的JDBC驱动器（Driver）</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>　　　JAVA对访问数据库提供了四种方法。这其中有两种是JDBC驱动器。一种是用JAVA外包的本地驱动器；另一种是完全的JAVA驱动器。具体要使用哪一种得根据JAVA布署的环境和应用程序本身来定。</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><B><FONT size=2>5.一些其他的经验和技巧</FONT></B></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>(1) 使用局部变量</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>(2) 避免在同一个类中动过调用函数或方法(get或set)来设置或调用变量。</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>(3) 避免在循环中生成同一个变量或调用同一个函数（参数变量也一样）</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>(4) 尽可能的使用static,final,private等关键字</FONT></TD></TR></TBODY></TABLE>
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD class=a14><FONT size=2>(5) 当复制大量数据时，使用System.arraycopy()命令。 <BR></FONT></TD></TR></TBODY></TABLE><img src ="http://www.blogjava.net/faintbear/aggbug/11615.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/faintbear/" target="_blank">小力力力</a> 2005-08-31 11:40 <a href="http://www.blogjava.net/faintbear/archive/2005/08/31/11615.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java.util (转)</title><link>http://www.blogjava.net/faintbear/archive/2005/04/19/3449.html</link><dc:creator>小力力力</dc:creator><author>小力力力</author><pubDate>Tue, 19 Apr 2005 03:25:00 GMT</pubDate><guid>http://www.blogjava.net/faintbear/archive/2005/04/19/3449.html</guid><wfw:comment>http://www.blogjava.net/faintbear/comments/3449.html</wfw:comment><comments>http://www.blogjava.net/faintbear/archive/2005/04/19/3449.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/faintbear/comments/commentRss/3449.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/faintbear/services/trackbacks/3449.html</trackback:ping><description><![CDATA[<DIV class=postTitle><A href="http://blog.csdn.net/WalkingWithJava/archive/2005/04/18/353229.aspx">java.util</A>
<SCRIPT language=javascript>document.title="java.util - "+document.title</SCRIPT>
 </DIV>
<DIV class=postText>
<P class=MsoTitle style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: navy"><FONT size=5><STRONG><FONT face="Courier New">Interface 
<P></P></FONT></STRONG></FONT></SPAN>
<P></P>
<P class=MsoSubtitle style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><STRONG><FONT face="Courier New" color=#0000ff size=5>Collection</FONT></STRONG></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=3><SPAN><FONT face="Courier New"><STRONG>RetainAll</STRONG> </FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'">：保留两个</SPAN><SPAN lang=EN-US><FONT face="Courier New">Collection</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'">的交集。注意，如果该</SPAN><SPAN lang=EN-US><FONT face="Courier New">Collection</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'">是由</SPAN><SPAN lang=EN-US><FONT face="Courier New">Arrays.asList</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'">转换而来，那么这个方法会失败。因为转换来的</SPAN><SPAN lang=EN-US><FONT face="Courier New">List</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'">接口不支持这个方法</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=3><SPAN lang=EN-US><FONT face="Courier New">Samples</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'">：</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT face="Courier New" size=3>public static void collectionTest()</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3><FONT face="Courier New"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>{</FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3><FONT face="Courier New"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>Collection c1 = new ArrayList();</FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3><FONT face="Courier New"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>Collection c2 = new ArrayList();</FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3><FONT face="Courier New"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="mso-spacerun: yes">&nbsp;</SPAN>c1.add("aaa");</FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3><FONT face="Courier New"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>c1.add("bbb");</FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3><FONT face="Courier New"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>c1.add("ccc");</FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3><FONT face="Courier New"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>c2.add("ddd");</FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3><FONT face="Courier New"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>c2.add("ccc");</FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3><FONT face="Courier New"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>c2.add("eee");</FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3><FONT face="Courier New"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>boolean isRetainSucceed = false;</FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3><FONT face="Courier New"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>isRetainSucceed = c2.retainAll(c1);</FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3><FONT face="Courier New"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>System.out.println("isRetainSucceed = " + isRetainSucceed);</FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3><FONT face="Courier New"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>System.out.println("********** print collection c2 values ");</FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3><FONT face="Courier New"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>for (Iterator iter = c2.iterator(); iter.hasNext();)</FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3><FONT face="Courier New"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>{</FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3><FONT face="Courier New"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>String s = (String) iter.next();</FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3><FONT face="Courier New"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>System.out.println("s = " + s);</FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3><FONT face="Courier New"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>}</FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><SPAN lang=EN-US><FONT face="Courier New" size=3>}</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3><FONT face="Courier New"> 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoSubtitle style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><A title="interface in java.util" href="http://blog.csdn.net/jdk142/api/java/util/Enumeration.html" target=classFrame><SPAN style="TEXT-DECORATION: none; text-underline: none"><STRONG><FONT face="Courier New" size=5>Enumeration</FONT></STRONG></SPAN></A></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'"><FONT size=3>太简单，参考文档</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3><FONT face="Courier New"> 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoSubtitle style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><A title="interface in java.util" href="http://blog.csdn.net/jdk142/api/java/util/Comparator.html" target=classFrame><SPAN style="TEXT-DECORATION: none; text-underline: none"><STRONG><FONT face="Courier New" size=5>Comparator</FONT></STRONG></SPAN></A></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'"><FONT size=3>未使用过</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3><FONT face="Courier New"> 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoSubtitle style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><STRONG><FONT face="Courier New" color=#0000ff size=5>EventListener</FONT></STRONG></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'"><FONT size=3>空接口</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3><FONT face="Courier New"> 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoSubtitle style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><STRONG><FONT face="Courier New" color=#0000ff size=5>Iterator</FONT></STRONG></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'">和</SPAN><SPAN lang=EN-US><A title="interface in java.util" href="http://blog.csdn.net/jdk142/api/java/util/Enumeration.html" target=classFrame><SPAN style="COLOR: black; TEXT-DECORATION: none; text-underline: none"><FONT face="Courier New">Enumeration</FONT></SPAN></A><FONT face="Courier New"> </FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'">的不同点：</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l1 level1 lfo1; tab-stops: list 18.0pt"><SPAN lang=EN-US><FONT face="Courier New" size=3>1．</FONT><SPAN style="FONT: 7pt 'Times New Roman'"> </SPAN></SPAN><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'">允许遍历</SPAN><SPAN lang=EN-US><FONT face="Courier New">Collection</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'">时删除对象</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l1 level1 lfo1; tab-stops: list 18.0pt"><SPAN lang=EN-US><FONT face="Courier New" size=3>2．</FONT><SPAN style="FONT: 7pt 'Times New Roman'"> </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'"><FONT size=3>方法名字可读性更好</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3><FONT face="Courier New"> 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoSubtitle style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><STRONG><FONT face="Courier New" color=#0000ff size=5>List</FONT></STRONG></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'">实现的四个类：</SPAN><SPAN lang=EN-US><A title="class in java.util" href="http://blog.csdn.net/jdk142/api/java/util/AbstractList.html"><FONT face="Courier New"><SPAN style="mso-field-code: 'HYPERLINK '/jdk142/api/java/util/AbstractList.html'o Ȭlass in java.util''">AbstractList</SPAN><SPAN style="COLOR: black; TEXT-DECORATION: none; text-underline: none">, <SPAN style="mso-field-code: 'HYPERLINK '/jdk142/api/java/util/ArrayList.html'o Ȭlass in java.util''"><U><SPAN style="COLOR: blue">ArrayList</SPAN></U></SPAN>, <SPAN style="mso-field-code: 'HYPERLINK '/jdk142/api/java/util/LinkedList.html'o Ȭlass in java.util''"><U><SPAN style="COLOR: blue">LinkedList</SPAN></U></SPAN>, <SPAN style="mso-field-code: 'HYPERLINK '/jdk142/api/java/util/Vector.html'o Ȭlass in java.util''"><U><SPAN style="COLOR: blue">Vector</SPAN></U></SPAN> </SPAN></FONT></A></SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=3><SPAN lang=EN-US><FONT face="Courier New">List </FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'">特点：</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo2; tab-stops: list 18.0pt"><SPAN lang=EN-US><FONT face="Courier New" size=3>1．</FONT><SPAN style="FONT: 7pt 'Times New Roman'"> </SPAN></SPAN><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'">允许重复元素，允许</SPAN><SPAN lang=EN-US><FONT face="Courier New">null</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'">元素</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo2; tab-stops: list 18.0pt"><SPAN lang=EN-US><FONT face="Courier New" size=3>2．</FONT><SPAN style="FONT: 7pt 'Times New Roman'"> </SPAN></SPAN><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'">推荐用</SPAN><SPAN lang=EN-US><FONT face="Courier New">Iterator</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'">遍历，而不是用索引</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3><FONT face="Courier New"> 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=3><B><SPAN lang=EN-US style="COLOR: navy"><FONT face="Courier New">addAll : </FONT></SPAN></B><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'">加入</SPAN><SPAN lang=EN-US><FONT face="Courier New">Collection</FONT></SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=3><FONT face="Courier New"><B><SPAN lang=EN-US style="COLOR: navy">containsAll</SPAN></B><SPAN lang=EN-US style="COLOR: navy"> :</SPAN></FONT><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'">是否包含</SPAN><SPAN lang=EN-US><FONT face="Courier New">Collection</FONT></SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=3><FONT face="Courier New"><B><SPAN lang=EN-US style="COLOR: navy">retainAll</SPAN></B><SPAN lang=EN-US> : </SPAN></FONT><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'">保留和</SPAN><SPAN lang=EN-US><FONT face="Courier New">Collection</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'">的交集</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=3><FONT face="Courier New"><B><SPAN lang=EN-US style="COLOR: navy">subList</SPAN></B><SPAN lang=EN-US> : </SPAN></FONT><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'">返回指定索引区间的子</SPAN><SPAN lang=EN-US><FONT face="Courier New">List</FONT></SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=3><FONT face="Courier New"><B><SPAN lang=EN-US style="COLOR: navy">ListIterator</SPAN></B><SPAN lang=EN-US> </SPAN></FONT><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'">：</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l2 level1 lfo3; tab-stops: list 18.0pt"><SPAN lang=EN-US><FONT face="Courier New" size=3>1．</FONT><SPAN style="FONT: 7pt 'Times New Roman'"> </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'"><FONT size=3>提供元素的双向遍历，而不是单向</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l2 level1 lfo3; tab-stops: list 18.0pt"><SPAN lang=EN-US><FONT face="Courier New" size=3>2．</FONT><SPAN style="FONT: 7pt 'Times New Roman'"> </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'"><FONT size=3>遍历时可改变存储的元素</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l2 level1 lfo3; tab-stops: list 18.0pt"><SPAN lang=EN-US><FONT face="Courier New" size=3>3．</FONT><SPAN style="FONT: 7pt 'Times New Roman'"> </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'"><FONT size=3>可动态插入元素，插入的元素在当前操作元素的上一个位置</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3><FONT face="Courier New"> 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=3><SPAN lang=EN-US><FONT face="Courier New">Samples</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'">：</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT face="Courier New" size=3>public static void ListTest(){</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3><FONT face="Courier New"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>System.out.println("**********ListTest begin:");</FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3><FONT face="Courier New"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>List list = new ArrayList();</FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3><FONT face="Courier New"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>list.add("aaa");</FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3><FONT face="Courier New"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>list.add("bbb");</FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3><FONT face="Courier New"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>list.add("ccc");</FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3><FONT face="Courier New"> 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3><FONT face="Courier New"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>ListIterator iter = list.listIterator();</FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3><FONT face="Courier New"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>System.out.println("**************** Iterating List forward :");</FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3><FONT face="Courier New"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>while(iter.hasNext()){</FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3><FONT face="Courier New"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>String s = (String)iter.next();</FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3><FONT face="Courier New"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>System.out.println("**********element = " + s);</FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3><FONT face="Courier New"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>}</FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3><FONT face="Courier New"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>System.out.println("**************** Iterating List backward :");</FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3><FONT face="Courier New"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>while(iter.hasPrevious()){</FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3><FONT face="Courier New"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>String s = (String)iter.previous();</FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3><FONT face="Courier New"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>System.out.println("**********element = " + s);</FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3><FONT face="Courier New"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>}</FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3><FONT face="Courier New"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>System.out.println("**************** Add element into List :");</FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3><FONT face="Courier New"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>while(iter.hasNext()){</FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3><FONT face="Courier New"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>int i = iter.nextIndex();</FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3><FONT face="Courier New"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>if (i==2)</FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3><FONT face="Courier New"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>iter.add("ddd");</FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3><FONT face="Courier New"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>String s = (String)iter.next();</FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3><FONT face="Courier New"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>System.out.println("**********element = " + s);</FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3><FONT face="Courier New"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>}</FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3><FONT face="Courier New"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>System.out.println("**************** Iterating List backward after add element:");</FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3><FONT face="Courier New"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>while(iter.hasPrevious()){</FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3><FONT face="Courier New"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>String s = (String)iter.previous();</FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3><FONT face="Courier New"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>System.out.println("**********element = " + s);</FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3><FONT face="Courier New"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>}</FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3><FONT face="Courier New"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>System.out.println("**********ListTest end:");</FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3><FONT face="Courier New"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>}</FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3><FONT face="Courier New"> 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoSubtitle style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><STRONG><FONT face="Courier New" color=#0000ff size=5>Map </FONT></STRONG></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN><FONT face="Courier New"><FONT size=3><STRONG>KeySet</STRONG> :</FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'">返回</SPAN><SPAN lang=EN-US><FONT face="Courier New">Set</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'">对象，然后可以遍历这个</SPAN><SPAN lang=EN-US><FONT face="Courier New">Set</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'">。其中的每个元素都是</SPAN><SPAN lang=EN-US><FONT face="Courier New">Map.Entry</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'">对象</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=3><FONT face="Courier New"><B><SPAN lang=EN-US style="COLOR: navy">Map.Entry.setValue</SPAN></B><SPAN lang=EN-US> :</SPAN></FONT></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'">在遍历</SPAN><SPAN lang=EN-US><FONT face="Courier New">Entry</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'">对象时，可以改变该</SPAN><SPAN lang=EN-US><FONT face="Courier New">Key</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'">对应的</SPAN><SPAN lang=EN-US><FONT face="Courier New">Value</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'">值</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=3><SPAN lang=EN-US><FONT face="Courier New">Samples</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'">：</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT face="Courier New" size=3>public static void mapEntrySetTest(){</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3><FONT face="Courier New"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>System.out.println("**********mapEntrySetTest begin:");</FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3><FONT face="Courier New"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>Map map = new HashMap();</FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3><FONT face="Courier New"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>map.put("first","aaa");</FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3><FONT face="Courier New"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>map.put("second","bbb");</FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3><FONT face="Courier New"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>map.put("third","ccc");</FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3><FONT face="Courier New"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>map.put("fourth","ddd");</FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3><FONT face="Courier New"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>Set set = map.entrySet();</FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3><FONT face="Courier New"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>Map.Entry entry = null;</FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3><FONT face="Courier New"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>System.out.println("********** print values in map :");</FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3><FONT face="Courier New"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>for(Iterator iter = set.iterator();iter.hasNext();){</FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3><FONT face="Courier New"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>entry = (Map.Entry)iter.next();</FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3><FONT face="Courier New"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>System.out.println("Key is :" + entry.getKey() + " and Value is :" + entry.getValue());</FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3><FONT face="Courier New"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>entry.setValue((String)entry.getValue() + "_setValueTest");</FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3><FONT face="Courier New"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>}</FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3><FONT face="Courier New"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>System.out.println("********** After set value ,iterating values in map :");</FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3><FONT face="Courier New"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>for(Iterator iter = set.iterator();iter.hasNext();){</FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3><FONT face="Courier New"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>entry = (Map.Entry)iter.next();</FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3><FONT face="Courier New"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>System.out.println("Key is :" + entry.getKey() + " and Value is :" + entry.getValue());<SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3><FONT face="Courier New"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>}</FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3><FONT face="Courier New"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>System.out.println("**********mapEntrySetTest end:");</FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><SPAN lang=EN-US><FONT face="Courier New" size=3>}</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3><FONT face="Courier New"> 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face="Courier New"><B><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: blue; mso-bidi-font-size: 12.0pt">Observable</SPAN></B><SPAN lang=EN-US><FONT size=3> and </FONT></SPAN><B><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: blue; mso-bidi-font-size: 12.0pt">Observer</SPAN></B></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'"><FONT size=3>暂未想通</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3><FONT face="Courier New"> 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><B><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: blue; mso-bidi-font-size: 12.0pt"><FONT face="Courier New">RandomAccess</FONT></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'">空接口。实现这个接口的</SPAN><SPAN lang=EN-US><FONT face="Courier New">List</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'">实现品，表示他们支持高速的随机访问元素。如果实现这个接口，理论上</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT face="Courier New" size=3>for (int i=0, n=list.size(); i &lt; n; i++)</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3><FONT face="Courier New"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>list.get(i);</FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'"><FONT size=3>比下面代码要快：</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT face="Courier New" size=3>for (Iterator i=list.iterator(); i.hasNext(); )</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3><FONT face="Courier New"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>i.next();</FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3><FONT face="Courier New"> 
<P></P></FONT></FONT></SPAN>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face="Courier New"><B><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: blue; mso-bidi-font-size: 12.0pt">Set</SPAN></B><SPAN lang=EN-US><FONT size=3> </FONT></SPAN></FONT><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'"><FONT size=3>：</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'">没什么特别的，和</SPAN><SPAN lang=EN-US><FONT face="Courier New">Collection</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'">差不多<BR><BR><BR>转自:http://blog.csdn.net/WalkingWithJava/</SPAN></FONT></P></DIV><img src ="http://www.blogjava.net/faintbear/aggbug/3449.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/faintbear/" target="_blank">小力力力</a> 2005-04-19 11:25 <a href="http://www.blogjava.net/faintbear/archive/2005/04/19/3449.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java 统计单词个数和标点符号</title><link>http://www.blogjava.net/faintbear/archive/2005/04/05/2872.html</link><dc:creator>小力力力</dc:creator><author>小力力力</author><pubDate>Tue, 05 Apr 2005 03:55:00 GMT</pubDate><guid>http://www.blogjava.net/faintbear/archive/2005/04/05/2872.html</guid><wfw:comment>http://www.blogjava.net/faintbear/comments/2872.html</wfw:comment><comments>http://www.blogjava.net/faintbear/archive/2005/04/05/2872.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/faintbear/comments/commentRss/2872.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/faintbear/services/trackbacks/2872.html</trackback:ping><description><![CDATA[把随机输入的一句话比如:It's only a test!存放在一个char[]的数组中，统计char[]中的单词个数和标点符号的个数。<BR><BR><BR>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #000000">package&nbsp;com.faintbear;<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>import&nbsp;java.io.</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">;<BR><IMG id=Codehighlighter1_59_771_Open_Image onclick="this.style.display='none'; Codehighlighter1_59_771_Open_Text.style.display='none'; Codehighlighter1_59_771_Closed_Image.style.display='inline'; Codehighlighter1_59_771_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_59_771_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_59_771_Closed_Text.style.display='none'; Codehighlighter1_59_771_Open_Image.style.display='inline'; Codehighlighter1_59_771_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000">&nbsp;Test</SPAN><SPAN id=Codehighlighter1_59_771_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_59_771_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG id=Codehighlighter1_117_769_Open_Image onclick="this.style.display='none'; Codehighlighter1_117_769_Open_Text.style.display='none'; Codehighlighter1_117_769_Closed_Image.style.display='inline'; Codehighlighter1_117_769_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_117_769_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_117_769_Closed_Text.style.display='none'; Codehighlighter1_117_769_Open_Image.style.display='inline'; Codehighlighter1_117_769_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">static</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;main(String[]&nbsp;args)&nbsp;throws&nbsp;Exception</SPAN><SPAN id=Codehighlighter1_117_769_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_117_769_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BufferedReader&nbsp;br&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;BufferedReader(</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;InputStreamReader(System.</SPAN><SPAN style="COLOR: #0000ff">in</SPAN><SPAN style="COLOR: #000000">));<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;str&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;br.readLine();<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">(str&nbsp;</SPAN><SPAN style="COLOR: #000000">==</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">null</SPAN><SPAN style="COLOR: #000000">)&nbsp;</SPAN><SPAN style="COLOR: #0000ff">throw</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;Exception(</SPAN><SPAN style="COLOR: #000000">""</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">char</SPAN><SPAN style="COLOR: #000000">[]&nbsp;c&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;str.toCharArray();<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;words&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;ip&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;boolean&nbsp;wordflag&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">false</SPAN><SPAN style="COLOR: #000000">;<BR><IMG id=Codehighlighter1_388_613_Open_Image onclick="this.style.display='none'; Codehighlighter1_388_613_Open_Text.style.display='none'; Codehighlighter1_388_613_Closed_Image.style.display='inline'; Codehighlighter1_388_613_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_388_613_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_388_613_Closed_Text.style.display='none'; Codehighlighter1_388_613_Open_Image.style.display='inline'; Codehighlighter1_388_613_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">for</SPAN><SPAN style="COLOR: #000000">(</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;i</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">;i</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">c.length;i</SPAN><SPAN style="COLOR: #000000">++</SPAN><SPAN style="COLOR: #000000">)</SPAN><SPAN id=Codehighlighter1_388_613_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_388_613_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG id=Codehighlighter1_455_546_Open_Image onclick="this.style.display='none'; Codehighlighter1_455_546_Open_Text.style.display='none'; Codehighlighter1_455_546_Closed_Image.style.display='inline'; Codehighlighter1_455_546_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_455_546_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_455_546_Closed_Text.style.display='none'; Codehighlighter1_455_546_Open_Image.style.display='inline'; Codehighlighter1_455_546_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">((c[i]</SPAN><SPAN style="COLOR: #000000">&gt;=</SPAN><SPAN style="COLOR: #000000">'</SPAN><SPAN style="COLOR: #000000">a</SPAN><SPAN style="COLOR: #000000">'</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">&amp;&amp;</SPAN><SPAN style="COLOR: #000000">&nbsp;c[i]&nbsp;</SPAN><SPAN style="COLOR: #000000">&lt;=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">'</SPAN><SPAN style="COLOR: #000000">z</SPAN><SPAN style="COLOR: #000000">'</SPAN><SPAN style="COLOR: #000000">)&nbsp;</SPAN><SPAN style="COLOR: #000000">||</SPAN><SPAN style="COLOR: #000000">&nbsp;(c[i]&nbsp;</SPAN><SPAN style="COLOR: #000000">&gt;=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">'</SPAN><SPAN style="COLOR: #000000">A</SPAN><SPAN style="COLOR: #000000">'</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">&amp;&amp;</SPAN><SPAN style="COLOR: #000000">&nbsp;c[i]&nbsp;</SPAN><SPAN style="COLOR: #000000">&lt;=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">'</SPAN><SPAN style="COLOR: #000000">Z</SPAN><SPAN style="COLOR: #000000">'</SPAN><SPAN style="COLOR: #000000">))</SPAN><SPAN id=Codehighlighter1_455_546_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_455_546_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG id=Codehighlighter1_474_495_Open_Image onclick="this.style.display='none'; Codehighlighter1_474_495_Open_Text.style.display='none'; Codehighlighter1_474_495_Closed_Image.style.display='inline'; Codehighlighter1_474_495_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_474_495_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_474_495_Closed_Text.style.display='none'; Codehighlighter1_474_495_Open_Image.style.display='inline'; Codehighlighter1_474_495_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">(wordflag)&nbsp;</SPAN><SPAN id=Codehighlighter1_474_495_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_474_495_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">continue</SPAN><SPAN style="COLOR: #000000">;<BR><IMG id=Codehighlighter1_500_520_Open_Image onclick="this.style.display='none'; Codehighlighter1_500_520_Open_Text.style.display='none'; Codehighlighter1_500_520_Closed_Image.style.display='inline'; Codehighlighter1_500_520_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_500_520_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_500_520_Closed_Text.style.display='none'; Codehighlighter1_500_520_Open_Image.style.display='inline'; Codehighlighter1_500_520_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #0000ff">else</SPAN><SPAN id=Codehighlighter1_500_520_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_500_520_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;words</SPAN><SPAN style="COLOR: #000000">++</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wordflag&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">true</SPAN><SPAN style="COLOR: #000000">;<BR><IMG id=Codehighlighter1_551_609_Open_Image onclick="this.style.display='none'; Codehighlighter1_551_609_Open_Text.style.display='none'; Codehighlighter1_551_609_Closed_Image.style.display='inline'; Codehighlighter1_551_609_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_551_609_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_551_609_Closed_Text.style.display='none'; Codehighlighter1_551_609_Open_Image.style.display='inline'; Codehighlighter1_551_609_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #0000ff">else</SPAN><SPAN id=Codehighlighter1_551_609_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_551_609_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wordflag&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">false</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">(c[i]&nbsp;</SPAN><SPAN style="COLOR: #000000">!=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">'</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">'</SPAN><SPAN style="COLOR: #000000">)<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ip</SPAN><SPAN style="COLOR: #000000">++</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.</SPAN><SPAN style="COLOR: #0000ff">out</SPAN><SPAN style="COLOR: #000000">.println(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">words=</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000">&nbsp;words);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.</SPAN><SPAN style="COLOR: #0000ff">out</SPAN><SPAN style="COLOR: #000000">.println(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">ip=</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000">&nbsp;ip);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">for</SPAN><SPAN style="COLOR: #000000">(</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;i</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">;i</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">c.length;i</SPAN><SPAN style="COLOR: #000000">++</SPAN><SPAN style="COLOR: #000000">)<BR><IMG id=Codehighlighter1_721_765_Open_Image onclick="this.style.display='none'; Codehighlighter1_721_765_Open_Text.style.display='none'; Codehighlighter1_721_765_Closed_Image.style.display='inline'; Codehighlighter1_721_765_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_721_765_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_721_765_Closed_Text.style.display='none'; Codehighlighter1_721_765_Open_Image.style.display='inline'; Codehighlighter1_721_765_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_721_765_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_721_765_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.</SPAN><SPAN style="COLOR: #0000ff">out</SPAN><SPAN style="COLOR: #000000">.print(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">c[</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000">i</SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">]=</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000">c[i]);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN></DIV></DIV><img src ="http://www.blogjava.net/faintbear/aggbug/2872.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/faintbear/" target="_blank">小力力力</a> 2005-04-05 11:55 <a href="http://www.blogjava.net/faintbear/archive/2005/04/05/2872.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>console的一个input类(转) </title><link>http://www.blogjava.net/faintbear/archive/2005/03/30/2631.html</link><dc:creator>小力力力</dc:creator><author>小力力力</author><pubDate>Wed, 30 Mar 2005 15:35:00 GMT</pubDate><guid>http://www.blogjava.net/faintbear/archive/2005/03/30/2631.html</guid><wfw:comment>http://www.blogjava.net/faintbear/comments/2631.html</wfw:comment><comments>http://www.blogjava.net/faintbear/archive/2005/03/30/2631.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/faintbear/comments/commentRss/2631.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/faintbear/services/trackbacks/2631.html</trackback:ping><description><![CDATA[<P>package com.faintbear;<BR>import java.io.*;</P>
<P><BR>class Input{<BR>&nbsp;&nbsp;&nbsp;&nbsp; //Read a Sring from kedboard<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static String getString()<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String string="";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BufferedReader br =new BufferedReader(new InputStreamReader(System.in));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string=br.readLine();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch(IOException iox) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.err.println(iox);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return string;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // read a char from keyboard<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static char getChar()throws java.io.IOException<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char cookie;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(true){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String string=getString();//Reads the next line of text from the input stream</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Check the input<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (string.length()&gt;1) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.err.println("Sorry,You should input a character,");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.err.println("Please input again");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; continue;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cookie=string.charAt(0) ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return cookie;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //read a double number from keyboard<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static double getDouble( )&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; double cookie;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(true) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String string = getString();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cookie=Double.parseDouble(string);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return cookie;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Check the number<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch(NumberFormatException nfe)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.err.println("Sorry,this is not a double number,plz input again");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; continue;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Read a int number from keyboard<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static int getInt( )&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int cookie;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(true) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String string = getString();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cookie=Integer.parseInt(string);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return cookie;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Check the input number<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch(NumberFormatException nfe)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.err.println("Sorry,this is not a integer number,plz input again");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; continue;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Read a float number from keyboard<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static float getFloat()<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; float cookie;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(true) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String string = getString();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cookie=Float.parseFloat(string);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return cookie;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Check the input number<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch(NumberFormatException nfe)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.err.println("Sorry,this is not a float number,plz input again");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; continue;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</P>
<P>} </P>
<P>&nbsp;</P>
<P>&nbsp;</P>
<P>package com.faintbear;<BR>import com.faintbear.Input;<BR>public class Class1<BR>{<BR>&nbsp;public static void main(String[] args) <BR>&nbsp;{<BR>&nbsp;&nbsp;System.out.println("请输入数据");<BR>&nbsp;&nbsp;System.out.println("******************");<BR>&nbsp;&nbsp;int kk=Input.getInt();<BR>&nbsp;&nbsp;System.out.println("l1====="+kk);<BR>&nbsp;}<BR>}</P><img src ="http://www.blogjava.net/faintbear/aggbug/2631.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/faintbear/" target="_blank">小力力力</a> 2005-03-30 23:35 <a href="http://www.blogjava.net/faintbear/archive/2005/03/30/2631.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java学习之类的属性 </title><link>http://www.blogjava.net/faintbear/archive/2005/03/30/2629.html</link><dc:creator>小力力力</dc:creator><author>小力力力</author><pubDate>Wed, 30 Mar 2005 13:43:00 GMT</pubDate><guid>http://www.blogjava.net/faintbear/archive/2005/03/30/2629.html</guid><wfw:comment>http://www.blogjava.net/faintbear/comments/2629.html</wfw:comment><comments>http://www.blogjava.net/faintbear/archive/2005/03/30/2629.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/faintbear/comments/commentRss/2629.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/faintbear/services/trackbacks/2629.html</trackback:ping><description><![CDATA[<DIV class=postTitle><A id=viewpost.ascx_TitleUrl href="http://blog.csdn.net/faintbear/archive/2004/12/07/207513.aspx"><FONT color=#000080>Java学习之类的属性</FONT></A> </DIV>
<DIV class=postText>
<P><FONT size=2>Public、private、protected显示了三种类中的属性和服务的类型，public是可以随意访问的、private是外界不能访问的（显示了数据的封装性）、protected说明数据是受保护的。下面就来详细讲述一下这三个究竟有什么区别。</FONT></P>
<P><FONT size=2>首先要了解一下包的概念。有若干个类，它们相互之间有一定的关系，那么就可以定义一个包容纳这些类，包不仅仅只能包含类，它可以拥有类、接口、构件、节点、协作，包内还可以包含包。</FONT></P>
<P><FONT size=2>现在就让我们来具体讨论一下这三个种类的不同之处。 </FONT></P>
<P><FONT size=2><BR>&nbsp;<BR>作为public的类和属性是可以被外界任意调用的，无论是在类中，还是跨越类的访问（如果不属于同一个包，就要调用import语句，添加包名），这一点是非常好理解的。</FONT></P>
<P><FONT size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Private的属性和方法是最自私的，它定义的属性和方法只能在本类中使用，到类外，是无论如何都不能被使用的，如：</FONT></P>
<P><FONT size=2>class Date</FONT></P>
<P><FONT size=2>{</FONT></P>
<P><FONT size=2>private int day;</FONT></P>
<P><FONT size=2>public void tomorrow() </FONT></P>
<P><FONT size=2>{</FONT></P>
<P><FONT size=2>this.day = this.day + 1;</FONT></P>
<P><FONT size=2>}</FONT></P>
<P><FONT size=2>}</FONT></P>
<P><FONT size=2>public class DateUser</FONT></P>
<P><FONT size=2>{</FONT></P>
<P><FONT size=2>public static void main(String args[]) </FONT></P>
<P><FONT size=2>{</FONT></P>
<P><FONT size=2>Date mydate = new Date();</FONT></P>
<P><FONT size=2>mydate.day = 21; //注意这句话是错的</FONT></P>
<P><FONT size=2>}</FONT></P>
<P><FONT size=2>}</FONT></P>
<P><FONT size=2></FONT>&nbsp;</P>
<P><BR><FONT size=2>在这个程序中，创建了一个Date类的对象mydate，这是可以的，但是由于类Date中的day是私有变量，所以，创建的这个对象mydate不能通过mydate.day来访问这个属性，如果在其它类中要使用这个私有变量，那么只能通过Date中的public的方法来访问这个属性，这样，就很好的保证了数据的封装性，就像面向对象中提到的报刊亭的故事一样，购买报刊的人不能自己伸手进去拿报纸或是找零钱，而只能由报刊亭内部人员来处理这些事情一样。在上面的例子中，大家可以发现，类Date中的默认方法（Date()）并没有定义它的类型，这就意味着它是友好的，也就是意味着它在本包内是public的，而在外包内是private的。但是一旦把它的类型定义为private，那么连Date mydate = new Date()也会出错，这是因为默认的构建器已经被定义为private类型，也就是即使是本包内的其他类也不能访问了。</FONT></P>
<P><FONT size=2><BR>&nbsp;</FONT></P>
<P><FONT size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对于protected就要考虑到包的概念，如果有两个类，如：Date和DateUser两个类分别位于不同的包内，而DateUser是继承Date类的一个类，那么如果要使DateUser中的方法访问Date中的方法或属性，除了使用import将包导入，还需要考虑所要访问的方法和属性是什么类型的，一般而言，跨包访问，public的方法和属性都一定可以访问，但是考虑到如果将需要使用的方法和属性都修改成public的话，那么就可以允许任何事物访问，就不具有安全性，为了这个事情的考虑，添加了protected，如果将需要访问的方法和属性定义为protected，那么其它的类无法访问，而外包的DateUser通过import就可以访问这些属性和方法了，即保证了数据的安全性，也保证了数据被很好的使用。范例如下：</FONT></P>
<P><FONT size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; package a.b;</FONT></P>
<P><FONT size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public class Sample</FONT></P>
<P><FONT size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</FONT></P>
<P><FONT size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; protected void doing();</FONT></P>
<P><FONT size=2>}</FONT></P>
<P><FONT size=2>import a.b.*；</FONT></P>
<P><FONT size=2>public class Sample1 extends Sample</FONT></P>
<P><FONT size=2>{</FONT></P>
<P><FONT size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static void main（String args[]）</FONT></P>
<P><FONT size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</FONT></P>
<P><FONT size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Sample1 x=new Sample1();</FONT></P>
<P><FONT size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x.doing();</FONT></P>
<P><FONT size=2>}</FONT></P>
<P><FONT size=2>}<BR></FONT></P></DIV><img src ="http://www.blogjava.net/faintbear/aggbug/2629.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/faintbear/" target="_blank">小力力力</a> 2005-03-30 21:43 <a href="http://www.blogjava.net/faintbear/archive/2005/03/30/2629.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Inner Classes </title><link>http://www.blogjava.net/faintbear/archive/2005/03/30/2628.html</link><dc:creator>小力力力</dc:creator><author>小力力力</author><pubDate>Wed, 30 Mar 2005 13:40:00 GMT</pubDate><guid>http://www.blogjava.net/faintbear/archive/2005/03/30/2628.html</guid><wfw:comment>http://www.blogjava.net/faintbear/comments/2628.html</wfw:comment><comments>http://www.blogjava.net/faintbear/archive/2005/03/30/2628.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/faintbear/comments/commentRss/2628.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/faintbear/services/trackbacks/2628.html</trackback:ping><description><![CDATA[<DIV class=postTitle><A id=viewpost.ascx_TitleUrl href="http://blog.csdn.net/faintbear/archive/2005/03/02/308114.aspx"><FONT color=#000080>Inner Classes </FONT></A></DIV>
<DIV class=postText>
<P>package com.faintbear;</P>
<P>public class Outer4<BR>{<BR>&nbsp; private int size = 5;<BR>&nbsp; public Object makeTheInner( final int localVar )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final int finalLocalVar = 6;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class Inner<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String toString()<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return ( "localVar=" + localVar + "&gt;" );<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }//end public String toString()<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }//end class Inner<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return new Inner();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }//end public Object makeTheInner( int localVar )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>public static void main( String args[] )<BR>{<BR>&nbsp;Outer4 outer = new Outer4();<BR>&nbsp;Object obj = outer.makeTheInner( 47 );<BR>&nbsp;System.out.println( "The object is " + obj );<BR>}<BR>}</P>
<P></P>
<P>Inner的toString会被调用,这是肯定的.<BR>你的 final int finalLocalVar = 6; 可以加个static,这样可以节省一定的内存和CPU开销. 不过好像没有用到么,那就删除吧.</P>
<P></P>
<P>同意楼上的<BR>Object obj = outer.makeTheInner( 47 );<BR>System.out.println( "The object is " + obj );<BR>这时其实是System.out.println( "The object is " + obj.toString());</P>
<P>Object obj = outer.makeTheInner( 47 );<BR>等同与<BR>Object obj =new Inner();/////////示意一下<BR>toString方法已经在Inner类中被重写了<BR>所以输出应该是The object is localvar=47&gt;<BR></P></DIV><img src ="http://www.blogjava.net/faintbear/aggbug/2628.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/faintbear/" target="_blank">小力力力</a> 2005-03-30 21:40 <a href="http://www.blogjava.net/faintbear/archive/2005/03/30/2628.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>2005-3-1学习笔记(Cloneable,List) </title><link>http://www.blogjava.net/faintbear/archive/2005/03/30/2627.html</link><dc:creator>小力力力</dc:creator><author>小力力力</author><pubDate>Wed, 30 Mar 2005 13:39:00 GMT</pubDate><guid>http://www.blogjava.net/faintbear/archive/2005/03/30/2627.html</guid><wfw:comment>http://www.blogjava.net/faintbear/comments/2627.html</wfw:comment><comments>http://www.blogjava.net/faintbear/archive/2005/03/30/2627.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/faintbear/comments/commentRss/2627.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/faintbear/services/trackbacks/2627.html</trackback:ping><description><![CDATA[<DIV class=postTitle><A id=viewpost.ascx_TitleUrl href="http://blog.csdn.net/faintbear/archive/2005/03/01/306726.aspx">2005-3-1学习笔记(Cloneable,List)</A> </DIV>
<DIV class=postText>
<P><FONT size=2>List list = new Vector();<BR>&nbsp;&nbsp;&nbsp; AnnuityStruct annuityStruct = null;<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;for(int i = 0; i &lt; recordCount.length; i++) <BR>&nbsp;{intCount = CCStrTools.str2Int(recordCount[i]);<BR>&nbsp; annuityStruct = PayoutObjectPool.getInstance().getAnnuityInstance();<BR>&nbsp; annuityStruct.init();<BR>&nbsp; annuityStruct.setAnnuitySeq(annuitySeq[intCount]);<BR>&nbsp; annuityStruct.setAnnuityPerson(Double.parseDouble(annuityPerson[intCount]));<BR>&nbsp; annuityStruct.setAnnuityAppPerson(Double.parseDouble(annuityAppPerson[intCount]));<BR>&nbsp; annuityStruct.setAnnuityCom(Double.parseDouble(annuityCom[intCount]));<BR>&nbsp; annuityStruct.setAnnuityAppCom(Double.parseDouble(annuityAppCom[intCount]));<BR>&nbsp; list.add(annuityStruct.clone());<BR>&nbsp;}<BR><BR><BR><BR><BR>/**<BR>&nbsp; *PayoutObjectPool构造器<BR>&nbsp; */<BR>&nbsp;private PayoutObjectPool() {<BR>&nbsp;&nbsp;System.out.println("PayoutObjectPool create.");<BR>&nbsp;}</FONT></P>
<P><FONT size=2>&nbsp;/**<BR>&nbsp; *获取PayoutObjectPool实例<BR>&nbsp; <A href="mailto:*@return">*@return</A> PayoutObjectPool 对象实例<BR>&nbsp; */<BR>&nbsp;public static synchronized PayoutObjectPool getInstance() {<BR>&nbsp;&nbsp;if (pool == null)<BR>&nbsp;&nbsp;&nbsp;pool = new PayoutObjectPool();<BR>&nbsp;&nbsp;return pool;<BR>&nbsp;}<BR><BR><BR>/**<BR>&nbsp; *获取AnnuityStruct实例<BR>&nbsp; <A href="mailto:*@return">*@return</A> AnnuityStruct 对象实例<BR>&nbsp; */<BR>&nbsp;public AnnuityStruct getAnnuityInstance() {<BR>&nbsp;&nbsp;if (annuityStruct == null)<BR>&nbsp;&nbsp;&nbsp;annuityStruct = new AnnuityStruct();<BR>&nbsp;&nbsp;return (AnnuityStruct) annuityStruct.clone();<BR>&nbsp;}<BR><BR><BR><BR>List里面放的都是引用～</FONT></P></DIV><img src ="http://www.blogjava.net/faintbear/aggbug/2627.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/faintbear/" target="_blank">小力力力</a> 2005-03-30 21:39 <a href="http://www.blogjava.net/faintbear/archive/2005/03/30/2627.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java三角扭啊扭 </title><link>http://www.blogjava.net/faintbear/archive/2005/03/30/2619.html</link><dc:creator>小力力力</dc:creator><author>小力力力</author><pubDate>Wed, 30 Mar 2005 10:41:00 GMT</pubDate><guid>http://www.blogjava.net/faintbear/archive/2005/03/30/2619.html</guid><wfw:comment>http://www.blogjava.net/faintbear/comments/2619.html</wfw:comment><comments>http://www.blogjava.net/faintbear/archive/2005/03/30/2619.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/faintbear/comments/commentRss/2619.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/faintbear/services/trackbacks/2619.html</trackback:ping><description><![CDATA[<DIV class=postTitle><A id=viewpost.ascx_TitleUrl href="http://blog.csdn.net/faintbear/archive/2004/11/03/165135.aspx"><FONT color=#000080>java三角扭啊扭</FONT></A> </DIV>
<DIV class=postText>
<P>class&nbsp; sanjiao<BR>{</P>
<P>&nbsp;public static void sanjiao(int hang)<BR>&nbsp;{ int count=1;<BR>&nbsp;&nbsp; for(int i=1;i&lt;=hang;i++)<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int j=0;j&lt;hang-i;j++)<BR>&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.print(" ");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(i%2==1)<BR>&nbsp;&nbsp;&nbsp;{&nbsp; int l1=count;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int k=l1+i-1;k&gt;=l1;k--)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.print(k);<BR>&nbsp;&nbsp;&nbsp;&nbsp; System.out.print(" ");<BR>&nbsp;&nbsp;&nbsp;&nbsp; count++;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;else<BR>&nbsp;&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp; int l2=count;<BR>&nbsp;&nbsp;&nbsp;&nbsp; for(int l=l2;l&lt;=l2+i-1;l++)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.print(l);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.print(" ");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; count++;<BR>&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;&nbsp;System.out.println("");</P>
<P><BR>&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;<BR>&nbsp;}</P>
<P>&nbsp;public static void main(String []args)<BR>&nbsp;{<BR>&nbsp;&nbsp; sanjiao(4);<BR>&nbsp;}<BR>}<BR></P></DIV><img src ="http://www.blogjava.net/faintbear/aggbug/2619.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/faintbear/" target="_blank">小力力力</a> 2005-03-30 18:41 <a href="http://www.blogjava.net/faintbear/archive/2005/03/30/2619.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA面试基础试题[转贴]</title><link>http://www.blogjava.net/faintbear/archive/2005/03/30/2618.html</link><dc:creator>小力力力</dc:creator><author>小力力力</author><pubDate>Wed, 30 Mar 2005 10:16:00 GMT</pubDate><guid>http://www.blogjava.net/faintbear/archive/2005/03/30/2618.html</guid><wfw:comment>http://www.blogjava.net/faintbear/comments/2618.html</wfw:comment><comments>http://www.blogjava.net/faintbear/archive/2005/03/30/2618.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/faintbear/comments/commentRss/2618.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/faintbear/services/trackbacks/2618.html</trackback:ping><description><![CDATA[<A class=post_title href="http://cnwyy.yculblog.com/post-255953.html">JAVA面试基础试题[转贴]</A><BR><FONT color=#336699><SPAN class=post_user>Irene @ 2004-10-27 13:05</SPAN><BR><BR></FONT><FONT color=#ff3300>第一，谈谈final, finally, finalize的区别。 （最常被问到）</FONT> <BR>
<TABLE style="BORDER-RIGHT: #000000 1px solid; BORDER-TOP: #000000 1px solid; MARGIN: 10px; BORDER-LEFT: #000000 1px solid; BORDER-BOTTOM: #000000 1px solid" cellSpacing=0 cellPadding=10 width="90%">
<TBODY>
<TR>
<TD bgColor=#eeeeee><FONT face="Courier New"><FONT color=#003399>final修饰符（关键字） <BR>如果一个类被声明为final，意味着它不能再派生出新的子类，不能作为父类被继承。因此一个类不能既被声明为abstract，又被声明为final。将变量或方法声明为final，可以保证它们在使用中不被改变。其初始化可以在两个地方：一是其定义处，也就是说在final变量定义时直接给其赋值；二是在构造函数中。这两个地方只能选其一，要么在定义时给值，要么在构造函数中给值，不能同时既在定义时给了值，又在构造函数中给另外的值，而在以后的引用中只能读取，不可修改。被声明为final的方法也同样只能使用，不能重写（override）。 <BR>finally <BR>在异常处理时提供finally块来执行任何清除操作。如果抛出一个异常，那么相匹配的catch子句就会执行，然后控制就会进入finally块（如果有的话）。 <BR>finalize <BR>方法名。Java 技术允许使用finalize()方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在Object类中定义的，因此所有的类都继承了它。子类覆盖finalize()方法以整理系统资源或者执行其他清理工作。finalize()方法是在垃圾收集器删除对象之前对这个对象调用的。</FONT></FONT></TD></TR></TBODY></TABLE><BR>第二，Anonymous Inner Class（匿名内部类） 是否可以extends（继承）其它类，是否可以implements（实现）interface（接口）？ <BR>
<TABLE style="BORDER-RIGHT: #000000 1px solid; BORDER-TOP: #000000 1px solid; MARGIN: 10px; BORDER-LEFT: #000000 1px solid; BORDER-BOTTOM: #000000 1px solid" cellSpacing=0 cellPadding=10 width="90%">
<TBODY>
<TR>
<TD bgColor=#eeeeee><FONT face="Courier New"><FONT color=#003399>匿名的内部类是没有名字的内部类。不能extends（继承） 其它类，但一个内部类可以作为一个接口，由另一个内部类实现。</FONT></FONT></TD></TR></TBODY></TABLE><BR>第三，Static Nested Class 和 Inner Class的不同，说得越多越好。（面试题有的很笼统） <BR>
<TABLE style="BORDER-RIGHT: #000000 1px solid; BORDER-TOP: #000000 1px solid; MARGIN: 10px; BORDER-LEFT: #000000 1px solid; BORDER-BOTTOM: #000000 1px solid" cellSpacing=0 cellPadding=10 width="90%">
<TBODY>
<TR>
<TD bgColor=#eeeeee><FONT face="Courier New"><FONT color=#003399>Nested（嵌套）Class（一般是C++的说法） <BR>nested class 是合成型聚集关系（Composite Aggregation） 的另一种表达方式，也就是说nested class也可以用Aggregation表达出来，但是，nested class更加精确地表达了一种专用的、紧耦合的关系，尤其在代码生成时，nested class在Java中映射成inline class。比如，计算机专用开关电源类可以作为计算机类的nested class，但是，电池组类就不一定适合作为计算机类的nested class，因为，电池组类表述的是一个过于通用的对象，可能还被包含（Aggregation）于模型中的其他设备对象。class A nested in class B，则说明A是一个nested class，一般A是用来完成B中的某种重要功能。 <BR>Inner Class (一般是JAVA的说法) <BR>Java内部类与C++嵌套类最大的不同就在于是否有指向外部的引用上。 <BR>静态内部类（Inner Class）意味着a创建一个static内部类的对象，不需要一个外部类对象，b不能从一个static内部类的一个对象访问一个外部类对象</FONT></FONT></TD></TR></TBODY></TABLE><BR>第四，&amp;和&amp;&amp;的区别。（这个问得很少） <BR>
<TABLE style="BORDER-RIGHT: #000000 1px solid; BORDER-TOP: #000000 1px solid; MARGIN: 10px; BORDER-LEFT: #000000 1px solid; BORDER-BOTTOM: #000000 1px solid" cellSpacing=0 cellPadding=10 width="90%">
<TBODY>
<TR>
<TD bgColor=#eeeeee><FONT face="Courier New"><FONT color=#003399>&amp;是位运算符。&amp;可为位运算，也可为逻辑运算，看情况而定。&amp;&amp;是布尔逻辑运算符。</FONT></FONT></TD></TR></TBODY></TABLE><BR><FONT color=#ff3300>第五，HashMap和Hashtable的区别。（常问）</FONT> <BR>
<TABLE style="BORDER-RIGHT: #000000 1px solid; BORDER-TOP: #000000 1px solid; MARGIN: 10px; BORDER-LEFT: #000000 1px solid; BORDER-BOTTOM: #000000 1px solid" cellSpacing=0 cellPadding=10 width="90%">
<TBODY>
<TR>
<TD bgColor=#eeeeee><FONT face="Courier New"><FONT color=#003399>都属于Map接口的类，实现了将惟一键映射到特定的值上。 <BR>HashMap 类没有分类或者排序。它允许一个 null 键和多个 null 值。 <BR>Hashtable 类似于 HashMap，但是不允许 null 键和 null 值。它也比 HashMap 慢，因为它是同步的。 <BR>Hashtable继承自Dictionary类，而HashMap是Java1.2引进的Map interface的一个实现。 <BR>HashMap允许将null作为一个entry的key或者value，而Hashtable不允许，还有就是，HashMap把Hashtable的contains方法去掉了，改成containsvalue(Returns true if this map maps one or more keys to the specified value)和containsKey(Returns true if this map contains a mapping for the specified key)。因为contains(Tests if some key maps into the specified value in this hashtable)方法容易让人引起误解。 <BR>最大的不同是，Hashtable的方法是Synchronize的，而HashMap不是，在多个线程访问Hashtable时，不需要自己为它的方法实现同步，而HashMap 就必须为之提供外同步。 <BR>Hashtable和HashMap采用的hash/rehash算法都大概一样，所以性能不会有很大的差异。</FONT></FONT></TD></TR></TBODY></TABLE><BR>第六，Collection 和 Collections的区别。（你千万别说一个是单数一个是复数） <BR>
<TABLE style="BORDER-RIGHT: #000000 1px solid; BORDER-TOP: #000000 1px solid; MARGIN: 10px; BORDER-LEFT: #000000 1px solid; BORDER-BOTTOM: #000000 1px solid" cellSpacing=0 cellPadding=10 width="90%">
<TBODY>
<TR>
<TD bgColor=#eeeeee><FONT face="Courier New"><FONT color=#003399>Collections是个java.util下的类，它包含有各种有关集合操作的静态方法。 <BR>Collection是个java.util下的接口，它是各种集合结构的父接口。</FONT></FONT></TD></TR></TBODY></TABLE><BR>第七，什么时候用assert。（API级的技术人员有可能会问这个） <BR>
<TABLE style="BORDER-RIGHT: #000000 1px solid; BORDER-TOP: #000000 1px solid; MARGIN: 10px; BORDER-LEFT: #000000 1px solid; BORDER-BOTTOM: #000000 1px solid" cellSpacing=0 cellPadding=10 width="90%">
<TBODY>
<TR>
<TD bgColor=#eeeeee><FONT face="Courier New"><FONT color=#003399>断言是一个包含布尔表达式的语句，在执行这个语句时假定该表达式为 true。如果表达式计算为 false，那么系统会报告一个 Assertionerror。它用于调试目的： <BR>assert(a &gt; 0); // throws an Assertionerror if a &lt;= 0 <BR>断言可以有两种形式： <BR>assert Expression1 ; <BR>assert Expression1 : Expression2 ; <BR>Expression1 应该总是产生一个布尔值。 <BR>Expression2 可以是得出一个值的任意表达式。这个值用于生成显示更多调试信息的 String 消息。 <BR>断言在默认情况下是禁用的。要在编译时启用断言，需要使用 source 1.4 标记： <BR>javac -source 1.4 Test.java <BR>要在运行时启用断言，可使用 -enableassertions 或者 -ea 标记。 <BR>要在运行时选择禁用断言，可使用 -da 或者 -disableassertions 标记。 <BR>要系统类中启用断言，可使用 -esa 或者 -dsa 标记。还可以在包的基础上启用或者禁用断言。 <BR>可以在预计正常情况下不会到达的任何位置上放置断言。断言可以用于验证传递给私有方法的参数。不过，断言不应该用于验证传递给公有方法的参数，因为不管是否启用了断言，公有方法都必须检查其参数。不过，既可以在公有方法中，也可以在非公有方法中利用断言测试后置条件。另外，断言不应该以任何方式改变程序的状态。</FONT></FONT></TD></TR></TBODY></TABLE><BR>第八，GC是什么？为什么要有GC？（基础） <BR>
<TABLE style="BORDER-RIGHT: #000000 1px solid; BORDER-TOP: #000000 1px solid; MARGIN: 10px; BORDER-LEFT: #000000 1px solid; BORDER-BOTTOM: #000000 1px solid" cellSpacing=0 cellPadding=10 width="90%">
<TBODY>
<TR>
<TD bgColor=#eeeeee><FONT face="Courier New"><FONT color=#003399>GC是垃圾收集器。Java 程序员不用担心内存管理，因为垃圾收集器会自动进行管理。要请求垃圾收集，可以调用下面的方法之一： <BR>System.gc() <BR>Runtime.getRuntime().gc() <BR>gc 虽可清理，但非立刻清理</FONT></FONT></TD></TR></TBODY></TABLE><BR>第九，String s = new String("xyz");创建了几个String Object？ <BR>
<TABLE style="BORDER-RIGHT: #000000 1px solid; BORDER-TOP: #000000 1px solid; MARGIN: 10px; BORDER-LEFT: #000000 1px solid; BORDER-BOTTOM: #000000 1px solid" cellSpacing=0 cellPadding=10 width="90%">
<TBODY>
<TR>
<TD bgColor=#eeeeee><FONT face="Courier New"><FONT color=#003399>两个对象，一个是“xyx”,一个是指向“xyx”的引用对象s。一个对象，一个对象引用。</FONT></FONT></TD></TR></TBODY></TABLE><BR>第十，Math.round(11.5)等于多少？ Math.round(-11.5)等于多少？ <BR>
<TABLE style="BORDER-RIGHT: #000000 1px solid; BORDER-TOP: #000000 1px solid; MARGIN: 10px; BORDER-LEFT: #000000 1px solid; BORDER-BOTTOM: #000000 1px solid" cellSpacing=0 cellPadding=10 width="90%">
<TBODY>
<TR>
<TD bgColor=#eeeeee><FONT face="Courier New"><FONT color=#003399>Math.round(11.5)返回（long）12，Math.round(-11.5)返回（long）-11; <BR></FONT></FONT></TD></TR></TBODY></TABLE><BR>第十一，short s1 = 1; s1 = s1 + 1;有什么错？ short s1 = 1; s1 += 1;有什么错？ （ 面试题都是很变态的，要做好受虐的准备） <BR>
<TABLE style="BORDER-RIGHT: #000000 1px solid; BORDER-TOP: #000000 1px solid; MARGIN: 10px; BORDER-LEFT: #000000 1px solid; BORDER-BOTTOM: #000000 1px solid" cellSpacing=0 cellPadding=10 width="90%">
<TBODY>
<TR>
<TD bgColor=#eeeeee><FONT face="Courier New"><FONT color=#003399>short s1 = 1; s1 = s1 + 1;有错，s1是short型，s1+1是int型,不能显式转化为short型。可修改为s1 =(short)(s1 + 1) 。short s1 = 1; s1 += 1正确。 <BR>Byte a=1,b=1,bye c=a+b;错误，byte与byte，short与short运算返回值为int</FONT></FONT></TD></TR></TBODY></TABLE>&nbsp;&nbsp; <BR>第十二，sleep() 和 wait() 有什么区别？ （搞线程的最爱） <BR>
<TABLE style="BORDER-RIGHT: #000000 1px solid; BORDER-TOP: #000000 1px solid; MARGIN: 10px; BORDER-LEFT: #000000 1px solid; BORDER-BOTTOM: #000000 1px solid" cellSpacing=0 cellPadding=10 width="90%">
<TBODY>
<TR>
<TD bgColor=#eeeeee><FONT face="Courier New"><FONT color=#003399>sleep() <BR>是使线程停止一段时间的方法。在sleep 时间间隔期满后，线程不一定立即恢复执行。这是因为在那个时刻，其它线程可能正在运行而且没有被调度为放弃执行，除非(a)“醒来”的线程具有更高的优先级 (b)正在运行的线程因为其它原因而阻塞。 <BR>wait() <BR>是线程交互时，如果线程对一个同步对象x 发出一个wait()调用，该线程会暂停执行，被调对象进入等待状态，直到被唤醒或等待时间到。</FONT></FONT></TD></TR></TBODY></TABLE><BR>第十三，Java有没有goto？（很十三的问题，如果哪个面试的问到这个问题，我劝你还是别进这家公司） <BR>
<TABLE style="BORDER-RIGHT: #000000 1px solid; BORDER-TOP: #000000 1px solid; MARGIN: 10px; BORDER-LEFT: #000000 1px solid; BORDER-BOTTOM: #000000 1px solid" cellSpacing=0 cellPadding=10 width="90%">
<TBODY>
<TR>
<TD bgColor=#eeeeee><FONT face="Courier New"><FONT color=#003399>Goto &nbsp;java中的保留字，现在没有在java中使用。</FONT></FONT></TD></TR></TBODY></TABLE><BR>第十四，数组有没有length()这个方法？ String有没有length()这个方法？ <BR>
<TABLE style="BORDER-RIGHT: #000000 1px solid; BORDER-TOP: #000000 1px solid; MARGIN: 10px; BORDER-LEFT: #000000 1px solid; BORDER-BOTTOM: #000000 1px solid" cellSpacing=0 cellPadding=10 width="90%">
<TBODY>
<TR>
<TD bgColor=#eeeeee><FONT face="Courier New"><FONT color=#003399>数组没有length()这个方法，有length的属性。 <BR>String有有length()这个方法。</FONT></FONT></TD></TR></TBODY></TABLE><BR><FONT color=#ff3300>第十五，Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型？ （常问）</FONT> <BR>
<TABLE style="BORDER-RIGHT: #000000 1px solid; BORDER-TOP: #000000 1px solid; MARGIN: 10px; BORDER-LEFT: #000000 1px solid; BORDER-BOTTOM: #000000 1px solid" cellSpacing=0 cellPadding=10 width="90%">
<TBODY>
<TR>
<TD bgColor=#eeeeee><FONT face="Courier New"><FONT color=#003399>方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现，重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数，我们说该方法被重写 (Overriding)。子类的对象使用这个方法时，将调用子类中的定义，对它而言，父类中的定义如同被“屏蔽”了。如果在一个类中定义了多个同名的方法，它们或有不同的参数个数或有不同的参数类型，则称为方法的重载(Overloading)。Overloaded的方法是可以改变返回值的类型。但是不能通过返回值进行overload。</FONT></FONT></TD></TR></TBODY></TABLE><BR>第十六，Set里的元素是不能重复的，那么用什么方法来区分重复与否呢？ 是用==还是equals()？ 它们有何区别？ <BR>
<TABLE style="BORDER-RIGHT: #000000 1px solid; BORDER-TOP: #000000 1px solid; MARGIN: 10px; BORDER-LEFT: #000000 1px solid; BORDER-BOTTOM: #000000 1px solid" cellSpacing=0 cellPadding=10 width="90%">
<TBODY>
<TR>
<TD bgColor=#eeeeee><FONT face="Courier New"><FONT color=#003399>Set里的元素是不能重复的，那么用iterator()方法来区分重复与否。equals()是判读两个Set是否相等。 <BR>equals()和==方法决定引用值是否指向同一对象equals()在类中被覆盖，为的是当两个分离的对象的内容和类型相配的话，返回真值。</FONT></FONT></TD></TR></TBODY></TABLE><BR>第十七，给我一个你最常见到的runtime exception。（如果你这个答不出来，面试的人会认为你没有实际编程经验） <BR>
<TABLE style="BORDER-RIGHT: #000000 1px solid; BORDER-TOP: #000000 1px solid; MARGIN: 10px; BORDER-LEFT: #000000 1px solid; BORDER-BOTTOM: #000000 1px solid" cellSpacing=0 cellPadding=10 width="90%">
<TBODY>
<TR>
<TD bgColor=#eeeeee><FONT face="Courier New"><FONT color=#003399>ArithmeticException, ArrayStoreException, BufferOverflowException, BufferUnderflowException, CannotRedoException, CannotUndoException, ClassCastException, CMMException, ConcurrentModificationException, DOMException, EmptyStackException, IllegalArgumentException, IllegalMonitorStateException, IllegalPathStateException, IllegalStateException, <BR>ImagingOpException, IndexOutOfBoundsException, MissingResourceException, NegativeArraySizeException, NoSuchElementException, NullPointerException, ProfileDataException, ProviderException, RasterFORMatException, SecurityException, SystemException, UndeclaredThrowableException, UnmodifiableSetException, UnsupportedOperationException</FONT></FONT></TD></TR></TBODY></TABLE><BR>第十八，error和exception有什么区别？ <BR>
<TABLE style="BORDER-RIGHT: #000000 1px solid; BORDER-TOP: #000000 1px solid; MARGIN: 10px; BORDER-LEFT: #000000 1px solid; BORDER-BOTTOM: #000000 1px solid" cellSpacing=0 cellPadding=10 width="90%">
<TBODY>
<TR>
<TD bgColor=#eeeeee><FONT face="Courier New"><FONT color=#003399>error 表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况。 <BR>exception 表示一种设计或实现问题。也就是说，它表示如果程序运行正常，从不会发生的情况。 <BR>error--unchecked &nbsp;exception--checked</FONT></FONT></TD></TR></TBODY></TABLE><BR>第十九，List, Set, Map是否继承自Collection接口？ <BR>
<TABLE style="BORDER-RIGHT: #000000 1px solid; BORDER-TOP: #000000 1px solid; MARGIN: 10px; BORDER-LEFT: #000000 1px solid; BORDER-BOTTOM: #000000 1px solid" cellSpacing=0 cellPadding=10 width="90%">
<TBODY>
<TR>
<TD bgColor=#eeeeee><FONT face="Courier New"><FONT color=#003399>List，Set是Map不是(与Collection同级)</FONT></FONT></TD></TR></TBODY></TABLE><BR><FONT color=#ff3300>第二十，abstract class和interface有什么区别？ （常问） </FONT><BR>
<TABLE style="BORDER-RIGHT: #000000 1px solid; BORDER-TOP: #000000 1px solid; MARGIN: 10px; BORDER-LEFT: #000000 1px solid; BORDER-BOTTOM: #000000 1px solid" cellSpacing=0 cellPadding=10 width="90%">
<TBODY>
<TR>
<TD bgColor=#eeeeee><FONT face="Courier New"><FONT color=#003399>声明方法的存在而不去实现它的类被叫做抽象类（abstract class），它用于要创建一个体现某些基本行为的类，并为该类声明方法，但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量，其类型是一个抽象类，并让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。Abstract 类的子类为它们父类中的所有抽象方法提供实现，否则它们也是抽象类为。取而代之，在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。 <BR>接口（interface）是抽象类的变体。在接口中，所有方法都是抽象的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽象的，没有一个有程序体。接口只可以定义static final成员变量。接口的实现与子类相似，除了该实现类不能从接口定义中继承行为。当类实现特殊接口时，它定义（即将程序体给予）所有这种接口的方法。然后，它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类，它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换，instanceof 运算符可以用来决定某对象的类是否实现了接口。</FONT></FONT></TD></TR></TBODY></TABLE><BR>第二十一，abstract的method是否可同时是static,是否可同时是native，是否可同时是synchronized？ <BR>
<TABLE style="BORDER-RIGHT: #000000 1px solid; BORDER-TOP: #000000 1px solid; MARGIN: 10px; BORDER-LEFT: #000000 1px solid; BORDER-BOTTOM: #000000 1px solid" cellSpacing=0 cellPadding=10 width="90%">
<TBODY>
<TR>
<TD bgColor=#eeeeee><FONT face="Courier New"><FONT color=#003399>都不能</FONT></FONT></TD></TR></TBODY></TABLE><BR>第二十二，接口是否可继承接口？ 抽象类是否可实现(implements)接口？ 抽象类是否可继承实体类(concrete class)？ <BR>
<TABLE style="BORDER-RIGHT: #000000 1px solid; BORDER-TOP: #000000 1px solid; MARGIN: 10px; BORDER-LEFT: #000000 1px solid; BORDER-BOTTOM: #000000 1px solid" cellSpacing=0 cellPadding=10 width="90%">
<TBODY>
<TR>
<TD bgColor=#eeeeee><FONT face="Courier New"><FONT color=#003399>接口可以继承接口。抽象类可以实现(implements)接口，抽象类是否可继承实体类，但前提是实体类必须有明确的构造函数。</FONT></FONT></TD></TR></TBODY></TABLE><BR>第二十三，启动一个线程是用run()还是start()？ <BR>
<TABLE style="BORDER-RIGHT: #000000 1px solid; BORDER-TOP: #000000 1px solid; MARGIN: 10px; BORDER-LEFT: #000000 1px solid; BORDER-BOTTOM: #000000 1px solid" cellSpacing=0 cellPadding=10 width="90%">
<TBODY>
<TR>
<TD bgColor=#eeeeee><FONT face="Courier New"><FONT color=#003399>启动一个线程是调用start()方法，使线程所代表的虚拟处理机处于可运行状态，这意味着它可以由JVM调度并执行。这并不意味着线程就会立即运行。run()方法可以产生必须退出的标志来停止一个线程。</FONT></FONT></TD></TR></TBODY></TABLE><BR>第二十四，构造器Constructor是否可被override？ <BR>
<TABLE style="BORDER-RIGHT: #000000 1px solid; BORDER-TOP: #000000 1px solid; MARGIN: 10px; BORDER-LEFT: #000000 1px solid; BORDER-BOTTOM: #000000 1px solid" cellSpacing=0 cellPadding=10 width="90%">
<TBODY>
<TR>
<TD bgColor=#eeeeee><FONT face="Courier New"><FONT color=#003399>构造器Constructor不能被继承，因此不能重写Overriding，但可以被重载Overloading。</FONT></FONT></TD></TR></TBODY></TABLE><BR>第二十五，是否可以继承String类？ <BR>
<TABLE style="BORDER-RIGHT: #000000 1px solid; BORDER-TOP: #000000 1px solid; MARGIN: 10px; BORDER-LEFT: #000000 1px solid; BORDER-BOTTOM: #000000 1px solid" cellSpacing=0 cellPadding=10 width="90%">
<TBODY>
<TR>
<TD bgColor=#eeeeee><FONT face="Courier New"><FONT color=#003399>String类是final类故不可以继承。</FONT></FONT></TD></TR></TBODY></TABLE><BR>第二十六，当一个线程进入一个对象的一个synchronized方法后，其它线程是否可进入此对象的其它方法？ <BR>
<TABLE style="BORDER-RIGHT: #000000 1px solid; BORDER-TOP: #000000 1px solid; MARGIN: 10px; BORDER-LEFT: #000000 1px solid; BORDER-BOTTOM: #000000 1px solid" cellSpacing=0 cellPadding=10 width="90%">
<TBODY>
<TR>
<TD bgColor=#eeeeee><FONT face="Courier New"><FONT color=#003399>不能，一个对象的一个synchronized方法只能由一个线程访问。</FONT></FONT></TD></TR></TBODY></TABLE><BR>第二十七，try {}里有一个return语句，那么紧跟在这个try后的finally {}里的code会不会被执行，什么时候被执行，在return前还是后？ <BR>
<TABLE style="BORDER-RIGHT: #000000 1px solid; BORDER-TOP: #000000 1px solid; MARGIN: 10px; BORDER-LEFT: #000000 1px solid; BORDER-BOTTOM: #000000 1px solid" cellSpacing=0 cellPadding=10 width="90%">
<TBODY>
<TR>
<TD bgColor=#eeeeee><FONT face="Courier New"><FONT color=#003399>会执行，在return前执行。</FONT></FONT></TD></TR></TBODY></TABLE><BR>第二十八，编程题: 用最有效率的方法算出2乘以8等于几？（有C背景的程序员特别喜欢问这种问题） <BR>
<TABLE style="BORDER-RIGHT: #000000 1px solid; BORDER-TOP: #000000 1px solid; MARGIN: 10px; BORDER-LEFT: #000000 1px solid; BORDER-BOTTOM: #000000 1px solid" cellSpacing=0 cellPadding=10 width="90%">
<TBODY>
<TR>
<TD bgColor=#eeeeee><FONT face="Courier New"><FONT color=#003399>2 &lt;&lt; 3</FONT></FONT></TD></TR></TBODY></TABLE><BR>第二十九，两个对象值相同(x.equals(y) == true)，但却可有不同的hash code，这句话对不对？ <BR>
<TABLE style="BORDER-RIGHT: #000000 1px solid; BORDER-TOP: #000000 1px solid; MARGIN: 10px; BORDER-LEFT: #000000 1px solid; BORDER-BOTTOM: #000000 1px solid" cellSpacing=0 cellPadding=10 width="90%">
<TBODY>
<TR>
<TD bgColor=#eeeeee><FONT face="Courier New"><FONT color=#003399>不对，有相同的hash code。看你的对象类型了。</FONT></FONT></TD></TR></TBODY></TABLE><BR>第三十，当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果，那么这里到底是值传递还是引用传递？ <BR>
<TABLE style="BORDER-RIGHT: #000000 1px solid; BORDER-TOP: #000000 1px solid; MARGIN: 10px; BORDER-LEFT: #000000 1px solid; BORDER-BOTTOM: #000000 1px solid" cellSpacing=0 cellPadding=10 width="90%">
<TBODY>
<TR>
<TD bgColor=#eeeeee><FONT face="Courier New"><FONT color=#003399>是值传递。Java 编程语言只由值传递参数。当一个对象实例作为一个参数被传递到方法中时，参数的值就是对该对象的引用。对象的内容可以在被调用的方法中改变，但对象的引用是永远不会改变的。</FONT></FONT></TD></TR></TBODY></TABLE><BR>第三十一，swtich是否能作用在byte上，是否能作用在long上，是否能作用在String上？ <BR>
<TABLE style="BORDER-RIGHT: #000000 1px solid; BORDER-TOP: #000000 1px solid; MARGIN: 10px; BORDER-LEFT: #000000 1px solid; BORDER-BOTTOM: #000000 1px solid" cellSpacing=0 cellPadding=10 width="90%">
<TBODY>
<TR>
<TD bgColor=#eeeeee><FONT face="Courier New"><FONT color=#003399>switch（expr1）中，expr1是一个整数表达式。因此传递给 switch 和 case 语句的参数应该是 int、 short、 char 或者 byte。long,string 都不能作用于swtich。</FONT></FONT></TD></TR></TBODY></TABLE><BR>第三十二，编程题: 写一个Singleton出来。 <BR>
<TABLE style="BORDER-RIGHT: #000000 1px solid; BORDER-TOP: #000000 1px solid; MARGIN: 10px; BORDER-LEFT: #000000 1px solid; BORDER-BOTTOM: #000000 1px solid" cellSpacing=0 cellPadding=10 width="90%">
<TBODY>
<TR>
<TD bgColor=#eeeeee><FONT face="Courier New"><FONT color=#003399>Singleton模式主要作用是保证在Java应用程序中，一个类Class只有一个实例存在。 <BR>一般Singleton模式通常有几种种形式: <BR>第一种形式: 定义一个类，它的构造函数为private的，它有一个static的private的该类变量，在类初始化时实例话，通过一个public的getInstance方法获取对它的引用,继而调用其中的方法。 <BR>public class Singleton { <BR>　　private Singleton(){} <BR>　　//在自己内部定义自己一个实例，是不是很奇怪？ <BR>　　//注意这是private 只供内部调用 <BR>　　private static Singleton instance = new Singleton(); <BR>　　//这里提供了一个供外部访问本class的静态方法，可以直接访问　　 <BR>　　public static Singleton getInstance() { <BR>　　　　return instance; 　　 <BR>　　 } <BR>} <BR>第二种形式: <BR>public class Singleton { <BR>　　private static Singleton instance = null; <BR>　　public static synchronized Singleton getInstance() { <BR>　　//这个方法比上面有所改进，不用每次都进行生成对象，只是第一次　　　 　 <BR>　　//使用时生成实例，提高了效率！ <BR>　　if (instance==null) <BR>　　　　instance＝new Singleton(); <BR>return instance; 　　} <BR>} <BR>其他形式: <BR>定义一个类，它的构造函数为private的，所有方法为static的。 <BR>一般认为第一种形式要更加安全些</FONT></FONT></TD></TR></TBODY></TABLE><img src ="http://www.blogjava.net/faintbear/aggbug/2618.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/faintbear/" target="_blank">小力力力</a> 2005-03-30 18:16 <a href="http://www.blogjava.net/faintbear/archive/2005/03/30/2618.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>冒泡法(转)java </title><link>http://www.blogjava.net/faintbear/archive/2005/03/30/2617.html</link><dc:creator>小力力力</dc:creator><author>小力力力</author><pubDate>Wed, 30 Mar 2005 10:15:00 GMT</pubDate><guid>http://www.blogjava.net/faintbear/archive/2005/03/30/2617.html</guid><wfw:comment>http://www.blogjava.net/faintbear/comments/2617.html</wfw:comment><comments>http://www.blogjava.net/faintbear/archive/2005/03/30/2617.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/faintbear/comments/commentRss/2617.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/faintbear/services/trackbacks/2617.html</trackback:ping><description><![CDATA[<DIV class=postTitle><A id=viewpost.ascx_TitleUrl href="http://blog.csdn.net/faintbear/archive/2004/10/28/156999.aspx">冒泡法(转)java</A> </DIV>
<DIV class=postText>
<P>1&gt;<BR>class maopao<BR>{</P>
<P>&nbsp;static int count=0;<BR>&nbsp;static void bubbleSort(int[] a)<BR>&nbsp;{<BR>&nbsp;&nbsp; <BR>&nbsp; for (int j = a.length - 1; j &gt; 0; j--) // outer loop (backward)<BR>&nbsp;&nbsp; for (int i = 0; i &lt; j; i++) // inner loop (forward)<BR>&nbsp; { if (a[i] &gt; a[i+1]) //Swap<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp; a[i] = a[i] + a[i+1];<BR>&nbsp;&nbsp;&nbsp;&nbsp; a[i+1] = a[i] - a[i+1];<BR>&nbsp;&nbsp;&nbsp;&nbsp; a[i] = a[i] - a[i+1];<BR>&nbsp; <BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; count++;<BR>&nbsp; }</P>
<P><BR>&nbsp;}<BR>&nbsp;public static&nbsp; void main(String[] args)<BR>&nbsp;{<BR>&nbsp; int[] a = new int[]{9,8,5,4,2,0};<BR>&nbsp; //int[] a = new int[]{9,8,7,6,5,4,3,2,1,0,11};<BR>&nbsp; bubbleSort(a);<BR>&nbsp; System.out.println("count&amp;&amp;&amp;&amp;"+count);<BR>&nbsp; for (int i=0; i &lt; a.length-1; i++)<BR>&nbsp; {<BR>&nbsp; <BR>&nbsp;&nbsp; System.out.print(a[i]+", ");<BR>&nbsp; }<BR>&nbsp;}<BR>}<BR><BR><BR><BR>2&gt;<BR><BR>class&nbsp; maopao4<BR>{<BR>&nbsp;<BR>&nbsp;public static void test1()&nbsp; //最普通的冒泡算法，需要比较(n-1)*(n-1)次<BR>&nbsp;{<BR>&nbsp; int[] iArray={9,8,5,4,2,0};<BR>&nbsp; int k=0;<BR>&nbsp; int icount=0;<BR>&nbsp; for(int j=0;j&lt;iArray.length-1;j++)<BR>&nbsp; {<BR>&nbsp;&nbsp; for(int i=0;i&lt;iArray.length-1;i++)<BR>&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp; if(iArray[i]&gt;iArray[i+1])<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp; k=iArray[i];<BR>&nbsp;&nbsp;&nbsp;&nbsp; iArray[i]=iArray[i+1];<BR>&nbsp;&nbsp;&nbsp;&nbsp; iArray[i+1]=k;<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; icount++;<BR>&nbsp;&nbsp; }<BR>&nbsp; }</P>
<P>&nbsp; System.out.println("共做比较次数： "+icount);<BR>&nbsp; for(int i=0;i&lt;iArray.length;i++)<BR>&nbsp; {<BR>&nbsp;&nbsp; System.out.print(" "+iArray[i]);<BR>&nbsp; }<BR>&nbsp;<BR>&nbsp;}<BR>&nbsp;public static void test2()&nbsp; //稍微作了一下改进，加入一个布尔变量，当顺序已经排好后，就不用做额外的比较了<BR>&nbsp;{<BR>&nbsp; int[] iArray={9,8,5,4,2,0};<BR>&nbsp; int k=0;<BR>&nbsp; int icount=0;<BR>&nbsp; boolean b=false;<BR>&nbsp; for(int j=0;j&lt;iArray.length-1;j++)<BR>&nbsp; {<BR>&nbsp;&nbsp; b=false;<BR>&nbsp;&nbsp; for(int i=0;i&lt;iArray.length-1;i++)<BR>&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp; if(iArray[i]&gt;iArray[i+1])<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp; k=iArray[i];<BR>&nbsp;&nbsp;&nbsp;&nbsp; iArray[i]=iArray[i+1];<BR>&nbsp;&nbsp;&nbsp;&nbsp; iArray[i+1]=k;<BR>&nbsp;&nbsp;&nbsp;&nbsp; b=true;<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; icount++;<BR>&nbsp;&nbsp; }<BR>&nbsp;&nbsp; if(!b) break;<BR>&nbsp; }</P>
<P>&nbsp; System.out.println("\r\n\r\n共做比较次数： "+icount);<BR>&nbsp; for(int i=0;i&lt;iArray.length;i++)<BR>&nbsp; {<BR>&nbsp;&nbsp; System.out.print(" "+iArray[i]);<BR>&nbsp; }<BR>&nbsp;<BR>&nbsp;}<BR>&nbsp;public static void main(String[] args) <BR>&nbsp;{<BR>&nbsp; test1();<BR>&nbsp; test2();<BR>&nbsp;}<BR>}<BR></P></DIV><img src ="http://www.blogjava.net/faintbear/aggbug/2617.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/faintbear/" target="_blank">小力力力</a> 2005-03-30 18:15 <a href="http://www.blogjava.net/faintbear/archive/2005/03/30/2617.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>今天在csdn论坛java版看到一篇讨论,又学到了点。大家看看,到底该怎么解释呢。 </title><link>http://www.blogjava.net/faintbear/archive/2005/03/28/2546.html</link><dc:creator>小力力力</dc:creator><author>小力力力</author><pubDate>Mon, 28 Mar 2005 05:59:00 GMT</pubDate><guid>http://www.blogjava.net/faintbear/archive/2005/03/28/2546.html</guid><wfw:comment>http://www.blogjava.net/faintbear/comments/2546.html</wfw:comment><comments>http://www.blogjava.net/faintbear/archive/2005/03/28/2546.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/faintbear/comments/commentRss/2546.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/faintbear/services/trackbacks/2546.html</trackback:ping><description><![CDATA[<DIV class=postTitle>&nbsp;</DIV>
<P>&nbsp;&nbsp;&nbsp;package com.faintbear;</P>
<P>public class test<BR>{<BR>int i = 0;</P>
<P>public test()<BR>{<BR>&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i=i ++;<BR>&nbsp;<BR>&nbsp;&nbsp; System.out.println(i);<BR>}</P>
<P>public static void main(String argsp[]) {<BR>new test();<BR>}<BR>}<BR><BR>结果是0,为什么呢 ?<BR><BR>
<TABLE cellSpacing=0 cellPadding=0 width=630 border=0>
<TBODY>
<TR class=color1 height=25>
<TD width=20></TD>
<TD width=410><FONT color=#3366cc>回复人：<B> <A href="http://community.csdn.net/Message_Board/Send.asp?sendto=blackhost" target=_blank><FONT color=#3366cc>blackhost(剑心) </FONT></A></B></FONT><FONT color=#000000>( <IMG title=四级(中级) alt=四级(中级) src="http://community.csdn.net/expert/images/rank/user4.gif">) 信誉：98 </FONT></TD>
<TD width=120><FONT color=#000000>2005-3-27 16:42:06 </FONT></TD>
<TD width=80><FONT color=#000000>得分:</FONT> <FONT color=#000000>0 </FONT></TD></TR>
<TR>
<TD bgColor=#0066cc colSpan=4 height=1></TD></TR>
<TR>
<TD colSpan=4 height=5></TD></TR>
<TR>
<TD><FONT color=#ffffff>&nbsp;</FONT> </TD>
<TD colSpan=3>
<TABLE style="TABLE-LAYOUT: fixed" cellPadding=3 width=610>
<TBODY>
<TR>
<TD>
<P>&nbsp;java的编译器搞的鬼!在遇到++和--操作符的时候会重新为原变量分配一块内存空间，以存放原始的值，而在完成了赋值运算之后，就将这块内存释放掉。由于i的原始值存放在后开辟的内存中，这样i=i++后，由于是先赋值,i就会得到i的原始值(存放在新内存中的数椐)，而原来内存位置的i自加后只保留在原来的位置,由于此时i指向已经是新开辟出来的内存地址，所以i的值没有发送变化!<BR>换句话说,<BR>while(true){<BR>&nbsp;&nbsp; i=i++;<BR>}<BR>永远执行i的值恒等于i的初始值,即使不是0也一样!下面我把过程写一下</P>
<P>i=0;//假设此时内存地址为0x12345678<BR>i=i++;//系统新开内存地址0x99999999,存放i原始值0,然后0x12345678的存放数据+1操作<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //此时0x12345678=1,0x99999999=0,但是上一步是先给值,所以i的内存地址是0x99999999=0;</P>
<P>所以i=0,</P>
<P>但是,如果是<BR>i=0;<BR>i++;<BR>此时i=1,因为0x99999999处新开辟的内存地址没有给任何引用,所以被丢弃了!i继续使用0x12345678处值<BR><BR><BR>你在栈上没有计算，正确的过程是</P>
<P>你把i的值0放到栈上<BR>然后把i变成1，但是栈上还是0<BR>最后把栈上的0弹出来赋值给i,结果把刚才iinc的结果给冲掉了,i又变成了0</P></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></P><img src ="http://www.blogjava.net/faintbear/aggbug/2546.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/faintbear/" target="_blank">小力力力</a> 2005-03-28 13:59 <a href="http://www.blogjava.net/faintbear/archive/2005/03/28/2546.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>StringTokenizer的学习(1)</title><link>http://www.blogjava.net/faintbear/archive/2005/03/25/2430.html</link><dc:creator>小力力力</dc:creator><author>小力力力</author><pubDate>Fri, 25 Mar 2005 03:29:00 GMT</pubDate><guid>http://www.blogjava.net/faintbear/archive/2005/03/25/2430.html</guid><wfw:comment>http://www.blogjava.net/faintbear/comments/2430.html</wfw:comment><comments>http://www.blogjava.net/faintbear/archive/2005/03/25/2430.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/faintbear/comments/commentRss/2430.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/faintbear/services/trackbacks/2430.html</trackback:ping><description><![CDATA[<P>在java中处理带分隔符数据的方式是，提供了一个系统类java.util.StringTokenizer来进行处理。例如 StringTokenizer(String&nbsp; content,String&nbsp; delim)将在字符串content的基础上创建一个StringTokenizer对象，并用delim来作为新的分隔符，如果省略delim,则以系统缺省的分隔符来作为原来各分隔符的替代。</P>
<P>实际上还有第三个参数，true/false，如果为true则返回值还包含分隔符本身。可以加以省略。<BR><BR>StringTokenizer的构造函数:<BR>StringTokenizer(String str)<BR>StringTokenizer(String str,String delimiters)<BR>StringTokenizer(String str,String delimiters,boolean delimiAsToken)<BR><BR><BR>关于Token的另一些方法，如public&nbsp; String&nbsp; nextToken(),&nbsp; public&nbsp; bolean&nbsp; hasMoreTokens(),&nbsp; public&nbsp; int&nbsp; countTokens()等，请参考有关java书籍手册。<BR><BR>一个例子:<BR>&nbsp;&nbsp;&nbsp;&nbsp; 实现把一个特殊结构的字符串转变成字符串数组<BR><BR><BR><BR></P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000">&nbsp;CCStrTools<BR><IMG id=Codehighlighter1_24_1084_Open_Image onclick="this.style.display='none'; Codehighlighter1_24_1084_Open_Text.style.display='none'; Codehighlighter1_24_1084_Closed_Image.style.display='inline'; Codehighlighter1_24_1084_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_24_1084_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_24_1084_Closed_Text.style.display='none'; Codehighlighter1_24_1084_Open_Image.style.display='inline'; Codehighlighter1_24_1084_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top></SPAN><SPAN id=Codehighlighter1_24_1084_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_24_1084_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">static</SPAN><SPAN style="COLOR: #000000">&nbsp;String[]&nbsp;str2Array(String&nbsp;str,&nbsp;String&nbsp;separator)<BR><IMG id=Codehighlighter1_95_793_Open_Image onclick="this.style.display='none'; Codehighlighter1_95_793_Open_Text.style.display='none'; Codehighlighter1_95_793_Closed_Image.style.display='inline'; Codehighlighter1_95_793_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_95_793_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_95_793_Closed_Text.style.display='none'; Codehighlighter1_95_793_Open_Image.style.display='inline'; Codehighlighter1_95_793_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_95_793_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_95_793_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">&nbsp;(str&nbsp;</SPAN><SPAN style="COLOR: #000000">==</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">null</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">||</SPAN><SPAN style="COLOR: #000000">&nbsp;separator&nbsp;</SPAN><SPAN style="COLOR: #000000">==</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">null</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">||</SPAN><SPAN style="COLOR: #000000">&nbsp;(str.trim()).length()&nbsp;</SPAN><SPAN style="COLOR: #000000">==</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">)<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">null</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">&nbsp;(str.substring(str.length()&nbsp;</SPAN><SPAN style="COLOR: #000000">-</SPAN><SPAN style="COLOR: #000000">&nbsp;separator.length(),<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str.length()).equals(separator))<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;str.substring(</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">,&nbsp;str.length()&nbsp;</SPAN><SPAN style="COLOR: #000000">-</SPAN><SPAN style="COLOR: #000000">&nbsp;separator.length());<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">if(str.charAt(str.length()-1)==',')<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">str=str.substring(0,str.length()-1);</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringTokenizer&nbsp;token&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;StringTokenizer(str,&nbsp;separator);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String[]&nbsp;array&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;String[token.countTokens()];<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;i&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">while</SPAN><SPAN style="COLOR: #000000">&nbsp;(token.hasMoreTokens())<BR><IMG id=Codehighlighter1_686_764_Open_Image onclick="this.style.display='none'; Codehighlighter1_686_764_Open_Text.style.display='none'; Codehighlighter1_686_764_Closed_Image.style.display='inline'; Codehighlighter1_686_764_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_686_764_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_686_764_Closed_Text.style.display='none'; Codehighlighter1_686_764_Open_Image.style.display='inline'; Codehighlighter1_686_764_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_686_764_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_686_764_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array[i]&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;token.nextToken(separator);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i</SPAN><SPAN style="COLOR: #000000">++</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000">&nbsp;array;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">static</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;main(String&nbsp;[]args)<BR><IMG id=Codehighlighter1_842_1080_Open_Image onclick="this.style.display='none'; Codehighlighter1_842_1080_Open_Text.style.display='none'; Codehighlighter1_842_1080_Closed_Image.style.display='inline'; Codehighlighter1_842_1080_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_842_1080_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_842_1080_Closed_Text.style.display='none'; Codehighlighter1_842_1080_Open_Image.style.display='inline'; Codehighlighter1_842_1080_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_842_1080_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_842_1080_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;s3&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">3@4@5@6@7@</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;w1[]&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">CCStrTools.str2Array(s3,</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">@</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">for</SPAN><SPAN style="COLOR: #000000">(</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;i</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">;i</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">w1.length;i</SPAN><SPAN style="COLOR: #000000">++</SPAN><SPAN style="COLOR: #000000">)<BR><IMG id=Codehighlighter1_978_1019_Open_Image onclick="this.style.display='none'; Codehighlighter1_978_1019_Open_Text.style.display='none'; Codehighlighter1_978_1019_Closed_Image.style.display='inline'; Codehighlighter1_978_1019_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_978_1019_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_978_1019_Closed_Text.style.display='none'; Codehighlighter1_978_1019_Open_Image.style.display='inline'; Codehighlighter1_978_1019_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_978_1019_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_978_1019_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.</SPAN><SPAN style="COLOR: #0000ff">out</SPAN><SPAN style="COLOR: #000000">.println(w1[i]);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">&nbsp;System.out.println(w1.length);</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;}</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/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</SPAN></SPAN></DIV></DIV><img src ="http://www.blogjava.net/faintbear/aggbug/2430.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/faintbear/" target="_blank">小力力力</a> 2005-03-25 11:29 <a href="http://www.blogjava.net/faintbear/archive/2005/03/25/2430.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Thinking:Java中static、this、super、final用法(转)</title><link>http://www.blogjava.net/faintbear/archive/2005/03/24/2394.html</link><dc:creator>小力力力</dc:creator><author>小力力力</author><pubDate>Thu, 24 Mar 2005 01:54:00 GMT</pubDate><guid>http://www.blogjava.net/faintbear/archive/2005/03/24/2394.html</guid><wfw:comment>http://www.blogjava.net/faintbear/comments/2394.html</wfw:comment><comments>http://www.blogjava.net/faintbear/archive/2005/03/24/2394.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/faintbear/comments/commentRss/2394.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/faintbear/services/trackbacks/2394.html</trackback:ping><description><![CDATA[<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center; mso-line-height-alt: 1.0pt" align=center><SPAN><STRONG>Thinking:Java中static、this、super、final用法<BR></STRONG><FONT size=3>
<H1><A class=headermaintitle id=Header1_HeaderTitle href="http://blog.csdn.net/wlgyhnj/"><FONT style="BACKGROUND-COLOR: #000000" color=#ffffff size=2>wlgyhnj的专栏</FONT></A></H1>
<P id=tagline><FONT size=2></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center; mso-line-height-alt: 1.0pt" align=center><STRONG>&nbsp;</STRONG>
<P></P></FONT></SPAN>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 1.0pt"><SPAN style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体">本篇旨在帮助准备学习<SPAN lang=EN-US>Java以及刚接触Java的朋友认识、掌握和使用static、this、super、final这几个关键字的使用。Java博大精深，我也是一位正在学习和使用Java的爱好者，文中难免有不妥之处，欢迎指正。 
<P></P></SPAN></SPAN>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 1.0pt"><SPAN style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体">一、<SPAN lang=EN-US>static 
<P></P></SPAN></SPAN>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 1.0pt"><SPAN style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体">　　请先看下面这段程序：<SPAN lang=EN-US> 
<P></P></SPAN></SPAN>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 1.0pt"><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体">&nbsp; public class Hello{<BR>&nbsp;&nbsp;&nbsp; public static void main(String[] args){ //(1)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Hello,world!");&nbsp;&nbsp; //(2)<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp; } 
<P></P></SPAN>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 1.0pt"><SPAN style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体">　　看过这段程序，对于大多数学过<SPAN lang=EN-US>Java 的从来说，都不陌生。即使没有学过Java，而学过其它的高级语言，例如C，那你也应该能看懂这段代码的意思。它只是简单的输出“Hello,world”，一点别的用处都没有，然而，它却展示了static关键字的主要用法。 
<P></P></SPAN></SPAN>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 1.0pt"><SPAN style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体">　　在<SPAN lang=EN-US>1处，我们定义了一个静态的方法名为main，这就意味着告诉Java编译器，我这个方法不需要创建一个此类的对象即可使用。你还得你是怎么运行这个程序吗？一般，我们都是在命令行下，打入如下的命令(加下划线为手动输入)： 
<P></P></SPAN></SPAN>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 1.0pt"><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体">javac Hello.java<BR>java Hello<BR>Hello,world! 
<P></P></SPAN>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 1.0pt"><SPAN style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体">　　这就是你运行的过程，第一行用来编译<SPAN lang=EN-US>Hello.java这个文件，执行完后，如果你查看当前，会发现多了一个Hello.class文件，那就是第一行产生的Java二进制字节码。第二行就是执行一个Java程序的最普遍做法。执行结果如你所料。在2中，你可能会想，为什么要这样才能输出。好，我们来分解一下这条语句。（如果没有安装Java文档，请到Sun的官方网站浏览J2SE API）首先，System是位于java.lang包中的一个核心类，如果你查看它的定义，你会发现有这样一行：public static final PrintStream out;接着在进一步，点击PrintStream这个超链接，在METHOD页面，你会看到大量定义的方法，查找println，会有这样一行： 
<P></P></SPAN></SPAN>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 1.0pt"><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体">public void println(String x)。 
<P></P></SPAN>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 1.0pt"><SPAN style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体">　　好了，现在你应该明白为什么我们要那样调用了，<SPAN lang=EN-US>out是System的一个静态变量，所以可以直接使用，而out所属的类有一个println方法。 
<P></P></SPAN></SPAN>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 1.0pt"><STRONG><SPAN style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体">静态方法</SPAN></STRONG><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体"> 
<P></P></SPAN>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 1.0pt"><SPAN style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体">　　通常，在一个类中定义一个方法为<SPAN lang=EN-US>static，那就是说，无需本类的对象即可调用此方法。如下所示： 
<P></P></SPAN></SPAN>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 1.0pt"><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体">class Simple{<BR>&nbsp;&nbsp; static void go(){<BR>&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Go...");<BR>&nbsp;&nbsp; }<BR>}<BR>public class Cal{<BR>&nbsp; public static void main(String[] args){<BR>&nbsp;&nbsp;&nbsp; Simple.go();<BR>&nbsp; }<BR>} 
<P></P></SPAN>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 1.0pt"><SPAN style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体">　　调用一个静态方法就是“类名<SPAN lang=EN-US>.方法名”,静态方法的使用很简单如上所示。一般来说，静态方法常常为应用程序中的其它类提供一些实用工具所用，在Java的类库中大量的静态方法正是出于此目的而定义的。 
<P></P></SPAN></SPAN>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 1.0pt"><STRONG><SPAN style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体">静态变量</SPAN></STRONG><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体"> 
<P></P></SPAN>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 1.0pt"><SPAN style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体">　　静态变量与静态方法类似。所有此类实例共享此静态变量，也就是说在类装载时，只分配一块存储空间，所有此类的对象都可以操控此块存储空间，当然对于<SPAN lang=EN-US>final则另当别论了。看下面这段代码： 
<P></P></SPAN></SPAN>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 1.0pt"><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体">class Value{<BR>&nbsp; static int c=0;<BR>&nbsp; static void inc(){<BR>&nbsp;&nbsp;&nbsp; c++;<BR>&nbsp; }<BR>}<BR>class Count{<BR>&nbsp; public static void prt(String s){<BR>&nbsp;&nbsp;&nbsp; System.out.println(s);<BR>&nbsp; }<BR>&nbsp; public static void main(String[] args){<BR>&nbsp;&nbsp;&nbsp; Value v1,v2;<BR>&nbsp;&nbsp;&nbsp; v1=new Value();<BR>&nbsp;&nbsp;&nbsp; v2=new Value();<BR>&nbsp;&nbsp;&nbsp; prt("v1.c="+v1.c+"&nbsp; v2.c="+v2.c);<BR>&nbsp;&nbsp;&nbsp; v1.inc();<BR>&nbsp;&nbsp;&nbsp; prt("v1.c="+v1.c+"&nbsp; v2.c="+v2.c);&nbsp; <BR>&nbsp; }<BR>} 
<P></P></SPAN>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 1.0pt"><SPAN style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体">　　结果如下：<SPAN lang=EN-US> 
<P></P></SPAN></SPAN>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 1.0pt"><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体">v1.c=0&nbsp; v2.c=0<BR>v1.c=1&nbsp; v2.c=1 
<P></P></SPAN>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 1.0pt"><SPAN style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体">由此可以证明它们共享一块存储区。<SPAN lang=EN-US>static变量有点类似于C中的全局变量的概念。值得探讨的是静态变量的初始化问题。我们修改上面的程序： 
<P></P></SPAN></SPAN>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 1.0pt"><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体">class Value{<BR>&nbsp; static int c=0;<BR>&nbsp; Value(){<BR>&nbsp;&nbsp;&nbsp; c=15;<BR>&nbsp; }<BR>&nbsp; Value(int i){<BR>&nbsp;&nbsp;&nbsp; c=i;<BR>&nbsp; }<BR>&nbsp; static void inc(){<BR>&nbsp;&nbsp;&nbsp; c++;<BR>&nbsp; }<BR>}<BR>class Count{<BR>&nbsp; public static void prt(String s){<BR>&nbsp;&nbsp;&nbsp; System.out.println(s);<BR>&nbsp; }<BR>&nbsp;&nbsp;&nbsp; Value v=new Value(10);<BR>&nbsp;&nbsp;&nbsp; static Value v1,v2;<BR>&nbsp;&nbsp;&nbsp; static{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; prt("v1.c="+v1.c+"&nbsp; v2.c="+v2.c);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; v1=new Value(27);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; prt("v1.c="+v1.c+"&nbsp; v2.c="+v2.c);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; v2=new Value(15);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; prt("v1.c="+v1.c+"&nbsp; v2.c="+v2.c);<BR>&nbsp;&nbsp;&nbsp; } 
<P></P></SPAN>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 1.0pt"><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体">&nbsp; public static void main(String[] args){<BR>&nbsp;&nbsp;&nbsp; Count ct=new Count();<BR>&nbsp;&nbsp;&nbsp; prt("ct.c="+ct.v.c);<BR>&nbsp;&nbsp;&nbsp; prt("v1.c="+v1.c+"&nbsp; v2.c="+v2.c);<BR>&nbsp;&nbsp;&nbsp; v1.inc();<BR>&nbsp;&nbsp;&nbsp; prt("v1.c="+v1.c+"&nbsp; v2.c="+v2.c);<BR>&nbsp;&nbsp;&nbsp; prt("ct.c="+ct.v.c);<BR>&nbsp; }<BR>} 
<P></P></SPAN>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 1.0pt"><SPAN style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体">运行结果如下：<SPAN lang=EN-US> 
<P></P></SPAN></SPAN>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 1.0pt"><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体">v1.c=0&nbsp; v2.c=0<BR>v1.c=27&nbsp; v2.c=27<BR>v1.c=15&nbsp; v2.c=15<BR>ct.c=10<BR>v1.c=10&nbsp; v2.c=10<BR>v1.c=11&nbsp; v2.c=11<BR>ct.c=11 
<P></P></SPAN>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 1.0pt"><SPAN style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体">　　这个程序展示了静态初始化的各种特性。如果你初次接触<SPAN lang=EN-US>Java，结果可能令你吃惊。可能会对static后加大括号感到困惑。首先要告诉你的是，static定义的变量会优先于任何其它非static变量，不论其出现的顺序如何。正如在程序中所表现的，虽然v出现在v1和v2的前面，但是结果却是v1和v2的初始化在v的前面。在static{后面跟着一段代码，这是用来进行显式的静态变量初始化，这段代码只会初始化一次，且在类被第一次装载时。如果你能读懂并理解这段代码，会帮助你对static关键字的认识。在涉及到继承的时候，会先初始化父类的static变量，然后是子类的，依次类推。非静态变量不是本文的主题，在此不做详细讨论，请参考Think in Java中的讲解。 
<P></P></SPAN></SPAN>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 1.0pt"><STRONG><SPAN style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体">静态类</SPAN></STRONG><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体"> 
<P></P></SPAN>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 1.0pt"><SPAN style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体">　　通常一个普通类不允许声明为静态的，只有一个内部类才可以。这时这个声明为静态的内部类可以直接作为一个普通类来使用，而不需实例一个外部类。如下代码所示：<SPAN lang=EN-US> 
<P></P></SPAN></SPAN>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 1.0pt"><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体">public class StaticCls{<BR>&nbsp; public static void main(String[] args){<BR>&nbsp;&nbsp;&nbsp; OuterCls.InnerCls oi=new OuterCls.InnerCls();<BR>&nbsp; }<BR>}<BR>class OuterCls{<BR>&nbsp; public static class InnerCls{<BR>&nbsp;&nbsp;&nbsp; InnerCls(){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("InnerCls");<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp; }<BR>} 
<P></P></SPAN>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 1.0pt"><SPAN style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体">　　输出结果会如你所料：<SPAN lang=EN-US> 
<P></P></SPAN></SPAN>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 1.0pt"><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体">InnerCls 
<P></P></SPAN>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 1.0pt"><SPAN style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体">　　和普通类一样。内部类的其它用法请参阅<SPAN lang=EN-US>Think in Java中的相关章节，此处不作详解。 
<P></P></SPAN></SPAN>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 1.0pt"><SPAN style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体">二、<SPAN lang=EN-US>this &amp; super 
<P></P></SPAN></SPAN>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 1.0pt"><SPAN style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体">　　在上一篇拙作中，我们讨论了<SPAN lang=EN-US>static的种种用法，通过用static来定义方法或成员，为我们编程提供了某种便利，从某种程度上可以说它类似于C语言中的全局函数和全局变量。但是，并不是说有了这种便利，你便可以随处使用，如果那样的话，你便需要认真考虑一下自己是否在用面向对象的思想编程，自己的程序是否是面向对象的。好了，现在开始讨论this&amp;super这两个关键字的意义和用法。 
<P></P></SPAN></SPAN>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 1.0pt"><SPAN style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体">　　在<SPAN lang=EN-US>Java中，this通常指当前对象，super则指父类的。当你想要引用当前对象的某种东西，比如当前对象的某个方法，或当前对象的某个成员，你便可以利用this来实现这个目的，当然，this的另一个用途是调用当前对象的另一个构造函数，这些马上就要讨论。如果你想引用父类的某种东西，则非super莫属。由于this与super有如此相似的一些特性和与生俱来的某种关系，所以我们在这一块儿来讨论，希望能帮助你区分和掌握它们两个。 
<P></P></SPAN></SPAN>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 1.0pt"><STRONG><SPAN style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体">在一般方法中</SPAN></STRONG><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体"> 
<P></P></SPAN>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 1.0pt"><SPAN style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体">　　最普遍的情况就是，在你的方法中的某个形参名与当前对象的某个成员有相同的名字，这时为了不至于混淆，你便需要明确使用<SPAN lang=EN-US>this关键字来指明你要使用某个成员，使用方法是“this.成员名”，而不带this的那个便是形参。另外，还可以用“this.方法名”来引用当前对象的某个方法，但这时this就不是必须的了，你可以直接用方法名来访问那个方法，编译器会知道你要调用的是那一个。下面的代码演示了上面的用法： 
<P></P></SPAN></SPAN>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 1.0pt"><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体">public class DemoThis{<BR>&nbsp; private String name;<BR>&nbsp; private int age;<BR>&nbsp; DemoThis(String name,int age){<BR>&nbsp;&nbsp;&nbsp; setName(name); //你可以加上this来调用方法，像这样：this.setName(name);但这并不是必须的<BR>&nbsp;&nbsp;&nbsp; setAge(age);<BR>&nbsp;&nbsp;&nbsp; this.print();<BR>&nbsp; }&nbsp;&nbsp; <BR>&nbsp; public void setName(String name){<BR>&nbsp;&nbsp;&nbsp; this.name=name;//此处必须指明你要引用成员变量<BR>&nbsp; }<BR>&nbsp; public void setAge(int age){<BR>&nbsp;&nbsp;&nbsp; this.age=age;<BR>&nbsp; }<BR>&nbsp; public void print(){<BR>&nbsp;&nbsp;&nbsp; System.out.println("Name="+name+" Age="+age);//在此行中并不需要用this，因为没有会导致混淆的东西<BR>&nbsp; }<BR>&nbsp; public static void main(String[] args){<BR>&nbsp;&nbsp;&nbsp; DemoThis dt=new DemoThis("Kevin","22");<BR>&nbsp; }<BR>} 
<P></P></SPAN>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 1.0pt"><SPAN style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体">　　这段代码很简单，不用解释你也应该能看明白。在构造函数中你看到用<SPAN lang=EN-US>this.print(),你完全可以用print()来代替它，两者效果一样。下面我们修改这个程序，来演示super的用法。 
<P></P></SPAN></SPAN>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 1.0pt"><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体">class Person{<BR>&nbsp; public int c;<BR>&nbsp; private String name;<BR>&nbsp; private int age;<BR>&nbsp; protected void setName(String name){<BR>&nbsp;&nbsp;&nbsp; this.name=name;<BR>&nbsp; }<BR>&nbsp; protected void setAge(int age){<BR>&nbsp;&nbsp;&nbsp; this.age=age;<BR>&nbsp; }<BR>&nbsp; protected void print(){<BR>&nbsp;&nbsp;&nbsp; System.out.println("Name="+name+" Age="+age);<BR>&nbsp; }<BR>}<BR>public class DemoSuper extends Person{<BR>&nbsp; public void print(){<BR>&nbsp;&nbsp;&nbsp; System.out.println("DemoSuper:");<BR>&nbsp;&nbsp;&nbsp; super.print();<BR>&nbsp; }<BR>&nbsp; public static void main(String[] args){<BR>&nbsp;&nbsp;&nbsp; DemoSuper ds=new DemoSuper();<BR>&nbsp;&nbsp;&nbsp; ds.setName("kevin");<BR>&nbsp;&nbsp;&nbsp; ds.setAge(22);<BR>&nbsp;&nbsp;&nbsp; ds.print();<BR>&nbsp; }<BR>} 
<P></P></SPAN>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 1.0pt"><SPAN style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体">　　在<SPAN lang=EN-US>DemoSuper中，重新定义的print方法覆写了父类的print方法，它首先做一些自己的事情，然后调用父类的那个被覆写了的方法。输出结果说明了这一点： 
<P></P></SPAN></SPAN>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 1.0pt"><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体">DemoSuper:<BR>Name=kevin Age=22 
<P></P></SPAN>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 1.0pt"><SPAN style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体">　　这样的使用方法是比较常用的。另外如果父类的成员可以被子类访问，那你可以像使用<SPAN lang=EN-US>this一样使用它，用“super.父类中的成员名”的方式，但常常你并不是这样来访问父类中的成员名的。 
<P></P></SPAN></SPAN>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 1.0pt"><STRONG><SPAN style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体">在构造函数中</SPAN></STRONG><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体"> 
<P></P></SPAN>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 1.0pt"><SPAN style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体">　　构造函数是一种特殊的方法，在对象初始化的时候自动调用。在构造函数中，<SPAN lang=EN-US>this和super也有上面说的种种使用方式，并且它还有特殊的地方，请看下面的例子： 
<P></P></SPAN></SPAN>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 1.0pt"><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体">class Person{<BR>&nbsp; public static void prt(String s){<BR>&nbsp;&nbsp;&nbsp; System.out.println(s);<BR>&nbsp; }<BR>&nbsp; Person(){<BR>&nbsp;&nbsp;&nbsp; prt("A Person.");<BR>&nbsp; }<BR>&nbsp; Person(String name){<BR>&nbsp;&nbsp;&nbsp; prt("A person name is:"+name);<BR>&nbsp; }<BR>}<BR>public class Chinese extends Person{<BR>&nbsp; Chinese(){<BR>&nbsp;&nbsp;&nbsp; super();&nbsp; //调用父类构造函数（1）<BR>&nbsp;&nbsp;&nbsp; prt("A chinese.");//(4)<BR>&nbsp; }<BR>&nbsp; Chinese(String name){<BR>&nbsp;&nbsp;&nbsp; super(name);//调用父类具有相同形参的构造函数（2）<BR>&nbsp;&nbsp;&nbsp; prt("his name is:"+name);<BR>&nbsp; }<BR>&nbsp; Chinese(String name,int age){<BR>&nbsp;&nbsp;&nbsp; this(name);//调用当前具有相同形参的构造函数（3）<BR>&nbsp;&nbsp;&nbsp; prt("his age is:"+age);<BR>&nbsp; }<BR>&nbsp; public static void main(String[] args){<BR>&nbsp;&nbsp;&nbsp; Chinese cn=new Chinese();<BR>&nbsp;&nbsp;&nbsp; cn=new Chinese("kevin");<BR>&nbsp;&nbsp;&nbsp; cn=new Chinese("kevin",22);<BR>&nbsp; }<BR>} 
<P></P></SPAN>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 1.0pt"><SPAN style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体">　　在这段程序中，<SPAN lang=EN-US>this和super不再是像以前那样用“.”连接一个方法或成员，而是直接在其后跟上适当的参数，因此它的意义也就有了变化。super后加参数的是用来调用父类中具有相同形式的构造函数，如1和2处。this后加参数则调用的是当前具有相同参数的构造函数，如3处。当然，在Chinese的各个重载构造函数中，this和super在一般方法中的各种用法也仍可使用，比如4处，你可以将它替换为“this.prt”(因为它继承了父类中的那个方法）或者是“super.prt”（因为它是父类中的方法且可被子类访问），它照样可以正确运行。但这样似乎就有点画蛇添足的味道了。 
<P></P></SPAN></SPAN>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 1.0pt"><SPAN style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体">　　最后，写了这么多，如果你能对“<SPAN lang=EN-US>this通常指代当前对象，super通常指代父类”这句话牢记在心，那么本篇便达到了目的，其它的你自会在以后的编程实践当中慢慢体会、掌握。另外关于本篇中提到的继承，请参阅相关Java教程。 
<P></P></SPAN></SPAN>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 1.0pt"><SPAN style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体">三、<SPAN lang=EN-US>final 
<P></P></SPAN></SPAN>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 1.0pt"><SPAN style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体">　　<SPAN lang=EN-US>final在Java中并不常用，然而它却为我们提供了诸如在C语言中定义常量的功能，不仅如此，final还可以让你控制你的成员、方法或者是一个类是否可被覆写或继承等功能，这些特点使final在Java中拥有了一个不可或缺的地位，也是学习Java时必须要知道和掌握的关键字之一。 
<P></P></SPAN></SPAN>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 1.0pt"><STRONG><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体">final成员</SPAN></STRONG><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体"> 
<P></P></SPAN>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 1.0pt"><SPAN style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体">　　当你在类中定义变量时，在其前面加上<SPAN lang=EN-US>final关键字，那便是说，这个变量一旦被初始化便不可改变，这里不可改变的意思对基本类型来说是其值不可变，而对于对象变量来说其引用不可再变。其初始化可以在两个地方，一是其定义处，也就是说在final变量定义时直接给其赋值，二是在构造函数中。这两个地方只能选其一，要么在定义时给值，要么在构造函数中给值，不能同时既在定义时给了值，又在构造函数中给另外的值。下面这段代码演示了这一点： 
<P></P></SPAN></SPAN>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 1.0pt"><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体">import java.util.List;<BR>import java.util.ArrayList;<BR>import java.util.LinkedList;<BR>public class Bat{<BR>&nbsp;&nbsp;&nbsp; final PI=3.14;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //在定义时便给址值<BR>&nbsp;&nbsp;&nbsp; final int i;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //因为要在构造函数中进行初始化，所以此处便不可再给值<BR>&nbsp;&nbsp;&nbsp; final List list;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //此变量也与上面的一样<BR>&nbsp;&nbsp;&nbsp; Bat(){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i=100;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; list=new LinkedList();<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; Bat(int ii,List l){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i=ii;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; list=l;<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; public static void main(String[] args){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Bat b=new Bat();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b.list.add(new Bat());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //b.i=25;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //b.list=new ArrayList();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("I="+b.i+" List Type:"+b.list.getClass());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b=new Bat(23,new ArrayList());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b.list.add(new Bat());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("I="+b.i+" List Type:"+b.list.getClass());<BR>&nbsp;&nbsp;&nbsp; }<BR>} 
<P></P></SPAN>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 1.0pt"><SPAN style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体">　　此程序很简单的演示了<SPAN lang=EN-US>final的常规用法。在这里使用在构造函数中进行初始化的方法，这使你有了一点灵活性。如Bat的两个重载构造函数所示，第一个缺省构造函数会为你提供默认的值，重载的那个构造函数会根据你所提供的值或类型为final变量初始化。然而有时你并不需要这种灵活性，你只需要在定义时便给定其值并永不变化，这时就不要再用这种方法。在main方法中有两行语句注释掉了，如果你去掉注释，程序便无法通过编译，这便是说，不论是i的值或是list的类型，一旦初始化，确实无法再更改。然而b可以通过重新初始化来指定i的值或list的类型，输出结果中显示了这一点： 
<P></P></SPAN></SPAN>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 1.0pt"><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体">I=100 List Type:class java.util.LinkedList<BR>I=23 List Type:class java.util.ArrayList 
<P></P></SPAN>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 1.0pt"><SPAN style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体">　　还有一种用法是定义方法中的参数为<SPAN lang=EN-US>final，对于基本类型的变量，这样做并没有什么实际意义，因为基本类型的变量在调用方法时是传值的，也就是说你可以在方法中更改这个参数变量而不会影响到调用语句，然而对于对象变量，却显得很实用，因为对象变量在传递时是传递其引用，这样你在方法中对对象变量的修改也会影响到调用语句中的对象变量，当你在方法中不需要改变作为参数的对象变量时，明确使用final进行声明，会防止你无意的修改而影响到调用方法。<BR>另外方法中的内部类在用到方法中的参变量时，此参变也必须声明为final才可使用，如下代码所示： 
<P></P></SPAN></SPAN>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 1.0pt"><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体">public class INClass{<BR>&nbsp;&nbsp; void innerClass(final String str){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class IClass{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IClass(){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(str);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IClass ic=new IClass();<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp; public static void main(String[] args){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INClass inc=new INClass();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; inc.innerClass("Hello");<BR>&nbsp; }<BR>} 
<P></P></SPAN>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 1.0pt"><STRONG><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体">final方法</SPAN></STRONG><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体"> 
<P></P></SPAN>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 1.0pt"><SPAN style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体">　　将方法声明为<SPAN lang=EN-US>final，那就说明你已经知道这个方法提供的功能已经满足你要求，不需要进行扩展，并且也不允许任何从此类继承的类来覆写这个方法，但是继承仍然可以继承这个方法，也就是说可以直接使用。另外有一种被称为inline的机制，它会使你在调用final方法时，直接将方法主体插入到调用处，而不是进行例行的方法调用，例如保存断点，压栈等，这样可能会使你的程序效率有所提高，然而当你的方法主体非常庞大时，或你在多处调用此方法，那么你的调用主体代码便会迅速膨胀，可能反而会影响效率，所以你要慎用final进行方法定义。 
<P></P></SPAN></SPAN>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 1.0pt"><STRONG><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体">final类</SPAN></STRONG><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体"> 
<P></P></SPAN>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 1.0pt"><SPAN style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体">　　当你将<SPAN lang=EN-US>final用于类身上时，你就需要仔细考虑，因为一个final类是无法被任何人继承的，那也就意味着此类在一个继承树中是一个叶子类，并且此类的设计已被认为很完美而不需要进行修改或扩展。对于final类中的成员，你可以定义其为final，也可以不是final。而对于方法，由于所属类为final的关系，自然也就成了final型的。你也可以明确的给final类中的方法加上一个final，但这显然没有意义。 
<P></P></SPAN></SPAN>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 1.0pt"><SPAN style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体">　　下面的程序演示了<SPAN lang=EN-US>final方法和final类的用法： 
<P></P></SPAN></SPAN>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 1.0pt"><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体">final class final{<BR>&nbsp;&nbsp;&nbsp; final String str="final Data";<BR>&nbsp;&nbsp;&nbsp; public String str1="non final data";<BR>&nbsp;&nbsp;&nbsp; final public void print(){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("final method.");<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; public void what(){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(str+"\n"+str1);<BR>&nbsp;&nbsp;&nbsp; }<BR>}<BR>public class FinalDemo {&nbsp;&nbsp; //extends final 无法继承 <BR>&nbsp;&nbsp;&nbsp; public static void main(String[] args){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final f=new final();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f.what();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f.print();<BR>&nbsp;&nbsp;&nbsp; }<BR>} 
<P></P></SPAN>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 1.0pt"><SPAN style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体">　　从程序中可以看出，<SPAN lang=EN-US>final类与普通类的使用几乎没有差别，只是它失去了被继承的特性。final方法与非final方法的区别也很难从程序行看出，只是记住慎用。 
<P></P></SPAN></SPAN>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 1.0pt"><STRONG><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体">final在设计模式中的应用</SPAN></STRONG><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体"> 
<P></P></SPAN>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 1.0pt"><SPAN style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体">　　在设计模式中有一种模式叫做不变模式，在<SPAN lang=EN-US>Java中通过final关键字可以很容易的实现这个模式，在讲解final成员时用到的程序Bat.java就是一个不变模式的例子。如果你对此感兴趣，可以参考阎宏博士编写的《Java与模式》一书中的讲解。 
<P></P></SPAN></SPAN>
<P></P>
<P style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 1.0pt"><SPAN style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体">　　到此为止，<SPAN lang=EN-US>this,static,supert和final的使用已经说完了，如果你对这四个关键字已经能够大致说出它们的区别与用法，那便说明你基本已经掌握。然而，世界上的任何东西都不是完美无缺的，Java提供这四个关键字，给程序员的编程带来了很大的便利，但并不是说要让你到处使用，一旦达到滥用的程序，便适得其反，所以在使用时请一定要认真考虑。 
<P></P></SPAN></SPAN><img src ="http://www.blogjava.net/faintbear/aggbug/2394.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/faintbear/" target="_blank">小力力力</a> 2005-03-24 09:54 <a href="http://www.blogjava.net/faintbear/archive/2005/03/24/2394.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java异常学习笔记（1）</title><link>http://www.blogjava.net/faintbear/archive/2005/03/23/2377.html</link><dc:creator>小力力力</dc:creator><author>小力力力</author><pubDate>Wed, 23 Mar 2005 09:14:00 GMT</pubDate><guid>http://www.blogjava.net/faintbear/archive/2005/03/23/2377.html</guid><wfw:comment>http://www.blogjava.net/faintbear/comments/2377.html</wfw:comment><comments>http://www.blogjava.net/faintbear/archive/2005/03/23/2377.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/faintbear/comments/commentRss/2377.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/faintbear/services/trackbacks/2377.html</trackback:ping><description><![CDATA[<P><FONT size=2>用异常来处理错误。<BR>捕获异常最佳的时候应该是程序编译的时候，也就是程序运行之前，但是不是所有的错误都能在编译的时候被发现，<BR>有些问题只有到程序运行的时候才能被处理，他们要通过某种方式，让引发问题的代码将适当的信息传给那些知道<BR>该怎么处理这些问题的程序。</FONT></P>
<P><FONT size=2>&nbsp;基本异常<BR>&nbsp; <BR>&nbsp; 异常条件是一种能阻止正在运行的方法或其某一部分继续运行下去的问题。<BR>&nbsp; 把异常条件同普通问题区分开来，这点很重要，遇到普通问题的时候，你在<BR>&nbsp; 当前的运行环境下有足够的信息来处理这个困难，对于异常条件，由于你得不到<BR>&nbsp; 足够得用以处理这个问题得信息，因此不能在当前得运行环境下继续运行下去，<BR>&nbsp; 你只能跳出当前得运行环境，并且把问题交到上层得运行环境，这就是抛出异常的<BR>&nbsp; 时候所发生的事情。</FONT></P>
<P><FONT size=2>&nbsp; 当你抛出异常对象的时候，首先会象创建其他java对象那样，创建一个异常对象，<BR>&nbsp; 在堆里，用new ,然后停下当前的执行路径，再将异常对象的reference从当前的运行<BR>&nbsp; 环境中弹出去，现在异常处理机制开始接管程序了，<BR><BR>&nbsp;创建自己的异常<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #000000">package&nbsp;com.faintbear;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><BR><IMG id=Codehighlighter1_65_66_Open_Image onclick="this.style.display='none'; Codehighlighter1_65_66_Open_Text.style.display='none'; Codehighlighter1_65_66_Closed_Image.style.display='inline'; Codehighlighter1_65_66_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_65_66_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_65_66_Closed_Text.style.display='none'; Codehighlighter1_65_66_Open_Image.style.display='inline'; Codehighlighter1_65_66_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000">&nbsp;SimpleException&nbsp;&nbsp;extends&nbsp;Exception&nbsp;</SPAN><SPAN id=Codehighlighter1_65_66_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_65_66_Open_Text><SPAN style="COLOR: #000000">{}</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></SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000">&nbsp;SimpleExceptionDemo&nbsp;<BR><IMG id=Codehighlighter1_103_513_Open_Image onclick="this.style.display='none'; Codehighlighter1_103_513_Open_Text.style.display='none'; Codehighlighter1_103_513_Closed_Image.style.display='inline'; Codehighlighter1_103_513_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_103_513_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_103_513_Closed_Text.style.display='none'; Codehighlighter1_103_513_Open_Image.style.display='inline'; Codehighlighter1_103_513_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top></SPAN><SPAN id=Codehighlighter1_103_513_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_103_513_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;f()&nbsp;throws&nbsp;SimpleException&nbsp;<BR><IMG id=Codehighlighter1_147_245_Open_Image onclick="this.style.display='none'; Codehighlighter1_147_245_Open_Text.style.display='none'; Codehighlighter1_147_245_Closed_Image.style.display='inline'; Codehighlighter1_147_245_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_147_245_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_147_245_Closed_Text.style.display='none'; Codehighlighter1_147_245_Open_Image.style.display='inline'; Codehighlighter1_147_245_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_147_245_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_147_245_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.</SPAN><SPAN style="COLOR: #0000ff">out</SPAN><SPAN style="COLOR: #000000">.println(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&nbsp;Throwing&nbsp;SimpleException&nbsp;from&nbsp;f()</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">throw</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;SimpleException&nbsp;();<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">static</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;main(String[]args)<BR><IMG id=Codehighlighter1_289_506_Open_Image onclick="this.style.display='none'; Codehighlighter1_289_506_Open_Text.style.display='none'; Codehighlighter1_289_506_Closed_Image.style.display='inline'; Codehighlighter1_289_506_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_289_506_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_289_506_Closed_Text.style.display='none'; Codehighlighter1_289_506_Open_Image.style.display='inline'; Codehighlighter1_289_506_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_289_506_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_289_506_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SimpleExceptionDemo&nbsp;sed&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;SimpleExceptionDemo();<BR><IMG id=Codehighlighter1_359_397_Open_Image onclick="this.style.display='none'; Codehighlighter1_359_397_Open_Text.style.display='none'; Codehighlighter1_359_397_Closed_Image.style.display='inline'; Codehighlighter1_359_397_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_359_397_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_359_397_Closed_Text.style.display='none'; Codehighlighter1_359_397_Open_Image.style.display='inline'; Codehighlighter1_359_397_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">try</SPAN><SPAN id=Codehighlighter1_359_397_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_359_397_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sed.f();<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR><IMG id=Codehighlighter1_423_503_Open_Image onclick="this.style.display='none'; Codehighlighter1_423_503_Open_Text.style.display='none'; Codehighlighter1_423_503_Closed_Image.style.display='inline'; Codehighlighter1_423_503_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_423_503_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_423_503_Closed_Text.style.display='none'; Codehighlighter1_423_503_Open_Image.style.display='inline'; Codehighlighter1_423_503_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #0000ff">catch</SPAN><SPAN style="COLOR: #000000">&nbsp;(SimpleException&nbsp;e)</SPAN><SPAN id=Codehighlighter1_423_503_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_423_503_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.err.println(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">caught&nbsp;it</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><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></SPAN></DIV></DIV>
<P></FONT>&nbsp;</P>
<P><FONT size=2>&nbsp; 异常说明</FONT></P>
<P><FONT size=2>&nbsp; 异常说明属于方法声明的一部分，要列在参数表的后面。<BR>&nbsp; 异常说明要用throws关键词语，后面跟上所有可能抛出异常类型的清单。</FONT></P>
<P><BR><FONT size=2>&nbsp; 捕捉任意类型的异常</FONT></P>
<P><FONT size=2>&nbsp; 要想创建一个“能处理任意类型异常的”异常处理程序是完全可能的，要做到这点，<BR>&nbsp; 你就必须去捕捉异常的基类Exception，</FONT></P>
<P><FONT size=2>&nbsp; 由于Exception只是那些跟程序员有关的异常类的基类，因此你不能从它那里得到更多的<BR>&nbsp; 关于异常的具体信息，不过你也可以调用Exception的基类Throwable的方法，</FONT></P>
<P><FONT size=2>&nbsp; String getMessage()</FONT></P>
<P><FONT size=2>&nbsp; String getLocalizedMessage()</FONT></P>
<P><FONT size=2>&nbsp; String toString()</FONT></P>
<P><FONT size=2>&nbsp; void printStackTrace()<BR>&nbsp; void printStackTrace(PrintStream)<BR>&nbsp; void printStackTrace(java.io.PrintWriter)</FONT></P>
<P><FONT size=2>&nbsp; Throwable fillInStackTrace()</FONT></P>
<P><BR><FONT size=2>&nbsp; 用finally进行清理</FONT></P>
<P><FONT size=2>&nbsp;&nbsp; 你会时常碰到”无论try区块有没有抛出异常“，程序都必须执行的代码。一般来说<BR>&nbsp;&nbsp; 这些代码都是执行恢复内存之外的操作的（因为恢复内存是垃圾回收器的活）<BR>&nbsp;&nbsp; 当你需要把内存以外的东西恢复到原先状态的时候finally就显得必要了。<BR>&nbsp;&nbsp;&nbsp; </FONT></P><img src ="http://www.blogjava.net/faintbear/aggbug/2377.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/faintbear/" target="_blank">小力力力</a> 2005-03-23 17:14 <a href="http://www.blogjava.net/faintbear/archive/2005/03/23/2377.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java异常处理之陋习展播（转）</title><link>http://www.blogjava.net/faintbear/archive/2005/03/23/2353.html</link><dc:creator>小力力力</dc:creator><author>小力力力</author><pubDate>Wed, 23 Mar 2005 02:57:00 GMT</pubDate><guid>http://www.blogjava.net/faintbear/archive/2005/03/23/2353.html</guid><wfw:comment>http://www.blogjava.net/faintbear/comments/2353.html</wfw:comment><comments>http://www.blogjava.net/faintbear/archive/2005/03/23/2353.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/faintbear/comments/commentRss/2353.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/faintbear/services/trackbacks/2353.html</trackback:ping><description><![CDATA[<P><FONT size=2>Java异常处理之陋习展播（ZT） <IMG height=166 alt=o_5.jpg src="http://www.blogjava.net/images/blogjava_net/faintbear/713/o_5.jpg" width=166 align=bottom border=0>(Marilyn manson)<BR></FONT><A href="http://www.chinaunix.net"><FONT size=2>http://www.chinaunix.net</FONT></A><FONT size=2> 作者:小飞爱使申华&nbsp; 发表于：2003-08-11 02:39:41 </FONT></P>
<P><FONT size=2>java 异常&nbsp; </FONT></P>
<P><BR><FONT size=2>你觉得自己是一个Java专家吗？是否肯定自己已经全面掌握了Java的异常处理机制？在下面这段代码中，你能够迅速找出异常处理的六个问题吗？&nbsp; </FONT></P>
<P><FONT size=2>[code:1:48e2a3bb92] <BR>1 OutputStreamWriter out = ... </FONT></P>
<P><FONT size=2>2 java.sql.Connection conn = ... </FONT></P>
<P><FONT size=2>3 try { // ⑸ </FONT></P>
<P><FONT size=2>4&nbsp;&nbsp;&nbsp; Statement stat = conn.createStatement();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </FONT></P>
<P><FONT size=2>5&nbsp;&nbsp;&nbsp; ResultSet rs = stat.executeQuery( </FONT></P>
<P><FONT size=2>6&nbsp;&nbsp;&nbsp; "select uid, name from user"); </FONT></P>
<P><FONT size=2>7&nbsp;&nbsp;&nbsp; while (rs.next()) </FONT></P>
<P><FONT size=2>8&nbsp;&nbsp;&nbsp; { </FONT></P>
<P><FONT size=2>9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.println("ID：" + rs.getString("uid") // ⑹ </FONT></P>
<P><FONT size=2>10&nbsp;&nbsp;&nbsp;&nbsp; "，姓名：" + rs.getString("name")); </FONT></P>
<P><FONT size=2>11&nbsp;&nbsp; } </FONT></P>
<P><FONT size=2>12&nbsp;&nbsp; conn.close(); // ⑶ </FONT></P>
<P><FONT size=2>13&nbsp;&nbsp; out.close(); </FONT></P>
<P><FONT size=2>14 } </FONT></P>
<P><FONT size=2>15 catch(Exception ex) // ⑵ </FONT></P>
<P><FONT size=2>16 { </FONT></P>
<P><FONT size=2>17&nbsp;&nbsp;&nbsp; ex.printStackTrace(); //⑴，⑷ </FONT></P>
<P><FONT size=2>18 } <BR>[/code:1:48e2a3bb92] </FONT></P>
<P><FONT size=2></FONT>&nbsp;</P>
<P><FONT size=2>　　作为一个Java程序员，你至少应该能够找出两个问题。但是，如果你不能找出全部六个问题，请继续阅读本文。&nbsp; </FONT></P>
<P><BR><FONT size=2>　　本文讨论的不是Java异常处理的一般性原则，因为这些原则已经被大多数人熟知。我们要做的是分析各种可称为“反例”（anti-pattern）的违背优秀编码规范的常见坏习惯，帮助读者熟悉这些典型的反面例子，从而能够在实际工作中敏锐地察觉和避免这些问题。&nbsp; </FONT></P>
<P><BR><FONT size=2>　　反例之一：丢弃异常 </FONT></P>
<P><BR><FONT size=2>　　代码：15行-18行。&nbsp; </FONT></P>
<P><BR><FONT size=2>　　这段代码捕获了异常却不作任何处理，可以算得上Java编程中的杀手。从问题出现的频繁程度和祸害程度来看，它也许可以和C/C++程序的一个恶名远播的问题相提并论——不检查缓冲区是否已满。如果你看到了这种丢弃（而不是抛出）异常的情况，可以百分之九十九地肯定代码存在问题（在极少数情况下，这段代码有存在的理由，但最好加上完整的注释，以免引起别人误解）。&nbsp; </FONT></P>
<P><BR><FONT size=2>　　这段代码的错误在于，异常（几乎）总是意味着某些事情不对劲了，或者说至少发生了某些不寻常的事情，我们不应该对程序发出的求救信号保持沉默和无动于衷。调用一下printStackTrace算不上“处理异常”。不错，调用printStackTrace对调试程序有帮助，但程序调试阶段结束之后，printStackTrace就不应再在异常处理模块中担负主要责任了。&nbsp; </FONT></P>
<P><BR><FONT size=2>　　丢弃异常的情形非常普遍。打开JDK的ThreadDeath类的文档，可以看到下面这段说明：“特别地，虽然出现ThreadDeath是一种‘正常的情形’，但ThreadDeath类是Error而不是Exception的子类，因为许多应用会捕获所有的Exception然后丢弃它不再理睬。”这段话的意思是，虽然ThreadDeath代表的是一种普通的问题，但鉴于许多应用会试图捕获所有异常然后不予以适当的处理，所以JDK把ThreadDeath定义成了Error的子类，因为Error类代表的是一般的应用不应该去捕获的严重问题。可见，丢弃异常这一坏习惯是如此常见，它甚至已经影响到了Java本身的设计。&nbsp; </FONT></P>
<P><BR><FONT size=2>　　那么，应该怎样改正呢？主要有四个选择：&nbsp; </FONT></P>
<P><BR><FONT size=2>　　1、处理异常。针对该异常采取一些行动，例如修正问题、提醒某个人或进行其他一些处理，要根据具体的情形确定应该采取的动作。再次说明，调用printStackTrace算不上已经“处理好了异常”。&nbsp; </FONT></P>
<P><BR><FONT size=2>　　2、重新抛出异常。处理异常的代码在分析异常之后，认为自己不能处理它，重新抛出异常也不失为一种选择。&nbsp; </FONT></P>
<P><BR><FONT size=2>　　3、把该异常转换成另一种异常。大多数情况下，这是指把一个低级的异常转换成应用级的异常（其含义更容易被用户了解的异常）。&nbsp; </FONT></P>
<P><BR><FONT size=2>　　4、不要捕获异常。&nbsp; </FONT></P>
<P><BR><FONT size=2>　　结论一：既然捕获了异常，就要对它进行适当的处理。不要捕获异常之后又把它丢弃，不予理睬。&nbsp; </FONT></P>
<P><BR><FONT size=2>　　反例之二：不指定具体的异常&nbsp; </FONT></P>
<P><BR><FONT size=2>　　代码：15行。&nbsp; </FONT></P>
<P><BR><FONT size=2>　　许多时候人们会被这样一种“美妙的”想法吸引：用一个catch语句捕获所有的异常。最常见的情形就是使用catch(Exception ex)语句。但实际上，在绝大多数情况下，这种做法不值得提倡。为什么呢？&nbsp; </FONT></P>
<P><BR><FONT size=2>　　要理解其原因，我们必须回顾一下catch语句的用途。catch语句表示我们预期会出现某种异常，而且希望能够处理该异常。异常类的作用就是告诉Java编译器我们想要处理的是哪一种异常。由于绝大多数异常都直接或间接从java.lang.Exception派生，catch(Exception ex)就相当于说我们想要处理几乎所有的异常。&nbsp; </FONT></P>
<P><BR><FONT size=2>　　再来看看前面的代码例子。我们真正想要捕获的异常是什么呢？最明显的一个是SQLException，这是JDBC操作中常见的异常。另一个可能的异常是IOException，因为它要操作OutputStreamWriter。显然，在同一个catch块中处理这两种截然不同的异常是不合适的。如果用两个catch块分别捕获SQLException和IOException就要好多了。这就是说，catch语句应当尽量指定具体的异常类型，而不应该指定涵盖范围太广的Exception类。&nbsp; </FONT></P>
<P><BR><FONT size=2>　　另一方面，除了这两个特定的异常，还有其他许多异常也可能出现。例如，如果由于某种原因，executeQuery返回了null，该怎么办？答案是让它们继续抛出，即不必捕获也不必处理。实际上，我们不能也不应该去捕获可能出现的所有异常，程序的其他地方还有捕获异常的机会——直至最后由JVM处理。&nbsp; </FONT></P>
<P><BR><FONT size=2>　　结论二：在catch语句中尽可能指定具体的异常类型，必要时使用多个catch。不要试图处理所有可能出现的异常。&nbsp; </FONT></P>
<P><BR><FONT size=2>　　反例之三：占用资源不释放&nbsp; </FONT></P>
<P><BR><FONT size=2>　　代码：3行-14行。&nbsp; </FONT></P>
<P><BR><FONT size=2>　　异常改变了程序正常的执行流程。这个道理虽然简单，却常常被人们忽视。如果程序用到了文件、Socket、JDBC连接之类的资源，即使遇到了异常，也要正确释放占用的资源。为此，Java提供了一个简化这类操作的关键词finally。&nbsp; </FONT></P>
<P><BR><FONT size=2>　　finally是样好东西：不管是否出现了异常，Finally保证在try/catch/finally块结束之前，执行清理任务的代码总是有机会执行。遗憾的是有些人却不习惯使用finally。&nbsp; </FONT></P>
<P><BR><FONT size=2>　　当然，编写finally块应当多加小心，特别是要注意在finally块之内抛出的异常——这是执行清理任务的最后机会，尽量不要再有难以处理的错误。&nbsp; </FONT></P>
<P><BR><FONT size=2>　　结论三：保证所有资源都被正确释放。充分运用finally关键词。&nbsp; </FONT></P>
<P><BR><FONT size=2>　　反例之四：不说明异常的详细信息&nbsp; </FONT></P>
<P><BR><FONT size=2>　　代码：3行-18行。&nbsp; </FONT></P>
<P><BR><FONT size=2>　　仔细观察这段代码：如果循环内部出现了异常，会发生什么事情？我们可以得到足够的信息判断循环内部出错的原因吗？不能。我们只能知道当前正在处理的类发生了某种错误，但却不能获得任何信息判断导致当前错误的原因。&nbsp; </FONT></P>
<P><BR><FONT size=2>　　printStackTrace的堆栈跟踪功能显示出程序运行到当前类的执行流程，但只提供了一些最基本的信息，未能说明实际导致错误的原因，同时也不易解读。&nbsp; </FONT></P>
<P><BR><FONT size=2>　　因此，在出现异常时，最好能够提供一些文字信息，例如当前正在执行的类、方法和其他状态信息，包括以一种更适合阅读的方式整理和组织printStackTrace提供的信息。&nbsp; </FONT></P>
<P><BR><FONT size=2>　　结论四：在异常处理模块中提供适量的错误原因信息，组织错误信息使其易于理解和阅读。&nbsp; </FONT></P>
<P><BR><FONT size=2>　　反例之五：过于庞大的try块&nbsp; </FONT></P>
<P><BR><FONT size=2>　　代码：3行-14行。&nbsp; </FONT></P>
<P><BR><FONT size=2>　　经常可以看到有人把大量的代码放入单个try块，实际上这不是好习惯。这种现象之所以常见，原因就在于有些人图省事，不愿花时间分析一大块代码中哪几行代码会抛出异常、异常的具体类型是什么。把大量的语句装入单个巨大的try块就象是出门旅游时把所有日常用品塞入一个大箱子，虽然东西是带上了，但要找出来可不容易。&nbsp; </FONT></P>
<P><BR><FONT size=2>　　一些新手常常把大量的代码放入单个try块，然后再在catch语句中声明Exception，而不是分离各个可能出现异常的段落并分别捕获其异常。这种做法为分析程序抛出异常的原因带来了困难，因为一大段代码中有太多的地方可能抛出Exception。&nbsp; </FONT></P>
<P><BR><FONT size=2>　　结论五：尽量减小try块的体积。&nbsp; </FONT></P>
<P><BR><FONT size=2>　　反例之六：输出数据不完整&nbsp; </FONT></P>
<P><BR><FONT size=2>　　代码：7行-11行。&nbsp; </FONT></P>
<P><BR><FONT size=2>　　不完整的数据是Java程序的隐形杀手。仔细观察这段代码，考虑一下如果循环的中间抛出了异常，会发生什么事情。循环的执行当然是要被打断的，其次，catch块会执行——就这些，再也没有其他动作了。已经输出的数据怎么办？使用这些数据的人或设备将收到一份不完整的（因而也是错误的）数据，却得不到任何有关这份数据是否完整的提示。对于有些系统来说，数据不完整可能比系统停止运行带来更大的损失。&nbsp; </FONT></P>
<P><BR><FONT size=2>　　较为理想的处置办法是向输出设备写一些信息，声明数据的不完整性；另一种可能有效的办法是，先缓冲要输出的数据，准备好全部数据之后再一次性输出。&nbsp; </FONT></P>
<P><BR><FONT size=2>　　结论六：全面考虑可能出现的异常以及这些异常对执行流程的影响。&nbsp; </FONT></P>
<P><BR><FONT size=2>　　改写后的代码&nbsp; </FONT></P>
<P><BR><FONT size=2>　　根据上面的讨论，下面给出改写后的代码。也许有人会说它稍微有点啰嗦，但是它有了比较完备的异常处理机制。&nbsp; </FONT></P>
<P><FONT size=2>[code:1:48e2a3bb92] <BR>OutputStreamWriter out = ... </FONT></P>
<P><FONT size=2>java.sql.Connection conn = ... </FONT></P>
<P><FONT size=2>try { </FONT></P>
<P><FONT size=2>&nbsp;&nbsp; Statement stat = conn.createStatement(); </FONT></P>
<P><FONT size=2>&nbsp;&nbsp; ResultSet rs = stat.executeQuery( </FONT></P>
<P><FONT size=2>&nbsp;&nbsp; "select uid, name from user"); </FONT></P>
<P><FONT size=2>&nbsp;&nbsp; while (rs.next()) </FONT></P>
<P><FONT size=2>&nbsp;&nbsp; { </FONT></P>
<P><FONT size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.println("ID：" + rs.getString("uid") + </FONT></P>
<P><FONT size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "，姓名: " + rs.getString("name")); </FONT></P>
<P><FONT size=2>&nbsp;&nbsp; } </FONT></P>
<P><FONT size=2>} </FONT></P>
<P><FONT size=2>catch(SQLException sqlex) </FONT></P>
<P><FONT size=2>{ </FONT></P>
<P><FONT size=2>&nbsp;&nbsp; out.println("警告：数据不完整"); </FONT></P>
<P><FONT size=2>&nbsp;&nbsp; throw new ApplicationException( </FONT></P>
<P><FONT size=2>&nbsp;&nbsp; "读取数据时出现SQL错误", sqlex); </FONT></P>
<P><FONT size=2>} </FONT></P>
<P><FONT size=2>catch(IOException ioex) </FONT></P>
<P><FONT size=2>{ </FONT></P>
<P><FONT size=2>&nbsp;&nbsp; throw new ApplicationException( </FONT></P>
<P><FONT size=2>&nbsp;&nbsp; "写入数据时出现IO错误", ioex); </FONT></P>
<P><FONT size=2>} </FONT></P>
<P><FONT size=2>finally </FONT></P>
<P><FONT size=2>{ </FONT></P>
<P><FONT size=2>&nbsp;&nbsp; if (conn != null) { </FONT></P>
<P><FONT size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try { </FONT></P>
<P><FONT size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; conn.close(); </FONT></P>
<P><FONT size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } </FONT></P>
<P><FONT size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch(SQLException sqlex2) </FONT></P>
<P><FONT size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { </FONT></P>
<P><FONT size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.err(this.getClass().getName() + </FONT></P>
<P><FONT size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ".mymethod - 不能关闭数据库连接: " + </FONT></P>
<P><FONT size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sqlex2.toString()); </FONT></P>
<P><FONT size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } </FONT></P>
<P><FONT size=2>&nbsp;&nbsp; } </FONT></P>
<P><BR><FONT size=2>&nbsp;&nbsp; if (out != null) { </FONT></P>
<P><FONT size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try { </FONT></P>
<P><FONT size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.close(); </FONT></P>
<P><FONT size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } </FONT></P>
<P><FONT size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch(IOException ioex2) </FONT></P>
<P><FONT size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { </FONT></P>
<P><FONT size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.err(this.getClass().getName() + </FONT></P>
<P><FONT size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ".mymethod - 不能关闭输出文件" + </FONT></P>
<P><FONT size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ioex2.toString()); </FONT></P>
<P><FONT size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } </FONT></P>
<P><FONT size=2>&nbsp;&nbsp; } </FONT></P>
<P><FONT size=2>} <BR>[/code:1:48e2a3bb92] </FONT></P>
<P><FONT size=2>　　本文的结论不是放之四海皆准的教条，有时常识和经验才是最好的老师。如果你对自己的做法没有百分之百的信心，务必加上详细、全面的注释。&nbsp; <BR>　　另一方面，不要笑话这些错误，不妨问问你自己是否真地彻底摆脱了这些坏习惯。即使最有经验的程序员偶尔也会误入歧途，原因很简单，因为它们确确实实带来了“方便”。所有这些反例都可以看作Java编程世界的恶魔，它们美丽动人，无孔不入，时刻诱惑着你。也许有人会认为这些都属于鸡皮蒜毛的小事，不足挂齿，但请记住：勿以恶小而为之，勿以善小而不为。 <BR>&nbsp;<BR></FONT></P><img src ="http://www.blogjava.net/faintbear/aggbug/2353.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/faintbear/" target="_blank">小力力力</a> 2005-03-23 10:57 <a href="http://www.blogjava.net/faintbear/archive/2005/03/23/2353.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java数据库编程中的几个常用技巧(转)</title><link>http://www.blogjava.net/faintbear/archive/2005/03/23/2351.html</link><dc:creator>小力力力</dc:creator><author>小力力力</author><pubDate>Wed, 23 Mar 2005 01:38:00 GMT</pubDate><guid>http://www.blogjava.net/faintbear/archive/2005/03/23/2351.html</guid><wfw:comment>http://www.blogjava.net/faintbear/comments/2351.html</wfw:comment><comments>http://www.blogjava.net/faintbear/archive/2005/03/23/2351.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/faintbear/comments/commentRss/2351.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/faintbear/services/trackbacks/2351.html</trackback:ping><description><![CDATA[<STRONG><FONT size=2>&nbsp;</FONT></STRONG><FONT size=2>
<HR color=#999999 noShade SIZE=1>
</FONT>
<P align=left><FONT size=2>1、java数据库操作基本流程 <BR><BR>　　2、几个常用的重要技巧： <BR><BR>　　可滚动、更新的记录集 <BR><BR>　　批量更新 <BR><BR>　　事务处理 <BR><BR>　　java数据库操作基本流程：取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 <BR><BR>　　1、取得数据库连接 <BR><BR>　　1）用DriverManager取数据库连接 <BR><BR>　　例子： <BR><BR>String className,url,uid,pwd; <BR>className = "oracle.jdbc.driver.OracleDriver"; <BR>url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; <BR>uid = "system"; <BR>pwd = "manager"; <BR>Class.forName(className); <BR>Connection cn = DriverManager.getConnection(url,uid,pwd); <BR><BR>　　2）用jndi(java的命名和目录服务)方式 <BR><BR>　　例子 <BR><BR>String jndi = "jdbc/db"; <BR>Context ctx = (Context) new InitialContext().lookup("java:comp/env"); <BR>DataSource ds = (DataSource) ctx.lookup(jndi); <BR>Connection cn = ds.getConnection(); <BR><BR>　　多用于jsp中 <BR><BR>　　2、执行sql语句 <BR><BR>　　1）用Statement来执行sql语句 <BR><BR>String sql; <BR>Statement sm = cn.createStatement(); <BR>sm.executeQuery(sql); // 执行数据查询语句（select） <BR>sm.executeUpdate(sql); // 执行数据更新语句（delete、update、insert、drop等）statement.close(); <BR><BR>　　2）用PreparedStatement来执行sql语句 <BR><BR>String sql; <BR>sql = "insert into user (id,name) values (?,?)"; <BR>PreparedStatement ps = cn.prepareStatement(sql); <BR>ps.setInt(1,xxx); <BR>ps.setString(2,xxx); <BR>... <BR>ResultSet rs = ps.executeQuery(); // 查询 <BR>int c = ps.executeUpdate(); // 更新 <BR><BR>　　3、处理执行结果 <BR><BR>　　查询语句，返回记录集ResultSet。 <BR><BR>　　更新语句，返回数字，表示该更新影响的记录数。 <BR><BR>　　ResultSet的方法： <BR><BR>　　1、next()，将游标往后移动一行，如果成功返回true；否则返回false。 <BR><BR>　　2、getInt("id")或getSting("name")，返回当前游标下某个字段的值。 <BR><BR>　　3、释放连接。 <BR><BR>cn.close(); <BR><BR>　　一般，先关闭ResultSet，然后关闭Statement（或者PreparedStatement）；最后关闭Connection <BR><BR>　　可滚动、更新的记录集 <BR><BR>　　1、创建可滚动、更新的Statement <BR><BR>Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); <BR><BR>　　该Statement取得的ResultSet就是可滚动的 <BR><BR>　　2、创建PreparedStatement时指定参数 <BR><BR>PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); <BR><BR>ResultSet.absolute(9000); <BR><BR>　　批量更新 <BR><BR>　　1、Statement <BR><BR>Statement sm = cn.createStatement(); <BR>sm.addBatch(sql1); <BR>sm.addBatch(sql2); <BR>... <BR>sm.executeBatch() <BR><BR>　　一个Statement对象，可以执行多个sql语句以后，批量更新。这多个语句可以是delete、update、insert等或兼有 <BR><BR>　　2、PreparedStatement <BR><BR>PreparedStatement ps = cn.preparedStatement(sql); <BR>{ <BR>　ps.setXXX(1,xxx); <BR>　... <BR>　ps.addBatch(); <BR>} <BR>ps.executeBatch(); <BR><BR>　　一个PreparedStatement，可以把一个sql语句，变换参数多次执行，一次更新。 <BR><BR>　　事务的处理 <BR><BR>　　1、关闭Connection的自动提交 <BR><BR>cn.setAutoCommit(false); <BR><BR>　　2、执行一系列sql语句 <BR><BR>　　要点：执行每一个新的sql语句前，上一次执行sql语句的Statement（或者PreparedStatemet）必须先close <BR><BR>Statement sm ; <BR>sm = cn.createStatement(insert into user...); <BR>sm.executeUpdate(); <BR>sm.close(); <BR><BR>sm = cn.createStatement("insert into corp...); <BR>sm.executeUpdate(); <BR>sm.close(); <BR><BR>　　3、提交 <BR><BR>cn.commit(); <BR><BR>　　4、如果发生异常，那么回滚 <BR><BR>cn.rollback(); <BR>　 </FONT></P><img src ="http://www.blogjava.net/faintbear/aggbug/2351.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/faintbear/" target="_blank">小力力力</a> 2005-03-23 09:38 <a href="http://www.blogjava.net/faintbear/archive/2005/03/23/2351.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java 入门之数据库连接和ArrayList的用法~</title><link>http://www.blogjava.net/faintbear/archive/2005/03/17/2183.html</link><dc:creator>小力力力</dc:creator><author>小力力力</author><pubDate>Thu, 17 Mar 2005 15:19:00 GMT</pubDate><guid>http://www.blogjava.net/faintbear/archive/2005/03/17/2183.html</guid><wfw:comment>http://www.blogjava.net/faintbear/comments/2183.html</wfw:comment><comments>http://www.blogjava.net/faintbear/archive/2005/03/17/2183.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/faintbear/comments/commentRss/2183.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/faintbear/services/trackbacks/2183.html</trackback:ping><description><![CDATA[<P>&nbsp;</P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #000000">Person.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><BR><IMG id=Codehighlighter1_14_48_Open_Image onclick="this.style.display='none'; Codehighlighter1_14_48_Open_Text.style.display='none'; Codehighlighter1_14_48_Closed_Image.style.display='inline'; Codehighlighter1_14_48_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_14_48_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_14_48_Closed_Text.style.display='none'; Codehighlighter1_14_48_Open_Image.style.display='inline'; Codehighlighter1_14_48_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top></SPAN><SPAN id=Codehighlighter1_14_48_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_14_48_Open_Text><SPAN style="COLOR: #008000">/*</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;*&nbsp;创建日期&nbsp;2005-3-17<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;*<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;*&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;*&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;</SPAN><SPAN style="COLOR: #008000">*/</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>package&nbsp;com.faintbear;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><BR><IMG id=Codehighlighter1_74_95_Open_Image onclick="this.style.display='none'; Codehighlighter1_74_95_Open_Text.style.display='none'; Codehighlighter1_74_95_Closed_Image.style.display='inline'; Codehighlighter1_74_95_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_74_95_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_74_95_Closed_Text.style.display='none'; Codehighlighter1_74_95_Open_Image.style.display='inline'; Codehighlighter1_74_95_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top></SPAN><SPAN id=Codehighlighter1_74_95_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_74_95_Open_Text><SPAN style="COLOR: #008000">/*</SPAN><SPAN style="COLOR: #008000">*<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;*&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;*<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;*&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;*&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;</SPAN><SPAN style="COLOR: #008000">*/</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG id=Codehighlighter1_117_466_Open_Image onclick="this.style.display='none'; Codehighlighter1_117_466_Open_Text.style.display='none'; Codehighlighter1_117_466_Closed_Image.style.display='inline'; Codehighlighter1_117_466_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_117_466_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_117_466_Closed_Text.style.display='none'; Codehighlighter1_117_466_Open_Image.style.display='inline'; Codehighlighter1_117_466_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000">&nbsp;Person&nbsp;</SPAN><SPAN id=Codehighlighter1_117_466_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_117_466_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">private</SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;String&nbsp;empname</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">""</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">private</SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;String&nbsp;empno</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">""</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;setEmpName(String&nbsp;empname)<BR><IMG id=Codehighlighter1_228_259_Open_Image onclick="this.style.display='none'; Codehighlighter1_228_259_Open_Text.style.display='none'; Codehighlighter1_228_259_Closed_Image.style.display='inline'; Codehighlighter1_228_259_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_228_259_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_228_259_Closed_Text.style.display='none'; Codehighlighter1_228_259_Open_Image.style.display='inline'; Codehighlighter1_228_259_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_228_259_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_228_259_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">this</SPAN><SPAN style="COLOR: #000000">.empname</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">empname;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;String&nbsp;getEmpName()<BR><IMG id=Codehighlighter1_295_324_Open_Image onclick="this.style.display='none'; Codehighlighter1_295_324_Open_Text.style.display='none'; Codehighlighter1_295_324_Closed_Image.style.display='inline'; Codehighlighter1_295_324_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_295_324_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_295_324_Closed_Text.style.display='none'; Codehighlighter1_295_324_Open_Image.style.display='inline'; Codehighlighter1_295_324_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_295_324_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_295_324_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">this</SPAN><SPAN style="COLOR: #000000">.empname;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;setEmpNo(String&nbsp;empno)<BR><IMG id=Codehighlighter1_371_399_Open_Image onclick="this.style.display='none'; Codehighlighter1_371_399_Open_Text.style.display='none'; Codehighlighter1_371_399_Closed_Image.style.display='inline'; Codehighlighter1_371_399_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_371_399_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_371_399_Closed_Text.style.display='none'; Codehighlighter1_371_399_Open_Image.style.display='inline'; Codehighlighter1_371_399_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_371_399_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_371_399_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">this</SPAN><SPAN style="COLOR: #000000">.empno</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">empno;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;String&nbsp;getEmpNo()<BR><IMG id=Codehighlighter1_433_461_Open_Image onclick="this.style.display='none'; Codehighlighter1_433_461_Open_Text.style.display='none'; Codehighlighter1_433_461_Closed_Image.style.display='inline'; Codehighlighter1_433_461_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_433_461_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_433_461_Closed_Text.style.display='none'; Codehighlighter1_433_461_Open_Image.style.display='inline'; Codehighlighter1_433_461_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_433_461_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_433_461_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">this</SPAN><SPAN style="COLOR: #000000">.empno;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><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>DbConnect.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>package&nbsp;com.faintbear;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>import&nbsp;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>import&nbsp;java.sql.</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_551_580_Open_Image onclick="this.style.display='none'; Codehighlighter1_551_580_Open_Text.style.display='none'; Codehighlighter1_551_580_Closed_Image.style.display='inline'; Codehighlighter1_551_580_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_551_580_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_551_580_Closed_Text.style.display='none'; Codehighlighter1_551_580_Open_Image.style.display='inline'; Codehighlighter1_551_580_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top></SPAN><SPAN id=Codehighlighter1_551_580_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_551_580_Open_Text><SPAN style="COLOR: #008000">/*</SPAN><SPAN style="COLOR: #008000">*<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;*&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;*<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;*&nbsp;数据库连接和测试<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;*&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;</SPAN><SPAN style="COLOR: #008000">*/</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG id=Codehighlighter1_605_2335_Open_Image onclick="this.style.display='none'; Codehighlighter1_605_2335_Open_Text.style.display='none'; Codehighlighter1_605_2335_Closed_Image.style.display='inline'; Codehighlighter1_605_2335_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_605_2335_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_605_2335_Closed_Text.style.display='none'; Codehighlighter1_605_2335_Open_Image.style.display='inline'; Codehighlighter1_605_2335_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000">&nbsp;DbConnect&nbsp;</SPAN><SPAN id=Codehighlighter1_605_2335_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_605_2335_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;Connection&nbsp;conn;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">private</SPAN><SPAN style="COLOR: #000000">&nbsp;Statement&nbsp;stmt;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">private</SPAN><SPAN style="COLOR: #000000">&nbsp;PreparedStatement&nbsp;pstmt;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">private</SPAN><SPAN style="COLOR: #000000">&nbsp;String&nbsp;dburl</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">jdbc:oracle:thin:@192.168.41.16:1521:cc</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">private</SPAN><SPAN style="COLOR: #000000">&nbsp;String&nbsp;user</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">cc</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">private</SPAN><SPAN style="COLOR: #000000">&nbsp;String&nbsp;password</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">123456</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">private</SPAN><SPAN style="COLOR: #000000">&nbsp;String&nbsp;driver</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">oracle.jdbc.driver.OracleDriver</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;DbConnect()&nbsp;throws&nbsp;Exception<BR><IMG id=Codehighlighter1_924_1112_Open_Image onclick="this.style.display='none'; Codehighlighter1_924_1112_Open_Text.style.display='none'; Codehighlighter1_924_1112_Closed_Image.style.display='inline'; Codehighlighter1_924_1112_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_924_1112_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_924_1112_Closed_Text.style.display='none'; Codehighlighter1_924_1112_Open_Image.style.display='inline'; Codehighlighter1_924_1112_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_924_1112_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_924_1112_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Class.forName(driver);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">DriverManager.getConnection(dburl,user,password);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stmt&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;Connection&nbsp;getConnection()<BR><IMG id=Codehighlighter1_1152_1171_Open_Image onclick="this.style.display='none'; Codehighlighter1_1152_1171_Open_Text.style.display='none'; Codehighlighter1_1152_1171_Closed_Image.style.display='inline'; Codehighlighter1_1152_1171_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_1152_1171_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1152_1171_Closed_Text.style.display='none'; Codehighlighter1_1152_1171_Open_Image.style.display='inline'; Codehighlighter1_1152_1171_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_1152_1171_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_1152_1171_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000">&nbsp;conn;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;List&nbsp;getEmpNameList()&nbsp;throws&nbsp;Exception&nbsp;<BR><IMG id=Codehighlighter1_1230_1945_Open_Image onclick="this.style.display='none'; Codehighlighter1_1230_1945_Open_Text.style.display='none'; Codehighlighter1_1230_1945_Closed_Image.style.display='inline'; Codehighlighter1_1230_1945_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_1230_1945_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1230_1945_Closed_Text.style.display='none'; Codehighlighter1_1230_1945_Open_Image.style.display='inline'; Codehighlighter1_1230_1945_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_1230_1945_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_1230_1945_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;sql</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">select&nbsp;*&nbsp;from&nbsp;cus_emp_basic&nbsp;where&nbsp;rownum&lt;10</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Connection&nbsp;conn</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #0000ff">null</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Statement&nbsp;stmt</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #0000ff">null</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ResultSet&nbsp;rst</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #0000ff">null</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ArrayList&nbsp;resultlist&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;ArrayList();<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">try</SPAN><SPAN style="COLOR: #000000"><BR><IMG id=Codehighlighter1_1439_1768_Open_Image onclick="this.style.display='none'; Codehighlighter1_1439_1768_Open_Text.style.display='none'; Codehighlighter1_1439_1768_Closed_Image.style.display='inline'; Codehighlighter1_1439_1768_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_1439_1768_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1439_1768_Closed_Text.style.display='none'; Codehighlighter1_1439_1768_Open_Image.style.display='inline'; Codehighlighter1_1439_1768_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_1439_1768_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_1439_1768_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rst</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">(</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;DbConnect()).stmt.executeQuery(sql);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">while</SPAN><SPAN style="COLOR: #000000">&nbsp;(rst.next())<BR><IMG id=Codehighlighter1_1558_1760_Open_Image onclick="this.style.display='none'; Codehighlighter1_1558_1760_Open_Text.style.display='none'; Codehighlighter1_1558_1760_Closed_Image.style.display='inline'; Codehighlighter1_1558_1760_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_1558_1760_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1558_1760_Closed_Text.style.display='none'; Codehighlighter1_1558_1760_Open_Image.style.display='inline'; Codehighlighter1_1558_1760_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_1558_1760_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_1558_1760_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Person&nbsp;person&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;Person();<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;person.setEmpNo(rst.getString(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">emp_no</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">));<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;person.setEmpName(rst.getString(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">emp_name</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">));<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;resultlist.add(person);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #0000ff">finally</SPAN><SPAN style="COLOR: #000000"><BR><IMG id=Codehighlighter1_1783_1894_Open_Image onclick="this.style.display='none'; Codehighlighter1_1783_1894_Open_Text.style.display='none'; Codehighlighter1_1783_1894_Closed_Image.style.display='inline'; Codehighlighter1_1783_1894_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_1783_1894_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1783_1894_Closed_Text.style.display='none'; Codehighlighter1_1783_1894_Open_Image.style.display='inline'; Codehighlighter1_1783_1894_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_1783_1894_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_1783_1894_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">(rst</SPAN><SPAN style="COLOR: #000000">!=</SPAN><SPAN style="COLOR: #0000ff">null</SPAN><SPAN style="COLOR: #000000">)rst.close();<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">(stmt</SPAN><SPAN style="COLOR: #000000">!=</SPAN><SPAN style="COLOR: #0000ff">null</SPAN><SPAN style="COLOR: #000000">)stmt.close();<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">(conn</SPAN><SPAN style="COLOR: #000000">!=</SPAN><SPAN style="COLOR: #0000ff">null</SPAN><SPAN style="COLOR: #000000">)conn.close();<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000">&nbsp;resultlist;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">static</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;main(String&nbsp;[]args)&nbsp;throws&nbsp;Exception<BR><IMG id=Codehighlighter1_2013_2332_Open_Image onclick="this.style.display='none'; Codehighlighter1_2013_2332_Open_Text.style.display='none'; Codehighlighter1_2013_2332_Closed_Image.style.display='inline'; Codehighlighter1_2013_2332_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_2013_2332_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_2013_2332_Closed_Text.style.display='none'; Codehighlighter1_2013_2332_Open_Image.style.display='inline'; Codehighlighter1_2013_2332_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_2013_2332_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_2013_2332_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DbConnect&nbsp;dbc&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;DbConnect();<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&nbsp;l1</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">(dbc.getEmpNameList());<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">for</SPAN><SPAN style="COLOR: #000000">(</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;i</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">l1.size();i</SPAN><SPAN style="COLOR: #000000">++</SPAN><SPAN style="COLOR: #000000">)<BR><IMG id=Codehighlighter1_2144_2309_Open_Image onclick="this.style.display='none'; Codehighlighter1_2144_2309_Open_Text.style.display='none'; Codehighlighter1_2144_2309_Closed_Image.style.display='inline'; Codehighlighter1_2144_2309_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_2144_2309_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_2144_2309_Closed_Text.style.display='none'; Codehighlighter1_2144_2309_Open_Image.style.display='inline'; Codehighlighter1_2144_2309_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_2144_2309_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_2144_2309_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Person&nbsp;person1</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">(Person)l1.</SPAN><SPAN style="COLOR: #0000ff">get</SPAN><SPAN style="COLOR: #000000">(i);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.</SPAN><SPAN style="COLOR: #0000ff">out</SPAN><SPAN style="COLOR: #000000">.println(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">person</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000">i</SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000">person1.getEmpName()</SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">empno=</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000">person1.getEmpNo());<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;}</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/ExpandedBlockEnd.gif" align=top>}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN></DIV></DIV><img src ="http://www.blogjava.net/faintbear/aggbug/2183.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/faintbear/" target="_blank">小力力力</a> 2005-03-17 23:19 <a href="http://www.blogjava.net/faintbear/archive/2005/03/17/2183.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于集合框架的思考 (转)</title><link>http://www.blogjava.net/faintbear/archive/2005/03/16/2125.html</link><dc:creator>小力力力</dc:creator><author>小力力力</author><pubDate>Wed, 16 Mar 2005 03:53:00 GMT</pubDate><guid>http://www.blogjava.net/faintbear/archive/2005/03/16/2125.html</guid><wfw:comment>http://www.blogjava.net/faintbear/comments/2125.html</wfw:comment><comments>http://www.blogjava.net/faintbear/archive/2005/03/16/2125.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/faintbear/comments/commentRss/2125.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/faintbear/services/trackbacks/2125.html</trackback:ping><description><![CDATA[<DIV class=postTitle><A id=viewpost.ascx_TitleUrl href="http://blog.csdn.net/jungleford/archive/2004/12/06/205761.aspx">关于集合框架的思考</A> </DIV>
<DIV class=postText><FONT size=2><STRONG><U><FONT color=#cc0000><SPAN class=style4><FONT size=3>jungleford如是说<BR></FONT></SPAN><BR></FONT></U></STRONG>&nbsp;&nbsp;&nbsp;&nbsp;对于Java集合框架（Java Collections Framework，JCF），Java玩家大概都不会陌生，在C++里面相似的概念是标准模板库（Standard Template Library，STL），主要是对一些数据结构和相关算法的封装。考虑到这是一个Java初学者将会经常接触的工具，所以有了以下的一些文字。主要是参考了<A href="http://www-900.ibm.com/developerWorks/cn/cnedu.nsf/java-onlinecourse-bytitle/4475AC55462B0B9448256B3B001F279A?OpenDocument" target=_blank>IBM developerWorks上的一篇教程</A>，它可能解释得更加清晰，这里算是浓缩了一下吧，真正的来龙去脉可以看看JDK文档里的“<A href="http://java.sun.com/j2se/1.4.2/docs/guide/collections/index.html" target=_blank>The Collections Framework</A>”，说明更为详细。 
<P><STRONG><U><FONT color=#cc0000><SPAN class=style4><FONT size=3>问题的源头</FONT></SPAN><BR></FONT></U></STRONG></P>
<UL>
<LI><STRONG>集合：对象的容器与数据结构</STRONG></LI></UL>&nbsp;&nbsp;&nbsp;&nbsp;回忆一下我们在程序设计里头可能会面对一些什么，无非是两类：基本类型和复合类型，后者常见的组织方式就是类。和基本类型不同，类对象通常是需要以动态方式分配的，譬如在内存的堆空间里new一个对象，这个我们一写OO的程序就必然会用到。同时我们面对的不仅仅是单个的基本类型或对象，对多个这样的数据我们通常采用的组织方式是什么？不错，是数组，这是伴随程序设计的一个古老概念。数组的优点显而易见，像根据下标检索元素这样的操作不费吹灰之力，但缺点也很明显：空间固定而不能动态增长（像Java这样的强类型语言对数组越界是及其敏感的），插入或删除元素比较费劲。因此数组不是解决一切集合问题的方便工具。我们可能需要一些新的工具，研究这些工具常常就是研究<SPAN class=style5><FONT color=#cc0000>数据结构</FONT></SPAN>，特别的，数组本身就是一种线性有序的数据结构。<BR>&nbsp;&nbsp;&nbsp;&nbsp;数据结构的数学基础是<SPAN class=style5><FONT color=#cc0000>集合论</FONT></SPAN>，为什么这么说呢？上面说过，现在我们要研究的不是单个的基本类型或对象，多个对象的整体不就是集合吗？从OO的角度上看，集合也是一种对象，但它是一种特殊的对象：对象的容器（注意，我们这里没有继续讨论基本类型的集合，因为基本类型和存储分配方式与对象有着本质的差别）。集合论的一个根本问题就是：给定一个元素，集合必须能够回答该元素是或者不是属于这个集合。还有一个问题也很重要，就是：如果元素是属于一个集合，那该元素在集合中的地位应该是唯一的，或者说它是<SPAN class=style5><FONT color=#cc0000>唯一确定</FONT></SPAN>的。当然还有其它问题，譬如查找、遍历、排序等等，这和具体的集合类型相关，后面将会讲到。 
<UL>
<LI><STRONG>无序集、有序集、映射</STRONG></LI></UL>&nbsp;&nbsp;&nbsp;&nbsp;谈到集合的类型，我们在高中所学的集合概念是其中的一种，叫做“<SPAN class=style5><FONT color=#cc0000>无序集</FONT></SPAN>”，也就是说集合的各个元素都是平等的，没有先后的区别，于是在无序集当中就决不允许出现一模一样的元素，否则当取到这个元素的时候就不知道应该取哪一个，这就违反了上面的“唯一确定”原则。<BR>&nbsp;&nbsp;&nbsp;&nbsp;等到我们上了大学，开始知道了另一种集合类型，叫做“<SPAN class=style5><FONT color=#cc0000>有序集</FONT></SPAN>”（或者叫“线性表”，区别于以后碰到的像“树”，“图”这样的非线性的数据结构），如果是计算机专业的，大概学过离散数学当中的“代数结构”，那你就更清楚的知道，“有序集”其实是一种“二元关系”，确切的说是“偏序关系”，它是可以包含相同元素的，因为两个的相同元素的“序号”可以不同，这样根据“序号”仍可以“唯一确定”一个元素，数组就是一种有序集，有序集的另一个特点就是任意两个元素可以确定他们的顺序。<BR>&nbsp;&nbsp;&nbsp;&nbsp;无序集，有序集，难道还有第三种可能？呵呵，它还是出现在我们的高中代数课本里，叫做“<SPAN class=style5><FONT color=#cc0000>映射</FONT></SPAN>”。映射也是集合？其实自从康托尔以来，集合论就认为“万物皆集合”（但也就是这个断言导致了集合论以后的尴尬境地，有兴趣可以看看罗素或哥德尔的一些结论，或<A href="http://www.google.com/" target=_blank>google</A>“集合论 悖论”）。映射其实是一种“元素对”的集合，就像<SPAN class=style6><FONT style="BACKGROUND-COLOR: #cccccc">f(a)=b, f(c)=d, ...</FONT></SPAN>等效于集合（无序集）<SPAN class=style6><FONT style="BACKGROUND-COLOR: #cccccc">{(a, b), (c, d), ...}</FONT></SPAN>，在“映射”中可以看作是(原象, 象)的集合，换一种说法就是(关键字key, 值value)的集合。所以我们可以在笛卡儿正交坐标平面上画出漂亮的函数图像，因为在集合论看来，函数（映射）就是二维平面上的一个个点，明白了？这样一来上面的“有序集”也好理解了，偏序关系<SPAN class=style6><FONT style="BACKGROUND-COLOR: #cccccc">a&gt;b&gt;c&gt;d&gt;...</FONT></SPAN>（不知道“偏序关系”就把它们看作是数组<SPAN class=style6><FONT style="BACKGROUND-COLOR: #cccccc">x[1]=a, x[2]=b, x[3]=c, x[4]=d ...</FONT></SPAN>好了）等效于无序集<SPAN class=style6><FONT style="BACKGROUND-COLOR: #cccccc">{(1, a), (2, b), (3, c), (4, d), ...}</FONT></SPAN>，于是乎，所有的集合都等效于无序集！所以高中只教了我们一种集合，呵呵…… 
<P>
<P><FONT size=-1><STRONG><U><FONT color=#cc0000><SPAN class=style4><FONT size=3>JCF的全家福<BR></FONT></SPAN><BR></FONT></U></STRONG>&nbsp;&nbsp;&nbsp;&nbsp;好啦好啦，这些我们都知道，又不是在上数学课，说了这么多废话，怎么还没扯到正题上来？JCF的影子我还没看见呢！列位看官别急，这就给您道来。其实上面的概念对理解JCF非常重要。<BR>&nbsp;&nbsp;&nbsp;&nbsp;JCF是个颇有点规模的家族，看看它的类层次关系图就知道了，下面这张图（图1）摘自著名的<A href="http://www.mindview.net/Books/TIJ/" target=_blank>Thinking in Java</A>：<BR><A name=fig1></A><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 图1 JCF层次结构<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;哇，这么多接口和类，真有点让人无从下手的感觉。其实我们真正需要记住的只是这么一个超超easy的结构（图2）：<BR><BR><A name=fig2></A><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;图2<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;这张图看起来舒服多了吧？但它又能说明什么问题呢？它怎么就能够把握整个JCF呢？我们把<A href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/Collection.html" target=_blank>Collection</A>接口置于最顶上，意思是想说：Collection其实是整个JCF家族中的“祖宗”，几乎所有的JCF成员都源自该接口，或者和它有密切的关系，Collection提供关于集合的一些通用操作的接口，包括插入（<A href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/Collection.html#add(java.lang.Object)" target=_blank>add</A>()方法）、删除（<A href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/Collection.html#remove(java.lang.Object)" target=_blank>remove</A>()方法）、判断一个元素是不是其成员（<A href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/Collection.html#contains(java.lang.Object)" target=_blank>contains</A>()方法）、遍历（<A href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/Collection.html#iterator()" target=_blank>iterator</A>()方法）等等。注意了，前面的“废话”在这里将得到体现：<A href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/Set.html" target=_blank>Set</A>接口体现的是“无序集”的概念，它是不允许有重复元素出现的；<A href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/List.html" target=_blank>List</A>接口代表“有序集”；而<A href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/Map.html" target=_blank>Map</A>接口则是“映射”（在早期的Java版本中并不叫Map，我们在后面会看到），其实<A href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/Map.Entry.html" target=_blank>Map.Entry</A>接口就是代表一个“元素对”我们可以通过Map的<A href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/Map.html#entrySet()" target=_blank>entrySet</A>()方法得到这样一个由“元素对”组成的Set对象。我们注意到Set和List都是从“祖宗”Collection派生的，而Map不是，毕竟对一对元素的操作与对单个元素的操作还是有区别的，但是如果你仔细对照一下Collection和Map的源代码，以及它们的直接后代<A href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/AbstractCollection.html" target=_blank>AbstractCollection</A>和<A href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/AbstractMap.html" target=_blank>AbstractMap</A>的源代码，你将会发现很多相似的地方，所以我们仍然可以把Map看成是和Collection有着血缘关系的接口，而和Set，List一起处于并列的位置。<BR>&nbsp;&nbsp;&nbsp;&nbsp;有了“无序集”，“有序集”和“映射”，我们就可以定义各种各样的抽象数据结构了，譬如图1所示的向量，链表，堆栈，哈希表，平衡二叉树等。但我们需要记住的，仅仅是图2，置于其它的成员，在用到的时候查一下API手册不就行了？不过一般初学者还是比较容易用到一些类，像Vector、ArrayList、HashMap，我在这里列了一张表，显示了常见的JCF成员及其关系： </FONT>
<TABLE cellSpacing=0 cellPadding=0 border=1>
<TBODY>
<TR>
<TD vAlign=top width=484 colSpan=5>
<P align=center>集合框架的祖宗： <A href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/Collection.html" target=_blank>Collection</A> </P></TD>
<TD vAlign=top width=118>
<P align=center>历史集合 </P></TD>
<TD vAlign=top width=398 colSpan=4>
<P align=center>新集合 </P></TD></TR>
<TR>
<TD vAlign=top width=195 colSpan=2>
<P align=center>无序集： <A href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/Set.html" target=_blank>Set</A> </P></TD>
<TD vAlign=top width=289 colSpan=3>
<P align=center>有序集： <A href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/List.html" target=_blank>List</A> </P></TD>
<TD vAlign=top width=118>
<P align=center>映射：<A href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/Dictionary.html" target=_blank>Dictionary</A> </P></TD>
<TD vAlign=top width=398 colSpan=4>
<P align=center>映射：<A href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/Map.html" target=_blank>Map</A> </P></TD></TR>
<TR>
<TD vAlign=top width=101 rowSpan=2>
<P align=center><A href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/AbstractSet.html" target=_blank>AbstractSet</A> </P></TD>
<TD vAlign=top width=94 rowSpan=2>
<P align=center><A href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/SortedSet.html" target=_blank>SortedSet</A> </P></TD>
<TD vAlign=top width=147 colSpan=2>
<P align=center><A href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/AbstractList.html" target=_blank>AbstractList</A> </P></TD>
<TD vAlign=top width=143>
<P align=center><A href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/AbstractSequentialList.html" target=_blank>AbstractSequentialList</A> </P></TD>
<TD vAlign=top width=118 rowSpan=3>
<P align=center><BR><BR><BR><A href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/Hashtable.html" target=_blank>Hashtable</A> </P></TD>
<TD vAlign=top width=321 colSpan=3>
<P align=center><A href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/AbstractMap.html" target=_blank>AbstractMap</A> </P></TD>
<TD vAlign=top width=77>
<P align=center><A href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/SortedMap.html" target=_blank>SortedMap</A> </P></TD></TR>
<TR>
<TD vAlign=top width=78>
<P align=center>历史集合 </P></TD>
<TD vAlign=top width=69>
<P align=center>新集合 </P></TD>
<TD vAlign=top width=143 rowSpan=2>
<P align=center><BR><BR><A href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/LinkedList.html" target=_blank>LinkedList</A> </P></TD>
<TD vAlign=top width=100 rowSpan=2>
<P align=center><BR><BR><A href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/WeakHashMap.html" target=_blank>WeakHashMap</A> </P></TD>
<TD vAlign=top width=112 rowSpan=2>
<P align=center><BR><BR><A href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/IdentityHashMap.html" target=_blank>IdentityHashMap</A> </P></TD>
<TD vAlign=top width=109 rowSpan=2>
<P align=center><BR><BR><A href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/HashMap.html" target=_blank>HashMap</A> </P></TD>
<TD vAlign=top width=77 rowSpan=2>
<P align=center><BR><BR><A href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/TreeMap.html" target=_blank>TreeMap</A> </P></TD></TR>
<TR>
<TD vAlign=top width=101>
<P align=center><A href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/HashSet.html" target=_blank>HashSet</A> </P></TD>
<TD vAlign=top width=94>
<P align=center><A href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/TreeSet.html" target=_blank>TreeSet</A> </P></TD>
<TD vAlign=top width=78>
<P align=center><A href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/Vector.html" target=_blank>Vector</A> </P></TD>
<TD vAlign=top width=69>
<P align=center><A href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/ArrayList.html" target=_blank>ArrayList</A> </P></TD></TR>
<TR>
<TD vAlign=top width=101>
<P align=center><A href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/LinkedHashSet.html" target=_blank>LinkedHashSet</A> </P></TD>
<TD vAlign=top width=94>&nbsp;</TD>
<TD vAlign=top width=78>
<P align=center><A href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/Stack.html" target=_blank>Stack</A> </P></TD>
<TD vAlign=top width=69>&nbsp;</TD>
<TD vAlign=top width=143>&nbsp;</TD>
<TD vAlign=top width=118>
<P align=center><A href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/Properties.html" target=_blank>Properties</A> </P></TD>
<TD vAlign=top width=100>&nbsp;</TD>
<TD vAlign=top width=112>&nbsp;</TD>
<TD vAlign=top width=109>
<P align=center><A href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/LinkedHashMap.html" target=_blank>LinkedHashMap</A> </P></TD>
<TD vAlign=top width=77>&nbsp;</TD></TR></TBODY></TABLE><FONT size=-1><BR>&nbsp;&nbsp;&nbsp;&nbsp;可能有的概念您还不是太了解，譬如什么叫“历史集合”，Hashtable、HashMap、TreeMap三者之间有什么区别和联系，怎样实现对一个特定集合的快速遍历、元素查找或者排序，没关系，我们在下面将逐一进行研究。 </FONT></P>
<P><STRONG><U><FONT color=#cc0000><FONT size=3><SPAN class=style4>细节考虑：目标与效率<BR></SPAN><BR></FONT></FONT></U></STRONG>&nbsp;&nbsp;&nbsp;&nbsp;有了JCF的层次还不够，重要的是对集合所容纳的对象的具体操作，以前我们学数据结构的时候可能老师总会让你计算一个算法的时间复杂度，可能你会对这个O(f(n))很不耐烦，但事实上算法效率是一个重要的因素。</P>
<UL><STRONG>1. 侧重点：遍历 vs. 查找</STRONG></UL>
<P>&nbsp;&nbsp;&nbsp;&nbsp;对集合的有两个主要的应用：我需要知道集合有哪些元素；根据条件找到一个特定的元素。在算法上通常称为“遍历”和“查找”。不要以为我们生活中不常用哦！譬如CCTV的“幸运52”里面，李咏让参赛者报出一款PDA的准确价位，他会怎么做？“2000”“高了”“1000”“低了”“1500”“低了”……直到答对为止。可能有很多人都会选择这个策略，无论他是不是计算机专业出身的，也不知道他是不是了解“数据结构”和“折半查找”，更不用说他是不是知道还有比在无初始代价下O(log n)的时间复杂度更快的算法了，但我们经常会自然而然地用这样的方法，这和一个人的行业无关，除非这个人的rp超强，呵呵……<BR>&nbsp;&nbsp;&nbsp;&nbsp;又讲了一堆题外话了，遍历和修改似乎是一对矛盾，一个可以高效率插入删除元素的数据结构通常遍历的性能并不是最优。于是JCF在这里根据用户的目标实现了两种定制的数据结构：哈希表（包括HashSet和HashMap）和平衡二叉树（包括TreeSet和TreeMap）。由于可排序性是一种独特的要求，所以引入了SortedSet和SortedMap，它们分别是AbstractSet和AbstractMap的子接口，而TreeSet和TreeMap又分别是他们的一种实现。熟悉数据结构的人可能比较了解，哈希表在进行插入、删除、查找这样的操作是很快的，其时间复杂度是常数级O(1)；平衡二叉树虽然插入、删除操作比较麻烦（需要O(log n)的代价），但进行遍历和排序却很快。选择完全在于用户的侧重点，但由于类型转换的方便性，通常我们用哈希表构造一个集合以后，再把它转换成相应的树集进行遍历，以获得较好的效果。<FONT size=3> <BR>
<TABLE cellSpacing=0 cellPadding=5 bgColor=#cccccc border=1>
<TBODY>
<TR>
<TD><FONT size=-1><SPAN class=style7><STRONG><FONT color=#990000>Set</FONT></STRONG></SPAN> set1 = <SPAN class=style12><STRONG><FONT color=#ff0000>new</FONT></STRONG></SPAN> <SPAN class=style7><STRONG><FONT color=#990000>HashSet</FONT></STRONG></SPAN>();<BR>set1.add(elem1);<FONT color=#006600><SPAN class=style10>// 通过插入元素构造集合</SPAN><BR></FONT>set1.add(elem2);<BR>set1.add(elem3);<BR><SPAN class=style7><STRONG><FONT color=#990000>Set</FONT></STRONG></SPAN> set2 = <SPAN class=style12><STRONG><FONT color=#ff0000>new</FONT></STRONG></SPAN> <SPAN class=style7><STRONG><FONT color=#990000>TreeSet</FONT></STRONG></SPAN>(set);<BR><SPAN class=style7><STRONG><FONT color=#990000>Iterator</FONT></STRONG></SPAN> all = set2.iterator();<BR><SPAN class=style12><STRONG><FONT color=#ff0000>while</FONT></STRONG></SPAN> (all.hasNext())<BR>{<FONT color=#006600><SPAN class=style10>// 遍历集合</SPAN><BR></FONT>all.next();<BR>...<BR>}</FONT></TD></TR></TBODY></TABLE></FONT><BR></P>
<UL><STRONG>2. 历史实现 vs. 新实现</STRONG></UL>&nbsp;&nbsp;&nbsp;&nbsp;历史实现（Legacy Implementations）是JCF的一个术语，准确的意义不是很清楚，但大致可以认为在Java 2（JDK 1.2）出现以前的老版本中JCF的一个雏形框架。在Java 2以后，JCF才开始完善健壮起来，新实现中出现了一些新的类用于替代老版本中的成员，但由于种种原因，老版本中很多类都代表了传统数据结构的精髓部分，以及一些安全原因，所以仍然被我们使用着。<BR><BR><A href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/Enumeration.html" target=_blank>Enumeration</A> vs. <A href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/Iterator.html" target=_blank>Iterator</A><BR>&nbsp;&nbsp;&nbsp;&nbsp;Enumeration是一个传统的集合遍历工具，在新的JCF中使用的是Iterator，Iterator同样具有遍历功能，还包含一个<A href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/Iterator.html#remove()" target=_blank>remove</A>()方法来删除当前得到的元素。<BR><BR><A href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/Dictionary.html" target=_blank>Dictionary</A> vs. <A href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/Map.html" target=_blank>Map</A><BR>&nbsp;&nbsp;&nbsp;&nbsp;Dictionary是一个现在已经被标记为deprecated的类，实现了老版本中的映射功能，现在已经完全被Map取代。它们的区别是：Dictionary中key和value不能为null，但Map却允许空的关键字和值，这一点直接影响到它们的后代：Hashtable和HashMap。<BR><BR><A href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/Vector.html" target=_blank>Vector</A> vs. <A href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/ArrayList.html" target=_blank>ArrayList</A><BR>&nbsp;&nbsp;&nbsp;&nbsp;Vector和ArrayList是数组在JCF中的体现，还记得前面讲过的数组的缺点么？Vector和ArrayList就是一种可以动态增长的数组。Vector是历史实现，它和ArrayList的主要区别在于，Vector是同步集合（或者说是线程安全的），但ArrayList并不是同步的，由于同步需要花一定的代价，所以ArrayList看起来要比Vector的存取访问效率更高。关于同步我们下面还将要谈到。<BR><BR><A href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/Hashtable.html" target=_blank>Hashtable</A> vs. <A href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/HashMap.html" target=_blank>HashMap</A><BR>&nbsp;&nbsp;&nbsp;&nbsp;Hashtable是Dictionary的子类，属于历史实现，而HashMap是Map的子类，是新实现。它们的区别除了上面所说的key和value是否可以为空之外，也有同步的差别，Hashtable是同步的，但HashMap不是。HashMap的一个经典的例子就是JSP的内置对象session。不过不要因为Hashtable是“老前辈”而瞧不起它哦，它的一个著名的子类<A href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/Properties.html" target=_blank>Properties</A>我们可是经常会用到的。 
<UL><STRONG>3. 同步 vs. 不同步</STRONG></UL>&nbsp;&nbsp;&nbsp;&nbsp;从上面的描述中我们似乎可以得出这么一个印象：历史实现好像都是同步的，但新实现中却没有。需要同步操作的理由是，可能存在多个线程对同一个集合进行操作的情况：譬如一个线程正在对某集合进行遍历，但与此同时，另一个线程又在对该集合进行插入或删除，那么第一个线程的遍历结果将是不可预测的，对于同步集合，它将会抛出一个<A href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/ConcurrentModificationException.html" target=_blank>ConcurrentModificationException</A>异常，JCF把这种机制成为“fail-fast”。我们对比一下Vector和ArrayList的源代码就可以发现Vector的很多方法都是有synchronized关键字修饰的，但ArrayList没有。 
<UL><STRONG>4. 容易遗忘的工具：</STRONG><A href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/Collections.html" target=_blank><STRONG>Collections</STRONG></A><STRONG>和</STRONG><A href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/Arrays.html" target=_blank><STRONG>Arrays</STRONG></A> </UL>&nbsp;&nbsp;&nbsp;&nbsp;在图1中右下角落里有两个类叫做Collections（注意，不是Collection！）和Arrays，这是JCF里面功能强大的工具，但初学者往往会忽视。按JCF文档的说法，这两个类提供了封装器实现（Wrapper Implementations）、数据结构算法和数组相关的应用。<BR>&nbsp;&nbsp;&nbsp;&nbsp;想必大家不会忘记上面谈到的“折半查找”、“排序”等经典算法吧，Collections类提供了丰富的静态方法帮助我们轻松完成这些在数据结构课上烦人的工作：<BR><BR><A href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/Collections.html#binarySearch(java.util.List,%20java.lang.Object)" target=_blank>binarySearch</A>：折半查找。<BR><A href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/Collections.html#sort(java.util.List)" target=_blank>sort</A>：排序，这里是一种类似于快速排序的方法，效率仍然是O(n * log n)，但却是一种稳定的排序方法。<BR><A href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/Collections.html#reverse(java.util.List)" target=_blank>reverse</A>：将线性表进行逆序操作，这个可是从前数据结构的经典考题哦！<BR><A href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/Collections.html#rotate(java.util.List,%20int)" target=_blank>rotate</A>：以某个元素为轴心将线性表“旋转”——哇，这个功能太酷了！<BR><A href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/Collections.html#swap(java.util.List,%20int,%20int)" target=_blank>swap</A>：交换一个线性表中两个元素的位置。<BR>……<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;Collections还有一个重要功能就是“封装器”（Wrapper），它提供了一些方法可以把一个集合转换成一个特殊的集合：<BR><BR>unmodifiableXXX：转换成只读集合，这里XXX代表六种基本集合接口：Collection、List、Map、Set、SortedMap和SortedSet。如果你对只读集合进行插入删除操作，将会抛出<A href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/UnsupportedOperationException.html" target=_blank>UnsupportedOperationException</A>异常。<BR>synchronizedXXX：转换成同步集合。<BR><A href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/Collections.html#singleton(java.lang.Object)" target=_blank>singleton</A>：创建一个仅有一个元素的集合，这里singleton生成的是单元素Set，<A href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/Collections.html#singletonList(java.lang.Object)" target=_blank>singletonList</A>和<A href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/Collections.html#singletonMap(java.lang.Object,%20java.lang.Object)" target=_blank>singletonMap</A>分别生成单元素的List和Map。<BR>空集：由Collections的静态属性<A href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/Collections.html#EMPTY_SET" target=_blank>EMPTY_SET</A>、<A href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/Collections.html#EMPTY_LIST" target=_blank>EMPTY_LIST</A>和<A href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/Collections.html#EMPTY_MAP" target=_blank>EMPTY_MAP</A>表示。<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;此外，我们知道把集合转换成对象数组可以用Collection的<A href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/Collection.html#toArray()" target=_blank>toArray</A>()方法，我们也可以方便地把一个对象数组转换成一个线性表（可不要告诉我你是一个一个地add哦）：Arrays.<A href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/Arrays.html#asList(java.lang.Object%5B%5D)" target=_blank>asList</A>()。 
<UL><STRONG>5. 泛型</STRONG></UL>&nbsp;&nbsp;&nbsp;&nbsp;目前我们了解的JCF的一个重要特征是：所有加入到集合当中的对象都将在表面上失去它们自己的特性，而看上去仅仅只是一个Object对象而已，除非你把它强制类型转换成它们原来的对象。这一点很自然，集合嘛，对象的容器，它容纳的是各种各样的对象，而不仅仅是某种特定类型的对象。J2SE 5.0出现以后，JCF开始引入泛型的特性，譬如我们经常碰到这样的应用，就是把集合转换成特定的数组，虽然Collection有toArray()的方法，但可惜的是，这个数组的所有元素都是Object类型的，我们通常的做法是用一个for循环把数组的每个元素都进行强制类型转换，虽然可行，但看上去很笨拙，如果有了泛型，我们就可以预先指定要得到的类型，然后一次toArray就可以得到我们期望的数组，里面的元素全部都是指定类型了。惭愧的是，我对5.0还不是太了解，具体可以参考<A href="http://java.sun.com/j2se/1.5.0/docs/guide/collections/index.html" target=_blank>J2SE 5.0的JCF文档</A>。 
<P>
<P><STRONG><U><FONT color=#cc0000><SPAN class=style4><FONT size=3>小结<BR></FONT></SPAN><BR></FONT></U></STRONG>&nbsp;&nbsp;&nbsp;&nbsp;我这里走马观花一样把JCF的一些主要概念罗嗦了一下，Java的老手们可能比较厌烦，新手们可能更觉得像回顾了一下高中的数学课和大学的数据结构，呵呵。这只是一个小小的例子，可见基础知识对现实当中的应用还是蛮有指导意义的。大师们看数学，觉得那是很唯美很艺术的一样东西，西方一直都把数学区别于其它自然科学，而认为它更靠近于哲学，像我等这样整天还在为找工作烦得要死的俗人还是没法入道啊，sigh……<BR><STRONG><U><FONT color=#cc0000><BR>参考资料</FONT></U></STRONG></P>
<P class=style4>
<UL>
<LI><FONT size=-1>IBM developerWorks教程：<A href="http://www-900.ibm.com/developerWorks/cn/cnedu.nsf/java-onlinecourse-bytitle/4475AC55462B0B9448256B3B001F279A?OpenDocument" target=_blank> Java 集合框架</A></FONT> 
<LI><FONT size=-1>J2SE Documentation: </FONT><A href="http://java.sun.com/j2se/1.4.2/docs/guide/collections/index.html" target=_blank>The Collections Framework </A>
<LI><A href="http://java.sun.com/docs/books/tutorial/collections/index.html" target=_blank>The J<FONT size=-1>ava Tutorial</FONT></A> 
<LI><FONT size=-1><A href="http://java.sun.com/j2se/1.4.2/docs/guide/collections/reference.html" target=_blank>JCF API</A></FONT></LI></UL></FONT></DIV><img src ="http://www.blogjava.net/faintbear/aggbug/2125.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/faintbear/" target="_blank">小力力力</a> 2005-03-16 11:53 <a href="http://www.blogjava.net/faintbear/archive/2005/03/16/2125.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA相关基础知识</title><link>http://www.blogjava.net/faintbear/archive/2005/03/16/2122.html</link><dc:creator>小力力力</dc:creator><author>小力力力</author><pubDate>Wed, 16 Mar 2005 02:54:00 GMT</pubDate><guid>http://www.blogjava.net/faintbear/archive/2005/03/16/2122.html</guid><wfw:comment>http://www.blogjava.net/faintbear/comments/2122.html</wfw:comment><comments>http://www.blogjava.net/faintbear/archive/2005/03/16/2122.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/faintbear/comments/commentRss/2122.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/faintbear/services/trackbacks/2122.html</trackback:ping><description><![CDATA[<P><FONT size=2><SPAN id=ArticleContent1_ArticleContent1_lblContent>JAVA相关基础知识<BR>1、面向对象的特征有哪些方面&nbsp;&nbsp; <BR>1.抽象：<BR>抽象就是忽略一个主题中与当前目标无关的那些方面，以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题，而只是选择其中的一部分，暂时不用部分细节。抽象包括两个方面，一是过程抽象，二是数据抽象。<BR>2.继承：<BR>继承是一种联结类的层次模型，并且允许和鼓励类的重用，它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生，这个过程称为类继承。新类继承了原始类的特性，新类称为原始类的派生类（子类），而原始类称为新类的基类（父类）。派生类可以从它的基类那里继承方法和实例变量，并且类可以修改或增加新的方法使之更适合特殊的需要。<BR>3.封装：<BR>封装是把过程和数据包围起来，对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念，即现实世界可以被描绘成一系列完全自治、封装的对象，这些对象通过一个受保护的接口访问其他对象。<BR>4. 多态性：<BR>多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势，很好的解决了应用程序函数同名问题。<BR>2、String是最基本的数据类型吗?<BR>基本数据类型包括byte、int、char、long、float、double、boolean和short。<BR>java.lang.String类是final类型的，因此不可以继承这个类、不能修改这个类。为了提高效率节省空间，我们应该用StringBuffer类<BR>3、int 和 Integer 有什么区别<BR>Java 提供两种不同的类型：引用类型和原始类型（或内置类型）。Int是java的原始数据类型，Integer是java为int提供的封装类。Java为每个原始类型提供了封装类。<BR>原始类型封装类<BR>booleanBoolean<BR>charCharacter<BR>byteByte<BR>shortShort<BR>intInteger<BR>longLong<BR>floatFloat<BR>doubleDouble<BR>引用类型和原始类型的行为完全不同，并且它们具有不同的语义。引用类型和原始类型具有不同的特征和用法，它们包括：大小和速度问题，这种类型以哪种类型的数据结构存储，当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为 null，而原始类型实例变量的缺省值与它们的类型有关。<BR>4、String 和StringBuffer的区别<BR>JAVA平台提供了两个类：String和StringBuffer，它们可以储存和操作字符串，即包含多个字符的字符数据。这个String类提供了数值不可改变的字符串。而这个StringBuffer类提供的字符串进行修改。当你知道字符数据要改变的时候你就可以使用StringBuffer。典型地，你可以使用StringBuffers来动态构造字符数据。<BR>5、运行时异常与一般异常有何异同？<BR>异常表示程序运行过程中可能出现的非正常状态，运行时异常表示虚拟机的通常操作中可能遇到的异常，是一种常见运行错误。java编译器要求方法必须声明抛出可能发生的非运行时异常，但是并不要求必须声明抛出未被捕获的运行时异常。<BR>6、说出Servlet的生命周期，并说出Servlet和CGI的区别。<BR>Servlet被服务器实例化后，容器运行其init方法，请求到达时运行其service方法，service方法自动派遣运行与请求对应的doXXX方法（doGet，doPost）等，当服务器决定将实例销毁的时候调用其destroy方法。<BR>与cgi的区别在于servlet处于服务器进程中，它通过多线程方式运行其service方法，一个实例可以服务于多个请求，并且其实例一般不会销毁，而CGI对每个请求都产生新的进程，服务完成后就销毁，所以效率上低于servlet。<BR>7、说出ArrayList,Vector, LinkedList的存储性能和特性<BR>ArrayList和Vector都是使用数组方式存储数据，此数组元素数大于实际存储的数据以便增加和插入元素，它们都允许直接按序号索引元素，但是插入元素要涉及数组元素移动等内存操作，所以索引数据快而插入数据慢，Vector由于使用了synchronized方法（线程安全），通常性能上较ArrayList差，而LinkedList使用双向链表实现存储，按序号索引数据需要进行前向或后向遍历，但是插入数据时只需要记录本项的前后项即可，所以插入速度较快。<BR>8、EJB是基于哪些技术实现的？并说出SessionBean和EntityBean的区别，StatefulBean和StatelessBean的区别。<BR>&nbsp;&nbsp;&nbsp; EJB包括Session Bean、Entity Bean、Message Driven Bean，基于JNDI、RMI、JAT等技术实现。<BR>SessionBean在J2EE应用程序中被用来完成一些服务器端的业务操作，例如访问数据库、调用其他EJB组件。EntityBean被用来代表应用系统中用到的数据。<BR>对于客户机，SessionBean是一种非持久性对象，它实现某些在服务器上运行的业务逻辑。<BR>对于客户机，EntityBean是一种持久性对象，它代表一个存储在持久性存储器中的实体的对象视图，或是一个由现有企业应用程序实现的实体。<BR>Session Bean 还可以再细分为 Stateful Session Bean 与 Stateless Session Bean ，这两种的 Session Bean都可以将系统逻辑放在 method之中执行，不同的是 Stateful Session Bean 可以记录呼叫者的状态，因此通常来说，一个使用者会有一个相对应的 Stateful Session Bean 的实体。Stateless Session Bean 虽然也是逻辑组件，但是他却不负责记录使用者状态，也就是说当使用者呼叫 Stateless Session Bean 的时候，EJB Container 并不会找寻特定的 Stateless Session Bean 的实体来执行这个 method。换言之，很可能数个使用者在执行某个 Stateless Session Bean 的 methods 时，会是同一个 Bean 的 Instance 在执行。从内存方面来看， Stateful Session Bean 与 Stateless Session Bean 比较， Stateful Session Bean 会消耗 J2EE Server 较多的内存，然而 Stateful Session Bean 的优势却在于他可以维持使用者的状态。<BR>9、Collection 和 Collections的区别。 <BR>　　Collection是集合类的上级接口，继承与他的接口主要有Set 和List.<BR>Collections是针对集合类的一个帮助类，他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。<BR>10、&amp;和&amp;&amp;的区别。 <BR>&nbsp;&nbsp;&nbsp; &amp;是位运算符，表示按位与运算，&amp;&amp;是逻辑运算符，表示逻辑与（and）。<BR>11、HashMap和Hashtable的区别。 <BR>&nbsp;&nbsp;&nbsp; HashMap是Hashtable的轻量级实现（非线程安全的实现），他们都完成了Map接口，主要区别在于HashMap允许空（null）键值（key）,由于非线程安全，效率上可能高于Hashtable。<BR>HashMap允许将null作为一个entry的key或者value，而Hashtable不允许。<BR>HashMap把Hashtable的contains方法去掉了，改成containsvalue和containsKey。因为contains方法容易让人引起误解。 <BR>Hashtable继承自Dictionary类，而HashMap是Java1.2引进的Map interface的一个实现。<BR>最大的不同是，Hashtable的方法是Synchronize的，而HashMap不是，在多个线程访问Hashtable时，不需要自己为它的方法实现同步，而HashMap 就必须为之提供外同步。 <BR>Hashtable和HashMap采用的hash/rehash算法都大概一样，所以性能不会有很大的差异。<BR>12、final, finally, finalize的区别。 <BR>　　final 用于声明属性，方法和类，分别表示属性不可变，方法不可覆盖，类不可继承。<BR>finally是异常处理语句结构的一部分，表示总是执行。<BR>finalize是Object类的一个方法，在垃圾收集器执行的时候会调用被回收对象的此方法，可以覆盖此方法提供垃圾收集时的其他资源回收，例如关闭文件等。<BR>13、sleep() 和 wait() 有什么区别? <BR>&nbsp;&nbsp;&nbsp; sleep是线程类（Thread）的方法，导致此线程暂停执行指定时间，给执行机会给其他线程，但是监控状态依然保持，到时后会自动恢复。调用sleep不会释放对象锁。<BR>wait是Object类的方法，对此对象调用wait方法导致本线程放弃对象锁，进入等待此对象的等待锁定池，只有针对此对象发出notify方法（或notifyAll）后本线程才进入对象锁定池准备获得对象锁进入运行状态。<BR>14、Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?<BR>方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现，重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数，我们说该方法被重写 (Overriding)。子类的对象使用这个方法时，将调用子类中的定义，对它而言，父类中的定义如同被"屏蔽"了。如果在一个类中定义了多个同名的方法，它们或有不同的参数个数或有不同的参数类型，则称为方法的重载(Overloading)。Overloaded的方法是可以改变返回值的类型。<BR>15、error和exception有什么区别?<BR>error 表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况。<BR>&nbsp;&nbsp;&nbsp; exception 表示一种设计或实现问题。也就是说，它表示如果程序运行正常，从不会发生的情况。<BR>16、同步和异步有何异同，在什么情况下分别使用他们？举例说明。<BR>如果数据将在线程间共享。例如正在写的数据以后可能被另一个线程读到，或者正在读的数据可能已经被另一个线程写过了，那么这些数据就是共享数据，必须进行同步存取。<BR>当应用程序在对象上调用了一个需要花费很长时间来执行的方法，并且不希望让程序等待方法的返回时，就应该使用异步编程，在很多情况下采用异步途径往往更有效率。<BR>17、abstract class和interface有什么区别?<BR>声明方法的存在而不去实现它的类被叫做抽象类（abstract class），它用于要创建一个体现某些基本行为的类，并为该类声明方法，但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量，其类型是一个抽象类，并让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。Abstract 类的子类为它们父类中的所有抽象方法提供实现，否则它们也是抽象类为。取而代之，在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。<BR>接口（interface）是抽象类的变体。在接口中，所有方法都是抽象的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽象的，没有一个有程序体。接口只可以定义static final成员变量。接口的实现与子类相似，除了该实现类不能从接口定义中继承行为。当类实现特殊接口时，它定义（即将程序体给予）所有这种接口的方法。然后，它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类，它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换，instanceof 运算符可以用来决定某对象的类是否实现了接口。<BR>18、heap和stack有什么区别。<BR>栈是一种线形集合，其添加和删除元素的操作应在同一段完成。栈按照后进先出的方式进行处理。<BR>堆是栈的一个组成元素<BR>19、forward 和redirect的区别<BR>forward是服务器请求资源，服务器直接访问目标地址的URL，把那个URL的响应内容读取过来，然后把这些内容再发给浏览器，浏览器根本不知道服务器发送的内容是从哪儿来的，所以它的地址栏中还是原来的地址。<BR>&nbsp;&nbsp;&nbsp; redirect就是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址，一般来说浏览器会用刚才请求的所有参数重新请求，所以session,request参数都可以获取。 </SPAN><BR></FONT></P><IMG height=384 alt=fish.jpg src="http://www.blogjava.net/images/blogjava_net/faintbear/fish.jpg" width=250 border=0><BR><img src ="http://www.blogjava.net/faintbear/aggbug/2122.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/faintbear/" target="_blank">小力力力</a> 2005-03-16 10:54 <a href="http://www.blogjava.net/faintbear/archive/2005/03/16/2122.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java内存泄露问题分析(转)</title><link>http://www.blogjava.net/faintbear/archive/2005/03/11/1933.html</link><dc:creator>小力力力</dc:creator><author>小力力力</author><pubDate>Fri, 11 Mar 2005 01:35:00 GMT</pubDate><guid>http://www.blogjava.net/faintbear/archive/2005/03/11/1933.html</guid><wfw:comment>http://www.blogjava.net/faintbear/comments/1933.html</wfw:comment><comments>http://www.blogjava.net/faintbear/archive/2005/03/11/1933.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/faintbear/comments/commentRss/1933.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/faintbear/services/trackbacks/1933.html</trackback:ping><description><![CDATA[<FONT color=#212121><FONT color=#000000 size=2>很多人在谈论内存泄露问题，当然对于c/c++来说，这个应该是老掉牙的问题，但是很多Java人员也越来越多得讨论这个问题，我这里写个小结，希望对大家有一定的参考价值。<BR><BR>　　内存泄漏的慨念<BR><BR>　　1.c/c++是程序员自己管理内存，Java内存是由GC自动回收的。<BR><BR>　　我虽然不是很熟悉C++，不过这个应该没有犯常识性错误吧。<BR><BR>　　2.什么是内存泄露?<BR><BR>　　内存泄露是指系统中存在无法回收的内存，有时候会造成内存不足或系统崩溃。<BR><BR>　　在C/C++中分配了内存不释放的情况就是内存泄露。<BR><BR>　　3.Java存在内存泄露<BR><BR>　　我们必须先承认这个，才可以接着讨论。虽然Java存在内存泄露，但是基本上不用很关心它，特别是那些对代码本身就不讲究的就更不要去关心这个了。<BR><BR>　　Java中的内存泄露当然是指：存在无用但是垃圾回收器无法回收的对象。而且即使有内存泄露问题存在，也不一定会表现出来。<BR><BR>　　4.Java中参数都是传值的。<BR><BR>　　对于基本类型，大家基本上没有异议，但是对于引用类型我们也不能有异议。<BR><BR>　　Java内存泄露情况<BR><BR>　　JVM回收算法是很复杂的，我也不知道他们怎么实现的，但是我只知道他们要实现的就是：对于没有被引用的对象是可以回收的。所以你要造成内存泄露就要做到：<BR><BR>　　持有对无用对象的引用!<BR><BR>　　不要以为这个很容易做到，既然无用，你怎么还会持有它的引用? 既然你还持有它，它怎么会是无用的呢?<BR><BR>　　我实在想不到比那个堆栈更经典的例子了,以致于我还要引用别人的例子，下面的例子不是我想到的，是书上看到的，当然如果没有在书上看到，可能过一段时间我自己也想的到，可是那时我说是我自己想到的也没有人相信的。<BR><BR></FONT>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
<TBODY>
<TR>
<TD><FONT size=2>public class Stack {<BR>　private Object[] elements=new Object[10];<BR>　private int size = 0;<BR><BR>　public void push(Object e){<BR>　　ensureCapacity();<BR>　　elements[size++] = e; <BR>　}<BR><BR>　public Object pop(){<BR>　　if( size == 0) <BR>　　　throw new EmptyStackException(); <BR>　　　return elements[--size];<BR>　}<BR><BR>private void ensureCapacity(){<BR>　if(elements.length == size){<BR>　　Object[] oldElements = elements;<BR>　　elements = new Object[2 * elements.length+1];<BR>　　System.arraycopy(oldElements,0, elements, 0, size);<BR>　}<BR>}<BR>}</FONT></TD></TR></TBODY></TABLE><BR><FONT size=2>　　上面的原理应该很简单，假如堆栈加了10个元素，然后全部弹出来，虽然堆栈是空的，没有我们要的东西，但是这是个对象是无法回收的，这个才符合了内存泄露的两个条件：无用，无法回收。<BR><BR>　　但是就是存在这样的东西也不一定会导致什么样的后果，如果这个堆栈用的比较少，也就浪费了几个K内存而已，反正我们的内存都上G了，哪里会有什么影响，再说这个东西很快就会被回收的，有什么关系。下面看两个例子。<BR><BR>　　例子1<BR><BR></FONT>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
<TBODY>
<TR>
<TD><FONT size=2>public class Bad{<BR>　public static Stack s=Stack();<BR>　　static{<BR>　　　s.push(new Object());<BR>　　　s.pop(); //这里有一个对象发生内存泄露<BR>　　　s.push(new Object()); //上面的对象可以被回收了，等于是自愈了<BR>　　}<BR>}</FONT></TD></TR></TBODY></TABLE><BR><FONT size=2>　　因为是static，就一直存在到程序退出，但是我们也可以看到它有自愈功能，就是说如果你的Stack最多有100个对象，那么最多也就只有100个对象无法被回收其实这个应该很容易理解，Stack内部持有100个引用，最坏的情况就是他们都是无用的，因为我们一旦放新的进取，以前的引用自然消失！<BR><BR>　　例子2<BR><BR></FONT>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
<TBODY>
<TR>
<TD><FONT size=2>public class NotTooBad{<BR>　public void doSomething(){<BR>　　Stack s=new Stack();<BR>　　s.push(new Object());<BR>　　//other code<BR>　　s.pop();//这里同样导致对象无法回收,内存泄露.<BR>　}//退出方法,s自动无效,s可以被回收,Stack内部的引用自然没了,所以<BR>　//这里也可以自愈,而且可以说这个方法不存在内存泄露问题,不过是晚一点<BR>　//交给GC而已,因为它是封闭的,对外不开放,可以说上面的代码99.9999%的<BR>　//情况是不会造成任何影响的,当然你写这样的代码不会有什么坏的影响,但是<BR>　//绝对可以说是垃圾代码!没有矛盾吧,我在里面加一个空的for循环也不会有<BR>　//什么太大的影响吧,你会这么做吗?<BR>}</FONT></TD></TR></TBODY></TABLE><BR><FONT size=2>　　上面两个例子都不过是小打小闹,但是C/C++中的内存泄露就不是Bad了,而是Worst了。他们如果一处没有回收就永远无法回收,频繁的调用这个方法内存不就用光了!因为Java还有自愈功能(我自己起的名字,还没申请专利),所以Java的内存泄露问题几乎可以忽略了,但是知道的人就不要犯了。<BR><BR>　　不知者无罪!Java存在内存泄露,但是也不要夸大其辞。如果你对Java都不是很熟,你根本就不用关心这个,我说过你无意中写出内存泄露的例子就像你中一千万一样概率小,开玩笑了,其实应该是小的多的多!<BR><BR>　　而且即使你有幸写出这样的代码，中奖了!基本上都是一包洗衣粉，不会让你发财，对系统没有什么大的影响。<BR><BR>　　杞人忧天的情况<BR><BR>　　1.无话可说型<BR><BR></FONT>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
<TBODY>
<TR>
<TD><FONT size=2>Object obj=new Object();<BR>obj=null;<BR>//这个完全多此一举,因为退出了作用范围，对象的引用自动消失<BR>//不要在你的程序中出现这样的语句，没有错，但是就是不雅观</FONT></TD></TR></TBODY></TABLE><BR><FONT size=2>　　2.思考不对型<BR><BR></FONT>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
<TBODY>
<TR>
<TD><FONT size=2>void func(Object o){<BR>　o=new Object();<BR>　return <BR>}</FONT></TD></TR></TBODY></TABLE><BR><FONT size=2>　　当我们知道Java参数是传值，就知道上面的方法什么也没错，就是申请了一个对象然后再丢给GC。因为是传值，这里的o是一个调用时候的拷贝,会不会无法回收？不就是拷贝吗，退出方法什么都没了，这个对象怎么会留的住。<BR><BR>　　3.尽量避免型<BR><BR></FONT>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
<TBODY>
<TR>
<TD><FONT size=2>class A{<BR>　B b=new B(this);<BR>}<BR>class B{<BR>　A a; <BR>　B(A a){this.a=a;}<BR>}</FONT></TD></TR></TBODY></TABLE><BR><FONT size=2>　　这个存在互相引用，可能导致孤岛现象，但是这个不会造成内存泄露不过我自己觉得这个会降低GC的效率，就从我的智力来看，我觉得这种情况比一般情况难以判断怎么回收!当然GC比我聪明，不过应该也要动一点脑子吧。<BR></FONT></FONT><img src ="http://www.blogjava.net/faintbear/aggbug/1933.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/faintbear/" target="_blank">小力力力</a> 2005-03-11 09:35 <a href="http://www.blogjava.net/faintbear/archive/2005/03/11/1933.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于Java栈与堆的思考(转) </title><link>http://www.blogjava.net/faintbear/archive/2005/03/10/1924.html</link><dc:creator>小力力力</dc:creator><author>小力力力</author><pubDate>Thu, 10 Mar 2005 09:40:00 GMT</pubDate><guid>http://www.blogjava.net/faintbear/archive/2005/03/10/1924.html</guid><wfw:comment>http://www.blogjava.net/faintbear/comments/1924.html</wfw:comment><comments>http://www.blogjava.net/faintbear/archive/2005/03/10/1924.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/faintbear/comments/commentRss/1924.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/faintbear/services/trackbacks/1924.html</trackback:ping><description><![CDATA[<A id=viewpost.ascx_TitleUrl href="http://blog.csdn.net/chensheng913/archive/2005/02/19/293560.aspx"><FONT size=2>关于Java栈与堆的思考</FONT></A><FONT size=2> </FONT>
<DIV class=postText>
<TABLE cellSpacing=0 cellPadding=0 width=590 align=center border=0>
<TBODY>
<TR>
<TD><SPAN class=f14><FONT color=#a52a2a size=2>　　1. 栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方。与C++不同，Java自动管理栈和堆，程序员不能直接地设置栈或堆。 <BR><BR>　　2. 栈的优势是，存取速度比堆要快，仅次于直接位于CPU中的寄存器。但缺点是，存在栈中的数据大小与生存期必须是确定的，缺乏灵活性。另外，栈数据可以共享，详见第3点。堆的优势是可以动态地分配内存大小，生存期也不必事先告诉编译器，Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是，由于要在运行时动态分配内存，存取速度较慢。<BR><BR>　　3. Java中的数据类型有两种。<BR><BR>　　一种是基本类型(primitive types), 共有8种，即int, short, long, byte, float, double, boolean, char(注意，并没有string的基本类型)。这种类型的定义是通过诸如int a = 3; long b = 255L;的形式来定义的，称为自动变量。值得注意的是，自动变量存的是字面值，不是类的实例，即不是类的引用，这里并没有类的存在。如int a = 3; 这里的a是一个指向int类型的引用，指向3这个字面值。这些字面值的数据，由于大小可知，生存期可知(这些字面值固定定义在某个程序块里面，程序块退出后，字段值就消失了)，出于追求速度的原因，就存在于栈中。<BR><BR>　　另外，栈有一个很重要的特殊性，就是存在栈中的数据可以共享。假设我们同时定义：<BR><BR></FONT>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
<TBODY>
<TR>
<TD><FONT color=#a52a2a size=2>int a = 3; <BR>int b = 3；</FONT></TD></TR></TBODY></TABLE><BR><FONT color=#a52a2a size=2>　　编译器先处理int a = 3；首先它会在栈中创建一个变量为a的引用，然后查找有没有字面值为3的地址，没找到，就开辟一个存放3这个字面值的地址，然后将a指向3的地址。接着处理int b = 3；在创建完b的引用变量后，由于在栈中已经有3这个字面值，便将b直接指向3的地址。这样，就出现了a与b同时均指向3的情况。<BR><BR>　　特别注意的是，这种字面值的引用与类对象的引用不同。假定两个类对象的引用同时指向一个对象，如果一个对象引用变量修改了这个对象的内部状态，那么另一个对象引用变量也即刻反映出这个变化。相反，通过字面值的引用来修改其值，不会导致另一个指向此字面值的引用的值也跟着改变的情况。如上例，我们定义完a与b的值后，再令a=4；那么，b不会等于4，还是等于3。在编译器内部，遇到a=4；时，它就会重新搜索栈中是否有4的字面值，如果没有，重新开辟地址存放4的值；如果已经有了，则直接将a指向这个地址。因此a值的改变不会影响到b的值。<BR><BR>　　另一种是包装类数据，如Integer, String, Double等将相应的基本数据类型包装起来的类。这些类数据全部存在于堆中，Java用new()语句来显示地告诉编译器，在运行时才根据需要动态创建，因此比较灵活，但缺点是要占用更多的时间。 4. String是一个特殊的包装类数据。即可以用String str = new String("abc");的形式来创建，也可以用String str = "abc"；的形式来创建(作为对比，在JDK 5.0之前，你从未见过Integer i = 3;的表达式，因为类与字面值是不能通用的，除了String。而在JDK 5.0中，这种表达式是可以的！因为编译器在后台进行Integer i = new Integer(3)的转换)。前者是规范的类的创建过程，即在Java中，一切都是对象，而对象是类的实例，全部通过new()的形式来创建。Java中的有些类，如DateFormat类，可以通过该类的getInstance()方法来返回一个新创建的类，似乎违反了此原则。其实不然。该类运用了单例模式来返回类的实例，只不过这个实例是在该类内部通过new()来创建的，而getInstance()向外部隐藏了此细节。那为什么在String str = "abc"；中，并没有通过new()来创建实例，是不是违反了上述原则？其实没有。<BR><BR>　　5. 关于String str = "abc"的内部工作。Java内部将此语句转化为以下几个步骤：<BR><BR>　　(1)先定义一个名为str的对String类的对象引用变量：String str；<BR><BR>　　(2)在栈中查找有没有存放值为"abc"的地址，如果没有，则开辟一个存放字面值为"abc"的地址，接着创建一个新的String类的对象o，并将o的字符串值指向这个地址，而且在栈中这个地址旁边记下这个引用的对象o。如果已经有了值为"abc"的地址，则查找对象o，并返回o的地址。<BR><BR>　　(3)将str指向对象o的地址。<BR><BR>　　值得注意的是，一般String类中字符串值都是直接存值的。但像String str = "abc"；这种场合下，其字符串值却是保存了一个指向存在栈中数据的引用！<BR><BR>　　为了更好地说明这个问题，我们可以通过以下的几个代码进行验证。<BR><BR></FONT>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
<TBODY>
<TR>
<TD><FONT color=#a52a2a size=2>String str1 = "abc";<BR>String str2 = "abc";<BR>System.out.println(str1==str2); //true</FONT></TD></TR></TBODY></TABLE><BR><FONT color=#a52a2a size=2>　　注意，我们这里并不用str1.equals(str2)；的方式，因为这将比较两个字符串的值是否相等。==号，根据JDK的说明，只有在两个引用都指向了同一个对象时才返回真值。而我们在这里要看的是，str1与str2是否都指向了同一个对象。<BR>结果说明，JVM创建了两个引用str1和str2，但只创建了一个对象，而且两个引用都指向了这个对象。<BR><BR>　　我们再来更进一步，将以上代码改成：<BR><BR></FONT>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
<TBODY>
<TR>
<TD><FONT color=#a52a2a size=2>String str1 = "abc";<BR>String str2 = "abc";<BR>str1 = "bcd";<BR>System.out.println(str1 + "," + str2); //bcd, abc<BR>System.out.println(str1==str2); //false</FONT></TD></TR></TBODY></TABLE><BR><FONT color=#a52a2a size=2>　　这就是说，赋值的变化导致了类对象引用的变化，str1指向了另外一个新对象！而str2仍旧指向原来的对象。上例中，当我们将str1的值改为"bcd"时，JVM发现在栈中没有存放该值的地址，便开辟了这个地址，并创建了一个新的对象，其字符串的值指向这个地址。<BR><BR>　　事实上，String类被设计成为不可改变(immutable)的类。如果你要改变其值，可以，但JVM在运行时根据新值悄悄创建了一个新对象，然后将这个对象的地址返回给原来类的引用。这个创建过程虽说是完全自动进行的，但它毕竟占用了更多的时间。在对时间要求比较敏感的环境中，会带有一定的不良影响。<BR><BR>　　再修改原来代码：<BR><BR></FONT>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
<TBODY>
<TR>
<TD><FONT color=#a52a2a size=2>String str1 = "abc";<BR>String str2 = "abc";<BR><BR>str1 = "bcd";<BR><BR>String str3 = str1;<BR>System.out.println(str3); //bcd<BR><BR>String str4 = "bcd";<BR>System.out.println(str1 == str4); //true</FONT></TD></TR></TBODY></TABLE><BR><FONT color=#a52a2a size=2>　　str3这个对象的引用直接指向str1所指向的对象(注意，str3并没有创建新对象)。当str1改完其值后，再创建一个String的引用str4，并指向因str1修改值而创建的新的对象。可以发现，这回str4也没有创建新的对象，从而再次实现栈中数据的共享。<BR><BR>　　我们再接着看以下的代码。<BR><BR></FONT>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
<TBODY>
<TR>
<TD><FONT color=#a52a2a size=2>String str1 = new String("abc");<BR>String str2 = "abc";<BR>System.out.println(str1==str2); //false</FONT></TD></TR></TBODY></TABLE><BR><FONT color=#a52a2a size=2>　　创建了两个引用。创建了两个对象。两个引用分别指向不同的两个对象。<BR><BR></FONT>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
<TBODY>
<TR>
<TD><FONT color=#a52a2a size=2>String str1 = "abc";<BR>String str2 = new String("abc");<BR>System.out.println(str1==str2); //false</FONT></TD></TR></TBODY></TABLE><BR><FONT color=#a52a2a size=2>　　创建了两个引用。创建了两个对象。两个引用分别指向不同的两个对象。<BR><BR>　　以上两段代码说明，只要是用new()来新建对象的，都会在堆中创建，而且其字符串是单独存值的，即使与栈中的数据相同，也不会与栈中的数据共享。<BR><BR>　　6. 数据类型包装类的值不可修改。不仅仅是String类的值不可修改，所有的数据类型包装类都不能更改其内部的值。 7. 结论与建议：<BR><BR>　　(1)我们在使用诸如String str = "abc"；的格式定义类时，总是想当然地认为，我们创建了String类的对象str。担心陷阱！对象可能并没有被创建！唯一可以肯定的是，指向String类的引用被创建了。至于这个引用到底是否指向了一个新的对象，必须根据上下文来考虑，除非你通过new()方法来显要地创建一个新的对象。因此，更为准确的说法是，我们创建了一个指向String类的对象的引用变量str，这个对象引用变量指向了某个值为"abc"的String类。清醒地认识到这一点对排除程序中难以发现的bug是很有帮助的。<BR><BR>　　(2)使用String str = "abc"；的方式，可以在一定程度上提高程序的运行速度，因为JVM会自动根据栈中数据的实际情况来决定是否有必要创建新对象。而对于String str = new String("abc")；的代码，则一概在堆中创建新对象，而不管其字符串值是否相等，是否有必要创建新对象，从而加重了程序的负担。这个思想应该是享元模式的思想，但JDK的内部在这里实现是否应用了这个模式，不得而知。<BR><BR>　　(3)当比较包装类里面的数值是否相等时，用equals()方法；当测试两个包装类的引用是否指向同一个对象时，用==。<BR><BR>　　(4)由于String类的immutable性质，当String变量需要经常变换其值时，应该考虑使用StringBuffer类，以提高程序效率。</FONT></SPAN></TD></TR></TBODY></TABLE></DIV><img src ="http://www.blogjava.net/faintbear/aggbug/1924.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/faintbear/" target="_blank">小力力力</a> 2005-03-10 17:40 <a href="http://www.blogjava.net/faintbear/archive/2005/03/10/1924.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA程序员面试32问</title><link>http://www.blogjava.net/faintbear/archive/2005/03/10/1923.html</link><dc:creator>小力力力</dc:creator><author>小力力力</author><pubDate>Thu, 10 Mar 2005 09:36:00 GMT</pubDate><guid>http://www.blogjava.net/faintbear/archive/2005/03/10/1923.html</guid><wfw:comment>http://www.blogjava.net/faintbear/comments/1923.html</wfw:comment><comments>http://www.blogjava.net/faintbear/archive/2005/03/10/1923.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/faintbear/comments/commentRss/1923.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/faintbear/services/trackbacks/1923.html</trackback:ping><description><![CDATA[<P><FONT size=2>第一，谈谈final, finally, finalize的区别。 <BR>final?修饰符（关键字）如果一个类被声明为final，意味着它不能再派生出新的子类，不能作为父类被继承。因此一个类不能既被声明为abstract的，又被声明为final的。将变量或方法声明为final，可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给定初值，而在以后的引用中只能读取，不可修改。被声明为final的方法也同样只能使用，不能重载 <BR>finally再异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常，那么相匹配的 catch 子句就会执行，然后控制就会进入 finally 块（如果有的话）。 <BR>finalize方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的，因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。 </FONT></P>
<P><FONT size=2>第二，Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类，是否可以implements(实现)interface(接口)<BR>匿名的内部类是没有名字的内部类。不能extends(继承) 其它类，但一个内部类可以作为一个接口，由另一个内部类实现。 </FONT></P>
<P><FONT size=2>第三，Static Nested Class 和 Inner Class的不同，说得越多越好(面试题有的很笼统)。 <BR>Nested Class （一般是C++的说法），Inner Class (一般是JAVA的说法)。Java内部类与C++嵌套类最大的不同就在于是否有指向外部的引用上。具体可见<BR>http: //www.frontfree.net/articles/services/view.asp?id=704&amp;page=1 <BR>注： 静态内部类（Inner Class）意味着1创建一个static内部类的对象，不需要一个外部类对象，2不能从一个static内部类的一个对象访问一个外部类对象 </FONT></P>
<P><FONT size=2>第四，&amp;和&amp;&amp;的区别。 <BR>&amp;是位运算符。&amp;&amp;是布尔逻辑运算符。 </FONT></P>
<P><FONT size=2>第五，HashMap和Hashtable的区别。 <BR>都属于Map接口的类，实现了将惟一键映射到特定的值上。 <BR>HashMap 类没有分类或者排序。它允许一个 null 键和多个 null 值。 <BR>Hashtable 类似于 HashMap，但是不允许 null 键和 null 值。它也比 HashMap 慢，因为它是同步的。 </FONT></P>
<P><FONT size=2>第六，Collection 和 Collections的区别。 <BR>Collections是个java.util下的类，它包含有各种有关集合操作的静态方法。 <BR>Collection是个java.util下的接口，它是各种集合结构的父接口。 </FONT></P>
<P><FONT size=2>第七，什么时候用assert。 <BR>断言是一个包含布尔表达式的语句，在执行这个语句时假定该表达式为 true。如果表达式计算为 false，那么系统会报告一个 AssertionError。它用于调试目的： <BR>assert(a &gt; 0); // throws an AssertionError if a &lt;= 0 <BR>断言可以有两种形式： <BR>assert Expression1 ; <BR>assert Expression1 : Expression2 ; <BR>Expression1 应该总是产生一个布尔值。 <BR>Expression2 可以是得出一个值的任意表达式。这个值用于生成显示更多调试信息的 String 消息。 <BR>断言在默认情况下是禁用的。要在编译时启用断言，需要使用 source 1.4 标记： <BR>javac -source 1.4 Test.java <BR>要在运行时启用断言，可使用 -enableassertions 或者 -ea 标记。 <BR>要在运行时选择禁用断言，可使用 -da 或者 -disableassertions 标记。 <BR>要系统类中启用断言，可使用 -esa 或者 -dsa 标记。还可以在包的基础上启用或者禁用断言。 <BR>可以在预计正常情况下不会到达的任何位置上放置断言。断言可以用于验证传递给私有方法的参数。不过，断言不应该用于验证传递给公有方法的参数，因为不管是否启用了断言，公有方法都必须检查其参数。不过，既可以在公有方法中，也可以在非公有方法中利用断言测试后置条件。另外，断言不应该以任何方式改变程序的状态。 </FONT></P>
<P><FONT size=2>第八，GC是什么? 为什么要有GC? (基础)。 <BR>GC是垃圾收集器。Java 程序员不用担心内存管理，因为垃圾收集器会自动进行管理。要请求垃圾收集，可以调用下面的方法之一： <BR>System.gc() <BR>Runtime.getRuntime().gc() </FONT></P>
<P><FONT size=2>第九，String s = new String("xyz");创建了几个String Object? <BR>两个对象，一个是“xyx”,一个是指向“xyx”的引用对象s。 </FONT></P>
<P><FONT size=2>第十，Math.round(11.5)等於多少? Math.round(-11.5)等於多少? <BR>Math.round(11.5)返回（long）12，Math.round(-11.5)返回（long）-11; <BR>第二十一，abstract的method是否可同时是static,是否可同时是native，是否可同时是synchronized? <BR>都不能 </FONT></P>
<P><FONT size=2>第二十二，接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)? <BR>接口可以继承接口。抽象类可以实现(implements)接口，抽象类是否可继承实体类，但前提是实体类必须有明确的构造函数。 </FONT></P>
<P><FONT size=2>第二十三，启动一个线程是用run()还是start()? <BR>启动一个线程是调用start()方法，使线程所代表的虚拟处理机处于可运行状态，这意味着它可以由JVM调度并执行。这并不意味着线程就会立即运行。run()方法可以产生必须退出的标志来停止一个线程。 </FONT></P>
<P><FONT size=2>第二十四，构造器Constructor是否可被override? <BR>构造器Constructor不能被继承，因此不能重写Overriding，但可以被重载Overloading。 </FONT></P>
<P><FONT size=2>第二十五，是否可以继承String类? <BR>String类是final类故不可以继承。 </FONT></P>
<P><FONT size=2>第二十六，当一个线程进入一个对象的一个synchronized方法后，其它线程是否可进入此对象的其它方法? <BR>不能，一个对象的一个synchronized方法只能由一个线程访问。 </FONT></P>
<P><FONT size=2>第二十七，try {}里有一个return语句，那么紧跟在这个try后的finally {}里的code会不会被执行，什么时候被执行，在return前还是后? <BR>会执行，在return前执行。 </FONT></P>
<P><FONT size=2>第二十八，编程题: 用最有效率的方法算出2乘以8等於几? <BR>有C背景的程序员特别喜欢问这种问题。 </FONT></P>
<P><FONT size=2>2 &lt;&lt; 3 </FONT></P>
<P><FONT size=2>第二十九，两个对象值相同(x.equals(y) == true)，但却可有不同的hash code，这句话对不对? <BR>不对，有相同的hash code。 </FONT></P>
<P><FONT size=2>第三十，当一个对象被当作参数传递到一个方法后，此方法可改变这个对象的属性，并可返回变化后的结果，那么这里到底是值传递还是引用传递? <BR>是值传递。Java 编程语言只由值传递参数。当一个对象实例作为一个参数被传递到方法中时，参数的值就是对该对象的引用。对象的内容可以在被调用的方法中改变，但对象的引用是永远不会改变的。 </FONT></P>
<P><FONT size=2>第三十一，swtich是否能作用在byte上，是否能作用在long上，是否能作用在String上? <BR>switch（expr1）中，expr1是一个整数表达式。因此传递给 switch 和 case 语句的参数应该是 int、 short、 char 或者 byte。long,string 都不能作用于swtich。 </FONT></P>
<P><FONT size=2>第三十二，编程题: 写一个Singleton出来。 <BR>Singleton模式主要作用是保证在Java应用程序中，一个类Class只有一个实例存在。 <BR>一般Singleton模式通常有几种种形式: <BR>第一种形式: 定义一个类，它的构造函数为private的，它有一个static的private的该类变量，在类初始化时实例话，通过一个public的getInstance方法获取对它的引用,继而调用其中的方法。 <BR>public class Singleton { <BR>　　private Singleton(){} <BR>　　//在自己内部定义自己一个实例，是不是很奇怪？ <BR>　　//注意这是private 只供内部调用 <BR>　　private static Singleton instance = new Singleton(); <BR>　　//这里提供了一个供外部访问本class的静态方法，可以直接访问　　 <BR>　　public static Singleton getInstance() { <BR>　　　　return instance; 　　 <BR>　　 } <BR>} <BR>第二种形式: <BR>public class Singleton { <BR>　　private static Singleton instance = null; <BR>　　public static synchronized Singleton getInstance() { <BR>　　//这个方法比上面有所改进，不用每次都进行生成对象，只是第一次　　　 　 <BR>　　//使用时生成实例，提高了效率！ <BR>　　if (instance==null) <BR>　　　　instance＝new Singleton(); <BR>return instance; 　　} <BR>} <BR>其他形式: <BR>定义一个类，它的构造函数为 <BR></FONT></P><img src ="http://www.blogjava.net/faintbear/aggbug/1923.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/faintbear/" target="_blank">小力力力</a> 2005-03-10 17:36 <a href="http://www.blogjava.net/faintbear/archive/2005/03/10/1923.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Inner Classes</title><link>http://www.blogjava.net/faintbear/archive/2005/03/10/1896.html</link><dc:creator>小力力力</dc:creator><author>小力力力</author><pubDate>Thu, 10 Mar 2005 04:00:00 GMT</pubDate><guid>http://www.blogjava.net/faintbear/archive/2005/03/10/1896.html</guid><wfw:comment>http://www.blogjava.net/faintbear/comments/1896.html</wfw:comment><comments>http://www.blogjava.net/faintbear/archive/2005/03/10/1896.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/faintbear/comments/commentRss/1896.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/faintbear/services/trackbacks/1896.html</trackback:ping><description><![CDATA[<P><FONT size=2>package com.faintbear;</FONT></P>
<P><FONT size=2>public class Outer4<BR>{<BR>&nbsp; private int size = 5;<BR>&nbsp; public Object makeTheInner( final int localVar )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final int finalLocalVar = 6;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class Inner<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String toString()<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return ( "localVar=" + localVar + "&gt;" );<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }//end public String toString()<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }//end class Inner<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return new Inner();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }//end public Object makeTheInner( int localVar )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>public static void main( String args[] )<BR>{<BR>&nbsp;Outer4 outer = new Outer4();<BR>&nbsp;Object obj = outer.makeTheInner( 47 );<BR>&nbsp;System.out.println( "The object is " + obj );<BR>}<BR>}</FONT></P>
<P><FONT size=2></FONT></P>
<P><FONT size=2>Inner的toString会被调用,这是肯定的.<BR>你的 final int finalLocalVar = 6; 可以加个static,这样可以节省一定的内存和CPU开销. 不过好像没有用到么,那就删除吧.</FONT></P>
<P><FONT size=2></FONT></P>
<P><FONT size=2>同意楼上的<BR>Object obj = outer.makeTheInner( 47 );<BR>System.out.println( "The object is " + obj );<BR>这时其实是System.out.println( "The object is " + obj.toString());</FONT></P>
<P><FONT size=2>Object obj = outer.makeTheInner( 47 );<BR>等同与<BR>Object obj =new Inner();/////////示意一下<BR>toString方法已经在Inner类中被重写了<BR>所以输出应该是The object is localvar=47&gt;</FONT></P><img src ="http://www.blogjava.net/faintbear/aggbug/1896.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/faintbear/" target="_blank">小力力力</a> 2005-03-10 12:00 <a href="http://www.blogjava.net/faintbear/archive/2005/03/10/1896.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java基本数据类型</title><link>http://www.blogjava.net/faintbear/archive/2005/03/10/1893.html</link><dc:creator>小力力力</dc:creator><author>小力力力</author><pubDate>Thu, 10 Mar 2005 03:36:00 GMT</pubDate><guid>http://www.blogjava.net/faintbear/archive/2005/03/10/1893.html</guid><wfw:comment>http://www.blogjava.net/faintbear/comments/1893.html</wfw:comment><comments>http://www.blogjava.net/faintbear/archive/2005/03/10/1893.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/faintbear/comments/commentRss/1893.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/faintbear/services/trackbacks/1893.html</trackback:ping><description><![CDATA[<DIV class=postText>
<P>
<TABLE style="WIDTH: 515px; HEIGHT: 203px" cellSpacing=1 cellPadding=1 width=515 border=1>
<TBODY>
<TR>
<TD><FONT size=2>&nbsp;基本型别</FONT></TD>
<TD><FONT size=2>&nbsp;大小</FONT></TD>
<TD><FONT size=2>&nbsp;最小值</FONT></TD>
<TD><FONT size=2>&nbsp;最大值</FONT></TD></TR>
<TR>
<TD><FONT size=2>&nbsp;boolean</FONT></TD>
<TD><FONT size=2>&nbsp;-----</FONT></TD>
<TD><FONT size=2>&nbsp;-----</FONT></TD>
<TD><FONT size=2>&nbsp;------</FONT></TD></TR>
<TR>
<TD><FONT size=2>&nbsp;char</FONT></TD>
<TD><FONT size=2>&nbsp;16-bit</FONT></TD>
<TD><FONT size=2>&nbsp;Unicode 0</FONT></TD>
<TD><FONT size=2>&nbsp;Unicode 2^16-1</FONT></TD></TR>
<TR>
<TD><FONT size=2>&nbsp;byte </FONT></TD>
<TD><FONT size=2>&nbsp;8-bit</FONT></TD>
<TD><FONT size=2>&nbsp;-128</FONT></TD>
<TD><FONT size=2>&nbsp;+127</FONT></TD></TR>
<TR>
<TD><FONT size=2>&nbsp;short </FONT></TD>
<TD><FONT size=2>&nbsp;16-bit</FONT></TD>
<TD><FONT size=2>&nbsp;-2^15</FONT></TD>
<TD><FONT size=2>&nbsp;+2^15-1</FONT></TD></TR>
<TR>
<TD><FONT size=2>&nbsp;int </FONT></TD>
<TD><FONT size=2>&nbsp;32-bit</FONT></TD>
<TD><FONT size=2>&nbsp;-2^31</FONT></TD>
<TD><FONT size=2>+2^31-1</FONT></TD></TR>
<TR>
<TD><FONT size=2>&nbsp;long</FONT></TD>
<TD><FONT size=2>&nbsp;64-bit</FONT></TD>
<TD><FONT size=2>&nbsp;-2^63</FONT></TD>
<TD><FONT size=2>+2^63-1</FONT></TD></TR>
<TR>
<TD><FONT size=2>&nbsp;float</FONT></TD>
<TD><FONT size=2>&nbsp;32-bit</FONT></TD>
<TD><FONT size=2>IEEE754</FONT></TD>
<TD><FONT size=2>IEEE754</FONT></TD></TR>
<TR>
<TD><FONT size=2>&nbsp;double</FONT></TD>
<TD><FONT size=2>&nbsp;64-bit</FONT></TD>
<TD><FONT size=2>IEEE754</FONT></TD>
<TD><FONT size=2>IEEE754</FONT></TD></TR>
<TR>
<TD><FONT size=2>&nbsp;void</FONT></TD>
<TD><FONT size=2>&nbsp;</FONT></TD>
<TD><FONT size=2>&nbsp;</FONT></TD>
<TD><FONT size=2>&nbsp;</FONT></TD></TR></TBODY></TABLE></P>
<P><FONT size=2>注意！：表格里的^代表的是次方哈～</FONT></P>
<P><FONT size=2>使用 Float 类 节省开发时间&nbsp; <BR>作者： Builder.com <BR>2004-11-16 11:50 AM <BR>&nbsp;</FONT></P>
<P><FONT size=2>即使你可能知道 IEEE 浮点数，你可能也从来没有逐个比特地处理过这类数据。下面我将向你展示如何逐个比特地处理 IEEE 浮点数，下次在你的 Java 项目需要从比特序列创建浮点数时，或者从浮点数创建比特序列时，你就知道Float 类可以为完成这一工作。</FONT></P>
<P><FONT size=2>IEEE 浮点数介绍</FONT></P>
<P><FONT size=2>IEEE 754 浮点单精度数字格式定义了一个用于存储浮点数的比特布局。在空比特布局中，一个比特留作符号位，八个比特留作指数，23个比特留作尾数。这些比特是按最重要比特到最不重要比特进行排列的，如下例所示：</FONT></P>
<P><BR><FONT size=2>&nbsp;<BR>31&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<BR>|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>SEEEEEEEEMMMMMMMMMMMMMMMMMMMMMMM </FONT></P>
<P><FONT size=2>其中：</FONT></P>
<P><FONT size=2>S = 符号位<BR>E = 指数<BR>M = 尾数</FONT></P>
<P><FONT size=2>你可以从 IEEE 的站点购买一份 IEEE 浮点数的完整解释。（如果在线搜索 IEEE 754，你应该可以找到免费的版本。）</FONT></P>
<P><FONT size=2>Float 对 Java 社区的贡献</FONT></P>
<P><FONT size=2>下面的示例程序使用 Float 的两个方法将一个浮点数转成比特，然后又将这些比特转成一个浮点数。</FONT></P>
<P><FONT size=2>使用Float.floatToIntBits(float f) 方法可以将一个浮点数转成一个比特序列。这个方法返回一个32位整数，表示你作为参数提供的浮点数的 IEEE 754 比特排列。</FONT></P>
<P><FONT size=2>使用Float.intBitsToFloat(int bits) 方法可以进行反方向转换。这个方法接受传入的整数作为参数，将这些比特转成一个 IEEE 浮点数。</FONT></P>
<P><FONT size=2>下面是示例程序：</FONT></P>
<P><FONT size=2>public class BitsTip {<BR>&nbsp;&nbsp;&nbsp; public static void main(String args[]) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; float f = Float.parseFloat(args[0]);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int bits = Float.floatToIntBits(f);</FONT></P>
<P><FONT size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("bits: " + bits);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("back to float: " + Float.intBitsToFloat(bits));<BR>&nbsp;&nbsp;&nbsp; }<BR>} </FONT></P>
<P><FONT size=2>如果你曾经必须要手工进行这种转换，那么你就会很欣赏这两个简单的方法为你节省的工作。如果你正在处理64位数，那么可以选择使用Double 包装器（wrapper）类。这个类提供同样的方法处理IEEE 754 双精度浮点数。</FONT></P>
<P><FONT size=2>最好选择阅读一下javadoc，查阅里面有关浮点数与比特序列之间的转换的部分，以便完整地了解这些方法都能为你些做什么。</FONT></P></DIV><img src ="http://www.blogjava.net/faintbear/aggbug/1893.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/faintbear/" target="_blank">小力力力</a> 2005-03-10 11:36 <a href="http://www.blogjava.net/faintbear/archive/2005/03/10/1893.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>