﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-一步一个脚印-文章分类-java基础</title><link>http://www.blogjava.net/flysky19/category/17551.html</link><description>java之路</description><language>zh-cn</language><lastBuildDate>Wed, 07 Mar 2007 11:33:17 GMT</lastBuildDate><pubDate>Wed, 07 Mar 2007 11:33:17 GMT</pubDate><ttl>60</ttl><item><title>讨论题：用快速的方法取得文件中这个层次树的任意节点的子节点</title><link>http://www.blogjava.net/flysky19/articles/98293.html</link><dc:creator>不断前进的小乌龟</dc:creator><author>不断前进的小乌龟</author><pubDate>Tue, 06 Feb 2007 06:12:00 GMT</pubDate><guid>http://www.blogjava.net/flysky19/articles/98293.html</guid><wfw:comment>http://www.blogjava.net/flysky19/comments/98293.html</wfw:comment><comments>http://www.blogjava.net/flysky19/articles/98293.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/flysky19/comments/commentRss/98293.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/flysky19/services/trackbacks/98293.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 题目来自一个搜索公司的笔试题：http://www.lietu.com/joinus/http://www.lietu.com/joinus/ClassTree.htmhttp://www.lietu.com/joinus/ClassTree.htm一、层次树(ClassTree.txt)：分类号分类名父分类是否是末级001         图书01001001计算机001            ...&nbsp;&nbsp;<a href='http://www.blogjava.net/flysky19/articles/98293.html'>阅读全文</a><img src ="http://www.blogjava.net/flysky19/aggbug/98293.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/flysky19/" target="_blank">不断前进的小乌龟</a> 2007-02-06 14:12 <a href="http://www.blogjava.net/flysky19/articles/98293.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于getRealPath</title><link>http://www.blogjava.net/flysky19/articles/98006.html</link><dc:creator>不断前进的小乌龟</dc:creator><author>不断前进的小乌龟</author><pubDate>Mon, 05 Feb 2007 06:49:00 GMT</pubDate><guid>http://www.blogjava.net/flysky19/articles/98006.html</guid><wfw:comment>http://www.blogjava.net/flysky19/comments/98006.html</wfw:comment><comments>http://www.blogjava.net/flysky19/articles/98006.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/flysky19/comments/commentRss/98006.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/flysky19/services/trackbacks/98006.html</trackback:ping><description><![CDATA[		1.关于<span style="font-size: 13px;">request.getRealPath的出错</span><br /><b>问题：</b><br /><span style="font-size: 13px;">String filename  =  request.getRealPath(filename)  //出了错<br /></span><span style="font-size: 13px;">
-------------------<br />
错误信息：<br />
The method getRealPath(String) from the type ServletRequest is deprecated <br /><br /><b>解决：<br /></b></span><span style="font-size: 13px;">资料来源：http://bbs.chinaunix.net/viewthread.php?tid=383861<br /><br /></span><span style="font-size: 13px;">参看request.getRealPath的java doc:<br />
Deprecated. As of Version 2.1 of the Java Servlet API, use ServletContext.getRealPath(java.lang.String) instead. <br /><br /><br />
而在servlet中使用getServletContext.getRealPath()这个方法收到war
和non-war的影响，以及不同app
server实现的影响，运气好的话，你常常会得到null，嘿嘿，比如你在weblogic上部署war文件，又调用这个方法..<br /><br />推荐ServletContext.getResourceAsStream<br /><br />参考资料：http://bbs.chinaunix.net/viewthread.php?tid=383861<br /><br />2.关于serveletContext.getRealPath返回NULL和不同的app server返回不同的结果<br />resoure url：<br />http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=121&amp;threadID=12968&amp;start=0&amp;tstart=0<br /><br /></span><span style="font-size: 13px;"><b>问题：</b><br /><br /></span><span style="font-size: 13px;">我的应用有几个配置文本配置文件（是一些报表的模板),我放在WEB-INF下面的config目录下，我有程序<br /><br />中是这样得到这个config的实际路径的<br />  先用 serveletContext.getRealPath得到根路径，tomcat中比如是<br />c:\tomcat\webapp\test<br />  然后我加上  "/WEB-INF/config/aa.config"，这样得到文件的path然后进行读入，<br />　　应用在tomcat上跑是ok的，后来将war放到weblogic上，出错，原因是：<br />在weblogic上用getRealPath得到的是像<br />  myserver\stage\_appsdir_test_war\test.war!\WEB-INF\config....<br />  这样的路径，于是一直报FileNotFoundException<br /><b><br />解决：</b><br /><br />serveletContext.getRealPath<br />这个方法在不同的服务器上所获得的实现是不一样的<br />这种情况我也同样遇到过<br />建议是通过classloader来获得你配置的资源文件<br /><br />context.getRealPath("/")可能返回了null,你可以输入来看看,<br />对一个打包的应用来说，是没有RealPath的概念的，调用getRealPath只会简单地返回null。其实，也很<br /><br />好理解，一个文件被打包入了.war文件，就不存在目录结构了（虽然包中仍然存在目录结构，但这不等同<br /><br />于文件系统中的目录结构）。所以，对war包中的资源是无法得到RealPath的。这样也就无从通过文件IO<br /><br />进行读取了。<br /><br />那么，如何读取war包中的资源呢？答案是使用ServletContext.getResourceAsStream<br /><br />("/WEB-INF/config/aa.config")方法。<br /><br /><br />原则：基本上就是尽量使用j2ee规范中的各层次classloader来获取资源，而不是试图去找文件的绝对路<br /><br />径<br />方法：调用this.getClass().getClassLoader().getResource("/").getPath(); 获取到classes目录的全<br /><br />路径<br /><br />使用：在得到classes目录的全路径后再根据字符串的截取与拼装达到你的要求即可。<br /><br /><br />楼上说的对，WebLogic对WEB-INF目录下的文件是有访问控制的，最好不要放在这个目录下。<br /><br />最好不要放在WEB-INF目录下。。<br /><br /><br /></span><img src ="http://www.blogjava.net/flysky19/aggbug/98006.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/flysky19/" target="_blank">不断前进的小乌龟</a> 2007-02-05 14:49 <a href="http://www.blogjava.net/flysky19/articles/98006.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>递归实现二叉树 java </title><link>http://www.blogjava.net/flysky19/articles/97398.html</link><dc:creator>不断前进的小乌龟</dc:creator><author>不断前进的小乌龟</author><pubDate>Thu, 01 Feb 2007 18:01:00 GMT</pubDate><guid>http://www.blogjava.net/flysky19/articles/97398.html</guid><wfw:comment>http://www.blogjava.net/flysky19/comments/97398.html</wfw:comment><comments>http://www.blogjava.net/flysky19/articles/97398.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/flysky19/comments/commentRss/97398.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/flysky19/services/trackbacks/97398.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 参考资料：														http://cslibrary.stanford.edu/110/BinaryTrees.html																																 																								今天顶着要交年终文档的压力，总算理清了递归方式实现二叉树的方法，彻底弄明白要如何建一颗二...&nbsp;&nbsp;<a href='http://www.blogjava.net/flysky19/articles/97398.html'>阅读全文</a><img src ="http://www.blogjava.net/flysky19/aggbug/97398.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/flysky19/" target="_blank">不断前进的小乌龟</a> 2007-02-02 02:01 <a href="http://www.blogjava.net/flysky19/articles/97398.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>理解堆与栈</title><link>http://www.blogjava.net/flysky19/articles/95964.html</link><dc:creator>不断前进的小乌龟</dc:creator><author>不断前进的小乌龟</author><pubDate>Thu, 25 Jan 2007 07:55:00 GMT</pubDate><guid>http://www.blogjava.net/flysky19/articles/95964.html</guid><wfw:comment>http://www.blogjava.net/flysky19/comments/95964.html</wfw:comment><comments>http://www.blogjava.net/flysky19/articles/95964.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/flysky19/comments/commentRss/95964.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/flysky19/services/trackbacks/95964.html</trackback:ping><description><![CDATA[一、引言：<br />    一直不太明白堆与栈到底是什么，是指一块内存区呢，还是指一种数据结构？编写程序中总提到内存分配的栈与堆的区别，静态与动态分配等，总也弄不明白，隐约知道一点，但总分不清堆与栈到底是一块内存区还是内存分配的方式，或者只是一种数据结构？？？<br /><br />跟杨惠讨论如何建立决策树的时候，她说实际上就是进栈出栈，当时真是一头雾水呀。隐约知道《TIJ》中说栈是存放数据的一个地方（实际是RAM），以前学数据结构时的栈是什么已经不记得了。今天终于下决心先理清堆与栈的概念。<br /><br />二、明确操作系统(或编译原理)的堆与栈和数据结构的堆与栈是不同的概念<br />参考资料摘录：<br /><br />1.http://www.bloghome.cn/posts/52992<br /><br />a）预备知识—程序的内存分配<br /><br />一个由c/C++编译的程序占用的内存分为以下几个部分<br />1、栈区（stack）— 由编译器自动分配释放 ，存放函数的参数值，局部变量的值等。其操作方式类似于<br /><br />数据结构中的栈。<br />2、堆区（heap） — 一般由程序员分配释放， 若程序员不释放，程序结束时可能由OS回收 。注意它与<br /><br />数据结构中的堆是两回事，分配方式倒是类似于链表，呵呵。<br />3、全局区（静态区）（static）—，全局变量和静态变量的存储是放在一块的，初始化的全局变量和静<br /><br />态变量在一块区域， 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有<br /><br />系统释放<br />4、文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放<br />5、程序代码区—存放函数体的二进制代码。<br /><br />b）小结：<br />堆和栈的区别可以用如下的比喻来看出：<br />使用栈就象我们去饭馆里吃饭，只管点菜（发出申请）、付钱、和吃（使用），吃饱了就走，不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作，他的好处是快捷，但是自由度小。<br />使用堆就象是自己动手做喜欢吃的菜肴，比较麻烦，但是比较符合自己的口味，而且自由度大。<br /><br />堆和栈的区别主要分：<br />操作系统方面的堆和栈，如上面说的那些，不多说了。<br />还有就是数据结构方面的堆和栈，这些都是不同的概念。这里的堆实际上指的就是（满足堆性质的）优先队列的一种数据结构，第1个元素有最高的优先权；栈实际上就是满足先进后出的性质的数学或数据结构。<br />虽然堆栈，堆栈的说法是连起来叫，但是他们还是有很大区别的，连着叫只是由于历史的原因。<br /><br />2.http://topic.csdn.net/t/20051107/15/4376867.html<br />看了大家对操作系统中堆与栈的说明，受益匪浅。我只是在数据结构的层面上说明一下堆与栈：这是两个完全相关的数据结构。栈结构就是后进先出的那个顺序结构，任何的数据结构书中都有说明的，而堆结构是一棵完全二叉树，这棵二叉树的特点是每个结点的值都比它两个孩子结点中的值小(或者大，当然如果它有孩子结点的话)。栈结构主要用在临时存储局部结果上，堆结构的特点主要是可以快速地连续取最值(因此当然可以排序啦)，这是我对这两个数据结构的理解。<br /><br />3.http://www.cnblogs.com/liangqihui/archive/2005/07/29/202989.html<br />在google.com搜索 “编译原理与实践”，看第7章，就会明白大概了 <br /><br />[精华] Re: 请问堆和栈有什么区别? [re: yuan_weiqi]<br />    <br />很喜欢你生气的样子，grin<br />呵呵，不开玩笑了，其实大家有点胡扯，也不是有意，因为堆和栈这2个概念本身就比较混沌，有时候是指两种数据结构，教科书里写的比较清楚（不过说实在的，堆的定义还真有点忘了，shrug）；有时候，这2个概念又指两种内存分配的方式，这通常是在操作系统原理里讲。上面这2种情况，原理性概念性比较强，实际中真很少人去仔细想（惭愧ing）。第三种时候，也是我在前面胡扯的，呵呵，这2个概念通常又混在一起，大家都堆栈堆栈的说，时间长了，也分不清了:)，这还是和第二种有关，因为大多数OS通常是将heap和stack放在一起（或者说比较接近），通常一个在高端，一个在低端，分配内存时，方向是相对的，之间并没有很明确的界限，APUE CHAP7有讲。<br />另外，印象中，两者还有一个区别就是，stack通常用于函数调用，而heap通常用于进程内局部变量的分配，不过这个印象是很久之前的印象了，不知道对不对。<br />BTW，偶不是高手，连所谓的都不是：），不过倒学到一点技巧，这里的高手往往不轻易出手，最好的方法就是刺激他们，嘿嘿<br /><br />三、由C/C++编译的程序占用的内存分配－堆与栈的区别<br />http://www.bloghome.cn/posts/52992<br />堆与栈的区别<br />c /liaxiz 发表于2006-10-14 23:32<br /><br />一、预备知识—程序的内存分配<br /><br />一个由c/C++编译的程序占用的内存分为以下几个部分<br />1、栈区（stack）— 由编译器自动分配释放 ，存放函数的参数值，局部变量的值等。其操作方式类似于<br /><br />数据结构中的栈。<br />2、堆区（heap） — 一般由程序员分配释放， 若程序员不释放，程序结束时可能由OS回收 。注意它与<br /><br />数据结构中的堆是两回事，分配方式倒是类似于链表，呵呵。<br />3、全局区（静态区）（static）—，全局变量和静态变量的存储是放在一块的，初始化的全局变量和静<br /><br />态变量在一块区域， 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有<br /><br />系统释放<br />4、文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放<br />5、程序代码区—存放函数体的二进制代码。<br /><br />例子程序<br />这是一个前辈写的，非常详细<br />//main.cpp<br />int a = 0; 全局初始化区<br />char *p1;  全局未初始化区<br />main()<br />{<br /> int b;    栈<br /> char s[] = "abc"; 栈<br /> char *p2; 栈<br /> char *p3 = "123456";   123456\0在常量区，p3在栈上。<br /> static int c =0；      全局（静态）初始化区<br /> p1 = (char *)malloc(10);<br /> p2 = (char *)malloc(20);      分配得来得10和20字节的区域就在堆区。<br /> strcpy(p1, "123456");         123456\0放在常量区，编译器可能会将它与p3所指向<br /><br />的"123456"优化成一个地方<br />}<br /><br />二、堆和栈的理论知识<br /><br />2.1申请方式<br />stack:<br />由系统自动分配。 例如，声明在函数中一个局部变量 int b; 系统自动在栈中为b开辟空间<br />heap:<br />需要程序员自己申请，并指明大小，在c中malloc函数<br />如p1 = (char *)malloc(10);<br />在C++中用new运算符<br />如p2 = (char *)malloc(10);<br />但是注意p1、p2本身是在栈中的。<br /><br />2.2<br />申请后系统的响应<br />栈：只要栈的剩余空间大于所申请空间，系统将为程序提供内存，否则将报异常提示栈溢出。<br />堆：首先应该知道操作系统有一个记录空闲内存地址的链表，当系统收到程序的申请时，<br />会遍历该链表，寻找第一个空间大于所申请空间的堆结点，然后将该结点从空闲结点链表中删除，并将该<br /><br />结点的空间分配给程序，另外，对于大多数系统，会在这块内存空间中的首地址处记录本次分配的大小，<br /><br />这样，代码中的delete语句才能正确的释放本内存空间。另外，由于找到的堆结点的大小不一定正好等于<br /><br />申请的大小，系统会自动的将多余的那部分重新放入空闲链表中。<br /><br />2.3申请大小的限制<br />栈：在Windows下,栈是向低地址扩展的数据结构，是一块连续的内存的区域。这句话的意思是栈顶的地址<br /><br />和栈的最大容量是系统预先规定好的，在 WINDOWS下，栈的大小是2M（也有的说是1M，总之是一个编译时<br /><br />就确定的常数），如果申请的空间超过栈的剩余空间时，将提示overflow。因此，能从栈获得的空间较小<br /><br />。<br />堆：堆是向高地址扩展的数据结构，是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址<br /><br />的，自然是不连续的，而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟<br /><br />内存。由此可见，堆获得的空间比较灵活，也比较大。<br /><br />2.4申请效率的比较：<br />栈由系统自动分配，速度较快。但程序员是无法控制的。<br />堆是由new分配的内存，一般速度比较慢，而且容易产生内存碎片,不过用起来最方便.<br />另外，在WINDOWS下，最好的方式是用VirtualAlloc分配内存，他不是在堆，也不是在栈是直接在进程的<br /><br />地址空间中保留一快内存，虽然用起来最不方便。但是速度快，也最灵活<br /><br />2.5堆和栈中的存储内容<br />栈： 在函数调用时，第一个进栈的是主函数中后的下一条指令（函数调用语句的下一条可执行语句）的<br /><br />地址，然后是函数的各个参数，在大多数的C编译器中，参数是由右往左入栈的，然后是函数中的局部变<br /><br />量。注意静态变量是不入栈的。<br />当本次函数调用结束后，局部变量先出栈，然后是参数，最后栈顶指针指向最开始存的地址，也就是主函<br /><br />数中的下一条指令，程序由该点继续运行。<br />堆：一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容有程序员安排.<br /><br />2.6存取效率的比较<br /><br />char s1[] = "aaaaaaaaaaaaaaa";<br />char *s2 = "bbbbbbbbbbbbbbbbb";<br />aaaaaaaaaaa是在运行时刻赋值的；<br />而bbbbbbbbbbb是在编译时就确定的；<br />但是，在以后的存取中，在栈上的数组比指针所指向的字符串(例如堆)快。<br />比如：<br />#include<br />void main()<br />{<br />char a = 1;<br />char c[] = "1234567890";<br />char *p ="1234567890";<br />a = c[1];<br />a = p[1];<br />return;<br />}<br />对应的汇编代码<br />10: a = c[1];<br />00401067 8A 4D F1 mov cl,byte ptr [ebp-0Fh]<br />0040106A 88 4D FC mov byte ptr [ebp-4],cl<br />11: a = p[1];<br />0040106D 8B 55 EC mov edx,dword ptr [ebp-14h]<br />00401070 8A 42 01 mov al,byte ptr [edx+1]<br />00401073 88 45 FC mov byte ptr [ebp-4],al<br />第一种在读取时直接就把字符串中的元素读到寄存器cl中，而第二种则要先把指针值读到edx中，在根据<br /><br />edx读取字符，显然慢了。<br /><br />2.7小结：<br />堆和栈的区别可以用如下的比喻来看出：<br />使用栈就象我们去饭馆里吃饭，只管点菜（发出申请）、付钱、和吃（使用），吃饱了就走，不必理会切<br /><br />菜、洗菜等准备工作和洗碗、刷锅等扫尾工作，他的好处是快捷，但是自由度小。<br />使用堆就象是自己动手做喜欢吃的菜肴，比较麻烦，但是比较符合自己的口味，而且自由度大。<br /><br />堆和栈的区别主要分：<br />操作系统方面的堆和栈，如上面说的那些，不多说了。<br />还有就是数据结构方面的堆和栈，这些都是不同的概念。这里的堆实际上指的就是（满足堆性质的）优先<br /><br />队列的一种数据结构，第1个元素有最高的优先权；栈实际上就是满足先进后出的性质的数学或数据结构<br /><br />。<br />虽然堆栈，堆栈的说法是连起来叫，但是他们还是有很大区别的，连着叫只是由于历史的原因。<br /><br />-----------------------------------------------------------------------------------------------------------------<br />      堆(heap)和栈(stack)是C/C++编程不可避免会碰到的两个基本概念。首先，这两个概念都可以在讲数<br /><br />据结构的书中找到，他们都是基本的数据结构，虽然栈更为简单一些。<br /><br />      在具体的C/C++编程框架中，这两个概念并不是并行的。对底层机器代码的研究可以揭示，栈是机器<br /><br />系统提供的数据结构，而堆则是C/C++函数库提供的。<br /><br />      具体地说，现代计算机(串行执行机制)，都直接在代码底层支持栈的数据结构。这体现在，有专门的<br /><br />寄存器指向栈所在的地址，有专门的机器指令完成数据入栈出栈的操作。这种机制的特点是效率高，支持<br /><br />的数据有限，一般是整数，指针，浮点数等系统直接支持的数据类型，并不直接支持其他的数据结构。因<br /><br />为栈的这种特点，对栈的使用在程序中是非常频繁的。对子程序的调用就是直接利用栈完成的。机器的<br /><br />call指令里隐含了把返回地址推入栈，然后跳转至子程序地址的操作，而子程序中的ret指令则隐含从堆<br /><br />栈中弹出返回地址并跳转之的操作。C/C++中的自动变量是直接利用栈的例子，这也就是为什么当函数返<br /><br />回时，该函数的自动变量自动失效的原因(因为堆栈恢复了调用前的状态)。<br /><br />      和栈不同，堆的数据结构并不是由系统(无论是机器系统还是操作系统)支持的，而是由函数库提供的<br /><br />。基本的malloc/realloc/free函数维护了一套内部的堆数据结构。当程序使用这些函数去获得新的内存<br /><br />空间时，这套函数首先试图从内部堆中寻找可用的内存空间，如果没有可以使用的内存空间，则试图利用<br /><br />系统调用来动态增加程序数据段的内存大小，新分配得到的空间首先被组织进内部堆中去，然后再以适当<br /><br />的形式返回给调用者。当程序释放分配的内存空间时，这片内存空间被返回内部堆结构中，可能会被适当<br /><br />的处理(比如和其他空闲空间合并成更大的空闲空间)，以更适合下一次内存分配申请。这套复杂的分配机<br /><br />制实际上相当于一个内存分配的缓冲池(Cache)，使用这套机制有如下若干原因：<br /><br />    1. 系统调用可能不支持任意大小的内存分配。有些系统的系统调用只支持固定大小及其倍数的内存<br /><br />请求(按页分配)；这样的话对于大量的小内存分类来说会造成浪费。<br /><br />    2. 系统调用申请内存可能是代价昂贵的。系统调用可能涉及用户态和核心态的转换。<br /><br />    3. 没有管理的内存分配在大量复杂内存的分配释放操作下很容易造成内存碎片。<br /><br />    堆和栈的对比<br /><br />    从以上知识可知，栈是系统提供的功能，特点是快速高效，缺点是有限制，数据不灵活；而堆是函数<br /><br />库提供的功能，特点是灵活方便，数据适应面广泛，但是效率有一定降低。栈是系统数据结构，对于进程<br /><br />/线程是唯一的；堆是函数库内部数据结构，不一定唯一。不同堆分配的内存逻辑上无法互相操作。栈空<br /><br />间分静态分配和动态分配两种。静态分配是编译器完成的，比如自动变量(auto)的分配。动态分配由<br /><br />alloca函数完成。栈的动态分配无需释放(是自动的)，也就没有释放函数。为可移植的程序起见，栈的动<br /><br />态分配操作是不被鼓励的！堆空间的分配总是动态的，虽然程序结束时所有的数据空间都会被释放回系统<br /><br />，但是精确的申请内存/释放内存匹配是良好程序的基本要素。<br /><br />四、参考资料：<br />1.堆与栈的区别<br />http://www.bloghome.cn/posts/52992<br /><br />2.内存分配中堆与栈的区别<br />http://blog.bioon.cn/user1/8688/archives/2006/53255.shtml<br /><br />http://blog.csdn.net/tiger406/archive/2006/09/07/1192110.aspx<br /><br />3.请问堆和栈有什么区别?-讨论答案,现在开始求慎解<br />http://www.cnblogs.com/liangqihui/archive/2005/07/29/202989.html<br /><br /><br /><br /><img src ="http://www.blogjava.net/flysky19/aggbug/95964.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/flysky19/" target="_blank">不断前进的小乌龟</a> 2007-01-25 15:55 <a href="http://www.blogjava.net/flysky19/articles/95964.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>创建二叉树－递归实现</title><link>http://www.blogjava.net/flysky19/articles/95754.html</link><dc:creator>不断前进的小乌龟</dc:creator><author>不断前进的小乌龟</author><pubDate>Wed, 24 Jan 2007 08:22:00 GMT</pubDate><guid>http://www.blogjava.net/flysky19/articles/95754.html</guid><wfw:comment>http://www.blogjava.net/flysky19/comments/95754.html</wfw:comment><comments>http://www.blogjava.net/flysky19/articles/95754.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/flysky19/comments/commentRss/95754.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/flysky19/services/trackbacks/95754.html</trackback:ping><description><![CDATA[一、引言：<br />   大三上学期学了数据结构后就没再接触过数据结构的内容了，至今已经整整两年半了，已经把链表，队列，堆栈，树，二叉树等内容忘得干干净净了，并且如果不是决定做《机器学习》的作业，自己丝毫没有意识到自己已经忘得干干净净，或者说是以前只是依样画葫芦的把二叉树的程序调出来了，但是根本就没有明白其中的原理！！<br /><br />二、做《机器学习》作业的时候，怎么也想不明白两个问题：<br />第一个问题：<br />"p-&gt;next"表示什么？p是一个指针，指针怎么会有next呢？应该Node结构体才有next指针呀。<br /><br />第二个问题：<br />怎么建立一棵树？杨惠说要传一个根结点，并返回该根结点，但是为什么要传一个根结点呢？返回一个根结点怎么就能表示一棵树了呢？？真是想不明白！！<br /><br />第三个问题：<br />建树函数buildTree()或者insert()，create()等需要设置几个参数？必须设置一个Node root参数吗？如果不设置root参数，怎么让它递归呢？<br /><br />三、解决：<br />第一个问题：<br />唉，太久没看指针了，或者说以前根本就没有理解什么是指针，指针变量，指针变量所指向的变量等概念，复习了一遍谭浩强的C语言的书，感觉第一个问题豁然开朗。原来"p-&gt;next"表示的是：p指针变量所指向的变量的next指针变量。<br /><br />第二个问题：<br />唉，看来以前根本没有理解二叉树，也没有理解递归方法，只因为吴平老师的一句“递归方法效率低”就完全不看递归了，真是傻瓜。不仅仅是递归，感觉自己连函数参数都不太理解，根本不知道什么时候需要参数，参数有何作用。更不用说明白一个函数的设计关键要清楚它传入什么参数，返回什么结果了。<br /><br />第三个问题：<br />至今仍然不太明白！似乎就是必须接受一个Node root参数。<br /><br />查了网上的递归建立二叉树的几个程序，它们分别是无参数、有一个参数、有两个参数的三种不同实现方法，从中终于领悟到什么时候需要参数，为什么需要参数了！可是第二、三个例子的一个参数和两个参数实际是一样的，只不过一个参数的例子用控制台输入数据而已。唉，还是不知道如果不设置一个Node root参数可不可实现建树。<br /><br />四、下面分别是这三个建立二叉树的程序：<br />1.无参数：http://www.51log.net/dev/603/4692612.htm<br />Tree *Create()<br />{<br />    char ch;<br />    cin&gt;&gt; ch;<br />    Tree *root;<br /><br />    if( ch == NIL )<br />    {<br />         return NULL;<br />    }<br />    else<br />    {<br />         root = new Tree(ch);<br />         root-&gt;left = Create();<br />         root-&gt;right = Create();<br />         return root;<br />    }<br />}<br />自己的注释：<br />Create函数：<br />输入：无<br />输出：一棵二叉树（根据返回的root根结点指针(注意不是root根结点，而是指针)就能访问到这棵树的所有结点了）<br /><br />2.一个参数：http://shakesmin.javaeye.com/blog/43107<br /># //创建二叉树   <br /># void CreateBiTree(BiTree &amp;t) {   <br />#     int ch=getchar();   <br />#     if(ch==' ') t=NULL;   <br />#     else {   <br />#         if( !( t=(BiTNode*)malloc(sizeof(BiTNode))) ) exit(OVERFLOW);   <br />#         t-&gt;data=ch;   <br />#         CreateBiTree(t-&gt;lchild);   <br />#         CreateBiTree(t-&gt;rchild);   <br />#     }   <br /># }   <br /><br />自己的注释：<br />CreateBiTree函数：<br />输入：根结点；<br />输出：一棵二叉树；（无返回值）<br /><br />注意：<br />这种方法传入根结点，但是没有返回值的原理。下面看一下它的使用方式就明白了：<br /># //递归遍历二叉树   <br /># void PreOrderTraverse(BiTree t) {   <br />#     if(t) {   <br />#         /* 以先序方式遍历,若要以中序或后序遍历  <br />#         只需改变以下三句顺序*/  <br />#         printf("%c ",t-&gt;data);   <br />#         PreOrderTraverse(t-&gt;lchild);   <br />#         PreOrderTraverse(t-&gt;rchild);   <br />#     }   <br /># }   <br /><br /># int main() {   <br />#     BiTree t;   <br />#     printf("请按先序正确输入二叉树(空格为空树):\n");   <br />#     CreateBiTree(t);   <br />#   <br />#     printf("先序历遍: ");   <br />#     PreOrderTraverse(t);   <br />#     return 0;   <br /># }  <br />明白了吧？原来是在main函数中定义了一个全局的根结点，以该根结点为基础建立二叉树和遍历二叉树，因此CreateBiTree中就不再需要返回root根结点指针才能访问该二叉树，它的PreOrderTraverse遍历函数传的直接是根结点，而第一个程序中遍历函数传的是指向root的指针变量。<br /><br />3.有两个参数：http://dev.csdn.net/article/68/68480.shtm<br />#include &lt;iostream.h&gt;<br />#ifndef DEBUG<br />#define DEBUG<br />typedef int DataType;<br />typedef struct Node<br />{<br />       DataType        data;<br />       struct Node  *LChild;<br />       struct Node  *RChild;<br />}Node;<br />/*树的数据结构*/<br />/////////////////////////////////////////////////////////////<br />Node * Initiate()<br />/*初始化为空树*/<br />{<br />       Node   *root = 0;<br />       return   root ;<br />}<br />/////////////////////////////////////////////////////////////<br />Node * Creat(  DataType data  )<br /> /*建节点*/<br />{<br />       Node   * Temp   = new Node ;<br />       Temp -&gt; data     = data ;<br />       Temp -&gt; LChild = 0 ;<br />       Temp -&gt; RChild = 0;<br />       return Temp ;<br />}<br /> <br />/************************************************/<br />void  Insert( Node *&amp;root , DataType data )<br />//在c下不能这样 Node *&amp;root<br />/* 降顺序二叉数装入数据，左子树&lt;右子树*/<br />{      <br />       Node *p = Creat( data );//注：该程序中此行代码在if前，如果要插入一个非root结点，则每次都要新创建两个结点，一进入insert()创建一个p，递归时又创建一次。如果把该语句放到if内也不对，因为else if( p-&gt;data &lt; root-&gt;data )时p就为空了。<br />       if( !root  )<br />       {      //Node *p = Creat( data ); //注：原程序逻辑不对，应该在if为真时才创建新结点；<br />              root = p;<br />            <br />       }<br />          else if( p-&gt;data &lt; root-&gt;data )<br />          {<br />                 Insert ( root-&gt;LChild , p-&gt;data );<br />          }<br />          else<br />          {<br />                 Insert ( root-&gt;RChild , p-&gt;data );<br />          } /*相等的 将装数据到右孩子 */<br />        <br />}<br />/****************************************************/<br /> void PrintTree(Node * root)<br /> /*递归中序遍历 ---&gt; 显示从小到大*/<br />{<br />       if( !root )  return ;<br />       PrintTree(root-&gt;LChild);<br />      <br />      cout&lt;&lt; root-&gt;data &lt;&lt;"  :";<br />      PrintTree( root-&gt;RChild );<br />      return ;<br />}<br /><br />自己的注释：<br />Insert函数：<br />输入：根结点和结点数据；<br />输出：一棵二叉树；（无返回值）<br /><br />注意：<br />同样，这种方式也传入了根结点来创建二叉树，并且函数没有返回root指针变量。再看它的使用方式：<br />///测试代码////////////<br />void main()<br />{ <br />       int a;<br />       Node *Root = Initiate() ;<br />       cout&lt;&lt;" -1 to exit: "&lt;&lt;endl;<br />       cin&gt;&gt;a;            <br />       while( (a != -1)&amp;&amp;cin.good() )<br />                 //遇到非法输入同样退出循环<br />       {     <br />              Insert( Root ,  a );<br />                       cin&gt;&gt;a ;                        <br />       }<br />         if(!cin.good())<br />                     //输出错误信息<br />         {<br />                     cout&lt;&lt;" the type is error ! "&lt;&lt;endl;<br />         }<br />          PrintTree(Root);<br />          cout&lt;&lt;" ok ? "&lt;&lt;endl;<br />           FreeTree(Root);//销毁树 防止内存泄漏<br />          return;<br />}<br /><br />现在明白了吧，也是在main中事先定义了一个root全局指针变量，然后把它做为参数建立二叉树和遍历二叉树。<br /><br />结合自己买的那本书《数据结构 算法与实现 C++描述》上的清晰描述，知道，一棵二叉树是数据在内存中的逻辑表示，需要有一个指向该二叉树的root根节点的指针变量来记录它的首地址，然后就能访问到该树的所有结点了。<br /><br />那么，这个根结点的指针变量在create()函数内定义呢（第一种无参的实现方式），还是在main函数中定义？——&gt;两种方式都可以！如果在create()函数内定义，则需要返回该root的指针变量，这样才能取得二叉树的首地址遍历该树；如果在main函数中定义，则在create(TreeNode *root)中添加一参数接受该首地址建立二叉树。ok！<br /><br /><br /><br />参考资料：<br />1. 二叉树的创建函数中对参数的疑问<br />http://www.51log.net/dev/603/4692612.htm<br /><br />2. 数据结构课程源代码之二叉树实现及相关算法<br />http://shakesmin.javaeye.com/blog/43107<br /><br />3. ::递归实现——创建二叉树 ----&gt; 装入数据---&gt;遍历---&gt; 显示 ---&gt;销毁::递归实现)  <br />http://dev.csdn.net/article/68/68480.shtm<br /><br /><br /><br /><br /><br /><img src ="http://www.blogjava.net/flysky19/aggbug/95754.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/flysky19/" target="_blank">不断前进的小乌龟</a> 2007-01-24 16:22 <a href="http://www.blogjava.net/flysky19/articles/95754.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Eclipse中报错“要了解详细信息，请使用-xlint:unchecked重新编译”的解决方案</title><link>http://www.blogjava.net/flysky19/articles/95583.html</link><dc:creator>不断前进的小乌龟</dc:creator><author>不断前进的小乌龟</author><pubDate>Tue, 23 Jan 2007 09:42:00 GMT</pubDate><guid>http://www.blogjava.net/flysky19/articles/95583.html</guid><wfw:comment>http://www.blogjava.net/flysky19/comments/95583.html</wfw:comment><comments>http://www.blogjava.net/flysky19/articles/95583.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/flysky19/comments/commentRss/95583.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/flysky19/services/trackbacks/95583.html</trackback:ping><description><![CDATA[
		<br />一、遇到问题：<br />用ant执行jasperreport的samples\charts示例的build.xml时，无法编译，提示错误如下：<br />javac:<br />    [javac] Compiling 2 source files to E:\jiangcm\workspace-forict-myeclipse\jasperreports\demo\samples\charts<br />    [javac] 注意： E:\jiangcm\workspace-forict-myeclipse\jasperreports\demo\samples\charts\ChartsApp.java 使用了未经检查或不安全的操作。<br />    [javac] 注意： 要了解详细信息，请使用 -Xlint:unchecked 重新编译。<br /><br />二、查了一下资料，知道是泛型的原因，网上查到的解决方案主要有以下几种：<br /><br />1.编译时带上参数-source 1.4<br />2.使用@SupressWarnings("unchecked")注释<br />3.更新你的代码，使用List&lt;Object&gt;. List&lt;Object&gt;的实例能接受任何类型的对象，就像是一个原型List。然而，编译器不会报错。<br />(以上三种方法来源：http://www.matrix.org.cn/resource/article/43/43634_java_generics.html）<br /><br />4.如果你用的Ant，使用build.xml编译的话，可以右击build.xml文件，<br />--&gt; 执行 --&gt; 构成和执行，选择 参数，在《程序参数》里面输入-xlint:unchecked即可;<br /><br />5.找到build.xml里面类似的语句，加上一句话：<br />&lt;!-- Java Compile --&gt;<br />&lt;target name="compile" depends="init"&gt;<br />&lt;javac srcdir="src" destdir="${classdir}"<br />deprecation="on" encoding="Windows-31J" debug="on" includes="**/jp/**"&gt;<br />&lt;compilerarg value="-Xlint:unchecked"/&gt; `&lt;!-- 就是这句话！！ --&gt;<br />&lt;classpath refid="project.class.path" /&gt;<br />&lt;/javac&gt;<br />&lt;/target&gt;<br />（以上两种方法来源：http://www.itwenku.com/java/12/47796.htm）<br /><br />三、自己的试验与结论<br /><br />第一种：<br />“编译时带上参数-source 1.4”使用方法：<br />找到build.xml里面类似的语句，加上一句话：<br />&lt;javac srcdir="${src.dir}" destdir="${classes.dir}" &gt;<br /> &lt;classpath refid="classpath"/&gt;<br /> &lt;compilerarg line="-source 1.5"/&gt; `&lt;!-- 就是这句话！注意与第五种方式不同的是line标签而不是value！ --&gt;<br />&lt;/javac&gt;<br />编译通过，charts下的报表出现了！<br /><br />第二种：<br />“使用@SupressWarnings("unchecked")注释”：<br />在ChartsApp.java的main函数前加上了这个注释，但是没有起作用，提示错误依然是“[javac] 注意： 要了解详细信息，请使用 -Xlint:unchecked 重新编译。”，怎么回事呢？<br /><br />在一篇文章中找到了答案：<br />http://www.matrix.org.cn/resource/article/43/43864_Generic_Types.html<br />在撰写本文时候，javac并不支持@SuppressWarnings 的注解。期望在Java 5.1中得到支持。 <br /><br />第三种：<br />更改代码为泛型使用方式：<br />原来的代码：<br />Map parameters = new HashMap();<br />parameters.put("MaxOrderID", new Integer(12500));<br /><br />更改后的代码：<br />Map&lt;String,Integer&gt; parameters = new HashMap&lt;String,Integer&gt; ();<br />parameters.put("MaxOrderID", new Integer(12500));<br />或者：<br />Map&lt;Object,Object&gt; parameters = new HashMap&lt;Object,Object&gt; ();<br />parameters.put("MaxOrderID", new Integer(12500));<br /><br />更改后，顺利通过编译，也能看到报表了！！<br /><br />第四种：<br />经验证无效；<br /><br />第五种：<br />&lt;javac srcdir="src" destdir="${classdir}"<br />deprecation="on" encoding="Windows-31J" debug="on" includes="**/jp/**"&gt;<br />&lt;compilerarg value="-Xlint:unchecked"/&gt; `&lt;!-- 就是这句话！！ --&gt;<br />&lt;classpath refid="project.class.path" /&gt;<br />&lt;/javac&gt;<br /><br />加上"&lt;compilerarg value="-Xlint:unchecked"/&gt;" 后，出现"警告",不过编译顺利通过，也能看到报表了！<br />编译提示如下：<br />    [javac] Compiling 2 source files to E:\jiangcm\workspace-forict-myeclipse\jasperreports\demo\samples\charts<br />    [javac] E:\jiangcm\workspace-forict-myeclipse\jasperreports\demo\samples\charts\ChartsApp.java:115: 警告： [unchecked] 对作为普通类型 java.util.Map 的成员的 put(K,V) 的调用未经检查<br />    [javac] parameters.put("MaxOrderID", new Integer(12500));<br />    [javac] ^<br />    [javac] 1 警告<br /><br /><br />呵呵，答案是丰富多彩的，条条大道通罗马，这次不仅解决了问题，还找到了四种解决问题的方法。<br /><br /><br />参考资料：<br />1.J2SE 5.0中的泛型<br />作者：Budi Kurniawan<br />http://www.matrix.org.cn/resource/article/43/43634_java_generics.html<br />2.Eclipse中报jsp中有错误“要了解详细信息，请使用-xlint:unchecked重新编译”，具体在菜单上怎么操作？<br />http://www.itwenku.com/java/12/47796.htm<br />3.泛型类型，第一部分<br />作者: David Flanagan<br />http://www.matrix.org.cn/resource/article/43/43864_Generic_Types.html<br />4.有关ant的faq<br />http://www.blogjava.net/luckyrobbie/articles/24117.html<br /><br />Q. How to pass -Xlint or -Xlint:unchecked to 1.5 javac task?<br />A: pass it as compilerarg nested &lt;compilerarg&gt; to specify.<br /><br />  &lt;compilerarg value="-Xlint"/&gt;<br />  &lt;!-- or --&gt;<br />  &lt;compilerarg value="-Xlint:unchecked"/&gt;<br /><br /><br /><img src ="http://www.blogjava.net/flysky19/aggbug/95583.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/flysky19/" target="_blank">不断前进的小乌龟</a> 2007-01-23 17:42 <a href="http://www.blogjava.net/flysky19/articles/95583.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>取字符串的最后几个字符</title><link>http://www.blogjava.net/flysky19/articles/93710.html</link><dc:creator>不断前进的小乌龟</dc:creator><author>不断前进的小乌龟</author><pubDate>Sun, 14 Jan 2007 02:13:00 GMT</pubDate><guid>http://www.blogjava.net/flysky19/articles/93710.html</guid><wfw:comment>http://www.blogjava.net/flysky19/comments/93710.html</wfw:comment><comments>http://www.blogjava.net/flysky19/articles/93710.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/flysky19/comments/commentRss/93710.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/flysky19/services/trackbacks/93710.html</trackback:ping><description><![CDATA[
		<p>2007年1月14日<br />java中没有直接可以从最后一个字符往前读取得子串的函数，那么如何取得字符</p>
		<p>串的最后几个字符呢？<br />查了一下资料和api，觉得可以用两种方法：<br />法一：<br />用循环直到结束，这样取得字符串的长度，然后再从长度往前取；<br />法二：<br />先取得前面的子串，然后再用replace方法；例如：<br />  String s1="abcde";<br />  String s2="abc";<br />  String s3="";<br />  s3=s1.replace(s2,"");<br />  System.out.println(s3);//s3="de";</p>
		<p>哈哈，自己真是太笨了，其实so easy！：<br />String subs = s.substring((s.length()-5),s.length());</p>
		<p>启发资料：<br />JavaScript 中如何取得一串字符串除后5个的其人全部<br /><a href="http://topic.csdn.net/t/20060110/15/4508133.html">http://topic.csdn.net/t/20060110/15/4508133.html</a></p>
		<p>String subs   =   s.substring(0,s.length-5);</p>
<img src ="http://www.blogjava.net/flysky19/aggbug/93710.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/flysky19/" target="_blank">不断前进的小乌龟</a> 2007-01-14 10:13 <a href="http://www.blogjava.net/flysky19/articles/93710.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于java中对数的计算</title><link>http://www.blogjava.net/flysky19/articles/93708.html</link><dc:creator>不断前进的小乌龟</dc:creator><author>不断前进的小乌龟</author><pubDate>Sun, 14 Jan 2007 01:21:00 GMT</pubDate><guid>http://www.blogjava.net/flysky19/articles/93708.html</guid><wfw:comment>http://www.blogjava.net/flysky19/comments/93708.html</wfw:comment><comments>http://www.blogjava.net/flysky19/articles/93708.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/flysky19/comments/commentRss/93708.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/flysky19/services/trackbacks/93708.html</trackback:ping><description><![CDATA[
		<p>2007年1月14日<br />关于java中对数的计算<br /><a href="http://dev.poptool.net/host/363/4468363638.shtml">http://dev.poptool.net/host/363/4468363638.shtml</a></p>
		<p>最近为了计算文档间的相关性需要用到对数的计算，在网上找到下面的方法：<br />其中的关键是：1 java标准包提供了自然对数的计算方法，2 其他的对数计算可</p>
		<p>以转换为自然对数的计算。</p>
		<p>下面是转贴：但不知道谁是原创作者。<br />后来搜索到这个连接：<br />还是人家有专业精神：<br />下面是他的描述：<br /> Java supplies a function to calculate natural logs, base e = </p>
		<p>2.718281828459045. To calculate logs to other bases, you need to </p>
		<p>multiply by a fixed constant: for a log base b multiply by 1/logeb </p>
		<p> </p>
		<p>　　Sun的J2SE提供了一个计算自然对数方法——double java.lang.Math.log</p>
		<p>(double)。请看如下代码：<br />　　double x = Math.log(5);<br />　　等价于下面的数学方程：<br />　　x = ln 5<br />　　或<br />　　x = loge5<br />　　其中e是内皮尔数或自然数。</p>
		<p>
				<br />　　如果你想算底不同的对数又该如何做呢？很遗憾，我们还没有办法计算以10</p>
		<p>为底或以2为底的对数。<br />    但是它们却是在计算对数时用的最多的。<br />    要想解决这个问题，我们就要回想曾经在学校里学过的数学和对数方程：<br />　　logx(y) =loge(x) / loge(y)<br />　　这只需一段简单的Java程序来实现：<br />　　public class Logarithm {<br />　　     static public double log(double value, double base) {<br />    　　 return Math.log(value) / Math.log(base);<br />　　     }<br />　　}<br />　　计算100的以10为底的对数就变为非常简单了：<br />　　double log = Logarithm.log(100, 10); // log is 2.0<br />　　512的以2为底的对数是：<br />　　double log = Logarithm.log(512, 2); // log is 9.0<br />　　下面的两个简单的方法也都是很有用的：<br />　　static public double log2(double value) {<br />　　 return log(value, 2.0);<br />　　 }<br />　　 static public double log10(double value) {<br />　　 return log(value, 10.0);<br />　　 } <br /></p>
<img src ="http://www.blogjava.net/flysky19/aggbug/93708.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/flysky19/" target="_blank">不断前进的小乌龟</a> 2007-01-14 09:21 <a href="http://www.blogjava.net/flysky19/articles/93708.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DecisionTree收获总结</title><link>http://www.blogjava.net/flysky19/articles/93707.html</link><dc:creator>不断前进的小乌龟</dc:creator><author>不断前进的小乌龟</author><pubDate>Sun, 14 Jan 2007 01:17:00 GMT</pubDate><guid>http://www.blogjava.net/flysky19/articles/93707.html</guid><wfw:comment>http://www.blogjava.net/flysky19/comments/93707.html</wfw:comment><comments>http://www.blogjava.net/flysky19/articles/93707.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/flysky19/comments/commentRss/93707.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/flysky19/services/trackbacks/93707.html</trackback:ping><description><![CDATA[2007年1月14日<br />DecisionTree收获总结<br />1.java.io;<br />2.真正理解了数组的作用；<br />3、array、ArrayList类、Arrays类的使用、关系、区别和互换；<br />4、相对路径与绝对路径；<br />5、HashTable、HashMap；ArrayList、Vector的区别。<br />6、如何读取文件，分析处理数据；<br />7、字符串处理，分割字符串，取子串等；<br />8、对数处理；（根据logx(y) =loge(x) / loge(y)求以2为底的对数）<br />9、第一次鼓起勇气去面对写程序，根据算法和说明，去理解、分析、并写代码；<img src ="http://www.blogjava.net/flysky19/aggbug/93707.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/flysky19/" target="_blank">不断前进的小乌龟</a> 2007-01-14 09:17 <a href="http://www.blogjava.net/flysky19/articles/93707.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>实现DecisionTree专题一：对6000多个属性的迷惑与解铃</title><link>http://www.blogjava.net/flysky19/articles/93501.html</link><dc:creator>不断前进的小乌龟</dc:creator><author>不断前进的小乌龟</author><pubDate>Fri, 12 Jan 2007 10:28:00 GMT</pubDate><guid>http://www.blogjava.net/flysky19/articles/93501.html</guid><wfw:comment>http://www.blogjava.net/flysky19/comments/93501.html</wfw:comment><comments>http://www.blogjava.net/flysky19/articles/93501.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/flysky19/comments/commentRss/93501.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/flysky19/services/trackbacks/93501.html</trackback:ping><description><![CDATA[实现DecisionTree专题一：对6000多个属性的迷惑与解铃<br /><br />起步做决策树分类器的作业，第一步当然是读取文件，取得所有行的数据；但是自己就在这停住了，总想<br /><br />着应该设计一个Sample类，这个类有6000多个属性，那么岂不是要定义6000多个变量？百思不得其解呀。<br /><br />后来问杨惠，杨惠说，定义一个数组就可以了，每次只需要找出熵最大的那个属性就可以。恍然大悟的感<br /><br />觉！<br /><br />自己可能之前一直在看UML的书，UML书上说一般先分析系统将会有哪些类，然后分析这些类的属性和方法<br /><br />等，同时要遵守单一职责原则（SRP）、开放－封闭原则（OCP）等；所以，自己现在很自然的想到要去分<br /><br />析实现这个决策树将会有什么类，然后Sample类就这样冒出来了。<br /><br />其实，UML只适合用于分析工程项目，并不适合用于分析算法类的程序，这个Bob大叔的《uml for java <br /><br />pro》书上也提到了。<br /><br />首先分析要解决什么事情，需要每一步做什么，再去考虑怎么写代码才是正确的。例如，构建<br /><br />decisiontree的第一步是求各个属性的熵（第二步是取熵的最大值），那么就想如何去求各个属性的熵就<br /><br />ok！而不是看着数据空想构造什么Sample类。因为decisiontree是以属性为基础的，无需构造样本类。<br /><br />原以为到此，自己已经弄明白了；学习和总结了数组与ArrayList的内容之后，才突然发现，原来自己的<br /><br />迷惑源于数组与ArrayList的迷惑！自己的语言功底太差了！就算是要定义一个样本类Sample类，这个类<br /><br />有6000多个属性，也只需要定义一个属性数组Attributes[]或者一个ArrayList attributes就ok了！这正<br /><br />是数组的作用！！看了良葛格的《java jdk5 学习笔记》的“数组”那章才忽然明白过来了！<br /><br /><br />补充内容：<br />1.为什么需要数组？<br />（《java jdk5.0 学习笔记》良葛格 http://book.csdn.net/bookfiles/135/1001354617.shtml）<br />例如，现在要整理全班的Java小考成绩，您希望写个小程序，全班共有40名学生，所以必须有40个变量来<br /><br />存储学生的成绩。现在问题来了，根据第3章学过的变量定义方式，难道要定义40个名称不同的变量来存<br /><br />储学生的成绩数据吗？<br /><br />当然不必这么麻烦，Java提供“数组”(Array)让您可以定义一个以“索引”(Index)作为识别的数据结构<br /><br />。在Java中，可以这么定义一个数组并初始数组内容：<br /><br />int[] score = {90, 85, 55, 94, 77};<br /><br /><br />2.ArrayList可以置入任意数据类型，包括数组；例如，可以置入String[]类型的对象。因为ArrayList本<br /><br />身就是数组，在ArrayList中置入数组，也就相当于一个二维数组。<br /><br />在java中，数组也是对象，二维数组的实际是连续存放一维数组对象的各个reference。<br /><br /><br /><br />受启发的资料：<br />ArrayList&lt;String[]&gt;如何导出为String[][]?<br />http://www.mysdn.cn/Java/J2SEjichulei/20060914/9172.html<br /><br />《java jdk5.0 学习笔记》良葛格 第五章 数组<br /> http://book.csdn.net/bookfiles/135/1001354617.shtml<br /><br /><br /><br /><br /><br /><br /><img src ="http://www.blogjava.net/flysky19/aggbug/93501.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/flysky19/" target="_blank">不断前进的小乌龟</a> 2007-01-12 18:28 <a href="http://www.blogjava.net/flysky19/articles/93501.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java 使用相对路径读取文件</title><link>http://www.blogjava.net/flysky19/articles/93492.html</link><dc:creator>不断前进的小乌龟</dc:creator><author>不断前进的小乌龟</author><pubDate>Fri, 12 Jan 2007 09:44:00 GMT</pubDate><guid>http://www.blogjava.net/flysky19/articles/93492.html</guid><wfw:comment>http://www.blogjava.net/flysky19/comments/93492.html</wfw:comment><comments>http://www.blogjava.net/flysky19/articles/93492.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/flysky19/comments/commentRss/93492.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/flysky19/services/trackbacks/93492.html</trackback:ping><description><![CDATA[java 使用相对路径读取文件<br /><br />1.java project环境，使用java.io用相对路径读取文件的例子：<br /> *目录结构：<br />  DecisionTree<br />            |___src<br />                 |___com.decisiontree.SamplesReader.java<br />            |___resource<br />                 |___train.txt,test.txt<br /> *SamplesReader.java:<br />  String filepath="resource/train.txt";//注意filepath的内容；<br />  File file=new File(filepath);<br />  ……<br /><br /> *我们留意filepath的内容，java.io默认定位到当前用户目录("user.dir")下，即：工程根目<br /><br />录"D:\DecisionTree"下，因此，此时的相对路径(以user.dir为基路径的路径)为"resource/train.txt"<br /><br />。这样，JVM就可以根据"user.dir"与"resource/train.txt"得到完整的路径（即绝对路<br /><br />径）"D:\DecisionTree\resource\train.txt"，从来找到train.txt文件。<br /><br /> *注意：相对路径的起始处无斜杆"/";例如：<br />filepath="resource/train.txt";<br />而不是filepath="/resource/train.txt"; //error!<br /><br />2、javaEE环境，使用Classloader用相对路径读取xml的例子：<br /> *参见之前写的文章“通过虚拟路径或相对路径读取一个xml文件，避免硬编码”。<br /><br /> *内容如下：<br /> java使用相对路径读取xml文件：<br />一、xml文件一般的存放位置有三个：<br />1.放在WEB-INF下；<br />2.xml文件放在/WEB-INF/classes目录下或classpath的jar包中；<br />3.放在与解析它的java类同一个包中，不一定是classpath；<br /><br />二、相对应的两种使用相对路径的读取方法：<br /><br />方法一：（未验证）<br />将xml文件放在WEB-INF目录下，然后<br />程序代码：<br />InputStream is=getServletContext().getResourceAsStream( "/WEB-INF/xmlfile.xml" );<br /><br />方法二：将xml文件放在/WEB-INF/classes目录下或classpath的jar包中，则可以使用ClassLoader的静态<br /><br />方法getSystemResourceAsStream(String s)读取；<br />程序代码：<br />String s_xmlpath="com/spf/web/ext/hotspot/hotspotxml/hotspot.xml";<br />InputStream in=ClassLoader.getSystemResourceAsStream(s_xmlpath);<br /><br />方法三：xml在随意某个包路径下：<br />String s_xmlpath="com/spf/web/ext/hotspot/hotspotxml/hotspot.xml";<br />ClassLoader classLoader=HotspotXmlParser.class.getClassLoader();<br />InputStream in=classLoader.getResourceAsStream(s_xmlpath);<br /><br /><br /><br /><img src ="http://www.blogjava.net/flysky19/aggbug/93492.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/flysky19/" target="_blank">不断前进的小乌龟</a> 2007-01-12 17:44 <a href="http://www.blogjava.net/flysky19/articles/93492.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>array专题三：Arrays类操纵java中的数组</title><link>http://www.blogjava.net/flysky19/articles/93480.html</link><dc:creator>不断前进的小乌龟</dc:creator><author>不断前进的小乌龟</author><pubDate>Fri, 12 Jan 2007 08:41:00 GMT</pubDate><guid>http://www.blogjava.net/flysky19/articles/93480.html</guid><wfw:comment>http://www.blogjava.net/flysky19/comments/93480.html</wfw:comment><comments>http://www.blogjava.net/flysky19/articles/93480.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/flysky19/comments/commentRss/93480.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/flysky19/services/trackbacks/93480.html</trackback:ping><description><![CDATA[array专题三：Arrays类操纵java中的数组<br /><br />使用java.util.Arrays类排序和查找数组<br /><br />1.以下代码演示程序初始化一个整数数组然后调用Arrays.sort升序排序那个数组。<br /><br />   1.<br />   2.     import java.util.Arrays;<br />   3.<br />   4.     public class ArrayDemo1 {<br />   5.         public static void main(String args[]) {<br />   6.             int vec[] = {37, 47, 23, -5, 19, 56};<br />   7.             Arrays.sort(vec);<br />   8.             for (int i = 0; i &lt; vec.length; i++) {<br />   9.                 System.out.println(vec[i]);<br />  10.             }<br />  11.         }<br />  12.     } <br /><br /><br />2.类似的，你可以在排完序的数组上进行二分法查找：<br /><br />   1.<br />   2.     import java.util.Arrays;<br />   3.<br />   4.     public class ArrayDemo2 {<br />   5.         public static void main(String args[]) {<br />   6.             int vec[] = {-5, 19, 23, 37, 47, 56};<br />   7.             int slot = Arrays.binarySearch(vec, 35);<br />   8.             slot = -(slot + 1);<br />   9.             System.out.println("insertion point = " + slot);<br />  10.         }<br />  11.     } <br /><br /><br />这个程序有个微妙的概念，如果二分法查找失败它将返回：<br /><br />    -(insertion point) - 1<br /><br />这个演示程序以参数35调用查找方法，而那个参数在数组中不存在，方法返回值－4，如果这个值加一再<br /><br />取其负数就得到3，这就是35应该被插入到数组中的位置，换言之，值-5, 19和23在数组中占据的位置是0<br /><br />，1和2。因此值35应该在索引3的位置，而37, 47以及56顺延。搜索方法并不进行实际的插入操作而只是<br /><br />指出应该在何处插入。<br /><br /><br />参考资料：<br />JDK核心API——操纵java中的数组<br />http://java.ccidnet.com/art/3737/20060627/589715_1.html<br /><br /><img src ="http://www.blogjava.net/flysky19/aggbug/93480.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/flysky19/" target="_blank">不断前进的小乌龟</a> 2007-01-12 16:41 <a href="http://www.blogjava.net/flysky19/articles/93480.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>array专题二：array与ArrayList的转换</title><link>http://www.blogjava.net/flysky19/articles/93476.html</link><dc:creator>不断前进的小乌龟</dc:creator><author>不断前进的小乌龟</author><pubDate>Fri, 12 Jan 2007 08:25:00 GMT</pubDate><guid>http://www.blogjava.net/flysky19/articles/93476.html</guid><wfw:comment>http://www.blogjava.net/flysky19/comments/93476.html</wfw:comment><comments>http://www.blogjava.net/flysky19/articles/93476.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/flysky19/comments/commentRss/93476.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/flysky19/services/trackbacks/93476.html</trackback:ping><description><![CDATA[array专题二：array与ArrayList的转换（《corejava卷2》110页）<br /><br />由于java平台API的很大一部分都是在集合框架建立之前设计的，因此有时候需要在传统的数组与现代的<br />集合之间进行转换。<br /><br />*如果你有一个数组，就需要将它转化为一个集合，Arrays.asList包装器能够实现这个目的，例如：<br />String[] values=...;<br />HashSet&lt;String&gt; staff=new HashSet&lt;String&gt;(Arrays.asList(values));<br /><br />*反过来，如果要从集合得到数组，操作起来就稍微麻烦一些。当然，你也可以直接使用toArray方法：<br /> Object[] values=staff.toArray();<br /> 但是该方法运行的结果是得到一个Object的数组。即使知道集合包含一组具体类型的对象，也不能使用<br /> 类型转换：<br /> String[] values=(String[])staff.toArray();//error!<br /> toArray方法返回的数组是一个Object[]数组，你无法改变它的类型。相反，你必须使用toArray方法的<br />某种变体，为它赋予一个长度为0的你要使用的类型的数组。然后，返回的数组就是与该类型相同的数组了。<br /> String[] values=staff.toArray(new String[0]);<br /> 如果你愿意，你还可以构建一个指定大小的数组：<br /> staff.toArray(new String[staff.size()]);<br /> 在这种情况下，并没有创建任何新的数组。<br /><br /><br /><img src ="http://www.blogjava.net/flysky19/aggbug/93476.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/flysky19/" target="_blank">不断前进的小乌龟</a> 2007-01-12 16:25 <a href="http://www.blogjava.net/flysky19/articles/93476.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>array专题一：数组（array）与ArrayList的主要区别：效率、类型识别和primitive type。</title><link>http://www.blogjava.net/flysky19/articles/93467.html</link><dc:creator>不断前进的小乌龟</dc:creator><author>不断前进的小乌龟</author><pubDate>Fri, 12 Jan 2007 08:03:00 GMT</pubDate><guid>http://www.blogjava.net/flysky19/articles/93467.html</guid><wfw:comment>http://www.blogjava.net/flysky19/comments/93467.html</wfw:comment><comments>http://www.blogjava.net/flysky19/articles/93467.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/flysky19/comments/commentRss/93467.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/flysky19/services/trackbacks/93467.html</trackback:ping><description><![CDATA[array专题一：数组（array）与ArrayList的主要区别：效率、类型识别和primitive type。<br /><br />1.自己的总结：<br />1）精辟阐述：（《TIJ》第323页）<br />初学者可以将ArrayList想象成一种“会自动扩增容量的array”。<br /><br />2）array（[]）：最高效；但是其容量固定且无法动态改变；<br />ArrayList：容量可动态增长；但牺牲效率；<br /><br />3）建议：（《TIJ》第292页）<br />基于效率和类型检验，应尽可能使用array，无法确定数组大小时才使用ArrayList！<br /><br />不过当你试着解决更一般化的问题时，array的功能就可能过于受限。<br /><br />4）java中一切皆对象，array也是对象。不论你所使用得array型别为何，array名称本身实际上是个reference，指向heap之内得某个实际对象。这个对象可经由“array初始化语法”被自动产生，也可以以new表达式手动产生。（《TIJ》第292页）<br /><br />5）array可做为函数返回值，因为它本身是对象的reference；（《TIJ》第295页）<br /><br />6)对象数组与基本类型数组在运用上几乎一模一样，唯一差别在于，前者持有得是reference，后者直接持有基本型别之值；（《TIJ》第292页）<br />eg.<br />Employee[] staff=new Employee[100];<br />int[] num=new int[10];<br /><br />7）容器所持有的其实是一个个reference指向Object，进而才能存储任意型别。当然这不包括基本型别，因为基本型别并不继承自任何classes。（《TIJ》第323页）<br /><br />8）面对array，我们可以直接持有基本型别数值的array（eg.int[] num;),也可以持有reference（指向对象）的array；但是容器类仅能持有reference（指向对象），若要将基本型别置于容器内，需要使用wrapper类。但是wrapper类使用起来可能不很容易上手，此外，primitives array得效率比起“容纳基本型别之外覆类（的reference）”的容器好太多了。<br /><br />当然，如果你的操作对象是基本型别，而且需要在空间不足时自动扩增容量，array便不适合，此时就得使用外覆类的容器了。<br />（《TIJ》第295页）<br /><br />自己的注释：<br />jdk5可以自动装包和解包，似乎感觉不到外覆类的存在了。<br /><br />9）某些情况下，容器类即使没有转型至原来的型别，仍然可以运作无误。有一种情况尤其特别：编译器对String class提供了一些额外的支持，使它可以平滑运作。（《TIJ》第325页）<br /><br />10）你可能会认为应该针对各种基本类型都提供一份特殊版的ArrayList，但java并未如此。有朝一日，某种模板机制也许能帮助java更妥善的处理此一问题。（《TIJ》第295页）<br /><br />自己的注释：<br />jdk5已经支持泛型，相当于不仅可以“针对各种基本类型都提供一份特殊版的ArrayList”，并且可以“针对所有型别（包括用户自定义的类，如Employee类）都提供一份特殊版的ArrayList”。<br /><br />这样，“不能识别型别”已经不再ArrayList的劣势，把不正确的对象置于容器内就会发生编译器错误；而不像以前那样编译期不发生错误，执行期才产生异常，可能会产生难以查觉的程序臭虫。<br /><br />此外，泛型支持的实现原理可以从“《TIJ》第326页”的“制作一个具有型别意识的ArrayList”的例子中领悟到一二。<br /><br />11）对数组的一些基本操作，像排序、搜索与比较等是很常见的。因此在Java中提供了Arrays类协助这几个操作：sort(),binarySearch(),equals(),fill(),asList().<br />（《Java JDK 5.0学习笔记》http://book.csdn.net/bookfiles/135/1001354621.shtml）<br /><br />自己的注释：<br />不过Arrays类没有提供删除方法，而ArrayList中有remove()方法，不知道是否是不需要在array中做删除等操作的原因（因为此时应该使用链表）。<br /><br />12）ArrayList的使用也很简单：产生ArrayList，利用add()将对象置入，利用get(i）配合索引值将它们取出。这一切就和array的使用方式完全相同，只不过少了[]而已。（《TIJ》第323页）<br /><br />2.参考资料：<br />1）效率：<br />数组扩容是对ArrayList效率影响比较大的一个因素。<br />每当执行Add、AddRange、Insert、InsertRange等添加元素的方法，都会检查内部数组的容量是否不够了，如果是，它就会以当前容量的两倍来重新构建一个数组，将旧元素Copy到新数组中，然后丢弃旧数组，在这个临界点的扩容操作，应该来说是比较影响效率的。<br /><br />ArrayList是Array的复杂版本<br />ArrayList内部封装了一个Object类型的数组，从一般的意义来说，它和数组没有本质的差别，甚至于ArrayList的许多方法，如Index、IndexOf、Contains、Sort等都是在内部数组的基础上直接调用Array的对应方法。<br /><br />2）类型识别：<br />ArrayList存入对象时，抛弃类型信息，所有对象屏蔽为Object，编译时不检查类型，但是运行时会报错。<br /><br />注：jdk5中加入了对泛型的支持，已经可以在使用ArrayList时进行类型检查。<br /><br /><br />从这一点上看来，ArrayList与数组的区别主要就是由于动态增容的效率问题了<br /><br /><br />3）ArrayList可以存任何Object，如String，Employee等，但不支持基本数据类型，除非使用wrapper。<br /><br /><img src ="http://www.blogjava.net/flysky19/aggbug/93467.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/flysky19/" target="_blank">不断前进的小乌龟</a> 2007-01-12 16:03 <a href="http://www.blogjava.net/flysky19/articles/93467.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java native方法</title><link>http://www.blogjava.net/flysky19/articles/93455.html</link><dc:creator>不断前进的小乌龟</dc:creator><author>不断前进的小乌龟</author><pubDate>Fri, 12 Jan 2007 07:32:00 GMT</pubDate><guid>http://www.blogjava.net/flysky19/articles/93455.html</guid><wfw:comment>http://www.blogjava.net/flysky19/comments/93455.html</wfw:comment><comments>http://www.blogjava.net/flysky19/articles/93455.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/flysky19/comments/commentRss/93455.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/flysky19/services/trackbacks/93455.html</trackback:ping><description><![CDATA[2007年1月12日<br /><br />java native方法是指本地方法，当在方法中调用一些不是由java语言写的代码或者在方法中用java语言<br />直接操纵计算机硬件时要声明为native方法。<br /><br />java中，通过JNI(Java Native Interface,java本地接口）来实现本地化。<br /><br /><br /><br /><br />参考资料：<br /><br />1.JAVA中native方法<br />http://karoii.bokee.com/5869823.html<br /><br />2.JNI<br />http://wiki.matrix.org.cn/Wiki.jsp?page=JNI<br /><br />3.用JNI调用C或C++动态联接库原来如此简单<br />http://blog.matrix.org.cn/david_w_johnson/<br /><br /><br />4.http://myblog.workgroup.cn/blogs/java/<br />Native方法一般用于两种情况：<br /><br />1）在方法中调用一些不是由java语言写的代码。<br /><br />2）在方法中用java语言直接操纵计算机硬件。<br /><br />Other than being implemented in native code, native methods are like all other methods: they <br /><br />can be overloaded, overridden, final, static, synchronized, public, protected, or private. A <br /><br />native method cannot, however, be declared abstract or strictfp.<br /><br />如果使用了native方法也就丢失了java的方便性和安全性。Native方法的执行依赖于JVM的设计者，比如<br /><br />在sun的JVM中，可以通过JNI(Java Native Interface) API接口来实现本地化。<br /><br /><img src ="http://www.blogjava.net/flysky19/aggbug/93455.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/flysky19/" target="_blank">不断前进的小乌龟</a> 2007-01-12 15:32 <a href="http://www.blogjava.net/flysky19/articles/93455.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ClassLoader主要用于加载类文件，利用反射（newInstance())生成类实例等，那么它可以用于加载xml、txt文件等吗？</title><link>http://www.blogjava.net/flysky19/articles/93432.html</link><dc:creator>不断前进的小乌龟</dc:creator><author>不断前进的小乌龟</author><pubDate>Fri, 12 Jan 2007 06:42:00 GMT</pubDate><guid>http://www.blogjava.net/flysky19/articles/93432.html</guid><wfw:comment>http://www.blogjava.net/flysky19/comments/93432.html</wfw:comment><comments>http://www.blogjava.net/flysky19/articles/93432.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/flysky19/comments/commentRss/93432.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/flysky19/services/trackbacks/93432.html</trackback:ping><description><![CDATA[
		<p>2007年1月12日<br /></p>
		<p>问题：</p>
		<p>ClassLoader主要用于加载类文件，利用反射（newInstance())生成类实例等，那么它可以用于加载xml、txt文件等吗？</p>
		<p>
				<br />
		</p>
		<p>解答：</p>
		<p>可以。只是它与java.io相比，定位的初始路径不同；当然各自的功能也各有侧重，java.io侧重于与磁盘文件打交道，而ClassLoader侧重于与.class文件打交道；java.io更适合于纯java project，而ClassLoader更适合于web project。</p>
		<p>详细见前面写的“j<font size="4">ava读取文件的两种方法：java.io和java.lang.ClassLoader”一文。</font></p>
<img src ="http://www.blogjava.net/flysky19/aggbug/93432.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/flysky19/" target="_blank">不断前进的小乌龟</a> 2007-01-12 14:42 <a href="http://www.blogjava.net/flysky19/articles/93432.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HashMap与HashTable,ArrayList与Vector的主要区别</title><link>http://www.blogjava.net/flysky19/articles/93409.html</link><dc:creator>不断前进的小乌龟</dc:creator><author>不断前进的小乌龟</author><pubDate>Fri, 12 Jan 2007 06:00:00 GMT</pubDate><guid>http://www.blogjava.net/flysky19/articles/93409.html</guid><wfw:comment>http://www.blogjava.net/flysky19/comments/93409.html</wfw:comment><comments>http://www.blogjava.net/flysky19/articles/93409.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/flysky19/comments/commentRss/93409.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/flysky19/services/trackbacks/93409.html</trackback:ping><description><![CDATA[
		<br />HashMap与HashTable的主要区别是什么？为什么都推荐使用HashMap？那么HashTable还有用武之地吗？什么时候才使用HashTable呢？<br />ArrayList与Vector的区别是否也一样呢？<br /><br />答：<br />1.以下内容来自：（《corejava 卷2》第119页）<br />Hashtable类的作用与HashMap类是相同的，实际上它们拥有相同的接口。与Vector类的方法一样，Hashtable类的各个方法也是同步的。如果你不需要同步也不需要与遗留代码相兼容，你就应该使用HashMap类。<br /><br />注意：Hashtable的类名字，table的"t"是小写，在windows系统，如果你使用HashTable，会报出一些奇怪的出错信息，因为windows文件系统不区分大小写，而java编译器则是区分大小写的。<br /><br />自己注释：<br />自己也查了jdk5的api证实了一下，HashMap与HashTable都实现了相同的接口，这两个类拥有一模一样的方法，不过它们不是继承自同一个类。<br />HashMap：<br />java.lang.Object<br />  java.util.AbstractMap&lt;K,V&gt;<br />      java.util.HashMap&lt;K,V&gt;<br /><script language="JScript" src="/jdk150/H2HHinclude.js"></script>All Implemented Interfaces: <br />Serializable, Cloneable, Map&lt;K,V&gt; <br /><br />Hashtable:<br />java.lang.Object<br />  java.util.Dictionary&lt;K,V&gt;<br />      java.util.Hashtable&lt;K,V&gt;<br />All Implemented Interfaces: <br />Serializable, Cloneable, Map&lt;K,V&gt; <br /><br />2.以下内容来自：（《corejava》卷2第88页）<br />现在为什么要用ArrayList类来代替Vector了呢？原因很简单：Vector类的所有方法都是同步的。你可以用两个线程安全的访问Vector对象。但是，如果你只用单个线程来访问Vector对象——这是更加常见的情况——那么你的代码将会在同步操作上浪费相当多的时间。相反，ArrayList类的方法不是同步的。因此我们建议你在不需要同步时使用ArrayList而不是Vector。<br /><br />自己注释：ArrayList与Vector也都是实现相同的接口，并且继承自相同的AbstractList类；它们的方法几乎也一模一样。<br />ArrayList类：<br />java.lang.Object<br />  java.util.AbstractCollection&lt;E&gt;<br />      java.util.AbstractList&lt;E&gt;<br />          java.util.ArrayList&lt;E&gt;<br />All Implemented Interfaces: <br />Serializable, Cloneable, Iterable&lt;E&gt;, Collection&lt;E&gt;, List&lt;E&gt;, RandomAccess <br /><br />Vector类：<br />java.lang.Object<br />  java.util.AbstractCollection&lt;E&gt;<br />      java.util.AbstractList&lt;E&gt;<br />          java.util.Vector&lt;E&gt;<br />All Implemented Interfaces: <br />Serializable, Cloneable, Iterable&lt;E&gt;, Collection&lt;E&gt;, List&lt;E&gt;, RandomAccess <br /><br /><br /><img src ="http://www.blogjava.net/flysky19/aggbug/93409.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/flysky19/" target="_blank">不断前进的小乌龟</a> 2007-01-12 14:00 <a href="http://www.blogjava.net/flysky19/articles/93409.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>uri与url的区别（zz）</title><link>http://www.blogjava.net/flysky19/articles/93379.html</link><dc:creator>不断前进的小乌龟</dc:creator><author>不断前进的小乌龟</author><pubDate>Fri, 12 Jan 2007 04:04:00 GMT</pubDate><guid>http://www.blogjava.net/flysky19/articles/93379.html</guid><wfw:comment>http://www.blogjava.net/flysky19/comments/93379.html</wfw:comment><comments>http://www.blogjava.net/flysky19/articles/93379.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/flysky19/comments/commentRss/93379.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/flysky19/services/trackbacks/93379.html</trackback:ping><description><![CDATA[自己的总结：<br />uri：Web上可用的每种资源 - HTML文档、图像、视频片段、程序等 - 由一个通过通<br />用资源标志符（Universal Resource Identifier, 简称"URI"）进行定位。 <br />语法如下：<br />    [scheme:] scheme-specific-part <br />例如：<br />http://www.ruc.edu.cn(url);<br />mailto:jeff@javajeff.com、news:comp.lang.java.help和xyz://whatever。<br /><br />url：是uri的一个子集；通俗地说，URL是Internet上用来描述信息资源的字符串，主要用在各种WWW客户程序和服务器程序上，特别是著名的Mosaic。<br />例如：<br />
http://www.ruc.edu.cn;<br /><br />参考资料：<br /><h4>URI、URL和URN之间的区别与联系</h4>
      http://www.cnlei.org/blog/article.asp?id=356<br /><br />
    URI：Uniform Resource Identifier，统一资源标识符；<br />URL：Uniform Resource Locator，统一资源定位符；<br />URN：Uniform Resource Name，统一资源名称。<br />其中，<b>URL,URN是URI的子集</b>。<br />     Web上地址的基本形式是URI,它代表统一资源标识符。有两种形式：<br />     URL：目前URI的最普遍形式就是无处不在的URL或统一资源定位器。<br />     URN：URL的一种更新形式，统一资源名称(URN, Uniform Resource Name)不依赖于位置，并且有可能减少失效连接的个数。但是其流行还需假以时日，因为它需要更精密软件的支持。<br />     URI是以某种统一的（标准化的）方式标识资源的简单字符串。<br />     URI一般由三部分组成：<br />     1. 访问资源的命名机制。 <br />     2. 存放资源的主机名。 <br />     3. 资源自身的名称，由路径表示。 <br />    典型情况下，这种字符串以scheme（命名URI的名字空间的标识符——一组相关的名称）开头，语法如下：<br />    [scheme:] scheme-specific-part <br />
URI以scheme和冒号开头。Scheme用大写/小写字母开头，后面为空或者跟着更多的大写/小写字母、数字、加号、减号和点号。冒号把
scheme与scheme-specific-part分开了，并且scheme-specific-part的语法和语义（意思）由URI的名字空间
决定。如下面的例子：<br />    http://www.cnn.com，其中http是scheme，//www.cnn.com是 scheme-specific-part，并且它的scheme与scheme-specific-part被冒号分开了。<br />
URI有绝对和相对之分，绝对的URI指以scheme（后面跟着冒号）开头的URI。前面提到的http://www.cnn.com就是绝对的URI
的一个例子，其它的例子还有mailto:jeff@javajeff.com、news:comp.lang.java.help和xyz:
//whatever。你可以把绝对的URI看作是以某种方式引用某种资源，而这种方式对标识符出现的环境没有依赖。如果使用文件系统作类比，绝对的
URI类似于从根目录开始的某个文件的径。 <br /> 与绝对的URI不同的，相对的URI不是以scheme（后面跟着冒号）开始的URI。
它的一个例子是articles/articles.html。你可以把相对的URI看作是以某种方式引用某种资源，而这种方式依赖于标识符出现的环境。
如果用文件系统作类比，相对的URI类似于从当前目录开始的文件路径。<br /><br /> URL是Uniform Resource
Location的缩写，译为"统一资源定位符"。通俗地说，URL是Internet上用来描述信息资源的字符串，主要用在各种WWW客户程序和服务器
程序上，特别是著名的Mosaic。采用URL可以用一种统一的格式来描述各种信息资源，包括文件、服务器的地址和目录等。 <br />     URL的格式由下列三部分组成： <br />     第一部分是协议（或称为服务方式）； <br />     第二部分是存有该资源的主机IP地址（有时也包括端口号）； <br />     第三部分是主机资源的具体地址。，如目录和文件名等。 <br />     第一部分和第二部分之间用"：//"符号隔开，第二部分和第三部分用"/"符号隔开。第一部分和第二部分是不可缺少的，第三部分有时可以省略。<br />
目前最大的缺点是当信息资源的存放地点发生变化时，必须对URL作相应的改变。因此人们正在研究新的信息资源表示方法，例如：URI(Universal
Resource Identifier)即"通用资源标识"（参见RFC 1630）、URN（Uniform Resource
Name）即"统一资源名"和URC（Uniform Resource Citation）即"统一资源引用符"等。<br />      URI目前还处在进一步的研究当中。研究的方向就是弥补URL目前存在的缺点。<br /><img src ="http://www.blogjava.net/flysky19/aggbug/93379.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/flysky19/" target="_blank">不断前进的小乌龟</a> 2007-01-12 12:04 <a href="http://www.blogjava.net/flysky19/articles/93379.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java读取文件的两种方法：java.io和java.lang.ClassLoader</title><link>http://www.blogjava.net/flysky19/articles/93280.html</link><dc:creator>不断前进的小乌龟</dc:creator><author>不断前进的小乌龟</author><pubDate>Thu, 11 Jan 2007 14:58:00 GMT</pubDate><guid>http://www.blogjava.net/flysky19/articles/93280.html</guid><wfw:comment>http://www.blogjava.net/flysky19/comments/93280.html</wfw:comment><comments>http://www.blogjava.net/flysky19/articles/93280.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/flysky19/comments/commentRss/93280.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/flysky19/services/trackbacks/93280.html</trackback:ping><description><![CDATA[
		<br />java读取文件的两种方法：java.io和java.lang.ClassLoader<br /><br />什么时候使用java.io，什么时候使用java.lang.ClassLoader呢？<br />（注：要是之前读xml文件时清晰知道java读取文件有这两种方法就好了！可以少走很多去理解相对路径<br />的弯路！）<br /><br />自己的总结：<br />*java.io:相对于当前用户目录的相对路径读取；注重与磁盘文件打交道或者纯java project中使用。<br />（虽然ClassLoader方式更通用，但是如果不是javaEE环境，要定位到classpath路径下去读文件是不合理<br />的。）<br />*java.lang.ClassLoader:相对于classpath的相对路径读取；建议在javaEE环境中都使用这种方式。<br /><br /><br />整理资料一：http://www.code168.com/bbs/html/2005-12-9/23554625833.html<br />问：<br />java打成jar包的后续问题！！！！如何在读取jar包里面的配置文件？<br />答1：<br />如果用java.util.ResourceBundle就不用担心什么，它本来就是从class  loader  folder/jar文件里找<br />properties文件。  <br />如果你已经注意到了，java取文件有两种方法，java.util.io和java.lang.ClassLoader两种。  <br />java.io:  <br />     File  file  =  new  File("...");  <br />     FileInputStream  fis  =  new  FileInputStream("...");  <br />     FileReader  fr  =  new  FileReader("...");  <br />ClassLoader:  <br />     ClassLoader  loader  =  XXXClass.class.getClassLoader();  <br />     or  <br />     ClassLoader  loader  =  Thread.currentThread().getContextClassLoader();  <br />     URL  url  =  loader.getResource("...");  <br />     File  file  =  new  File(url.getFile());  <br />     InputStream  input  =  loader.getResourceAsStream("...");  <br />这两种，一种是从project  loader  folder取，一种是从class  loader  folder取，class  loader  <br />folder包括jar文件。  <br />我想你应该明白了吧？自己写个程序test一下就知道了。<br /><br />答2：<br />File  file  =  new  File(url.getFile());不是用在你这种情况的。  <br />一般情况既然classloader已经拿到resource,就没有必要画蛇添足地再转成File.  <br />转成File事实上是为了拿到绝对路径，我们碰到过这么一种情况。  <br />一个Web  application,用tomcat启动，tomcat会建一个application  folder,folder下面有一个web-inf <br /><br /> folder,再下面是classes目录，classes目录下面是所有的java  classes.程序需要用一个property文件<br /><br />记录数据，用io  package只能定位到绝对路径，用class  loader可以是相对路径，不管tomcat在客户电<br /><br />脑上任何位置，但是，如果写文件在classes  folder下面，tomcat会reload  web  server,页面会重载<br /><br />。为了定位到application  folder,与web-inf并列，先用classloader,再转成file拿到全路径，去掉后<br /><br />面不需要的folder,就可以拿到 tomecat建的web  application的绝对路径。  <br />与你的情况不同的是，classloader定位到的文件，不在jar里头。我认为用java  io不可以定到jar里面<br /><br />。<br /><br />整理资料二：<br />Java路径问题最终解决方案<br />http://www.matrix.org.cn/thread.shtml?topicId=6d0bbeed-9157-11db-ab77-<br /><br />2bbe780ebfbf&amp;forumId=19<br /><br />一、相对于当前用户目录的相对路径<br />就是相对于System.getProperty("user.dir")返回的路径。<br />对于一般项目，这是项目的根路径。对于JavaEE服务器，这可能是服务器的某个路径。这个并没有统一的<br /><br />规范！<br />所以，绝对不要使用“相对于当前用户目录的相对路径”。然而：<br />默认情况下，java.io 包中的类总是根据当前用户目录来分析相对路径名。此目录由系统属性 user.dir <br /><br />指定，通常是 Java 虚拟机的调用目录。<br />这就是说，在使用java.io包中的类时，最好不要使用相对路径。否则，虽然在J2SE应用程序中可能还算<br /><br />正常，但是到了J2EE程序中，一定会出问题！而且这个路径，在不同的服务器中都是不同的！<br /><br />二、相对于classpath的相对路径<br />如：相对于<br />file:/D:/java/eclipse32/workspace/jbpmtest3/bin/这个路径的相对路径。其中，bin是本项目的<br /><br />classpath。所有的Java源文件编译后的.class文件复制到这个目录中。<br /><br /><br />三、相对路径最佳实践<br />推荐使用相对于当前classpath的相对路径<br />因此，我们在使用相对路径时，应当使用相对于当前classpath的相对路径。<br />ClassLoader类的getResource(String name),getResourceAsStream(String name)等方法，使用相对于当<br /><br />前项目的classpath的相对路径来查找资源。<br />读取属性文件常用到的ResourceBundle类的getBundle(String path)也是如此。<br />通过查看ClassLoader类及其相关类的源代码，我发现，它实际上还是使用了URI形式的绝对路径。通过得<br /><br />到当前classpath的URI形式的绝对路径，构建了相对路径的URI形式的绝对路径。（这个实际上是猜想，<br /><br />因为JDK内部调用了SUN的源代码，而这些代码不属于JDK，不是开源的。）<br /><br />四、相对路径本质上还是绝对路径<br />因此，归根结底，Java本质上只能使用绝对路径来寻找资源。所有的相对路径寻找资源的方法，都不过是<br /><br />一些便利方法。不过是API在底层帮助我们构建了绝对路径，从而找到资源的！<br /><br /><br /><img src ="http://www.blogjava.net/flysky19/aggbug/93280.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/flysky19/" target="_blank">不断前进的小乌龟</a> 2007-01-11 22:58 <a href="http://www.blogjava.net/flysky19/articles/93280.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java路径问题最终解决方案（zz）</title><link>http://www.blogjava.net/flysky19/articles/93278.html</link><dc:creator>不断前进的小乌龟</dc:creator><author>不断前进的小乌龟</author><pubDate>Thu, 11 Jan 2007 14:41:00 GMT</pubDate><guid>http://www.blogjava.net/flysky19/articles/93278.html</guid><wfw:comment>http://www.blogjava.net/flysky19/comments/93278.html</wfw:comment><comments>http://www.blogjava.net/flysky19/articles/93278.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/flysky19/comments/commentRss/93278.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/flysky19/services/trackbacks/93278.html</trackback:ping><description><![CDATA[来自：http://www.matrix.org.cn/thread.shtml?topicId=6d0bbeed-9157-11db-ab77-2bbe780ebfbf&amp;forumId=19<br /><br />Java路径问题最终解决方案<br />                                                                                                           —可定位所有资源的相对路径寻址<br />-------------------------------------------------------- <br />前言<br />Java的路径问题，非常难搞。最近的工作涉及到创建和读取文件的工作，这里我就给大家彻底得解决Java路径问题。<br />我
编写了一个方法，比ClassLoader.getResource(String
相对路径)方法的能力更强。它可以接受“../”这样的参数，允许我们用相对路径来定位classpath外面的资源。这样，我们就可以使用相对于
classpath的路径，定位所有位置的资源！<br /><br />Java路径<br />Java中使用的路径，分为两种：绝对路径和相对路径。具体而言，又分为四种：<br />一、URI形式的绝对资源路径<br />如：file:/D:/java/eclipse32/workspace/jbpmtest3/bin/aaa.b<br />URL是URI的特例。URL的前缀/协议，必须是Java认识的。URL可以打开资源，而URI则不行。<br />URL和URI对象可以互相转换，使用各自的toURI(),toURL()方法即可！<br /><br />二、本地系统的绝对路径<br />D:/java/eclipse32/workspace/jbpmtest3/bin/aaa.b<br />Java.io包中的类，需要使用这种形式的参数。<br />但是，它们一般也提供了URI类型的参数，而URI类型的参数，接受的是URI样式的String。因此，通过URI转换，还是可以把URI样式的绝对路径用在java.io包中的类中。<br /><br />三、相对于classpath的相对路径<br />如：相对于<br />file:/D:/java/eclipse32/workspace/jbpmtest3/bin/这个路径的相对路径。其中，bin是本项目的classpath。所有的Java源文件编译后的.class文件复制到这个目录中。<br /><br /><br />四、相对于当前用户目录的相对路径<br />就是相对于System.getProperty("user.dir")返回的路径。<br />对于一般项目，这是项目的根路径。对于JavaEE服务器，这可能是服务器的某个路径。这个并没有统一的规范！<br />所以，绝对不要使用“相对于当前用户目录的相对路径”。然而：<br />默认情况下，java.io 包中的类总是根据当前用户目录来分析相对路径名。此目录由系统属性 user.dir 指定，通常是 Java 虚拟机的调用目录。<br />这就是说，在使用java.io包中的类时，最好不要使用相对路径。否则，虽然在J2SE应用程序中可能还算正常，但是到了J2EE程序中，一定会出问题！而且这个路径，在不同的服务器中都是不同的！<br /><br />相对路径最佳实践<br />推荐使用相对于当前classpath的相对路径<br />因此，我们在使用相对路径时，应当使用相对于当前classpath的相对路径。<br />ClassLoader类的getResource(String name),getResourceAsStream(String name)等方法，使用相对于当前项目的classpath的相对路径来查找资源。<br />读取属性文件常用到的ResourceBundle类的getBundle(String path)也是如此。<br />通
过查看ClassLoader类及其相关类的源代码，我发现，它实际上还是使用了URI形式的绝对路径。通过得到当前classpath的URI形式的绝
对路径，构建了相对路径的URI形式的绝对路径。（这个实际上是猜想，因为JDK内部调用了SUN的源代码，而这些代码不属于JDK，不是开源的。）<br /><br />相对路径本质上还是绝对路径<br />因此，归根结底，Java本质上只能使用绝对路径来寻找资源。所有的相对路径寻找资源的方法，都不过是一些便利方法。不过是API在底层帮助我们构建了绝对路径，从而找到资源的！<br /><br />得到classpath和当前类的绝对路径的一些方法<br />    下面是一些得到classpath和当前类的绝对路径的一些方法。你可能需要使用其中的一些方法来得到你需要的资源的绝对路径。<br />1，FileTest.class.getResource("")<br />得到的是当前类FileTest.class文件的URI目录。不包括自己！<br />如：file:/D:/java/eclipse32/workspace/jbpmtest3/bin/com/test/<br />2，FileTest.class.getResource("/")<br />得到的是当前的classpath的绝对URI路径。<br />如：file:/D:/java/eclipse32/workspace/jbpmtest3/bin/<br />3，Thread.currentThread().getContextClassLoader().getResource("")<br />得到的也是当前ClassPath的绝对URI路径。<br />如：file:/D:/java/eclipse32/workspace/jbpmtest3/bin/<br />4，FileTest.class.getClassLoader().getResource("")<br />得到的也是当前ClassPath的绝对URI路径。<br />如：file:/D:/java/eclipse32/workspace/jbpmtest3/bin/<br />5，ClassLoader.getSystemResource("")<br />得到的也是当前ClassPath的绝对URI路径。<br />如：file:/D:/java/eclipse32/workspace/jbpmtest3/bin/<br />    <br />我推荐使用Thread.currentThread().getContextClassLoader().getResource("")来得到当前的classpath的绝对路径的URI表示法。<br /><br />Web应用程序中资源的寻址<br />    上文中说过，当前用户目录，即相对于System.getProperty("user.dir")返回的路径。<br />对于JavaEE服务器，这可能是服务器的某个路径，这个并没有统一的规范！<br />而不是我们发布的Web应用程序的根目录！<br />这样，在Web应用程序中，我们绝对不能使用相对于当前用户目录的相对路径。<br />在Web应用程序中，我们一般通过ServletContext.getRealPath("/")方法得到Web应用程序的根目录的绝对路径。<br />这样，我们只需要提供相对于Web应用程序根目录的路径，就可以构建出定位资源的绝对路径。<br />这是我们开发Web应用程序时一般所采取的策略。<br /><br />通用的相对路径解决办法<br />Java中各种相对路径非常多，不容易使用，非常容易出错。因此，我编写了一个便利方法，帮助更容易的解决相对路径问题。<br /><br />Web应用程序中使用JavaSE运行的资源寻址问题<br />在JavaSE程序中，我们一般使用classpath来作为存放资源的目的地。但是，在Web应用程序中，我们一般使用classpath外面的WEB-INF及其子目录作为资源文件的存放地。<br />在Web应用程序中，我们一般通过ServletContext.getRealPath("/")方法得到Web应用程序的根目录的绝对路径。这样，我们只需要提供相对于Web应用程序根目录的路径，就可以构建出定位资源的绝对路径。<br />Web应用程序，可以作为Web应用程序进行发布和运行。但是，我们也常常会以JavaSE的方式来运行Web应用程序的某个类的main方法。或者，使用JUnit测试。这都需要使用JavaSE的方式来运行。<br />这样，我们就无法使用ServletContext.getRealPath("/")方法得到Web应用程序的根目录的绝对路径。<br />而JDK提供的ClassLoader类，<br />它的getResource(String name),getResourceAsStream(String name)等方法，使用相对于当前项目的classpath的相对路径来查找资源。<br />读取属性文件常用到的ResourceBundle类的getBundle(String path)也是如此。<br />它们都只能使用相对路径来读取classpath下的资源，无法定位到classpath外面的资源。<br />Classpath外配置文件读取问题<br />如，我们使用测试驱动开发的方法，开发Spring、Hibernate、iBatis等使用配置文件的Web应用程序，就会遇到问题。<br />尽管Spring自己提供了FileSystem（也就是相对于user,dir目录）来读取Web配置文件的方法，但是终究不是很方便。而且与Web程序中的代码使用方式不一致！<br />至于Hibernate，iBatis就更麻烦了！只有把配置文件移到classpath下，否则根本不可能使用测试驱动开发！<br /><br />    这怎么办？<br /><br />通用的相对路径解决办法<br />面
对这个问题，我决定编写一个助手类ClassLoaderUtil，提供一个便利方法[public static URL
getExtendResource(String
relativePath)]。在Web应用程序等一切Java程序中，需要定位classpath外的资源时，都使用这个助手类的便利方法，而不使用
Web应用程序特有的ServletContext.getRealPath("/")方法来定位资源。<br /><br />利用classpath的绝对路径，定位所有资源<br />这个便利方法的实现原理，就是“利用classpath的绝对路径，定位所有资源”。<br />ClassLoader类的getResource("")方法能够得到当前classpath的绝对路径，这是所有Java程序都拥有的能力，具有最大的适应性！<br />而目前的JDK提供的ClassLoader类的getResource(String 相对路径)方法，只能接受一般的相对路径。这样，使用ClassLoader类的getResource(String 相对路径)方法就只能定位到classpath下的资源。<br />如果，它能够接受“../”这样的参数，允许我们用相对路径来定位classpath外面的资源，那么我们就可以定位位置的资源！<br />当
然，我无法修改ClassLoader类的这个方法，于是，我编写了一个助手类ClassLoaderUtil类，提供了[public static
URL getExtendResource(String
relativePath)]这个方法。它能够接受带有“../”符号的相对路径，实现了自由寻找资源的功能。<br /><br />通过相对classpath路径实现自由寻找资源的助手类的源代码：<br />import java.io.IOException;<br />import java.io.InputStream;<br />import java.net.MalformedURLException;<br />import java.net.URL;<br />import java.util.Properties;<br /><br />import org.apache.commons.logging.Log;<br />import org.apache.commons.logging.LogFactory;<br /><br />/**<br /> *@author沈东良shendl_s@hotmail.com<br /> *Nov29,2006 10:34:34AM<br /> *用来加载类，ｃｌａｓｓｐａｔｈ下的资源文件，属性文件等。<br /> *getExtendResource(StringrelativePath)方法，可以使用../符号来加载classpath外部的资源。<br /> */<br />publicclass ClassLoaderUtil {<br />    privatestatic Log log=LogFactory.getLog(ClassLoaderUtil.class);<br />    /**<br />     *Thread.currentThread().getContextClassLoader().getResource("")<br />     */<br />    <br />    /**<br />     *加载Java类。 使用全限定类名<br />     *@paramclassName<br />     *@return<br />     */<br />    publicstatic Class loadClass(String className) {<br />        try {<br />          return getClassLoader().loadClass(className);<br />        } catch (ClassNotFoundException e) {<br />          thrownew RuntimeException("class not found '"+className+"'", e);<br />        }<br />     }<br />     /**<br />       *得到类加载器<br />       *@return<br />       */<br />     publicstatic ClassLoader getClassLoader() {<br />     <br />        return ClassLoaderUtil.class.getClassLoader();<br />     }<br />     /**<br />       *提供相对于classpath的资源路径，返回文件的输入流<br />       *@paramrelativePath必须传递资源的相对路径。是相对于classpath的路径。如果需要查找classpath外部的资源，需要使用../来查找<br />       *@return 文件输入流<br />     *@throwsIOException<br />     *@throwsMalformedURLException<br />       */<br />     publicstatic InputStream getStream(String relativePath) throws MalformedURLException, IOException {<br />         if(!relativePath.contains("../")){<br />             return getClassLoader().getResourceAsStream(relativePath);<br />             <br />         }else{<br />             return ClassLoaderUtil.getStreamByExtendResource(relativePath);<br />         }<br />        <br />     }<br />     /**<br />       *<br />       *@paramurl<br />       *@return<br />       *@throwsIOException<br />       */<br />     publicstatic InputStream getStream(URL url) throws IOException{<br />         if(url!=null){<br />             <br />                return url.openStream();<br />            <br />             <br />         }else{<br />             returnnull;<br />         }<br />     }<br />     /**<br />       *<br />       *@paramrelativePath必须传递资源的相对路径。是相对于classpath的路径。如果需要查找classpath外部的资源，需要使用../来查找<br />       *@return<br />       *@throwsMalformedURLException<br />       *@throwsIOException<br />       */<br />     publicstatic InputStream getStreamByExtendResource(String relativePath) throws MalformedURLException, IOException{<br />        return ClassLoaderUtil.getStream(ClassLoaderUtil.getExtendResource(relativePath));<br />         <br />         <br />     }<br />     <br />      /**<br />       *提供相对于classpath的资源路径，返回属性对象，它是一个散列表<br />       *@paramresource<br />       *@return<br />       */<br />     publicstatic Properties getProperties(String resource) {<br />        Properties properties = new Properties();<br />        try {<br />          properties.load(getStream(resource));<br />        } catch (IOException e) {<br />          thrownew RuntimeException("couldn't load properties file '"+resource+"'", e);<br />        }<br />        return properties;<br />     }<br />     /**<br />       *得到本Class所在的ClassLoader的Classpat的绝对路径。<br />       *URL形式的<br />       *@return<br />       */<br />     publicstatic String getAbsolutePathOfClassLoaderClassPath(){<br />         <br />         <br />         ClassLoaderUtil.log.info(ClassLoaderUtil.getClassLoader().getResource("").toString());<br />         return ClassLoaderUtil.getClassLoader().getResource("").toString();<br />         <br />     }<br />     /**<br />       *<br />       *@paramrelativePath 必须传递资源的相对路径。是相对于classpath的路径。如果需要查找classpath外部的资源，需要使用../来查找<br />       *@return资源的绝对URL<br />     *@throwsMalformedURLException<br />       */<br />     publicstatic URL getExtendResource(String relativePath) throws MalformedURLException{<br />     <br />         ClassLoaderUtil.log.info("传入的相对路径："+relativePath) ;<br />         //ClassLoaderUtil.log.info(Integer.valueOf(relativePath.indexOf("../"))) ;<br />         if(!relativePath.contains("../")){<br />             return ClassLoaderUtil.getResource(relativePath);<br />             <br />         }<br />         String classPathAbsolutePath=ClassLoaderUtil.getAbsolutePathOfClassLoaderClassPath();<br />         if(relativePath.substring(0, 1).equals("/")){<br />             relativePath=relativePath.substring(1);<br />         }<br />         ClassLoaderUtil.log.info(Integer.valueOf(relativePath.lastIndexOf("../"))) ;<br />        <br />         String wildcardString=relativePath.substring(0,relativePath.lastIndexOf("../")+3);<br />        relativePath=relativePath.substring(relativePath.lastIndexOf("../")+3);<br />         int containSum=ClassLoaderUtil.containSum(wildcardString, "../");<br />         classPathAbsolutePath= ClassLoaderUtil.cutLastString(classPathAbsolutePath, "/", containSum);<br />         String resourceAbsolutePath=classPathAbsolutePath+relativePath;<br />         ClassLoaderUtil.log.info("绝对路径："+resourceAbsolutePath) ;<br />         URL resourceAbsoluteURL=new URL(resourceAbsolutePath);<br />         return resourceAbsoluteURL;<br />     }<br />     /**<br />      *<br />       *@paramsource<br />       *@paramdest<br />       *@return<br />       */<br />     privatestaticint containSum(String source,String dest){<br />         int containSum=0;<br />         int destLength=dest.length();<br />         while(source.contains(dest)){<br />             containSum=containSum+1;<br />             source=source.substring(destLength);<br />             <br />         }<br />         <br />         <br />         return containSum;<br />     }<br />     /**<br />       *<br />       *@paramsource<br />       *@paramdest<br />       *@paramnum<br />       *@return<br />       */<br />     privatestatic String cutLastString(String source,String dest,int num){<br />         // String cutSource=null;<br />         for(int i=0;i&lt;num;i++){<br />             source=source.substring(0, source.lastIndexOf(dest, source.length()-2)+1);<br />             <br />             <br />         }<br />         <br />         <br />         <br />         return source;<br />     }<br />     /**<br />       *<br />       *@paramresource<br />       *@return<br />       */<br />      publicstatic URL getResource(String resource){<br />      ClassLoaderUtil.log.info("传入的相对于classpath的路径："+resource) ;<br />         return ClassLoaderUtil.getClassLoader().getResource(resource);<br />     }<br />     <br /><br />     <br /><br />    /**<br />     *@paramargs<br />     *@throwsMalformedURLException<br />     */<br />    publicstaticvoid main(String[] args) throws MalformedURLException {<br />        <br />            //ClassLoaderUtil.getExtendResource("../spring/dao.xml");<br />        //ClassLoaderUtil.getExtendResource("../../../src/log4j.properties");<br />        ClassLoaderUtil.getExtendResource("log4j.properties");<br />        <br />        System.out.println(ClassLoaderUtil.getClassLoader().getResource("log4j.properties").toString());<br /><br />    }<br /><br />}<br /><br />后记<br />ClassLoaderUtil类的public static URL getExtendResource(String relativePath)，虽然很简单，但是确实可以解决大问题。<br />不过这个方法还是比较简陋的。我还想在未来有空时，进一步增强它的能力。比如，增加Ant风格的匹配符。用**代表多个目录，*代表多个字符，？代表一个字符。达到Spring那样的能力，一次返回多个资源的URL，进一步方便大家开发。<br /><br />总结：<br />1，尽量不要使用相对于System.getProperty("user.dir")当前用户目录的相对路径。这是一颗定时炸弹，随时可能要你的命。<br />2，尽量使用URI形式的绝对路径资源。它可以很容易的转变为URI,URL，File对象。<br />3，
尽量使用相对classpath的相对路径。不要使用绝对路径。使用上面ClassLoaderUtil类的public static URL
getExtendResource(String
relativePath)方法已经能够使用相对于classpath的相对路径定位所有位置的资源。<br />4，绝对不要使用硬编码的绝对路径。因为，我们完全可以使用ClassLoader类的getResource("")方法得到当前classpath的绝对路径。<br />使用硬编码的绝对路径是完全没有必要的！它一定会让你死的很难看！程序将无法移植！<br />如果你一定要指定一个绝对路径，那么使用配置文件，也比硬编码要好得多！<br />当然，我还是推荐你使用程序得到classpath的绝对路径来拼资源的绝对路径！<br /><br /><img src ="http://www.blogjava.net/flysky19/aggbug/93278.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/flysky19/" target="_blank">不断前进的小乌龟</a> 2007-01-11 22:41 <a href="http://www.blogjava.net/flysky19/articles/93278.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>String int Integer间的转换(zz)</title><link>http://www.blogjava.net/flysky19/articles/92976.html</link><dc:creator>不断前进的小乌龟</dc:creator><author>不断前进的小乌龟</author><pubDate>Wed, 10 Jan 2007 09:44:00 GMT</pubDate><guid>http://www.blogjava.net/flysky19/articles/92976.html</guid><wfw:comment>http://www.blogjava.net/flysky19/comments/92976.html</wfw:comment><comments>http://www.blogjava.net/flysky19/articles/92976.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/flysky19/comments/commentRss/92976.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/flysky19/services/trackbacks/92976.html</trackback:ping><description><![CDATA[http://hanric.spaces.live.com/blog/cns!b758f6a5183497ed!117.entry<br /><br /><b>注：如果使用JDK5.0的话，JVM会自动完成装包解包的。</b><h4 style="margin-bottom: 0px;" class="TextColor1" id="subjcns!b758f6a5183497ed!117">String int Integer间的转换</h4><div id="msgcns!b758f6a5183497ed!117"><ul><li> 如何将字串 String 转换成整数 int? </li></ul><p>int i = Integer.valueOf(my_str).intValue(); </p><p>int i=Integer.parseInt(str);</p><ul><li>如何将字串 String 转换成Integer ?</li></ul><p>Integer integer=Integer.valueOf(str);</p><ul><li>如何将整数 int 转换成字串 String ? </li></ul><div>1.) String s = String.valueOf(i);</div><div> </div><div>2.) String s = Integer.toString(i); </div><div> </div><div>3.) String s = "" + i; </div><ul><li>如何将整数 int 转换成Integer ? </li></ul><p>Integer integer=new Integer(i);</p><ul><li>如何将Integer 转换成字串 String ? </li></ul><p>Integer integer＝String</p><ul><li>如何将Integer 转换成 int ? </li></ul><p>int num=Integer.intValue();</p><ul><li>如何将String转换成  BigDecimal  ? </li></ul><p> BigDecimal d_id = new BigDecimal(str);</p><p>//-----------------日期-------------------------</p><p>Calendar calendar=Calendar.getInstance();<br />  int year=calendar.get(Calendar.YEAR);<br />  int month=calendar.get(Calendar.MONTH)+1;<br />  int day=calendar.get(Calendar.DATE);</p><p>获取今天的日期字符串<br />String today=java.text.DateFormat.getDateInstance().format(new java.util.Date());<br />获取今天的日期<br />new java.sql.Date(System.currentTimeMillis())</p></div><br /><br /><img src ="http://www.blogjava.net/flysky19/aggbug/92976.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/flysky19/" target="_blank">不断前进的小乌龟</a> 2007-01-10 17:44 <a href="http://www.blogjava.net/flysky19/articles/92976.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数组与ArrayList的关系与区别</title><link>http://www.blogjava.net/flysky19/articles/92775.html</link><dc:creator>不断前进的小乌龟</dc:creator><author>不断前进的小乌龟</author><pubDate>Tue, 09 Jan 2007 14:55:00 GMT</pubDate><guid>http://www.blogjava.net/flysky19/articles/92775.html</guid><wfw:comment>http://www.blogjava.net/flysky19/comments/92775.html</wfw:comment><comments>http://www.blogjava.net/flysky19/articles/92775.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/flysky19/comments/commentRss/92775.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/flysky19/services/trackbacks/92775.html</trackback:ping><description><![CDATA[一、数组与ArrayList的主要区别：效率、类型识别和primitive type。<br />数组（[]）：最高效；但是其容量固定且无法动态改变；<br />ArrayList：容量可动态增长；但牺牲效率；<br />建议：<br />首先使用数组，无法确定数组大小时才使用ArrayList！<br /><br /><br />1.效率：<br />数组扩容是对ArrayList效率影响比较大的一个因素。<br />每当执行Add、AddRange、Insert、InsertRange等添加元素的方法，都会检查内部数组的容量是否不够了，如果是，它就会以当前容量的两倍来重新构建一个数组，将旧元素Copy到新数组中，然后丢弃旧数组，<br /><br />在这个临界点的扩容操作，应该来说是比较影响效率的。<br /><br />ArrayList是Array的复杂版本<br />ArrayList内部封装了一个Object类型的数组，从一般的意义来说，它和数组没有本质的差别，甚至于<br /><br />ArrayList的许多方法，如Index、IndexOf、Contains、Sort等都是在内部数组的基础上直接调用Array的对应方法。<br /><br />2.类型识别：<br />ArrayList存入对象时，抛弃类型信息，所有对象屏蔽为Object，编译时不检查类型，但是运行时会报错。<br /><br />注：jdk5中加入了对泛型的支持，已经可以在使用ArrayList时进行类型检查。<br /><br />从这一点上看来，ArrayList与数组的区别主要就是由于动态增容的效率问题了<br /><br /><br />3.ArrayList可以存任何Object，如String，Employee等，但不支持基本数据类型，除非使用wrapper。<br /><br />二、数组与ArrayList的转换（有待补充：见《corejava》110页）<br />1.ArrayList转换为数组：<br />ArrayList转换String[]<br />ArrayList list = new ArrayList();list.add(&amp;quot;a&amp;quot;);list.add(&amp;quot;b&amp;quot;);list.add<br /><br />(&amp;quot;c&amp;quot;);System.out.println(&amp;quot;a=&amp;quot;+list);String[] b=(String[])list.toArray<br /><br />(new String[0]);<br /><br />2.数组转换为ArrayList（有待补充）<br /><br />三、Arrays类操纵java中的数组（有待补充）<br />http://java.ccidnet.com/art/3737/20060627/589715_1.html<br /><br />四、实现DecisionTree时对ArrayList与String[]的迷惑与解铃（有待补充）<br /><br />http://www.mysdn.cn/Java/J2SEjichulei/20060914/9172.html<br /><br />（实际为数组与ArrayList的迷惑）<br /><br />五、其他<br />1.数组和ArrayList都表示可以存一组同类型的对象；都使用下标定位和查找元素；<br />2.数组的定义：<br />int[] num=new int[10];<br />Employee[] staff=new Employee[100];<br /><br />3.ArrayList的使用：<br />List lst＝new ArrayList();<br />lst.add(employee);<br /><br />4.起初并没有Arrays类（？？不记得在哪看到了，不确定），Arrays类是为了方便数组的一些常用的共同<br /><br />操作而实现的。<br /><br />5.ArrayList详解：<br />http://my.opera.com/wujianrong/blog/index.dml/tag/ArrayList<br /><br />http://blog.csdn.net/realasker/<br /><br />6.J2SE 5.0中的泛型<br />http://www.javanb.com/j2se/1/5246.html<br /><br /><br /><br /><br /><br /><br /><img src ="http://www.blogjava.net/flysky19/aggbug/92775.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/flysky19/" target="_blank">不断前进的小乌龟</a> 2007-01-09 22:55 <a href="http://www.blogjava.net/flysky19/articles/92775.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Arrays类学习（zz）</title><link>http://www.blogjava.net/flysky19/articles/92768.html</link><dc:creator>不断前进的小乌龟</dc:creator><author>不断前进的小乌龟</author><pubDate>Tue, 09 Jan 2007 14:15:00 GMT</pubDate><guid>http://www.blogjava.net/flysky19/articles/92768.html</guid><wfw:comment>http://www.blogjava.net/flysky19/comments/92768.html</wfw:comment><comments>http://www.blogjava.net/flysky19/articles/92768.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/flysky19/comments/commentRss/92768.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/flysky19/services/trackbacks/92768.html</trackback:ping><description><![CDATA[
		<span id="ArticleContent1_ArticleContent1_lblContent">
				<font face="Simsun">http://dev.csdn.net/article/33/33116.shtm<br /><br />在论坛和生活中总是碰到不停的找</font>
				<span lang="EN-US">JAVA</span>
				<span style="font-family: SimSun;">排序和查找算法的人，问哪里有源代码，呵呵。其实</span>
				<span lang="EN-US">JAVA</span>
				<span style="font-family: SimSun;">本身给大家提供了一个很好的类，那就是</span>
				<span lang="EN-US">Arrays</span>
				<span style="font-family: SimSun;">。</span>
				<span lang="EN-US">Arrays</span>
				<span style="font-family: SimSun;">隶属书</span>
				<span lang="EN-US">The Collections Framework</span>
				<span style="font-family: SimSun;">。这个类提供了数组的填充，查找，比较，排序等一系列的对数组的操作。</span>
				<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
						<b style="">
								<span style="font-family: SimSun;">
										<br />
										<font size="4">一</font>
								</span>
								<font size="4">
								</font>
						</b>
						<b style="">
								<span style="font-family: SimSun;">
										<font size="4">填充：</font>
								</span>
								<span lang="EN-US">
										<o:p>
										</o:p>
								</span>
						</b>
				</p>
				<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
						<span lang="EN-US">Arrays.fill(</span>
						<span style="font-size: 12pt; font-family: SimSun;" lang="EN-US">type[] a, type</span>
						<span lang="EN-US"> val)</span>
						<span style="font-family: SimSun;">系列方法是给，数组填充。就是简单的把一个数组全部或者某段数据填成一个特殊的值。</span>
				</p>
				<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
						<span lang="EN-US">
								<o:p>
										<br />
								</o:p>
						</span>
				</p>
				<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
						<font size="4">
								<b style="">
										<span style="font-family: SimSun;">二</span>
								</b>
								<b style="">
										<span style="font-family: SimSun;">查找：</span>
										<span lang="EN-US">
												<o:p>
												</o:p>
										</span>
								</b>
						</font>
				</p>
				<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
						<span style="font-size: 12pt; font-family: SimSun;" lang="EN-US">binarySearch(type[] a, type key)</span>
						<span style="font-size: 12pt; font-family: SimSun;">系列方法是，在某类型的数组中用<span lang="EN-US">2</span>分法查找特定的<span lang="EN-US">Key</span>的元素，返回元素号。前提是这个数组是经过排序的，如果有多个元素和<span lang="EN-US">Key</span>值相等的情况下，无法预料，返回的是哪一个。对于返回值，有以下规律，返回值<span lang="EN-US"> &lt; 0</span>表示没有找到，返回值<span lang="EN-US"> &gt;= 0</span>说明找到了。<span lang="EN-US"><o:p></o:p></span></span>
				</p>
				<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
						<span style="font-size: 12pt; font-family: SimSun;">对于插入，<span lang="EN-US">Arrays</span>没有特殊算法，一般对数组的插入都是转化为</span>
						<span lang="EN-US">Collection</span>
						<span style="font-size: 12pt; font-family: SimSun;">之后再做的，但是<span lang="EN-US">binarySearch</span>还是能帮你找到数组的插入点的，插入点位置为返回值的绝对值减<span lang="EN-US">1(</span></span>
						<span style="font-size: 12pt; font-family: 'ＭＳ 明朝';" lang="EN-US">|</span>
						<span style="font-size: 12pt; font-family: SimSun;">返回值</span>
						<span style="font-size: 12pt; font-family: 'ＭＳ 明朝';" lang="EN-US">| - 1</span>
						<span style="font-size: 12pt; font-family: SimSun;" lang="EN-US">)</span>
						<span style="font-size: 12pt; font-family: SimSun;">。</span>
						<span style="font-size: 12pt; font-family: SimSun;" lang="EN-US">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
						<span style="font-family: SimSun;">对排序过的数组查找，算法用</span>
						<span lang="EN-US">2</span>
						<span style="font-family: SimSun;">分法已经相当快了，呵呵。</span>
				</p>
				<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
						<span lang="EN-US">
								<o:p>
										<br />
								</o:p>
						</span>
				</p>
				<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
						<font size="4">
								<b style="">
										<span style="font-family: SimSun;">三</span>
								</b>
								<b style="">
										<span style="font-family: SimSun;">比较:</span>
										<span lang="EN-US">
												<o:p>
												</o:p>
										</span>
								</b>
						</font>
				</p>
				<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
						<span style="font-size: 12pt; font-family: SimSun;" lang="EN-US">equals(type[] a, type[] b) </span>
						<span style="font-size: 12pt; font-family: SimSun;">系列方法是做两个数组的比较的，相等返回<span lang="EN-US">true</span>。这个方法运用的时候，有些地方要注意。<span lang="EN-US"><br /></span>比较两个<span lang="EN-US">float</span>数组的时候，对每个元素比较，程序不是用的<span lang="EN-US">==</span>来判断的，而是用<span lang="EN-US">new Float(f1).equals(new Float(f2))</span>，这个方法认为</span>
						<font face="Simsun">
								<tt>
										<span style="font-size: 12pt;" lang="EN-US">NaN</span>
								</tt>
								<tt>
										<span style="font-size: 12pt;">等于它本身，<span style="color: red;" lang="EN-US">0.0f</span><span style="color: red;">不等于<span lang="EN-US">-0.0f</span></span>。对于<span lang="EN-US">double</span>数组也是一样的。<span lang="EN-US"><o:p></o:p></span></span>
								</tt>
						</font>
				</p>
				<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
						<tt>
								<span style="font-size: 12pt;">
										<font face="Simsun">对于<span lang="EN-US">Object[]</span>数组呢，是用的<span lang="EN-US">(e1==null ? e2==null : e1.equals(e2))</span>。<span lang="EN-US"><o:p></o:p></span></font>
								</span>
						</tt>
				</p>
				<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
						<span style="font-size: 12pt; font-family: SimSun;" lang="EN-US">
								<o:p>
										<br />
								</o:p>
						</span>
				</p>
				<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
						<b>
								<span style="font-size: 12pt; font-family: SimSun;">
										<font size="4">四 排序:<span lang="EN-US"><o:p></o:p></span></font>
								</span>
						</b>
				</p>
				<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
						<span style="font-size: 12pt; font-family: SimSun;" lang="EN-US">sort(type[] a)</span>
						<span style="font-size: 12pt; font-family: SimSun;">系列方法是对数组排序的。<span lang="EN-US">Sun</span>用的排序算法是调整快速排序法<span lang="EN-US">,</span>采用的是<span lang="EN-US">Jon
L. Bentley and M. Douglas McIlroy's "Engineering a Sort Function",
Software-Practice and Experience, Vol. 23(11) P. 1249-1265 (November
1993)</span>。这个算法排序要<span lang="EN-US">n* O(n)</span>时间的大量数据，只需要<span lang="EN-US">O(n1ogn)</span>时间。<span lang="EN-US"><o:p></o:p></span></span>
				</p>
				<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
						<span style="font-size: 12pt; font-family: SimSun;">关于快速排序法参考：<span lang="EN-US">(http://algorithm.myrice.com/algorithm/commonalg/sort/internal_sorting/quick_sort/quick_sort.ht</span></span>
						<span lang="EN-US">m<br /></span>
						<span style="font-family: SimSun;">快速排序</span>
						<span lang="EN-US"> Quick Sort</span>
				</p>
				<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
						<span style="font-family: SimSun;">我们已经知道，</span>
						<span lang="EN-US">
								<a href="http://algorithm.myrice.com/algorithm/commonalg/sort/internal_sorting/chapter1.htm">
										<span style="color: windowtext; font-family: SimSun; text-decoration: none;" lang="EN-US">
												<span lang="EN-US">在决策树计算模型下，任何一个基于比较来确定两个元素相对位置的排序算法需要</span>
										</span>
										<span style="color: windowtext; text-decoration: none;">Ω(nlogn)</span>
										<span style="color: windowtext; font-family: SimSun; text-decoration: none;" lang="EN-US">
												<span lang="EN-US">计算时间</span>
										</span>
								</a>
						</span>
						<span style="font-family: SimSun;">。如果我们能设计一个需要</span>
						<span lang="EN-US">O(n1ogn)</span>
						<span style="font-family: SimSun;">时间的排序算法，则在渐近的意义上，这个排序算法就是最优的。许多排序算法都是追求这个目标。快速排序算法它在平均情况下需要</span>
						<span lang="EN-US">O(nlogn)</span>
						<span style="font-family: SimSun;">时间。这个算法是由</span>
						<span lang="EN-US">C.A.R.Hoare</span>
						<span style="font-family: SimSun;">发明的。</span>
						<span lang="EN-US">)</span>
				</p>
				<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
						<span lang="EN-US">
								<o:p>
										<br />
								</o:p>
						</span>
				</p>
				<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
						<b>
								<span style="font-size: 12pt; font-family: SimSun;">
										<font size="4">五 数组的转换:<span lang="EN-US"><o:p></o:p></span></font>
								</span>
						</b>
				</p>
				<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
						<span style="font-family: SimSun;">用</span>
						<span lang="EN-US">Arrays.asList(Object[] a)</span>
						<span style="font-family: SimSun;">能够实现数组到</span>
						<span lang="EN-US">ArrayList</span>
						<span style="font-family: SimSun;">的转换。同时利用</span>
						<span lang="EN-US">Collection.toArray()</span>
						<span style="font-family: SimSun;">能将一些集合类型的数据方便的变成数组。</span>
				</p>
		</span>
		<br />
		<br />
<img src ="http://www.blogjava.net/flysky19/aggbug/92768.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/flysky19/" target="_blank">不断前进的小乌龟</a> 2007-01-09 22:15 <a href="http://www.blogjava.net/flysky19/articles/92768.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>理解java数组</title><link>http://www.blogjava.net/flysky19/articles/92763.html</link><dc:creator>不断前进的小乌龟</dc:creator><author>不断前进的小乌龟</author><pubDate>Tue, 09 Jan 2007 14:08:00 GMT</pubDate><guid>http://www.blogjava.net/flysky19/articles/92763.html</guid><wfw:comment>http://www.blogjava.net/flysky19/comments/92763.html</wfw:comment><comments>http://www.blogjava.net/flysky19/articles/92763.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/flysky19/comments/commentRss/92763.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/flysky19/services/trackbacks/92763.html</trackback:ping><description><![CDATA[参考资料：<br />1.《java jdk5.0 学习笔记》良葛格 第五章数组<br />2.如何理解数组的length?<br />http://blog.csdn.net/treeroot/archive/2005/01/22/264001.aspx<br />3.关于java数组的深度思考<br />http://dev.csdn.net/author/DeepNightTwo/afb7e220bdf5423ba656f84b6a183b44.html<br /><br /><br />一.为什么需要数组？（《java jdk5.0 学习笔记》良葛格）<br />例如，现在要整理全班的Java小考成绩，您希望写个小程序，全班共有40名学生，所以必须有40个变量来存储学生的成绩。现在问题来了，根据第3章学过的变量定义方式，难道要定义40个名称不同的变量来存储学生的成绩数据吗？<br /><br />当然不必这么麻烦，Java提供“数组”(Array)让您可以定义一个以“索引”(Index)作为识别的数据结构。在Java中，可以这么定义一个数组并初始数组内容：<br /><br />int[] score = {90, 85, 55, 94, 77};<br /><br />二.什么是数组？<br />java语言中，数组是一种最简单的复合数据类型。数组是有序数据的集合，数组中的每个元素具有相同的数据类型，可以用一个统一的数组名和下标来唯一地确定数组中的元素。数组有一维数组和多维数组。<br />（http://www.linux8.net/html/java/2006-3/29/21_59_23_560.html）<br /><br />array的定义和使用：使用“[]”做为索引运算符（indexing operator).(《TIJ》）<br /><br />三.java中数组到底是什么？<br /><br />1）不管在其他语言中是什么，数组在Java中可得看作一个对象，它有一些值得探讨的特性。<br />（《java jdk5.0 学习笔记》良葛格）<br /><br />这就意味着与C++中的数组的根本不同，相反，Java中的数组与C++中的STL或Java中的容器类反而更相像一些（只是作为对象，它的方法要比STL中的容器类或者Collection类少很多）。<br /><br />Java中的数组其实是一个对象，但是确实是一个特殊的对象，实在是太特殊了，以致我们都不好把它多做对象处理。<br /><br />刚刚开始接触java数组的人都会听到一句类似的话：java是纯面向对象的语言，他的数组也是一个对象。<br />于是乎，我就按照一个对象的方式来使用数组，心安理得。直到我接触到C的数组后，才发现将数组作为一个类来使用在实现上是多么的“不自然”。<br />首先我们看一下表面现象，数组创建的时候采用的是如下语句：<br />MyClass[] arr = new MyClass[9];<br />而普通类采用的是如下语句：<br />MyClass obj = new MyClass();<br />就是说，创建数组的时候不使用小括号传参。使得数组和普通类看起来就有很多不同，因为小括号里的参数是传递给构造方法的，进而让人感觉数组类是没有构造方法的。<br />（http://dev.csdn.net/author/DeepNightTwo/afb7e220bdf5423ba656f84b6a183b44.html）<br /><br />2）java中数组是对象的依据：<br /><br />a）来源：（http://blog.csdn.net/treeroot/archive/2005/01/22/264001.aspx）<br /><br />我们确定数组的父类是Object，<br />  new Object[0].getClass().getSuperClass()  是Object.class<br /><br />数组没有对应的类文件，String对应String.class.但是数组却没有，而且他们的<br />  类名字很古怪，可以这样获得 new int[2].getClass().getName();<br />  这是和其他对象最大的不同点，因为数组类是在运行时生成的。<br /><br />java.lang.reflect.Array是final的，所以数组肯定不是它的子类<br />  这个类用来动态生成数组或者操作数组(获得长度等).<br /><br /><br /><br />b）来源：（http://dev.csdn.net/author/DeepNightTwo/afb7e220bdf5423ba656f84b6a183b44.html）<br /><br />再往深了想，还有很多让人感觉不自然的东西。可以肯定的是，java确实将数组作为了一个类来处理。还是用上面的例子说明：<br />可以通过以下方法得到MyClass[]的Class实例：arr.getClass()或MyClass[].class。这样，我就可以向数组类里面“窥探”了。<br />Class clazz = MyClass[].class;<br />System.out.println(clazz.getConstructors().length);<br />打印出来的结果是0；证明数组类确实没有构造方法。<br /><br /><br />再看看数组类的“庐山真面目”：<br />System.out.println(clazz);<br />输出是：<br />[Larraytest.MyClass<br /><br />对Java Class文件结构稍有了结就知道，这个字符串的意思就是一个元素类型为arraytest.MyClass的一维数组。也就是说，数组类型不是和普通类一样，以一个全限定路径名+类名来作为自己的唯一标示的，而是以[+一个或者多个L+数组元素类全限定路径+类来最为唯一标示的。这个()也是数组和普通类的区别。而这个区别似乎在某种程度上说明数组和普通java类在实现上有很大区别。因为java虚拟机(java指令集)在处理数组类和普通类的时候，肯定会做出区分。我猜想，可能会有专门的java虚拟机指令来处理数组。<br /><br />分析到这里，我基本上可以肯定：java对数组对象化的操作的支持是指令级的，也就是说java虚拟机有专门针对数组的指令。数组的Class类实例是java虚拟机动态创建动态加载的，其结构与普通java类的Class实例有一些不同。<br /><br />JDK API中有一个java.lang.reflect.Array类，这个类提供了很多方法(绝大多数是native方法，这在另一个方面证明了java对数组的支持是专用指令支持的，否则用本地方法干嘛^_^)，用来弥补我们对数组操作的局限性。<br />下面这句话用来创建一个一维的、长度为10的、类型为arraytest.MyClass的数组：<br />arraytest.MyClass[] arr = (arraytest.MyClass[]) Array.newInstance(arraytest.MyClass, 10);<br /><br />下面这句话用来创建一个二维的、3乘5的、类型为arraytest.MyClass的数组：<br />int[] arrModel = new int[]{3,5};<br />Object arrObj = Array.newInstance(Sub.class, arrModel);<br />当然你可以用一个数组的引用指向上面的二维数组，这里我们用一个Object的引用指向他。<br />使用的时候，我们也是可以利用Array类提供的方法来实现：<br /><br />System.out.println(Array.getLength(arrObj);//第一维长度为3<br />System.out.println(Array.getLength(Array.get(arrObj, 2)));//第二维长度为5，这里如果写3，就会得到你意想之中的java.lang.ArrayIndexOutOfBoundsException<br /><br />打印结果是如我所想的：<br />3<br />5<br /><br />对于数组的Class类实例，还有一些奇怪的现象：<br />在运行代码 java.lang.reflect.Field fieldarr = clazz.getField("length");的时候，会抛出异常：java.lang.NoSuchFieldException: length，这似乎在说数组类没有length这个域，而这个域其实是我们用的最多的一个（也就是说这个域是肯定存在的）。我想关于数组的Class类实例、数组的实现等，还有很多“猫腻”在里面。<br /><br />顺便说一句，java数组最多只能是255维的。这个让人看到了C的影子，嘿嘿。<br /><br />“Java把数组当作一个java类来处理”说起来容易，用起来自然，但是细细想来，还是有很多不简单的地方呀。 <br /><br /><br /><br />c）来源：《java jdk5.0 学习笔记》良葛格 第五章数组<br /><br />从对数组对象的进一步探讨，可以稍微了解Java对对象处理的一些方法。首先来看看一维数组的引用名称的定义：<br /><br />int[] arr = null;<br /><br />在这个定义中，arr表示一个可以参考引用自一维数组对象的变量名称，但是目前将这个名称参考引用自null，表示还没有指定这个名称参考引用自实际的对象。在Java中，=运算用于基本数据类型时，是将值复制给变量，但当它用于对象时，则是将对象指定给参考引用名称来参考引用。也可以将同一个对象指定给两个参考引用名称，当对象的值由其中一个参考引用名称进行操作而变更时，另一个参考引用名称所参考引用到的值也会变动。下面来看看范例5.8的示范。<br /><br />ü 范例5.8  AdvancedArray.java<br /><br />public class AdvancedArray {<br /><br />    public static void main(String[] args) {<br /><br />        int[] arr1 = {1, 2, 3, 4, 5};<br /><br />        int[] tmp1 = arr1;<br /><br />        int[] tmp2 = arr1;<br /><br /> <br /><br />        System.out.print("通过tmp1取出数组值：");<br /><br />        for(int i = 0; i &lt; tmp1.length; i++)<br /><br />            System.out.print(tmp1[i] + " ");<br /><br /> <br /><br />        System.out.print("\n通过tmp2取出数组值：");<br /><br />        for(int i = 0; i &lt; tmp2.length; i++)<br /><br />            System.out.print(tmp2[i] + " ");<br /><br /> <br /><br />        tmp1[2] = 9;<br /><br />        System.out.print("\n\n通过tmp1取出数组值：");<br /><br />        for(int i = 0; i &lt; tmp1.length; i++)<br /><br />            System.out.print(tmp1[i] + " ");<br /><br /> <br /><br />        System.out.print("\n通过tmp2取出数组值：");<br /><br />        for(int i = 0; i &lt; tmp2.length; i++)<br /><br />            System.out.print(tmp2[i] + " ");<br /><br />        System.out.println();<br /><br />    }<br /><br />}<br /><br />执行结果：<br /><br /> <br /><br />通过tmp1取出数组值：1 2 3 4 5<br /><br />通过tmp2取出数组值：1 2 3 4 5<br /><br /> <br /><br />通过tmp1取出数组值：1 2 9 4 5<br /><br />通过tmp2取出数组值：1 2 9 4 5<br /><br /> <br /><br />在这个范例中，通过tmp1名称改变了索引2的元素值，由于tmp2也引用自同一数组对象，所以tmp2取出索引2的元素值是改变后的值。事实上在范例5.8中，有三个引用名称引用自同一个数组对象，也就是arr1、tmp1与tmp2，所以，如果取出arr1索引2的元素，元素值也会是9。<br /><br /><p class="MsoNormal" style="text-indent: 22.6pt;"><span style="font-family: 宋体;"><br /></span></p><p class="MsoNormal" style="text-indent: 22.6pt;"><span style="font-family: 宋体;">了解到在</span><span lang="EN-US">Java</span><span style="font-family: 宋体;">中数组是一个对象，而使用</span><span lang="EN-US">=</span><span style="font-family: 宋体;">指定时是将对象指定给数组名来引用，而<span style="">不是将数组进行复制</span>。如果想将整个数组的值复制给另一个数组该如何作呢？可以使用循环，将整个数组的元素值遍历一遍，并指定给另一个数组相对应的索引位置。范例</span><span lang="EN-US">5.10</span><span style="font-family: 宋体;">示范了进行数组复制的方法。</span></p><div style="border-style: none none solid; border-bottom: 1pt solid blue; padding: 0cm 0cm 1pt;"><p class="03"><span style="font-family: Wingdings;" lang="EN-US">Ü</span><span lang="EN-US"></span><span style="font-family: 宋体;">范例</span><span lang="EN-US">5.10  ArrayCopy.java</span></p></div><p class="04" style="margin-left: 12.1pt;"><span lang="EN-US">public class ArrayCopy {</span><span lang="EN-US"></span></p><p class="04" style="margin-left: 12.1pt; line-height: 13pt;"><span lang="EN-US">    public static void main(String[] args) {</span><span lang="EN-US"></span></p><p class="04" style="margin-left: 12.1pt; line-height: 13pt;"><span lang="EN-US">        int[] arr1 = {1, 2, 3, 4, 5};</span><span lang="EN-US"></span></p><p class="04" style="margin-left: 12.1pt; line-height: 13pt;"><span lang="EN-US">        int[] arr2 = new int[5];</span><span lang="EN-US"></span></p><p class="04" style="margin-left: 12.1pt; line-height: 13pt;"><span lang="EN-US"> </span></p><p class="04" style="margin-left: 12.1pt; line-height: 13pt;"><span lang="EN-US">        for(int i = 0; i &lt; arr1.length; i++)</span><span lang="EN-US"></span></p><p class="04" style="margin-left: 12.1pt; line-height: 13pt;"><span lang="EN-US">            arr2[i] = arr1[i];</span></p><p class="04" style="margin-left: 12.1pt; line-height: 13pt;"><span lang="EN-US"> </span></p><p class="04" style="margin-left: 12.1pt; line-height: 13pt;"><span lang="EN-US">        for(int i = 0; i &lt; arr2.length; i++)</span><span lang="EN-US"></span></p><p class="04" style="margin-left: 12.1pt; line-height: 13pt;"><span lang="EN-US">            System.out.print(arr2[i] + " ");</span><span lang="EN-US"></span></p><p class="04" style="margin-left: 12.1pt; line-height: 13pt;"><span lang="EN-US">        System.out.println();</span></p><div style="border-style: none none solid; border-bottom: 1pt solid blue; padding: 0cm 0cm 1pt; margin-left: 5pt; margin-right: 0cm;"><p class="05" style="margin-left: 0cm; text-indent: 8pt; line-height: 13pt;"><span lang="EN-US">    }</span><span lang="EN-US"></span></p><p class="05" style="margin-left: 0cm; text-indent: 8pt; line-height: 13pt;"><span lang="EN-US">}</span><span lang="EN-US"></span></p></div><p class="MsoNormal" style="text-indent: 22.6pt;"><span style="font-family: 宋体;">执行结果：</span></p><p class="02"><span lang="EN-US"> </span></p><div style="border: 1.5pt solid rgb(224, 224, 224); padding: 1pt 4pt; background: rgb(224, 224, 224) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; margin-left: 33.95pt; margin-right: 6.05pt;"><p class="06" style="margin: 0cm 0cm 0pt; background: rgb(224, 224, 224) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span lang="EN-US">1 2 3 4 5</span></p></div><p class="MsoNormal" style="text-indent: 22.6pt;"><span style="font-family: 宋体;">另一个进行数组复制的方法是使用</span><span lang="EN-US">System</span><span style="font-family: 宋体;">类提供的</span><span lang="EN-US">arraycopy()</span><span style="font-family: 宋体;">方法。其语法如下：</span></p><pre style="margin: 3.5pt 0cm 0pt 24.25pt;"><span lang="EN-US">System.arraycopy(</span><span style="font-family: 宋体;">来源</span><span lang="EN-US">, </span><span style="font-family: 宋体;">起始索引</span><span lang="EN-US">, </span><span style="font-family: 宋体;">目的</span><span lang="EN-US">, </span><span style="font-family: 宋体;">起始索引</span><span lang="EN-US">, </span><span style="font-family: 宋体;">复制长度</span><span lang="EN-US">);</span></pre><p class="MsoNormal" style="margin-top: 8pt; text-indent: 22.6pt; line-height: 125%;"><span style="font-family: 宋体;">范例</span><span lang="EN-US">5.11</span><span style="font-family: 宋体;">改写了范例</span><span lang="EN-US">5.10</span><span style="font-family: 宋体;">，使用</span><span lang="EN-US">System.arraycopy()</span><span style="font-family: 宋体;">进行数组复制，执行结果与范例</span><span lang="EN-US">5.10</span><span style="font-family: 宋体;">是相同的。</span></p><div style="border-style: none none solid; border-bottom: 1pt solid blue; padding: 0cm 0cm 1pt;"><p class="03"><span style="font-family: Wingdings;" lang="EN-US">Ü</span><span lang="EN-US"></span><span style="font-family: 宋体;">范例</span><span lang="EN-US">5.11  ArrayCopy2.java</span></p></div><p class="04" style="margin-left: 12.1pt; line-height: 13pt;"><span lang="EN-US">public class ArrayCopy2 {</span><span lang="EN-US"></span></p><p class="04" style="margin-left: 12.1pt; line-height: 12pt;"><span lang="EN-US">    public static void main(String[] args) {</span><span lang="EN-US"></span></p><p class="04" style="margin-left: 12.1pt; line-height: 12pt;"><span lang="EN-US">        int[] arr1 = {1, 2, 3, 4, 5};</span><span lang="EN-US"></span></p><p class="04" style="margin-left: 12.1pt; line-height: 12pt;"><span lang="EN-US">        int[] arr2 = new int[5];</span></p><p class="04" style="margin-left: 12.1pt; line-height: 12pt;"><span lang="EN-US"> </span></p><p class="04" style="margin-left: 12.1pt; line-height: 12pt;"><span lang="EN-US">        System.arraycopy(arr1, 0, arr2, 0, arr1.length);</span></p><p class="04" style="margin-left: 12.1pt; line-height: 12pt;"><span lang="EN-US"> </span></p><p class="04" style="margin-left: 12.1pt; line-height: 12pt;"><span lang="EN-US">        for(int i = 0; i &lt; arr2.length; i++)</span><span lang="EN-US"></span></p><p class="04" style="margin-left: 12.1pt; line-height: 12pt;"><span lang="EN-US">            System.out.print(arr2[i] + " ");</span><span lang="EN-US"></span></p><p class="04" style="margin-left: 12.1pt; line-height: 12pt;"><span lang="EN-US">        System.out.println();</span></p><p class="04" style="margin-left: 12.1pt; line-height: 12pt;"><span lang="EN-US">    }</span><span lang="EN-US"></span></p><span lang="EN-US">}</span><br /><br /><br />四、 Java中的数组作为对象带来的好处<br />1）越界检查<br /><br />2）length field：与传统的C++中的数组相比，length字段可以方便的得到数组的大小；但要注意，仅仅可以得到数组的大小，不能得到数组中实际包含多少个元素，因为length 只会告诉我们最多可将多少元素置入那个数组。<br /><br />3） 初始化：对象数组在创建之初会自动初始化成null，由原始数据类型构成的数组会自动初始化成零（针对数值类型），(Char)0 （针对字符类型）或者false （针对布尔类型）。<br /><br />4） 数组作为返回值：首先，既然数组是对象，那么就可以把这个对象作为返回值；而且，不必担心那个数组的是否可用只要需要它就会自动存在而且垃圾收集器会在我们完成后自动将其清除 <br /><br /><img src ="http://www.blogjava.net/flysky19/aggbug/92763.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/flysky19/" target="_blank">不断前进的小乌龟</a> 2007-01-09 22:08 <a href="http://www.blogjava.net/flysky19/articles/92763.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>有效使用return语句（return可用于控制方法的执行，比如，若某一环节失败则退出方法等）</title><link>http://www.blogjava.net/flysky19/articles/92580.html</link><dc:creator>不断前进的小乌龟</dc:creator><author>不断前进的小乌龟</author><pubDate>Tue, 09 Jan 2007 05:37:00 GMT</pubDate><guid>http://www.blogjava.net/flysky19/articles/92580.html</guid><wfw:comment>http://www.blogjava.net/flysky19/comments/92580.html</wfw:comment><comments>http://www.blogjava.net/flysky19/articles/92580.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/flysky19/comments/commentRss/92580.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/flysky19/services/trackbacks/92580.html</trackback:ping><description><![CDATA[以下内容来自：http://book.csdn.net/bookfiles/170/1001707575.shtml<br /><br /><b>return</b>语句

<p class="MsoNormal" style="text-indent: 20pt;">return语句是用来退出方法的跳转语句：</p><p class="a1" style="margin: 6pt 0cm;"><img src="http://book.csdn.net/bookfiles/170/04/image033.jpg" height="26" width="236" /></p><p class="a1" style="margin: 6pt 0cm;"><img src="http://book.csdn.net/bookfiles/170/04/image034.jpg" height="56" width="236" /></p><p class="MsoNormal" style="text-indent: 0cm;">只要遇到return语句，方法就在那一行代码停止执行，执行控制将立刻返回到调用该方法的代码处。</p><p class="MsoNormal" style="text-indent: 20pt;">          对于返回值类型为void的方法，return关键字单独作为完整的语句使用：</p><p class="a1" style="margin: 6pt 0cm;"><img src="http://book.csdn.net/bookfiles/170/04/image035.jpg" height="11" width="39" /></p><p class="MsoNormal" style="text-indent: 0cm;">然而，对于返回类型为void的方法，return;语句是可选的。如果省略这条语句，隐含表明方法的最后一行有一个return;语句。即，下面两个版本的doSomething方法是等价的：</p><p class="a1" style="margin: 6pt 0cm;"><img src="http://book.csdn.net/bookfiles/170/04/image037.jpg" height="69" width="107" /></p><p class="MsoNormal" style="text-indent: 0cm;">和</p><p class="a1" style="margin: 6pt 0cm;"><img src="http://book.csdn.net/bookfiles/170/04/image038.jpg" height="82" width="107" /></p><p class="MsoNormal" style="text-indent: 20pt;">另一方面，对于返回类型非void的方法体，必须至少包括一条明确的return语句。这种情况下，return关键字后面必须跟随一个求值类型和方法声明的返回类型一致的表达式。例如，如果方法定义为具有int返回类型，那么下列任何一种return语句都可以接受：</p><p class="a1" style="margin: 6pt 0cm;"><img src="http://book.csdn.net/bookfiles/170/04/image039.jpg" height="138" width="419" /></p><p class="MsoNormal" style="text-indent: 0cm;">等等。另一个例子，如果方法定义为具有boolean返回类型，那么下列任何一种return语句都可以接受：</p><p class="a1" style="margin: 6pt 0cm;"><img src="http://book.csdn.net/bookfiles/170/04/image040.jpg" height="139" width="371" /></p><p class="MsoNormal" style="text-indent: 20pt;">方法体可以包含不只一条return语句。但好的编程习惯是一个方法中只在最末尾包含一条return语句。再看一下前面讨论过的isHornorsStudent方法，这个方法有两条return语句：</p><p class="a1" style="margin: 6pt 0cm;"><img src="http://book.csdn.net/bookfiles/170/04/image042.jpg" height="111" width="242" /></p><p class="MsoNormal" style="text-indent: 0cm;">使用局部boolean变量result来重写这个方法，该变量捕获最终返回的true/false结果。在方法最末尾用一条return语句返回result变量的值：</p><p class="a1" style="margin: 6pt 0cm;"><img src="http://book.csdn.net/bookfiles/170/04/image043.jpg" height="285" width="448" /></p><p class="MsoNormal" style="text-indent: 20pt;">如上述代码所示，由于已经给result变量赋予初值false，因此在else子句中明确地给它赋值false是不必要的，可以像下面这样简化isHornorsStudent方法：</p><p class="a1" style="margin: 6pt 0cm;"><img src="http://book.csdn.net/bookfiles/170/04/image044.jpg" height="183" width="393" /></p><p class="MsoNormal" style="text-indent: 20pt;"><b>但是有一种情况下多个return语句是可以接受的：方法需要执行一系列操作，在这个过程中，任何一步失败意味着整个方法失败。</b>下面的伪代码阐明了这种情况：</p><p class="a1" style="margin: 4.5pt 0cm;"><img src="http://book.csdn.net/bookfiles/170/04/image046.jpg" height="25" width="117" /></p><p class="a1" style="margin: 6pt 0cm;"><img src="http://book.csdn.net/bookfiles/170/04/image047.jpg" height="255" width="393" /></p><p class="MsoNormal" style="text-indent: 20pt;">          注意，Java编译器会校验是否方法的所有逻辑路径都返回类型正确的结果。例如，下面的方法会产生编译错误，因为只有在if测试成功时才能到达return语句，如果if测试失败，则return语句被绕过：</p><p class="a1" style="margin: 6pt 0cm;"><img src="http://book.csdn.net/bookfiles/170/04/image048.jpg" height="40" width="185" /></p><p class="MsoNormal" style="text-indent: 20pt;">这种情况下将产生下面这个编译错误：</p><div style="border-style: solid none; border-color: rgb(153, 153, 153) -moz-use-text-color; border-width: 1.5pt medium; padding: 5pt 0cm; margin-left: 2pt; margin-right: 2pt;"><p class="af7" style="margin: 7.5pt 0cm;"><img src="http://book.csdn.net/bookfiles/170/04/image049.jpg" height="25" width="215" /></p></div><br /><br /><img src ="http://www.blogjava.net/flysky19/aggbug/92580.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/flysky19/" target="_blank">不断前进的小乌龟</a> 2007-01-09 13:37 <a href="http://www.blogjava.net/flysky19/articles/92580.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>File,FileInputStream,FileReader,InputStreamReader,BufferedReader的使用和区别</title><link>http://www.blogjava.net/flysky19/articles/92286.html</link><dc:creator>不断前进的小乌龟</dc:creator><author>不断前进的小乌龟</author><pubDate>Sun, 07 Jan 2007 17:30:00 GMT</pubDate><guid>http://www.blogjava.net/flysky19/articles/92286.html</guid><wfw:comment>http://www.blogjava.net/flysky19/comments/92286.html</wfw:comment><comments>http://www.blogjava.net/flysky19/articles/92286.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/flysky19/comments/commentRss/92286.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/flysky19/services/trackbacks/92286.html</trackback:ping><description><![CDATA[
		<p>2007年1月8日</p>
		<p>
				<br />File,FileInputStream,FileReader,InputStreamReader,BufferedReader 的使用和区别 </p>
		<p>参考资料： </p>
		<p>l         《 core java 》 12 章 </p>
		<p>l         使用 Java 操作文本文件的方法详解 </p>
		<p>
				<a href="http://java.ccidnet.com/art/3737/20041108/523627_1.html">http://java.ccidnet.com/art/3737/20041108/523627_1.html</a>
		</p>
		<p>l  FileReader 是什么类？和 FileInputStream 有什么不同？？？      </p>
		<p> <a href="http://book.hackbase.com/ask2/ask107572.htm">http://book.hackbase.com/ask2/ask107572.htm</a><br />自己的整理和领会：<br />引言：<br />    <br />C语言只需要一个File*就可以了，与C不同，java有一系列流类型，其数量超过60种。类库的设计者声称：“有</p>
		<p>足够的理由为用户提供丰富的流类型的选择：这样做可以减少程序的错误。”例如，在C语言种，许多人认为“</p>
		<p>将输出流写入一个只读模式的文件”是很常见的错误。（事实上，这并不常见。）</p>
		<p>我们认为在C＋＋语言中，流接口设计者避免程序出错的主要“工具”是小心谨慎的态度，在java语言中更是如</p>
		<p>此。流库的高度复杂性迫使程序设计人员谨小慎微。<br />    <br />1.  File类<br />  <br />1 ） File 类介绍（《 core java 》 638 页） </p>
		<p>File 类封装了对用户机器的文件系统进行操作的功能。例如，可以用 File 类获得文件上次修改的时间移动，</p>
		<p>或者对文件进行删除、重命名。换句话说，流类关注的是文件内容，而 File 类关注的是文件在磁盘上的存储</p>
		<p>。 </p>
		<p>File 类的主要方法有： getName(),getCanonicalFile(),lastModified(),isDerector(),isFile(),getPath() </p>
		<p>等； </p>
		<p>
		</p>
		<p>2 ） File 类与 FileInputStream 类的区别： </p>
		<p>流类关注的是文件内容，而 File 类关注的是文件在磁盘上的存储。 </p>
		<p>
		</p>
		<p>File 不属于文件流 , 只能代表一个文件或是目录的路径名而已。 </p>
		<p>
		</p>
		<p>提示：（《 core java 》 639 页） </p>
		<p>如果处理文件或者目录名，就应该使用 File 对象，而不是字符串。例如， File 类的 equals 方法知道一些</p>
		<p>文件系统对大小写是敏感的，目录尾的“ / ”字符无关紧要。 </p>
		<p>
		</p>
		<p>自己的领会： </p>
		<p>FileInputStream 类或者 FileReader 类的构造函数有多个，其中典型的两个分别为：一个使用 File 对象为</p>
		<p>参数；而另一个使用表示路径的 String 对象作为参数；自己以前一直觉得直接用了 String 指定路径就可以</p>
		<p>了，一直不明白为什么很多人都先构造一个 File 对象，现在终于明白了，“如果处理文件或者目录名，就应</p>
		<p>该使用 File 对象，而不是字符串。”！ </p>
		<p>2.       FileInputStream 类 </p>
		<p>1 ） FileInputStream 类介绍： </p>
		<p>以字节为单位（非 unicode ）的流处理。字节序列即：二进制数据。与编码无关，不存在乱码问题。 </p>
		<p>FileInputStream 类的主要方法有： </p>
		<p>Read （）， read （ byte[] b ）， read （ byte[],int off,int len ） ,available(); </p>
		<p>
		</p>
		<p>2 ） FileInputStream 类与 FileReader 类的区别： </p>
		<p>两个类的构造函数的形式和参数都是相同的，参数为 File 对象或者表示路径的 String ，它们到底有何区别</p>
		<p>呢？ </p>
		<p>l         Readers and Writers work only on line based character data, so plain text files.<br />For anything else, you MUST use Streams. </p>
		<p>l         JDK5 API: </p>
		<p>FileInputStream is meant for reading streams of raw bytes such as image data. For reading streams </p>
		<p>of characters, consider using FileReader. </p>
		<p>FileReader is meant for reading streams of characters. For reading streams of raw bytes, consider </p>
		<p>using a FileInputStream . </p>
		<p>l         FileInputStream ：以字节流方式读取； FileReader ：把文件转换为字符流读入； <br />l        InputStream提供的是字节流的读取，而非文本读取，这是和Reader类的根本区别。用Reader读取出</p>
		<p>来的是char数组或者String ，使用InputStream读取出来的是byte数组。<br />l        Reader类及其子类提供的字符流的读取char（16位,unicode编码），inputStream及其子类提供字节</p>
		<p>流的读取byte（8位），所以FileReader类是将文件按字符流的方式读取，FileInputStream则按字节流的方式</p>
		<p>读取文件；InputStreamReader可以将读如stream转换成字符流方式，是reader和stream之间的桥梁<br />l  最初Java是不支持对文本文件的处理的，为了弥补这个缺憾而引入了Reader和Writer两个类。<br />  <br />l         FileInputStream 类以二进制输入 / 输出， I/O 速度快且效率搞，但是它的 read （）方法读到</p>
		<p>的是一个字节（二进制数据），很不利于人们阅读。 </p>
		<p>l         而 FileReader 类弥补了这个缺陷，可以以文本格式输入 / 输出，非常方便；比如可以使用 </p>
		<p>while((ch = filereader.read())!=-1 ) 循环来读取文件；可以使用 BufferedReader 的 readLine() 方法一</p>
		<p>行一行的读取文本。 </p>
		<p>l         当我们读写文本文件的时候，采用 Reader 是非常方便的，比如 FileReader ， </p>
		<p>InputStreamReader 和 BufferedReader 。其中最重要的类是 InputStreamReader ，它是字节转换为字符的桥</p>
		<p>梁。 你可以在构造器重指定编码的方式，如果不指定的话将采用底层操作系统的默认编码方式，例如 GBK 等</p>
		<p>。 </p>
		<p>l         FileReader 与 InputStreamReader 涉及编码转换 ( 指定编码方式或者采用 os 默认编码 ) ，可</p>
		<p>能在不同的平台上出现乱码现象！而 FileInputStream 以二进制方式处理，不会出现乱码现象 . </p>
		<p>3 ）自己的领会： </p>
		<p>l         如果处理纯文本文件，建议使用 FileReader ，因为更方便，也更适合阅读；但是要注意编码问题</p>
		<p>！ <br />l   其他情况（处理非纯文本文件），FileInputStream是唯一的选择；FileInputStream是进Socket通讯时会</p>
		<p>用到很多，如将文件流是Stream的方式传向服务器！<br />  <br />3.       FileReader 类 </p>
		<p>1）    FileReader 类介绍： </p>
		<p>InputStreamReader 类的子类，所有方法（ read （）等）都从父类 InputStreamReader 中继承而来； </p>
		<p>2）    与 InputStreamReader 类的区别： </p>
		<p>l         自己的领会： </p>
		<p>该类与它的父类 InputStreamReader 的主要不同在于构造函数，主要区别也就在于构造函数！从 </p>
		<p>InputStreamReader 的构造函数中看到，参数为 InputStream 和编码方式，可以看出，当要指定编码方式时，</p>
		<p>必须使用 InputStreamReader 类；而 FileReader 构造函数的参数与 FileInputStream 同，为 File 对象或</p>
		<p>表示 path 的 String ，可以看出，当要根据 File 对象或者 String 读取一个文件时，用 FileReader ；我</p>
		<p>想 FileReader 子类的作用也就在于这个小分工吧。 </p>
		<p>3）    一般用法： </p>
		<p>FileReader fr = new FileReader("ming.txt");<br />　　 char[] buffer = new char[1024];<br />　　 int ch = 0;<br />　　 while((ch = fr.read())!=-1 )<br />　　 {<br />　　　 System.out.print((char)ch); <br />　　 } </p>
		<p>4.       InputStreamReader 类 </p>
		<p>l         以文本格式输入 / 输出，可以指定编码格式； </p>
		<p>l         主要方法： </p>
		<p>getEncoding ()，read(); </p>
		<p>l         一般用法： </p>
		<p>InputStreamReader isr = new InputStreamReader(new FileInputStream("ming.txt"));<br />　　 while((ch = isr.read())!=-1)<br />　　 {<br />　　　 System.out.print((char)ch); <br />　　 } </p>
		<p>5.       BufferedReader 类 </p>
		<p>l         Jdk5 api ： </p>
		<p>Read text from a character-input stream, buffering characters so as to provide for the efficient </p>
		<p>reading of characters, arrays, and lines. <br />l    BufferedReader 由Reader类扩展而来，提供通用的缓冲方式文本读取，而且提供了很实用的readLine，</p>
		<p>读取分行文本很适合，BufferedReader是针对Reader的，不直接针对文件，也不是只针对文件读取。<br />l  一般用法：<br />    <br />BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("ming.txt")));<br />　　String data = null;<br />　　while((data = br.readLine())!=null)<br />　　{<br />　　　System.out.println(data); <br />　　}<br />    <br />  <br />6.       总结以上内容，得出比较好的规范用法： </p>
		<p>1）    File file = new File ("hello.txt"); </p>
		<p>FileInputStream in=new FileInputStream(file); </p>
		<p>2）    File file = new File ("hello.txt"); </p>
		<p>FileInputStream in=new FileInputStream(file); </p>
		<p>InputStreamReader inReader=new InputStreamReader(in); </p>
		<p>BufferedReader bufReader=new BufferedReader(inReader); </p>
		<p>3）    File file = new File ("hello.txt"); </p>
		<p>FileReader fileReader=new FileReader(file); </p>
		<p>BufferedReader bufReader=new BufferedReader(fileReader); </p>
		<p>
		</p>
		<p>7.一些写法的区别：<br />1）<br />File file = new File ("hello.txt");<br />FileInputStream in=new FileInputStream(file);<br />InputStreamReader inReader=new InputStreamReader(in);<br />BufferedReader bufReader=new BufferedReader(inReader); <br /><br />2）<br />FileInputStream in＝null;<br />File file = new File ("hello.txt");<br />in=new FileInputStream(file);<br />BufferedReader bufReader=new BufferedReader(new InputStreamReader(in)); <br /><br />3）<br />File file = new File ("hello.txt");<br />BufferedReader bufReader=new BufferedReader(new InputStreamReader(new FileInputStream(file)));<br /><br />上述两种写法的微小区别：<br />a）第二种方式中把“FileInputStream in＝null;”定义单独放在开始处，说明下面应该还有要用到in对象变量的地方；（BufferedReader处用了）<br /><br />b）第二种方式没有定义InputStreamReader的对象变量，直接在BufferedReader的构造函数中new一个，<br />这种方式与第一种方式的主要区别：InputStreamReader对象只使用一次！<br /><br />这对于在这里只需要使用一次这个InputStreamReader对象的应用来说更好；无需定义InputStreamReader的对象变量，接收由new返回的该对象的引用，因为下面的程序中不需要这个InputStreamReader的对象变量，所以无需定义；所以这种情况下，第二种方式比第一种更好一些。<br /><br />c）第三种方式中，典型的三层嵌套委派关系，清晰看出Reader的委派模式（《corejava》12章有图描述该委派关系），FileInputStream和InputStreamReader都没有定义变量，new生成的对象都只是使用一次。<br /><br />d）三种方式的区别也就在于FileInputStream和InputStreamReader对象是否都只使用一次，是否需要定义它们的对象变量，以及个人的编码习惯。</p>
		<p>e)但是要注意异常处理，FileInputStream(file)会抛出NotFileFoundException，如果采用surround方式<br />（try&amp;catch）处理，应该用第二种方式，这样可以用System.out.println提示文件未找到；<br />当然在函数名后使用throws Exception，然后用第三种方式也行，但似乎这适合有用户界面的情况，把异常抛出在客户端在处理。<br /></p>
<img src ="http://www.blogjava.net/flysky19/aggbug/92286.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/flysky19/" target="_blank">不断前进的小乌龟</a> 2007-01-08 01:30 <a href="http://www.blogjava.net/flysky19/articles/92286.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>多态性</title><link>http://www.blogjava.net/flysky19/articles/89965.html</link><dc:creator>不断前进的小乌龟</dc:creator><author>不断前进的小乌龟</author><pubDate>Mon, 25 Dec 2006 11:22:00 GMT</pubDate><guid>http://www.blogjava.net/flysky19/articles/89965.html</guid><wfw:comment>http://www.blogjava.net/flysky19/comments/89965.html</wfw:comment><comments>http://www.blogjava.net/flysky19/articles/89965.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/flysky19/comments/commentRss/89965.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/flysky19/services/trackbacks/89965.html</trackback:ping><description><![CDATA[
		<p>
				<font size="4">2006年12月25日<br />学c++和java那么久了，但是觉得自己一直对封装，继承，多态性这三个面向对象的关键特征一直不是很</font>
		</p>
		<p>
				<font size="4">了解。其实应该说是自己以为了解了，但是找实习时，笔试才知道，面对这些基本得不能再基本的题目，</font>
		</p>
		<p>
				<font size="4">自己却答不出来，猛然发觉，原来是自己根本就还没有理解透彻！！！</font>
		</p>
		<p>
				<font size="4">一、先用自己的语言概括一下“多态性”吧：</font>
		</p>
		<p>
				<font size="4">多态性是指在继承层次或者接口与实现类层次上，如果子类覆盖了父类的方法，或者说实现类实现了接口</font>
		</p>
		<p>
				<font size="4">定义的方法，那么可以通过一般化的用父类或者接口来调用该方法，JVM在运行期能够根据实际传递的子</font>
		</p>
		<p>
				<font size="4">类对象引用，来调用相应的方法，产生正确的行为。达到“同一函数，不同行为”的效果。java的多态性</font>
		</p>
		<p>
				<font size="4">是通过动态绑定实现的。</font>
		</p>
		<p>
				<font size="4">例如，类A中有一aa()方法，类B和类C继承类A，并覆盖了类A的aa()方法，这时在程序中，如果用类A的引</font>
		</p>
		<p>
				<font size="4">用a调用aa方法：a.aa()，JVM会根据动态绑定机制，根据a的实际类型调用相应方法；如果a=new B(),那</font>
		</p>
		<p>
				<font size="4">么调的是B的方法；如果a=new C(),那么调的是C的方法。</font>
		</p>
		<p>
				<font size="4">二、上述概念包含几个关键点：<br />首先是多态性的前提：<br />1.在继承层次或者接口与实现类层次上才有多态性；<br />2.子类覆盖了父类的方法，或者实现类实现了接口定义的方法，才有多态性；</font>
		</p>
		<p>
				<font size="4">其次是多态性的表现：<br />1.可以通过一般化的用父类或者接口来调用某一方法，JVM在运行期能够根据实际传递的子类对象引用，</font>
		</p>
		<p>
				<font size="4">来调用相应的方法，从而产生正确的行为。</font>
		</p>
		<p>
				<font size="4">最后是多态性的实现原理：<br />1.java多态性是通过函数的动态绑定机制实现的；</font>
		</p>
		<p>
				<font size="4">至于动态绑定的机制是什么，请看下一篇文章“java动态绑定机制”。</font>
		</p>
		<p>
				<font size="4">有待查看的资料：<br />1.C++的书；（java的书中只对多态性进行阐述，但是很少对多态性的概念作出解释，好像C++中的书中有</font>
		</p>
		<p>
				<font size="4">概念）</font>
		</p>
		<p>
				<font size="4">2.《core java》</font>
		</p>
		<p>
				<br />
				<font size="4">参考资料：<br />1.简单的理解 类的继承 和 多态性<br /></font>
				<a href="http://bbs.nou.com.cn/thread-93841-1-1.html">
						<font size="4">http://bbs.nou.com.cn/thread-93841-1-1.html</font>
				</a>
		</p>
		<p>
				<font size="4">2.JAVA中动态性实例解释<br /></font>
				<a href="http://dev.csdn.net/article/12/12550.shtm">
						<font size="4">http://dev.csdn.net/article/12/12550.shtm</font>
				</a>
				<br />
		</p>
<img src ="http://www.blogjava.net/flysky19/aggbug/89965.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/flysky19/" target="_blank">不断前进的小乌龟</a> 2006-12-25 19:22 <a href="http://www.blogjava.net/flysky19/articles/89965.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>arguments 和 parameter的区别 </title><link>http://www.blogjava.net/flysky19/articles/89963.html</link><dc:creator>不断前进的小乌龟</dc:creator><author>不断前进的小乌龟</author><pubDate>Mon, 25 Dec 2006 11:09:00 GMT</pubDate><guid>http://www.blogjava.net/flysky19/articles/89963.html</guid><wfw:comment>http://www.blogjava.net/flysky19/comments/89963.html</wfw:comment><comments>http://www.blogjava.net/flysky19/articles/89963.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/flysky19/comments/commentRss/89963.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/flysky19/services/trackbacks/89963.html</trackback:ping><description><![CDATA[
		<font size="4">2006年12月25日<br />看《TIJ》时老看到“引数”这个词，觉得怪别扭的，但一直没去查引数和参数有何区别，先查资料终于明白了：<br /></font>
		<font size="4">
				<span style="FONT-SIZE: 13px">1.http://blog.chinaunix.net/u/25073/showart_188475.html<br />一般说来，两个是可以互换的。但是 C 程序员的习惯是：parameter 是参数，而 argument 是参数的值。也就是说，函数原型的参数列表，是 parameter list，比如<br /><br />int sum(int a, int b);<br /><br />而当使用的时候<br /><br />int sum;<br />sum = sum(10, 20);<br /><br />10 和 20 则是 argument。<br /><br />这个习惯也影响了很多其他语言的程序员。如果要混合两者的意义，一般用 argument，而 parameter 则比较少用。<br /><br />argument 有的时候也被称作 actual parameter。<br /><br />对应的中文术语是<br /><br />parameter = 形参 (估计是「形式参数」简称)<br />argument = 实参 (估计是「实际参数」简称)</span>
				<br />
				<br />
		</font>
		<div>
				<font size="4">2.http://royfang.spaces.live.com/blog/cns!53F57C7F0CE9D52C!125.entry<br />argument和parameter是有区别的，过去的资料中统一翻译为参数是不准确的，前者翻译成引数，后者翻译成参数，这样的翻译才是精确的翻译，两者的区别如下文：<br />What is the difference between an argument and a parameter?<br />引数和参数有何区别？<br />While defining method, variables passed in the method are called parameters. <br />当定义方法时，传递到方法中的变量称为参数.<br />While using those methods, values passed to those variables are called arguments. <br />当使用方法时，传给变量的值称为引数.</font>
		</div>
<img src ="http://www.blogjava.net/flysky19/aggbug/89963.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/flysky19/" target="_blank">不断前进的小乌龟</a> 2006-12-25 19:09 <a href="http://www.blogjava.net/flysky19/articles/89963.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>重载、覆盖、多态(zz)</title><link>http://www.blogjava.net/flysky19/articles/89703.html</link><dc:creator>不断前进的小乌龟</dc:creator><author>不断前进的小乌龟</author><pubDate>Sat, 23 Dec 2006 16:14:00 GMT</pubDate><guid>http://www.blogjava.net/flysky19/articles/89703.html</guid><wfw:comment>http://www.blogjava.net/flysky19/comments/89703.html</wfw:comment><comments>http://www.blogjava.net/flysky19/articles/89703.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/flysky19/comments/commentRss/89703.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/flysky19/services/trackbacks/89703.html</trackback:ping><description><![CDATA[
		<p>
				<font size="4">source:http://topic.csdn.net/t/20040224/15/2770426.html<br />1.首先说重载（overload），是发生在同一类中。与什么父类子类、继承毫无关系。     <br />  标识一个函数除了函数名外，还有函数的参数（个数和类型）。也就是说，一个类中可以有两个或更多的函数，叫同一个名字而他们的参数不同。     <br />  他们之间毫无关系，是不同的函数，只是可能他们的功能类似，所以才命名一样，增加可读性，仅此而已！   <br />  它是面向过程的设计方法与面向对象无关。说什么是多态的表现方式，真是狗屁不通！   <br />    <br /> 2. 再说覆盖(override),是发生在子类中！也就是说必须有继承的情况下才有覆盖发生。   <br />  我们知道继承一个类，也就有了父类了全部方法，如果你感到哪个方法不爽，功能要变，那就把那个函数在子类中重新实现一遍。   <br />  这样再调用这个方法的时候，就是执行子类中的过程了。父类中的函数就被覆盖了。（当然，覆盖的时候函数名和参数要和父类中完全一样   <br />  ，不然你的方法对父类中的方法就不起任何作用，因为两者是两个函数，毫不关系）   <br />    <br />3.  最后说多态（polymorphism），这个n多大师都有经典论述，我不敢多说什么。   <br />  提醒一句，这个也是必须有继承发生的情况下，而且必须有上溯造型的时候才有多态 <br />自己的补充：觉得覆盖是多态的基础，这样父类对象的引用可以动态调用实际类型的子类的方法；</font>
		</p>
<img src ="http://www.blogjava.net/flysky19/aggbug/89703.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/flysky19/" target="_blank">不断前进的小乌龟</a> 2006-12-24 00:14 <a href="http://www.blogjava.net/flysky19/articles/89703.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>为什么会有两个jre？060925（原创）</title><link>http://www.blogjava.net/flysky19/articles/88935.html</link><dc:creator>不断前进的小乌龟</dc:creator><author>不断前进的小乌龟</author><pubDate>Tue, 19 Dec 2006 15:22:00 GMT</pubDate><guid>http://www.blogjava.net/flysky19/articles/88935.html</guid><wfw:comment>http://www.blogjava.net/flysky19/comments/88935.html</wfw:comment><comments>http://www.blogjava.net/flysky19/articles/88935.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/flysky19/comments/commentRss/88935.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/flysky19/services/trackbacks/88935.html</trackback:ping><description><![CDATA[
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一、</span>
				<span lang="EN-US">jre</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span>
				<span lang="EN-US">jdk</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">有什么区别</span>
				<span lang="EN-US">???</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">为什么安装</span>
				<span lang="EN-US">jdk</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">后会有两套</span>
				<span lang="EN-US">jre</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">？（一套一般在</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">c:\program files\java\jre</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">下，一套自己选择的</span>
				<span lang="EN-US">jdk</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">安装路径下，一般为</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">d:\jdk1.5\jre</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">；）</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?>
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">答：</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">1.1 </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">以下是</span>
				<span lang="EN-US">java.sun.com</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">上的官方解释：</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">Question: Why would anyone want the JRE if the Java 2 SDK has </span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">everything in the JRE and more? </span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">Answer: The JRE is smaller and therefore easier to download or </span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">distribute with software than the Java 2 SDK. Most users of Java </span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">technology are people who just want to run applets and applications </span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">developed by others. They're not interested in developing any </span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">applications themselves. The relatively small Java RE is made for such </span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">end users. They can download the Java RE themselves from the web, or </span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">software vendors can include it in their own products. The typical end</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">-user doesn't need the bulkier Java 2 SDK with its development tools.</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">1.2 </span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">自己的理解：</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">问：</span>
				<span lang="EN-US">jre</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span>
				<span lang="EN-US">jdk</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">有什么区别</span>
				<span lang="EN-US">?</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">答：</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">JRE</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">提供了</span>
				<span lang="EN-US">JAVA</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">程序运行的必要环境平台；</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">jdk</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">提供了</span>
				<span lang="EN-US">java</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的编程环境，它包含编译调试的环境功能，包含</span>
				<span lang="EN-US">JRE</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">；</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如果只安装了</span>
				<span lang="EN-US">jre</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，那么</span>
				<span lang="EN-US">cmd</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">命令行中只能执行</span>
				<span lang="EN-US">java</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">指令，不能执行</span>
				<span lang="EN-US">javac</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">；</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">安装好</span>
				<span lang="EN-US">jdk</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">后才能执行</span>
				<span lang="EN-US">javac</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，因为</span>
				<span lang="EN-US">jre</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中不包含用于开发的编译环境；</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">问：</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">为什么安装</span>
				<span lang="EN-US">jdk</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">后会有两套</span>
				<span lang="EN-US">jre</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">？</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">答：</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo1; tab-stops: list 21.0pt">
				<span lang="EN-US" style="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings">
						<span style="mso-list: Ignore">l<span style="FONT: 7pt 'Times New Roman'">         </span></span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">之所以需要两套</span>
				<span lang="EN-US">jre</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，是因为可以分担工作；当用户只需要执行</span>
				<span lang="EN-US">java</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的程序时，那</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo1; tab-stops: list 21.0pt">
				<span lang="EN-US" style="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings">
						<span style="mso-list: Ignore">l</span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">么</span>
				<span lang="EN-US">c:\program files\java\jre</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">下的</span>
				<span lang="EN-US">jre</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">就</span>
				<span lang="EN-US">ok</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">！当用户是</span>
				<span lang="EN-US">java</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">程序员，需要</span>
				<span lang="EN-US">java</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">开发环境，那么开发时，系统就会优先去找“</span>
				<span lang="EN-US">java</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span>
				<span lang="EN-US">javac</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">”这些命令本身的目录或者他们的父目录的</span>
				<span lang="EN-US">jre</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">；这样开发时一般运行的是</span>
				<span lang="EN-US">jdk</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">下的</span>
				<span lang="EN-US">jre</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">；而运行外部程序时，一般运行的是</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo1; tab-stops: list 21.0pt">
				<span lang="EN-US" style="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings">
						<span style="mso-list: Ignore">l</span>
				</span>
				<span lang="EN-US">c:\program files\</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">下的</span>
				<span lang="EN-US">jre</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，实现了分工，不同的</span>
				<span lang="EN-US">jre</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">负责各自范围的内容；</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo1; tab-stops: list 21.0pt">
				<span lang="EN-US" style="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings">
						<span style="mso-list: Ignore">l<span style="FONT: 7pt 'Times New Roman'">         </span></span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">详细的解释和学习，参看王森的</span>
				<span lang="EN-US">&lt;&lt;java</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">深度历险</span>
				<span lang="EN-US">&gt;&gt;</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的第二章“深入</span>
				<span lang="EN-US">java 2 SDK</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">”</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo1; tab-stops: list 21.0pt">
				<span lang="EN-US" style="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings">
						<span style="mso-list: Ignore">l</span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，讲得非常明白到位！</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">相关内容摘录如下：（图略）</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="ZH-TW" style="FONT-SIZE: 18pt; FONT-FAMILY: DFHei-Lt-HK-BF; mso-font-kerning: 0pt; mso-bidi-font-family: DFHei-Lt-HK-BF; mso-fareast-language: ZH-TW">您所執行的是哪一個</span>
				<b>
						<span lang="EN-US" style="FONT-SIZE: 18pt; FONT-FAMILY: CenturyGothic-Bold; mso-fareast-font-family: DFHei-Lt-HK-BF; mso-font-kerning: 0pt; mso-bidi-font-family: CenturyGothic-Bold; mso-fareast-language: ZH-TW">java.exe ?<o:p></o:p></span>
				</b>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="ZH-TW" style="FONT-SIZE: 12pt; FONT-FAMILY: DFHei-Lt-HK-BF; mso-font-kerning: 0pt; mso-bidi-font-family: DFHei-Lt-HK-BF; mso-fareast-language: ZH-TW">既然您的電腦裡頭至少有兩套</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 'Century Gothic'; mso-fareast-font-family: DFHei-Lt-HK-BF; mso-font-kerning: 0pt; mso-bidi-font-family: 'Century Gothic'; mso-fareast-language: ZH-TW">JRE</span>
				<span lang="ZH-TW" style="FONT-SIZE: 12pt; FONT-FAMILY: DFHei-Lt-HK-BF; mso-font-kerning: 0pt; mso-bidi-font-family: DFHei-Lt-HK-BF; mso-fareast-language: ZH-TW">，那麼誰來決定用哪一套</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 'Century Gothic'; mso-fareast-font-family: DFHei-Lt-HK-BF; mso-font-kerning: 0pt; mso-bidi-font-family: 'Century Gothic'; mso-fareast-language: ZH-TW">JRE </span>
				<span lang="ZH-TW" style="FONT-SIZE: 12pt; FONT-FAMILY: DFHei-Lt-HK-BF; mso-font-kerning: 0pt; mso-bidi-font-family: DFHei-Lt-HK-BF; mso-fareast-language: ZH-TW">呢</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 'Century Gothic'; mso-fareast-font-family: DFHei-Lt-HK-BF; mso-font-kerning: 0pt; mso-bidi-font-family: 'Century Gothic'; mso-fareast-language: ZH-TW">? </span>
				<span lang="ZH-TW" style="FONT-SIZE: 12pt; FONT-FAMILY: DFHei-Lt-HK-BF; mso-font-kerning: 0pt; mso-bidi-font-family: DFHei-Lt-HK-BF; mso-fareast-language: ZH-TW">這個重</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: DFHei-Lt-HK-BF; mso-font-kerning: 0pt; mso-bidi-font-family: DFHei-Lt-HK-BF; mso-fareast-language: ZH-TW">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="ZH-TW" style="FONT-SIZE: 12pt; FONT-FAMILY: DFHei-Lt-HK-BF; mso-font-kerning: 0pt; mso-bidi-font-family: DFHei-Lt-HK-BF; mso-fareast-language: ZH-TW">責大任就落在</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 'Century Gothic'; mso-fareast-font-family: DFHei-Lt-HK-BF; mso-font-kerning: 0pt; mso-bidi-font-family: 'Century Gothic'; mso-fareast-language: ZH-TW">java.exe </span>
				<span lang="ZH-TW" style="FONT-SIZE: 12pt; FONT-FAMILY: DFHei-Lt-HK-BF; mso-font-kerning: 0pt; mso-bidi-font-family: DFHei-Lt-HK-BF; mso-fareast-language: ZH-TW">的身上。</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: DFHei-Lt-HK-BF; mso-font-kerning: 0pt; mso-bidi-font-family: DFHei-Lt-HK-BF; mso-fareast-language: ZH-TW">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="ZH-TW" style="FONT-SIZE: 12pt; FONT-FAMILY: DFHei-Lt-HK-BF; mso-font-kerning: 0pt; mso-bidi-font-family: DFHei-Lt-HK-BF; mso-fareast-language: ZH-TW">當我們在命令列輸入</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: DFHei-Lt-HK-BF; mso-font-kerning: 0pt; mso-bidi-font-family: DFHei-Lt-HK-BF; mso-fareast-language: ZH-TW">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<b>
						<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: CenturyGothic-Bold; mso-fareast-font-family: DFHei-Lt-HK-BF; mso-font-kerning: 0pt; mso-bidi-font-family: CenturyGothic-Bold; mso-fareast-language: ZH-TW">java XXX<o:p></o:p></span>
				</b>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="ZH-TW" style="FONT-SIZE: 12pt; FONT-FAMILY: DFHei-Lt-HK-BF; mso-font-kerning: 0pt; mso-bidi-font-family: DFHei-Lt-HK-BF; mso-fareast-language: ZH-TW">的時候，</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 'Century Gothic'; mso-fareast-font-family: DFHei-Lt-HK-BF; mso-font-kerning: 0pt; mso-bidi-font-family: 'Century Gothic'; mso-fareast-language: ZH-TW">java.exe </span>
				<span lang="ZH-TW" style="FONT-SIZE: 12pt; FONT-FAMILY: DFHei-Lt-HK-BF; mso-font-kerning: 0pt; mso-bidi-font-family: DFHei-Lt-HK-BF; mso-fareast-language: ZH-TW">的工作就是找到合適的</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 'Century Gothic'; mso-fareast-font-family: DFHei-Lt-HK-BF; mso-font-kerning: 0pt; mso-bidi-font-family: 'Century Gothic'; mso-fareast-language: ZH-TW">JRE </span>
				<span lang="ZH-TW" style="FONT-SIZE: 12pt; FONT-FAMILY: DFHei-Lt-HK-BF; mso-font-kerning: 0pt; mso-bidi-font-family: DFHei-Lt-HK-BF; mso-fareast-language: ZH-TW">來執行類</span>
				<span lang="ZH-TW" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-fareast-language: ZH-TW">別</span>
				<span lang="ZH-TW" style="FONT-SIZE: 12pt; FONT-FAMILY: DFHei-Lt-HK-BF; mso-font-kerning: 0pt; mso-bidi-font-family: DFHei-Lt-HK-BF; mso-fareast-language: ZH-TW">檔。</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 'Century Gothic'; mso-fareast-font-family: DFHei-Lt-HK-BF; mso-font-kerning: 0pt; mso-bidi-font-family: 'Century Gothic'; mso-fareast-language: ZH-TW">java.exe </span>
				<span lang="ZH-TW" style="FONT-SIZE: 12pt; FONT-FAMILY: DFHei-Lt-HK-BF; mso-font-kerning: 0pt; mso-bidi-font-family: DFHei-Lt-HK-BF; mso-fareast-language: ZH-TW">依照底</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: DFHei-Lt-HK-BF; mso-font-kerning: 0pt; mso-bidi-font-family: DFHei-Lt-HK-BF; mso-fareast-language: ZH-TW">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="ZH-TW" style="FONT-SIZE: 12pt; FONT-FAMILY: DFHei-Lt-HK-BF; mso-font-kerning: 0pt; mso-bidi-font-family: DFHei-Lt-HK-BF; mso-fareast-language: ZH-TW">下邏輯來尋找</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 'Century Gothic'; mso-fareast-font-family: DFHei-Lt-HK-BF; mso-font-kerning: 0pt; mso-bidi-font-family: 'Century Gothic'; mso-fareast-language: ZH-TW">JRE:<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 'Century Gothic'; mso-fareast-font-family: DFHei-Lt-HK-BF; mso-font-kerning: 0pt; mso-bidi-font-family: 'Century Gothic'; mso-fareast-language: ZH-TW">1. </span>
				<span lang="ZH-TW" style="FONT-SIZE: 12pt; FONT-FAMILY: DFHei-Lt-HK-BF; mso-font-kerning: 0pt; mso-bidi-font-family: DFHei-Lt-HK-BF; mso-fareast-language: ZH-TW">自己的目錄下有</span>
				<span lang="ZH-TW" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-fareast-language: ZH-TW">沒</span>
				<span lang="ZH-TW" style="FONT-SIZE: 12pt; FONT-FAMILY: DFHei-Lt-HK-BF; mso-font-kerning: 0pt; mso-bidi-font-family: DFHei-Lt-HK-BF; mso-fareast-language: ZH-TW">有</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 'Century Gothic'; mso-fareast-font-family: DFHei-Lt-HK-BF; mso-font-kerning: 0pt; mso-bidi-font-family: 'Century Gothic'; mso-fareast-language: ZH-TW">JRE </span>
				<span lang="ZH-TW" style="FONT-SIZE: 12pt; FONT-FAMILY: DFHei-Lt-HK-BF; mso-font-kerning: 0pt; mso-bidi-font-family: DFHei-Lt-HK-BF; mso-fareast-language: ZH-TW">目錄。</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 'Century Gothic'; mso-fareast-font-family: DFHei-Lt-HK-BF; mso-font-kerning: 0pt; mso-bidi-font-family: 'Century Gothic'; mso-fareast-language: ZH-TW">(</span>
				<span lang="ZH-TW" style="FONT-SIZE: 12pt; FONT-FAMILY: DFHei-Lt-HK-BF; mso-font-kerning: 0pt; mso-bidi-font-family: DFHei-Lt-HK-BF; mso-fareast-language: ZH-TW">這個部分這樣</span>
				<span lang="ZH-TW" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-fareast-language: ZH-TW">說</span>
				<span lang="ZH-TW" style="FONT-SIZE: 12pt; FONT-FAMILY: DFHei-Lt-HK-BF; mso-font-kerning: 0pt; mso-bidi-font-family: DFHei-Lt-HK-BF; mso-fareast-language: ZH-TW">並不是非常精確，原因</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: DFHei-Lt-HK-BF; mso-font-kerning: 0pt; mso-bidi-font-family: DFHei-Lt-HK-BF; mso-fareast-language: ZH-TW">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="ZH-TW" style="FONT-SIZE: 12pt; FONT-FAMILY: DFHei-Lt-HK-BF; mso-font-kerning: 0pt; mso-bidi-font-family: DFHei-Lt-HK-BF; mso-fareast-language: ZH-TW">請詳見</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 'Century Gothic'; mso-fareast-font-family: DFHei-Lt-HK-BF; mso-font-kerning: 0pt; mso-bidi-font-family: 'Century Gothic'; mso-fareast-language: ZH-TW">JDK </span>
				<span lang="ZH-TW" style="FONT-SIZE: 12pt; FONT-FAMILY: DFHei-Lt-HK-BF; mso-font-kerning: 0pt; mso-bidi-font-family: DFHei-Lt-HK-BF; mso-fareast-language: ZH-TW">原始碼，這此不特</span>
				<span lang="ZH-TW" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-fareast-language: ZH-TW">別說</span>
				<span lang="ZH-TW" style="FONT-SIZE: 12pt; FONT-FAMILY: DFHei-Lt-HK-BF; mso-font-kerning: 0pt; mso-bidi-font-family: DFHei-Lt-HK-BF; mso-fareast-language: ZH-TW">明</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 'Century Gothic'; mso-fareast-font-family: DFHei-Lt-HK-BF; mso-font-kerning: 0pt; mso-bidi-font-family: 'Century Gothic'; mso-fareast-language: ZH-TW">)<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 'Century Gothic'; mso-fareast-font-family: DFHei-Lt-HK-BF; mso-font-kerning: 0pt; mso-bidi-font-family: 'Century Gothic'; mso-fareast-language: ZH-TW">2. </span>
				<span lang="ZH-TW" style="FONT-SIZE: 12pt; FONT-FAMILY: DFHei-Lt-HK-BF; mso-font-kerning: 0pt; mso-bidi-font-family: DFHei-Lt-HK-BF; mso-fareast-language: ZH-TW">父目錄底下</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 'Century Gothic'; mso-fareast-font-family: DFHei-Lt-HK-BF; mso-font-kerning: 0pt; mso-bidi-font-family: 'Century Gothic'; mso-fareast-language: ZH-TW">JRE </span>
				<span lang="ZH-TW" style="FONT-SIZE: 12pt; FONT-FAMILY: DFHei-Lt-HK-BF; mso-font-kerning: 0pt; mso-bidi-font-family: DFHei-Lt-HK-BF; mso-fareast-language: ZH-TW">子目錄。</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: DFHei-Lt-HK-BF; mso-font-kerning: 0pt; mso-bidi-font-family: DFHei-Lt-HK-BF; mso-fareast-language: ZH-TW">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 'Century Gothic'; mso-fareast-font-family: DFHei-Lt-HK-BF; mso-font-kerning: 0pt; mso-bidi-font-family: 'Century Gothic'">3. </span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: DFHei-Lt-HK-BF; mso-font-kerning: 0pt; mso-bidi-font-family: DFHei-Lt-HK-BF">查詢</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 'Century Gothic'; mso-fareast-font-family: DFHei-Lt-HK-BF; mso-font-kerning: 0pt; mso-bidi-font-family: 'Century Gothic'">Windows<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 'Century Gothic'; mso-fareast-font-family: DFHei-Lt-HK-BF; mso-font-kerning: 0pt; mso-bidi-font-family: 'Century Gothic'">Registry(</span>
				<b>
						<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: CenturyGothic-Bold; mso-fareast-font-family: DFHei-Lt-HK-BF; mso-font-kerning: 0pt; mso-bidi-font-family: CenturyGothic-Bold">HKEY_LOCAL_MACHINE\Software\JavaSoft\Java<o:p></o:p></span>
				</b>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<b>
						<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: CenturyGothic-Bold; mso-fareast-font-family: DFHei-Lt-HK-BF; mso-font-kerning: 0pt; mso-bidi-font-family: CenturyGothic-Bold">Runtime Environment\</span>
				</b>
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 'Century Gothic'; mso-fareast-font-family: DFHei-Lt-HK-BF; mso-font-kerning: 0pt; mso-bidi-font-family: 'Century Gothic'">)</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: DFHei-Lt-HK-BF; mso-font-kerning: 0pt; mso-bidi-font-family: DFHei-Lt-HK-BF">。<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="ZH-TW" style="FONT-SIZE: 12pt; FONT-FAMILY: DFHei-Lt-HK-BF; mso-font-kerning: 0pt; mso-bidi-font-family: DFHei-Lt-HK-BF; mso-fareast-language: ZH-TW">所以，</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 'Century Gothic'; mso-fareast-font-family: DFHei-Lt-HK-BF; mso-font-kerning: 0pt; mso-bidi-font-family: 'Century Gothic'; mso-fareast-language: ZH-TW">java.exe </span>
				<span lang="ZH-TW" style="FONT-SIZE: 12pt; FONT-FAMILY: DFHei-Lt-HK-BF; mso-font-kerning: 0pt; mso-bidi-font-family: DFHei-Lt-HK-BF; mso-fareast-language: ZH-TW">的執行結果和您電腦裡面哪一個</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 'Century Gothic'; mso-fareast-font-family: DFHei-Lt-HK-BF; mso-font-kerning: 0pt; mso-bidi-font-family: 'Century Gothic'; mso-fareast-language: ZH-TW">java.exe </span>
				<span lang="ZH-TW" style="FONT-SIZE: 12pt; FONT-FAMILY: DFHei-Lt-HK-BF; mso-font-kerning: 0pt; mso-bidi-font-family: DFHei-Lt-HK-BF; mso-fareast-language: ZH-TW">被執行，然後哪一</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: DFHei-Lt-HK-BF; mso-font-kerning: 0pt; mso-bidi-font-family: DFHei-Lt-HK-BF; mso-fareast-language: ZH-TW">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="ZH-TW" style="FONT-SIZE: 12pt; FONT-FAMILY: DFHei-Lt-HK-BF; mso-font-kerning: 0pt; mso-bidi-font-family: DFHei-Lt-HK-BF; mso-fareast-language: ZH-TW">套</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 'Century Gothic'; mso-fareast-font-family: DFHei-Lt-HK-BF; mso-font-kerning: 0pt; mso-bidi-font-family: 'Century Gothic'; mso-fareast-language: ZH-TW">JRE </span>
				<span lang="ZH-TW" style="FONT-SIZE: 12pt; FONT-FAMILY: DFHei-Lt-HK-BF; mso-font-kerning: 0pt; mso-bidi-font-family: DFHei-Lt-HK-BF; mso-fareast-language: ZH-TW">被拿來執行</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 'Century Gothic'; mso-fareast-font-family: DFHei-Lt-HK-BF; mso-font-kerning: 0pt; mso-bidi-font-family: 'Century Gothic'; mso-fareast-language: ZH-TW">Java </span>
				<span lang="ZH-TW" style="FONT-SIZE: 12pt; FONT-FAMILY: DFHei-Lt-HK-BF; mso-font-kerning: 0pt; mso-bidi-font-family: DFHei-Lt-HK-BF; mso-fareast-language: ZH-TW">應用程式有莫大的關係。</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: DFHei-Lt-HK-BF; mso-font-kerning: 0pt; mso-bidi-font-family: DFHei-Lt-HK-BF; mso-fareast-language: ZH-TW">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="mso-fareast-language: ZH-TW">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l1 level1 lfo2; tab-stops: list 21.0pt">
				<span lang="EN-US" style="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings">
						<span style="mso-list: Ignore">l<span style="FONT: 7pt 'Times New Roman'">         </span></span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">另外，在实际的项目开发中，我们发现很多时候</span>
				<span lang="EN-US">eclipse</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">老报错，提示</span>
				<span lang="EN-US">java</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">虚拟机</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l1 level1 lfo2; tab-stops: list 21.0pt">
				<span lang="EN-US" style="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings">
						<span style="mso-list: Ignore">l</span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">内存不足，但是机器的内存是</span>
				<span lang="EN-US">2G</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的，怎么可能内存不足呢？后来发现是</span>
				<span lang="EN-US">jvm</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">所支持</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l1 level1 lfo2; tab-stops: list 21.0pt">
				<span lang="EN-US" style="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings">
						<span style="mso-list: Ignore">l</span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的内存最高只能设置为</span>
				<span lang="EN-US">64M</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的缘故，这时我们把一套</span>
				<span lang="EN-US">jre</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">拷贝到</span>
				<span lang="EN-US">eclipse</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的目录下，让</span>
				<span lang="EN-US">eclipse</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">单独跑一套</span>
				<span lang="EN-US">jre</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，多个</span>
				<span lang="EN-US">jvm</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">分管工作，</span>
				<span lang="EN-US">jvm</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">内存不足的问题就解决了。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">二、</span>
				<span lang="EN-US">jdk</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">下的</span>
				<span lang="EN-US">lib</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">与</span>
				<span lang="EN-US">jre</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">下的</span>
				<span lang="EN-US">lib</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">有何区别？</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">自己的理解：</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">jdk</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">下的</span>
				<span lang="EN-US">lib</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">包括</span>
				<span lang="EN-US">java</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">开发环境的</span>
				<span lang="EN-US">jar</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">包，</span>
				<span lang="EN-US">jre</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">下的</span>
				<span lang="EN-US">lib</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">只是运行</span>
				<span lang="EN-US">java</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">程序的</span>
				<span lang="EN-US">jar</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">包；</span>
		</p>
<img src ="http://www.blogjava.net/flysky19/aggbug/88935.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/flysky19/" target="_blank">不断前进的小乌龟</a> 2006-12-19 23:22 <a href="http://www.blogjava.net/flysky19/articles/88935.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>