??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲视频中文字幕,国产亚洲精品第一综合,亚洲AV本道一区二区三区四区http://www.tkk7.com/flysky19/category/17551.htmljava之\zh-cnWed, 07 Mar 2007 11:33:17 GMTWed, 07 Mar 2007 11:33:17 GMT60讨论题:用快速的Ҏ(gu)取得文g中这个层ơ树的Q意节点的子节?/title><link>http://www.tkk7.com/flysky19/articles/98293.html</link><dc:creator>不断前进的小乌龟</dc:creator><author>不断前进的小乌龟</author><pubDate>Tue, 06 Feb 2007 06:12:00 GMT</pubDate><guid>http://www.tkk7.com/flysky19/articles/98293.html</guid><wfw:comment>http://www.tkk7.com/flysky19/comments/98293.html</wfw:comment><comments>http://www.tkk7.com/flysky19/articles/98293.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/flysky19/comments/commentRss/98293.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/flysky19/services/trackbacks/98293.html</trackback:ping><description><![CDATA[     摘要: 题目来自一个搜索公司的W试题:http://www.lietu.com/joinus/http://www.lietu.com/joinus/ClassTree.htmhttp://www.lietu.com/joinus/ClassTree.htm一、层ơ树(ClassTree.txt)Q分cd分类名父分类是否是末U?01         图书01001001计算?01            ...  <a href='http://www.tkk7.com/flysky19/articles/98293.html'>阅读全文</a><img src ="http://www.tkk7.com/flysky19/aggbug/98293.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/flysky19/" target="_blank">不断前进的小乌龟</a> 2007-02-06 14:12 <a href="http://www.tkk7.com/flysky19/articles/98293.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于getRealPathhttp://www.tkk7.com/flysky19/articles/98006.html不断前进的小乌龟不断前进的小乌龟Mon, 05 Feb 2007 06:49:00 GMThttp://www.tkk7.com/flysky19/articles/98006.htmlhttp://www.tkk7.com/flysky19/comments/98006.htmlhttp://www.tkk7.com/flysky19/articles/98006.html#Feedback0http://www.tkk7.com/flysky19/comments/commentRss/98006.htmlhttp://www.tkk7.com/flysky19/services/trackbacks/98006.htmlrequest.getRealPath的出?/span>
问题Q?/b>
String filename  =  request.getRealPath(filename)  //Z?br /> -------------------
错误信息Q?br /> The method getRealPath(String) from the type ServletRequest is deprecated

解决Q?br />
资料来源Qhttp://bbs.chinaunix.net/viewthread.php?tid=383861

参看request.getRealPath的java doc:
Deprecated. As of Version 2.1 of the Java Servlet API, use ServletContext.getRealPath(java.lang.String) instead.


而在servlet中用getServletContext.getRealPath()q个Ҏ(gu)收到war 和non-war的媄响,以及不同app server实现的媄响,q气好的话,你常怼得到nullQ嘿嘿,比如你在weblogic上部|war文gQ又调用q个Ҏ(gu)..

推荐ServletContext.getResourceAsStream

参考资料:http://bbs.chinaunix.net/viewthread.php?tid=383861

2.关于serveletContext.getRealPathq回NULL和不同的app serverq回不同的结?br />resoure urlQ?br />http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=121&threadID=12968&start=0&tstart=0

问题Q?/b>

我的应用有几个配|文本配|文Ӟ是一些报表的模板),我放在WEB-INF下面的config目录下,我有E序

中是q样得到q个config的实际\径的
  先用 serveletContext.getRealPath得到根\径,tomcat中比如是
c:\tomcat\webapp\test
  然后我加上?"/WEB-INF/config/aa.config"Q这样得到文件的path然后q行dQ?br />  应用在tomcat上跑是ok的,后来war攑ֈweblogic上,出错Q原因是Q?br />在weblogic上用getRealPath得到的是?br />  myserver\stage\_appsdir_test_war\test.war!\WEB-INF\config....
  q样的\径,于是一直报FileNotFoundException

解决Q?/b>

serveletContext.getRealPath
q个Ҏ(gu)在不同的服务器上所获得的实现是不一L
q种情况我也同样遇到q?br />是通过classloader来获得你配置的资源文?br />
context.getRealPath("/")可能q回了null,你可以输入来看看,
对一个打包的应用来说Q是没有RealPath的概늚Q调用getRealPath只会单地q回null。其实,也很

好理解,一个文件被打包入了.war文gQ就不存在目录结构了Q虽然包中仍然存在目录结构,但这不等?br />
于文件系l中的目录结构)。所以,对war包中的资源是无法得到RealPath的。这样也无从通过文gIO

q行d了?br />
那么Q如何读取war包中的资源呢Q答案是使用ServletContext.getResourceAsStream

("/WEB-INF/config/aa.config")Ҏ(gu)?br />

原则Q基本上是量使用j2ee规范中的各层ơclassloader来获取资源,而不是试囑֎找文件的l对?br />
?br />Ҏ(gu)Q调用this.getClass().getClassLoader().getResource("/").getPath(); 获取到classes目录的全

路径

使用Q在得到classes目录的全路径后再Ҏ(gu)字符串的截取与拼装达C的要求即可?br />

g说的对,WebLogic对WEB-INF目录下的文g是有讉K控制的,最好不要放在这个目录下?br />
最好不要放在WEB-INF目录下。?br />



]]>
递归实现二叉?java http://www.tkk7.com/flysky19/articles/97398.html不断前进的小乌龟不断前进的小乌龟Thu, 01 Feb 2007 18:01:00 GMThttp://www.tkk7.com/flysky19/articles/97398.htmlhttp://www.tkk7.com/flysky19/comments/97398.htmlhttp://www.tkk7.com/flysky19/articles/97398.html#Feedback0http://www.tkk7.com/flysky19/comments/commentRss/97398.htmlhttp://www.tkk7.com/flysky19/services/trackbacks/97398.html阅读全文

]]>
理解堆与?/title><link>http://www.tkk7.com/flysky19/articles/95964.html</link><dc:creator>不断前进的小乌龟</dc:creator><author>不断前进的小乌龟</author><pubDate>Thu, 25 Jan 2007 07:55:00 GMT</pubDate><guid>http://www.tkk7.com/flysky19/articles/95964.html</guid><wfw:comment>http://www.tkk7.com/flysky19/comments/95964.html</wfw:comment><comments>http://www.tkk7.com/flysky19/articles/95964.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/flysky19/comments/commentRss/95964.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/flysky19/services/trackbacks/95964.html</trackback:ping><description><![CDATA[一、引aQ?br />    一直不太明白堆与栈到底是什么,是指一块内存区呢,q是指一U数据结构?~写E序中L到内存分配的栈与堆的区别Q静态与动态分配等QM弄不明白Q隐U知道一点,但d不清堆与栈到底是一块内存区q是内存分配的方式,或者只是一U数据结构?Q?<br /><br />跟杨惠讨论如何徏立决{树的时候,她说实际上就是进栈出栈,当时真是一头雾水呀。隐U知道《TIJ》中说栈是存放数据的一个地方(实际是RAMQ,以前学数据结构时的栈是什么已l不记得了。今天终于下军_先理清堆与栈的概c?br /><br />二、明操作系l?或编译原?的堆与栈和数据结构的堆与栈是不同的概?br />参考资料摘录:<br /><br />1.http://www.bloghome.cn/posts/52992<br /><br />aQ预备知识—程序的内存分配<br /><br />一个由c/C++~译的程序占用的内存分ؓ以下几个部分<br />1、栈区(stackQ?q译器自动分配释放 Q存攑և数的参数|局部变量的值等。其操作方式cM?br /><br />数据l构中的栈?br />2、堆区(heapQ??一般由E序员分配释放, 若程序员不释放,E序l束时可能由O(jin)S回收 。注意它?br /><br />数据l构中的堆是两回事,分配方式倒是cM于链表,呵呵?br />3、全局区(静态区Q(staticQ—,全局变量和静态变量的存储是放在一块的Q初始化的全局变量和静<br /><br />态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在盔R的另一块区域?- E序l束后有<br /><br />pȝ释放<br />4、文字常量区 —常量字W串是攑֜q里的?E序l束后由pȝ释放<br />5、程序代码区—存攑ևC的二q制代码?br /><br />bQ小l:<br />堆和栈的区别可以用如下的比喻来看出:<br />使用栈就象我们去饭馆里吃饭,只管点菜Q发出申P、付钱、和吃(使用Q,吃饱了就赎ͼ不必理会切菜、洗菜等准备工作和洗、刷锅等扫尾工作Q他的好处是快捷Q但是自由度?br />使用堆就象是自己动手做喜Ƣ吃的菜_比较ȝQ但是比较符合自q口味Q而且自由度大?br /><br />堆和栈的区别主要分:<br />操作pȝ斚w的堆和栈Q如上面说的那些Q不多说了?br />q有是数据l构斚w的堆和栈Q这些都是不同的概念。这里的堆实际上指的是Q满_性质的)优先队列的一U数据结构,W?个元素有最高的优先权;栈实际上是满先进后出的性质的数学或数据l构?br />虽然堆栈Q堆栈的说法是连h叫,但是他们q是有很大区别的Q连着叫只是由于历史的原因?br /><br />2.http://topic.csdn.net/t/20051107/15/4376867.html<br />看了大家Ҏ(gu)作系l中堆与栈的说明Q受益匪。我只是在数据结构的层面上说明一下堆与栈Q这是两个完全相关的数据l构。栈l构是后进先出的那个顺序结构,M的数据结构书中都有说明的Q而堆l构是一完全二叉树Q这二叉树的特Ҏ(gu)每个l点的值都比它两个孩子l点中的值小(或者大Q当然如果它有孩子结点的?。栈l构主要用在临时存储局部结果上Q堆l构的特点主要是可以快速地q箋取最?因此当然可以排序?Q这是我对这两个数据l构的理解?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 />呵呵Q不开玩笑了,其实大家有点胡扯Q也不是有意Q因为堆和栈q?个概忉|w就比较hQ有时候是指两U数据结构,教科书里写的比较清楚Q不q说实在的,堆的定义q真有点忘了QshrugQ;有时候,q?个概念又指两U内存分配的方式Q这通常是在操作pȝ原理里讲。上面这2U情况,原理性概忉|比较强Q实际中真很hMl想Q惭愧ingQ。第三种时候,也是我在前面胡扯的,呵呵Q这2个概念通常又؜在一P大家都堆栈堆栈的_旉长了Q也分不清了:)Q这q是和第二种有关Q因为大多数OS通常是将heap和stack攑֜一P或者说比较接近Q,通常一个在高端Q一个在低端Q分配内存时Q方向是相对的,之间q没有很明确的界限,APUE CHAP7有讲?br />另外Q印象中Q两者还有一个区别就是,stack通常用于函数调用Q而heap通常用于q程内局部变量的分配Q不q这个印象是很久之前的印象了Q不知道对不寏V?br />BTWQ偶不是高手Q连所谓的都不是:Q,不过倒学CҎ(gu)巧,q里的高手往往不轻易出手,最好的Ҏ(gu)是刺激他们Q嘿?br /><br />三、由C/C++~译的程序占用的内存分配Q堆与栈的区?br />http://www.bloghome.cn/posts/52992<br />堆与栈的区别<br />c /liaxiz 发表?006-10-14 23:32<br /><br />一、预备知识—程序的内存分配<br /><br />一个由c/C++~译的程序占用的内存分ؓ以下几个部分<br />1、栈区(stackQ?q译器自动分配释放 Q存攑և数的参数|局部变量的值等。其操作方式cM?br /><br />数据l构中的栈?br />2、堆区(heapQ??一般由E序员分配释放, 若程序员不释放,E序l束时可能由O(jin)S回收 。注意它?br /><br />数据l构中的堆是两回事,分配方式倒是cM于链表,呵呵?br />3、全局区(静态区Q(staticQ—,全局变量和静态变量的存储是放在一块的Q初始化的全局变量和静<br /><br />态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在盔R的另一块区域?- E序l束后有<br /><br />pȝ释放<br />4、文字常量区 —常量字W串是攑֜q里的?E序l束后由pȝ释放<br />5、程序代码区—存攑ևC的二q制代码?br /><br />例子E序<br />q是一个前辈写的,非常详细<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在常量区Qp3在栈上?br /> static int c =0Q    ?全局Q静态)初始化区<br /> p1 = (char *)malloc(10);<br /> p2 = (char *)malloc(20);      分配得来?0?0字节的区域就在堆区?br /> strcpy(p1, "123456");         123456\0攑֜帔R区,~译器可能会它与p3所指向<br /><br />?123456"优化成一个地?br />}<br /><br />二、堆和栈的理论知?br /><br />2.1甌方式<br />stack:<br />ql自动分配?例如Q声明在函数中一个局部变?int b; pȝ自动在栈中ؓb开辟空?br />heap:<br />需要程序员自己甌Qƈ指明大小Q在c中malloc函数<br />如p1 = (char *)malloc(10);<br />在C++中用newq算W?br />如p2 = (char *)malloc(10);<br />但是注意p1、p2本n是在栈中的?br /><br />2.2<br />甌后系l的响应<br />栈:只要栈的剩余I间大于所甌I间Q系l将为程序提供内存,否则报异常提示栈溢出?br />堆:首先应该知道操作pȝ有一个记录空闲内存地址的链表,当系l收到程序的甌Ӟ<br />会遍历该链表Q寻扄一个空间大于所甌I间的堆l点Q然后将该结点从I闲l点链表中删除,q将?br /><br />l点的空间分配给E序Q另外,对于大多数系l,会在q块内存I间中的首地址处记录本ơ分配的大小Q?br /><br />q样Q代码中的delete语句才能正确的释放本内存I间。另外,׃扑ֈ的堆l点的大不一定正好等?br /><br />甌的大,pȝ会自动的多余的那部分重新放入空闲链表中?br /><br />2.3甌大小的限?br />栈:在Windows?栈是向低地址扩展的数据结构,是一块连l的内存的区域。这句话的意思是栈顶的地址<br /><br />和栈的最大容量是pȝ预先规定好的Q在 WINDOWS下,栈的大小?MQ也有的说是1MQM是一个编译时<br /><br />q定的常数Q,如果甌的空间超q栈的剩余空间时Q将提示overflow。因此,能从栈获得的I间较小<br /><br />?br />堆:堆是向高地址扩展的数据结构,是不q箋的内存区域。这是由于系l是用链表来存储的空闲内存地址<br /><br />的,自然是不q箋的,而链表的遍历方向是由低地址向高地址。堆的大受限于计算机系l中有效的虚?br /><br />内存。由此可见,堆获得的I间比较灉|Q也比较大?br /><br />2.4甌效率的比较:<br />栈由pȝ自动分配Q速度较快。但E序员是无法控制的?br />堆是由new分配的内存,一般速度比较慢,而且Ҏ(gu)产生内存片,不过用v来最方便.<br />另外Q在WINDOWS下,最好的方式是用VirtualAlloc分配内存Q他不是在堆Q也不是在栈是直接在q程?br /><br />地址I间中保留一快内存,虽然用v来最不方ѝ但是速度快,也最灉|<br /><br />2.5堆和栈中的存储内?br />栈: 在函数调用时Q第一个进栈的是主函数中后的下一条指令(函数调用语句的下一条可执行语句Q的<br /><br />地址Q然后是函数的各个参敎ͼ在大多数的C~译器中Q参数是由右往左入栈的Q然后是函数中的局部变<br /><br />量。注意静态变量是不入栈的?br />当本ơ函数调用结束后Q局部变量先出栈Q然后是参数Q最后栈指针指向最开始存的地址Q也是d<br /><br />C的下一条指令,E序p点l运行?br />堆:一般是在堆的头部用一个字节存攑֠的大。堆中的具体内容有程序员安排.<br /><br />2.6存取效率的比?br /><br />char s1[] = "aaaaaaaaaaaaaaa";<br />char *s2 = "bbbbbbbbbbbbbbbbb";<br />aaaaaaaaaaa是在q行时刻赋值的Q?br />而bbbbbbbbbbb是在~译时就定的;<br />但是Q在以后的存取中Q在栈上的数l比指针所指向的字W串(例如?快?br />比如Q?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 />W一U在d时直接就把字W串中的元素d寄存器cl中,而第二种则要先把指针D到edx中,在根?br /><br />edxd字符Q显然慢了?br /><br />2.7结Q?br />堆和栈的区别可以用如下的比喻来看出:<br />使用栈就象我们去饭馆里吃饭,只管点菜Q发出申P、付钱、和吃(使用Q,吃饱了就赎ͼ不必理会?br /><br />菜、洗菜等准备工作和洗、刷锅等扫尾工作Q他的好处是快捷Q但是自由度?br />使用堆就象是自己动手做喜Ƣ吃的菜_比较ȝQ但是比较符合自q口味Q而且自由度大?br /><br />堆和栈的区别主要分:<br />操作pȝ斚w的堆和栈Q如上面说的那些Q不多说了?br />q有是数据l构斚w的堆和栈Q这些都是不同的概念。这里的堆实际上指的是Q满_性质的)优先<br /><br />队列的一U数据结构,W?个元素有最高的优先权;栈实际上是满先进后出的性质的数学或数据l构<br /><br />?br />虽然堆栈Q堆栈的说法是连h叫,但是他们q是有很大区别的Q连着叫只是由于历史的原因?br /><br />-----------------------------------------------------------------------------------------------------------------<br />      ?heap)和栈(stack)是C/C++~程不可避免会碰到的两个基本概念。首先,q两个概念都可以在讲?br /><br />据结构的书中扑ֈQ他们都是基本的数据l构Q虽然栈更ؓ单一些?br /><br />      在具体的C/C++~程框架中,q两个概念ƈ不是q行的。对底层机器代码的研I可以揭C,栈是机器<br /><br />pȝ提供的数据结构,而堆则是C/C++函数库提供的?br /><br />      具体地说Q现代计机(串行执行机制)Q都直接在代码底层支持栈的数据结构。这体现在,有专门的<br /><br />寄存器指向栈所在的地址Q有专门的机器指令完成数据入栈出栈的操作。这U机制的特点是效率高Q支?br /><br />的数据有限,一般是整数Q指针,点数等pȝ直接支持的数据类型,q不直接支持其他的数据结构。因<br /><br />为栈的这U特点,Ҏ(gu)的用在E序中是非常频繁的。对子程序的调用是直接利用栈完成的。机器的<br /><br />call指o里隐含了把返回地址推入栈,然后跌{臛_E序地址的操作,而子E序中的ret指o则隐含从?br /><br />栈中弹出q回地址q蟩转之的操作。C/C++中的自动变量是直接利用栈的例子,q也是Z么当函数q?br /><br />回时Q该函数的自动变量自动失效的原因(因ؓ堆栈恢复了调用前的状??br /><br />      和栈不同Q堆的数据结构ƈ不是ql?无论是机器系l还是操作系l?支持的,而是由函数库提供?br /><br />。基本的malloc/realloc/free函数l护了一套内部的堆数据结构。当E序使用q些函数去获得新的内?br /><br />I间Ӟq套函数首先试图从内部堆中寻扑֏用的内存I间Q如果没有可以用的内存I间Q则试图利用<br /><br />pȝ调用来动态增加程序数据段的内存大,新分配得到的I间首先被组l进内部堆中去,然后再以适当<br /><br />的Ş式返回给调用者。当E序释放分配的内存空间时Q这片内存空间被q回内部堆结构中Q可能会被适当<br /><br />的处?比如和其他空闲空间合q成更大的空闲空?Q以更适合下一ơ内存分配申诗这套复杂的分配?br /><br />制实际上相当于一个内存分配的~冲?Cache)Q用这套机制有如下若干原因Q?br /><br />    1. pȝ调用可能不支持Q意大的内存分配。有些系l的pȝ调用只支持固定大及其倍数的内?br /><br />h(按页分配)Q这L话对于大量的内存分cL说会造成费?br /><br />    2. pȝ调用甌内存可能是代h늚。系l调用可能涉及用h和核心态的转换?br /><br />    3. 没有理的内存分配在大量复杂内存的分配释放操作下很容易造成内存片?br /><br />    堆和栈的Ҏ(gu)<br /><br />    从以上知识可知,栈是pȝ提供的功能,特点是快速高效,~点是有限制Q数据不灉|Q而堆是函?br /><br />库提供的功能Q特Ҏ(gu)灉|方便Q数据适应面广泛,但是效率有一定降低。栈是系l数据结构,对于q程<br /><br />/U程是唯一的;堆是函数库内部数据结构,不一定唯一。不同堆分配的内存逻辑上无法互相操作。栈I?br /><br />间分静态分配和动态分配两U。静态分配是~译器完成的Q比如自动变?auto)的分配。动态分配由<br /><br />alloca函数完成。栈的动态分配无需释放(是自动的)Q也没有释攑և数。ؓ可移植的E序赯Q栈的动<br /><br />态分配操作是不被鼓励的!堆空间的分配L动态的Q虽然程序结束时所有的数据I间都会被释攑֛pȝ<br /><br />Q但是精的甌内存/释放内存匚w是良好程序的基本要素?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.tkk7.com/flysky19/aggbug/95964.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/flysky19/" target="_blank">不断前进的小乌龟</a> 2007-01-25 15:55 <a href="http://www.tkk7.com/flysky19/articles/95964.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>创徏二叉树-递归实现http://www.tkk7.com/flysky19/articles/95754.html不断前进的小乌龟不断前进的小乌龟Wed, 24 Jan 2007 08:22:00 GMThttp://www.tkk7.com/flysky19/articles/95754.htmlhttp://www.tkk7.com/flysky19/comments/95754.htmlhttp://www.tkk7.com/flysky19/articles/95754.html#Feedback0http://www.tkk7.com/flysky19/comments/commentRss/95754.htmlhttp://www.tkk7.com/flysky19/services/trackbacks/95754.html   大三上学期学了数据结构后没再接触过数据l构的内容了Q至今已l整整两q半了,已经把链表,队列Q堆栈,树,二叉树等内容忘得q干净净了,q且如果不是军_做《机器学习》的作业Q自׃毫没有意识到自己已经忘得q干净净Q或者说是以前只是依L葫芦的把二叉树的E序调出来了Q但是根本就没有明白其中的原理!Q?br />
二、做《机器学习》作业的时候,怎么也想不明白两个问题:
W一个问题:
"p->next"表示什么?p是一个指针,指针怎么会有next呢?应该Nodel构体才有next指针呀?br />
W二个问题:
怎么建立一|Q杨惠说要传一个根l点Qƈq回该根l点Q但是ؓ什么要传一个根l点呢?q回一个根l点怎么p表示一|了呢Q?真是想不明白Q!

W三个问题:
建树函数buildTree()或者insert()Qcreate(){需要设|几个参敎ͼ必须讄一个Node root参数吗?如果不设|root参数Q怎么让它递归呢?

三、解冻I
W一个问题:
唉,太久没看指针了,或者说以前Ҏ(gu)没有理解什么是指针Q指针变量,指针变量所指向的变量等概念Q复习了一遍K强的C语言的书Q感觉第一个问题豁然开朗。原?p->next"表示的是Qp指针变量所指向的变量的next指针变量?br />
W二个问题:
唉,看来以前Ҏ(gu)没有理解二叉树,也没有理解递归Ҏ(gu)Q只因ؓ吴^老师的一句“递归Ҏ(gu)效率低”就完全不看递归了,真是ȝ。不仅仅是递归Q感觉自p函数参数都不太理解,Ҏ(gu)不知道什么时候需要参敎ͼ参数有何作用。更不用说明白一个函数的设计关键要清楚它传入什么参敎ͼq回什么结果了?br />
W三个问题:
至今仍然不太明白Q似乎就是必L受一个Node root参数?br />
查了|上的递归建立二叉树的几个E序Q它们分别是无参数、有一个参数、有两个参数的三U不同实现方法,从中l于领?zhn)C么时候需要参敎ͼZ么需要参CQ可是第二、三个例子的一个参数和两个参数实际是一LQ只不过一个参数的例子用控制台输入数据而已。唉Q还是不知道如果不设|一个Node root参数可不可实现徏树?br />
四、下面分别是q三个徏立二叉树的程序:
1.无参敎ͼhttp://www.51log.net/dev/603/4692612.htm
Tree *Create()
{
    char ch;
    cin>> ch;
    Tree *root;

    if( ch == NIL )
    {
         return NULL;
    }
    else
    {
         root = new Tree(ch);
         root->left = Create();
         root->right = Create();
         return root;
    }
}
自己的注释:
Create函数Q?br />输入Q无
输出Q一二叉树Q根据返回的root根结Ҏ(gu)?注意不是root根结点,而是指针)p讉K到这|的所有结点了Q?br />
2.一个参敎ͼhttp://shakesmin.javaeye.com/blog/43107
# //创徏二叉树 ?
# void CreateBiTree(BiTree &t) {  
#     int ch=getchar();  
#     if(ch==' ') t=NULL;  
#     else {  
#         if( !( t=(BiTNode*)malloc(sizeof(BiTNode))) ) exit(OVERFLOW);  
#         t->data=ch;  
#         CreateBiTree(t->lchild);  
#         CreateBiTree(t->rchild);  
#     }  
# }  

自己的注释:
CreateBiTree函数Q?br />输入Q根l点Q?br />输出Q一二叉树Q(无返回|

注意Q?br />q种Ҏ(gu)传入根结点,但是没有q回值的原理。下面看一下它的用方式就明白了:
# //递归遍历二叉树 ?
# void PreOrderTraverse(BiTree t) {  
#     if(t) {  
#         /* 以先序方式遍?若要以中序或后序遍历 
#         只需改变以下三句序*/ 
#         printf("%c ",t->data);  
#         PreOrderTraverse(t->lchild);  
#         PreOrderTraverse(t->rchild);  
#     }  
# }  

# int main() {  
#     BiTree t;  
#     printf("h先序正确输入二叉?I格为空?:\n");  
#     CreateBiTree(t);  
#  
#     printf("先序历遍: ");  
#     PreOrderTraverse(t);  
#     return 0;  
# } 
明白了吧Q原来是在main函数中定义了一个全局的根l点Q以该根l点为基建立二叉树和遍历二叉树,因此CreateBiTree中就不再需要返回root根结Ҏ(gu)针才能访问该二叉树,它的PreOrderTraverse遍历函数传的直接是根l点Q而第一个程序中遍历函数传的是指向root的指针变量?br />
3.有两个参敎ͼhttp://dev.csdn.net/article/68/68480.shtm
#include <iostream.h>
#ifndef DEBUG
#define DEBUG
typedef int DataType;
typedef struct Node
{
       DataType        data;
       struct Node  *LChild;
       struct Node  *RChild;
}Node;
/*树的数据l构*/
/////////////////////////////////////////////////////////////
Node * Initiate()
/*初始化ؓI树*/
{
       Node   *root = 0;
       return   root ;
}
/////////////////////////////////////////////////////////////
Node * Creat(  DataType data  )
 /*?/
{
       Node   * Temp   = new Node ;
       Temp -> data     = data ;
       Temp -> LChild = 0 ;
       Temp -> RChild = 0;
       return Temp ;
}
 
/************************************************/
void  Insert( Node *&root , DataType data )
//在c下不能这?Node *&root
/* 降顺序二叉数装入数据Q左子树<叛_?/
{     
       Node *p = Creat( data );//注:该程序中此行代码在if前,如果要插入一个非rootl点Q则每次都要新创Z个结点,一q入insert()创徏一个pQ递归时又创徏一ơ。如果把该语句放到if内也不对Q因为else if( p->data < root->data )时p׃ؓIZ?br />       if( !root  )
       {      //Node *p = Creat( data ); //注:原程序逻辑不对Q应该在if为真时才创徏新结点;
              root = p;
           
       }
          else if( p->data < root->data )
          {
                 Insert ( root->LChild , p->data );
          }
          else
          {
                 Insert ( root->RChild , p->data );
          } /*相等?装数据到右孩子 */
       
}
/****************************************************/
 void PrintTree(Node * root)
 /*递归中序遍历 ---> 昄从小到大*/
{
       if( !root )  return ;
       PrintTree(root->LChild);
     
      cout<< root->data <<"  :";
      PrintTree( root->RChild );
      return ;
}

自己的注释:
Insert函数Q?br />输入Q根l点和结Ҏ(gu)据;
输出Q一二叉树Q(无返回|

注意Q?br />同样Q这U方式也传入了根l点来创Z叉树Qƈ且函数没有返回root指针变量。再看它的用方式:
///试代码////////////
void main()
{
       int a;
       Node *Root = Initiate() ;
       cout<<" -1 to exit: "<<endl;
       cin>>a;           
       while( (a != -1)&&cin.good() )
                 //遇到非法输入同样退出@?br />       {    
              Insert( Root ,  a );
                       cin>>a ;                       
       }
         if(!cin.good())
                     //输出错误信息
         {
                     cout<<" the type is error ! "<<endl;
         }
          PrintTree(Root);
          cout<<" ok ? "<<endl;
           FreeTree(Root);//销毁树 防止内存泄漏
          return;
}

现在明白了吧Q也是在main中事先定义了一个root全局指针变量Q然后把它做为参数徏立二叉树和遍历二叉树?br />
l合自己买的那本书《数据结?法与实?C++描述》上的清晰描qͼ知道Q一二叉树是数据在内存中的逻辑表示Q需要有一个指向该二叉树的root根节点的指针变量来记录它的首地址Q然后就能访问到该树的所有结点了?br />
那么Q这个根l点的指针变量在create()函数内定义呢Q第一U无参的实现方式Q,q是在main函数中定义?—?gt;两种方式都可以!如果在create()函数内定义,则需要返回该root的指针变量,q样才能取得二叉树的首地址遍历该树Q如果在main函数中定义,则在create(TreeNode *root)中添加一参数接受该首地址建立二叉树。okQ?br />


参考资料:
1. 二叉树的创徏函数中对参数的疑?br />http://www.51log.net/dev/603/4692612.htm

2. 数据l构评源代码之二叉树实现及相关法
http://shakesmin.javaeye.com/blog/43107

3. ::递归实现——创Z叉树 ----> 装入数据--->遍历---> 昄 --->销?:递归实现) 
http://dev.csdn.net/article/68/68480.shtm







]]>
Eclipse中报错“要了解详细信息Q请使用-xlint:unchecked重新~译”的解决Ҏ(gu)http://www.tkk7.com/flysky19/articles/95583.html不断前进的小乌龟不断前进的小乌龟Tue, 23 Jan 2007 09:42:00 GMThttp://www.tkk7.com/flysky19/articles/95583.htmlhttp://www.tkk7.com/flysky19/comments/95583.htmlhttp://www.tkk7.com/flysky19/articles/95583.html#Feedback0http://www.tkk7.com/flysky19/comments/commentRss/95583.htmlhttp://www.tkk7.com/flysky19/services/trackbacks/95583.html一、遇到问题:
用ant执行jasperreport的samples\chartsCZ的build.xmlӞ无法~译Q提C错误如下:
javac:
    [javac] Compiling 2 source files to E:\jiangcm\workspace-forict-myeclipse\jasperreports\demo\samples\charts
    [javac] 注意Q?E:\jiangcm\workspace-forict-myeclipse\jasperreports\demo\samples\charts\ChartsApp.java 使用了未l检查或不安全的操作?br />    [javac] 注意Q?要了解详l信息,请?-Xlint:unchecked 重新~译?br />
二、查了一下资料,知道是泛型的原因Q网上查到的解决Ҏ(gu)主要有以下几U:

1.~译时带上参?source 1.4
2.使用@SupressWarnings("unchecked")注释
3.更新你的代码Q用List<Object>. List<Object>的实例能接受Mcd的对象,像是一个原型List。然而,~译器不会报错?br />(以上三种Ҏ(gu)来源Qhttp://www.matrix.org.cn/resource/article/43/43634_java_generics.htmlQ?br />
4.如果你用的AntQ用build.xml~译的话Q可以右击build.xml文gQ?br />--> 执行 --> 构成和执行,选择 参数Q在《程序参数》里面输?xlint:unchecked卛_;

5.扑ֈbuild.xml里面cM的语句,加上一句话Q?br /><!-- Java Compile -->
<target name="compile" depends="init">
<javac srcdir="src" destdir="${classdir}"
deprecation="on" encoding="Windows-31J" debug="on" includes="**/jp/**">
<compilerarg value="-Xlint:unchecked"/> `<!-- 是q句话!Q?-->
<classpath refid="project.class.path" />
</javac>
</target>
Q以上两U方法来源:http://www.itwenku.com/java/12/47796.htmQ?br />
三、自q试验与结?br />
W一U:
“编译时带上参数-source 1.4”用方法:
扑ֈbuild.xml里面cM的语句,加上一句话Q?br /><javac srcdir="${src.dir}" destdir="${classes.dir}" >
 <classpath refid="classpath"/>
 <compilerarg line="-source 1.5"/> `<!-- 是q句话!注意与第五种方式不同的是line标签而不是valueQ?-->
</javac>
~译通过Qcharts下的报表出现了!

W二U:
“用@SupressWarnings("unchecked")注释”:
在ChartsApp.java的main函数前加上了q个注释Q但是没有v作用Q提C错误依然是“[javac] 注意Q?要了解详l信息,请?-Xlint:unchecked 重新~译。”,怎么回事呢?

在一文章中扑ֈ了答案:
http://www.matrix.org.cn/resource/article/43/43864_Generic_Types.html
在撰写本文时候,javacq不支持@SuppressWarnings 的注解。期望在Java 5.1中得到支持?

W三U:
更改代码为泛型用方式:
原来的代码:
Map parameters = new HashMap();
parameters.put("MaxOrderID", new Integer(12500));

更改后的代码Q?br />Map<String,Integer> parameters = new HashMap<String,Integer> ();
parameters.put("MaxOrderID", new Integer(12500));
或者:
Map<Object,Object> parameters = new HashMap<Object,Object> ();
parameters.put("MaxOrderID", new Integer(12500));

更改后,利通过~译Q也能看到报表了Q!

W四U:
l验证无效;

W五U:
<javac srcdir="src" destdir="${classdir}"
deprecation="on" encoding="Windows-31J" debug="on" includes="**/jp/**">
<compilerarg value="-Xlint:unchecked"/> `<!-- 是q句话!Q?-->
<classpath refid="project.class.path" />
</javac>

加上"<compilerarg value="-Xlint:unchecked"/>" 后,出现"警告",不过~译利通过Q也能看到报表了Q?br />~译提示如下Q?br />    [javac] Compiling 2 source files to E:\jiangcm\workspace-forict-myeclipse\jasperreports\demo\samples\charts
    [javac] E:\jiangcm\workspace-forict-myeclipse\jasperreports\demo\samples\charts\ChartsApp.java:115: 警告Q?[unchecked] 对作为普通类?java.util.Map 的成员的 put(K,V) 的调用未l检?br />    [javac] parameters.put("MaxOrderID", new Integer(12500));
    [javac] ^
    [javac] 1 警告


呵呵Q答案是丰富多彩的,条条大道通罗马,q次不仅解决了问题,q找C四种解决问题的方法?br />

参考资料:
1.J2SE 5.0中的泛型
作者:Budi Kurniawan
http://www.matrix.org.cn/resource/article/43/43634_java_generics.html
2.Eclipse中报jsp中有错误“要了解详细信息Q请使用-xlint:unchecked重新~译”,具体在菜单上怎么操作Q?br />http://www.itwenku.com/java/12/47796.htm
3.泛型cdQ第一部分
作? David Flanagan
http://www.matrix.org.cn/resource/article/43/43864_Generic_Types.html
4.有关ant的faq
http://www.tkk7.com/luckyrobbie/articles/24117.html

Q. How to pass -Xlint or -Xlint:unchecked to 1.5 javac task?
A: pass it as compilerarg nested <compilerarg> to specify.

  <compilerarg value="-Xlint"/>
  <!-- or -->
  <compilerarg value="-Xlint:unchecked"/>




]]>
取字W串的最后几个字W?/title><link>http://www.tkk7.com/flysky19/articles/93710.html</link><dc:creator>不断前进的小乌龟</dc:creator><author>不断前进的小乌龟</author><pubDate>Sun, 14 Jan 2007 02:13:00 GMT</pubDate><guid>http://www.tkk7.com/flysky19/articles/93710.html</guid><wfw:comment>http://www.tkk7.com/flysky19/comments/93710.html</wfw:comment><comments>http://www.tkk7.com/flysky19/articles/93710.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/flysky19/comments/commentRss/93710.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/flysky19/services/trackbacks/93710.html</trackback:ping><description><![CDATA[ <p>2007q??4?br />java中没有直接可以从最后一个字W往前读取得子串的函敎ͼ那么如何取得字符</p> <p>串的最后几个字W呢Q?br />查了一下资料和apiQ觉得可以用两种Ҏ(gu)Q?br />法一Q?br />用@环直到结束,q样取得字符串的长度Q然后再从长度往前取Q?br />法二Q?br />先取得前面的子串Q然后再用replaceҎ(gu)Q例如:<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>哈哈Q自q是太W了Q其实so easyQ:<br />String subs = s.substring((s.length()-5),s.length());</p> <p>启发资料Q?br />JavaScript 中如何取得一串字W串除后5个的其h全部<br /><a >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.tkk7.com/flysky19/aggbug/93710.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/flysky19/" target="_blank">不断前进的小乌龟</a> 2007-01-14 10:13 <a href="http://www.tkk7.com/flysky19/articles/93710.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于java中对数的计算http://www.tkk7.com/flysky19/articles/93708.html不断前进的小乌龟不断前进的小乌龟Sun, 14 Jan 2007 01:21:00 GMThttp://www.tkk7.com/flysky19/articles/93708.htmlhttp://www.tkk7.com/flysky19/comments/93708.htmlhttp://www.tkk7.com/flysky19/articles/93708.html#Feedback0http://www.tkk7.com/flysky19/comments/commentRss/93708.htmlhttp://www.tkk7.com/flysky19/services/trackbacks/93708.html2007q??4?br />关于java中对数的计算
http://dev.poptool.net/host/363/4468363638.shtml

最qؓ了计文档间的相x需要用到对数的计算Q在|上扑ֈ下面的方法:
其中的关键是Q? java标准包提供了自然Ҏ(gu)的计方法,2 其他的对数计可

以{换ؓ自然Ҏ(gu)的计?/p>

下面是{_但不知道谁是原创作者?br />后来搜烦到这个连接:
q是人家有专业精:
下面是他的描qͼ
 Java supplies a function to calculate natural logs, base e =

2.718281828459045. To calculate logs to other bases, you need to

multiply by a fixed constant: for a log base b multiply by 1/logeb

 

  Sun的J2SE提供了一个计自然对数方法——double java.lang.Math.log

(double)。请看如下代码:
  double x = Math.log(5);
  {h(hun)于下面的数学方程Q?br />  x = ln 5
  ?br />  x = loge5
  其中e是内皮尔数或自然数?/p>


  如果你想底不同的对数又该如何做呢?很遗憾,我们q没有办法计以10

为底或以2为底的对数?br />    但是它们却是在计对数时用的最多的?br />    要想解决q个问题Q我们就要回xl在学校里学q的数学和对数方E:
  logx(y) =loge(x) / loge(y)
  q只需一D늮单的JavaE序来实玎ͼ
  public class Logarithm {
       static public double log(double value, double base) {
       return Math.log(value) / Math.log(base);
       }
  }
  计算100的以10为底的对数就变ؓ非常单了Q?br />  double log = Logarithm.log(100, 10); // log is 2.0
  512的以2为底的对数是Q?br />  double log = Logarithm.log(512, 2); // log is 9.0
  下面的两个简单的Ҏ(gu)也都是很有用的:
  static public double log2(double value) {
   return log(value, 2.0);
   }
   static public double log10(double value) {
   return log(value, 10.0);
   }



]]>
DecisionTree收获ȝhttp://www.tkk7.com/flysky19/articles/93707.html不断前进的小乌龟不断前进的小乌龟Sun, 14 Jan 2007 01:17:00 GMThttp://www.tkk7.com/flysky19/articles/93707.htmlhttp://www.tkk7.com/flysky19/comments/93707.htmlhttp://www.tkk7.com/flysky19/articles/93707.html#Feedback0http://www.tkk7.com/flysky19/comments/commentRss/93707.htmlhttp://www.tkk7.com/flysky19/services/trackbacks/93707.htmlDecisionTree收获ȝ
1.java.io;
2.真正理解了数l的作用Q?br />3、array、ArrayListcRArrayscȝ使用、关pR区别和互换Q?br />4、相对\径与l对路径Q?br />5、HashTable、HashMapQArrayList、Vector的区别?br />6、如何读取文Ӟ分析处理数据Q?br />7、字W串处理Q分割字W串Q取子串{;
8、对数处理;Q根据logx(y) =loge(x) / loge(y)求以2为底的对敎ͼ
9、第一ơ鼓起勇气去面对写程序,Ҏ(gu)法和说明,ȝ解、分析、ƈ写代码;

]]>
实现DecisionTree专题一Q对6000多个属性的qh与解?/title><link>http://www.tkk7.com/flysky19/articles/93501.html</link><dc:creator>不断前进的小乌龟</dc:creator><author>不断前进的小乌龟</author><pubDate>Fri, 12 Jan 2007 10:28:00 GMT</pubDate><guid>http://www.tkk7.com/flysky19/articles/93501.html</guid><wfw:comment>http://www.tkk7.com/flysky19/comments/93501.html</wfw:comment><comments>http://www.tkk7.com/flysky19/articles/93501.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/flysky19/comments/commentRss/93501.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/flysky19/services/trackbacks/93501.html</trackback:ping><description><![CDATA[实现DecisionTree专题一Q对6000多个属性的qh与解?br /><br />h做决{树分类器的作业Q第一步当然是d文gQ取得所有行的数据;但是自己在q停住了QL<br /><br />着应该设计一个Samplec,q个cL6000多个属性,那么岂不是要定义6000多个变量Q百思不得其解呀?br /><br />后来问杨惠,杨惠_定义一个数l就可以了,每次只需要找出熵最大的那个属性就可以。恍然大(zhn)的?br /><br />觉!<br /><br />自己可能之前一直在看UML的书QUML书上说一般先分析pȝ会有哪些类Q然后分析这些类的属性和Ҏ(gu)<br /><br />{,同时要遵守单一职责原则QSRPQ、开放-闭原则QOCPQ等Q所以,自己现在很自然的惛_要去?br /><br />析实现这个决{树会有什么类Q然后Samplecdq样冒出来了?br /><br />其实QUML只适合用于分析工程目Qƈ不适合用于分析法cȝE序Q这个Bob大叔的《uml for java <br /><br />pro》书上也提到了?br /><br />首先分析要解决什么事情,需要每一步做什么,再去考虑怎么写代码才是正的。例如,构徏<br /><br />decisiontree的第一步是求各个属性的熵(W二步是取熵的最大|Q那么就惛_何去求各个属性的熵就<br /><br />okQ而不是看着数据I想构造什么SamplecR因为decisiontree是以属性ؓ基础的,无需构造样本类?br /><br />原以为到此,自己已经弄明白了Q学习和ȝ了数l与ArrayList的内容之后,才突然发玎ͼ原来自己?br /><br />qh源于数组与ArrayList的迷惑!自己的语a功底太差了!q是要定义一个样本类Samplec,q个c?br /><br />?000多个属性,也只需要定义一个属性数lAttributes[]或者一个ArrayList attributesok了!q正<br /><br />是数l的作用Q!看了良葛格的《java jdk5 学习W记》的“数l”那章才忽然明白q来了!<br /><br /><br />补充内容Q?br />1.Z么需要数l?<br />Q《java jdk5.0 学习W记》良葛格 http://book.csdn.net/bookfiles/135/1001354617.shtmlQ?br />例如Q现在要整理全班的Java考成l,(zhn)希望写个小E序Q全班共?0名学生,所以必L40个变量来<br /><br />存储学生的成l。现在问题来了,Ҏ(gu)W?章学q的变量定义方式Q难道要定义40个名UC同的变量来存<br /><br />储学生的成W数据吗?<br /><br />当然不必q么ȝQJava提供“数l?Array)让?zhn)可以定义一个以“烦引?Index)作ؓ识别的数据结?br /><br />。在Java中,可以q么定义一个数lƈ初始数组内容Q?br /><br />int[] score = {90, 85, 55, 94, 77};<br /><br /><br />2.ArrayList可以|入L数据cdQ包括数l;例如Q可以置入String[]cd的对象。因为ArrayList?br /><br />w就是数l,在ArrayList中置入数l,也就相当于一个二l数l?br /><br />在java中,数组也是对象Q二l数l的实际是连l存放一l数l对象的各个reference?br /><br /><br /><br />受启发的资料Q?br />ArrayList<String[]>如何导出为String[][]?<br />http://www.mysdn.cn/Java/J2SEjichulei/20060914/9172.html<br /><br />《java jdk5.0 学习W记》良葛格 W五?数组<br /> http://book.csdn.net/bookfiles/135/1001354617.shtml<br /><br /><br /><br /><br /><br /><br /><img src ="http://www.tkk7.com/flysky19/aggbug/93501.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/flysky19/" target="_blank">不断前进的小乌龟</a> 2007-01-12 18:28 <a href="http://www.tkk7.com/flysky19/articles/93501.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java 使用相对路径d文ghttp://www.tkk7.com/flysky19/articles/93492.html不断前进的小乌龟不断前进的小乌龟Fri, 12 Jan 2007 09:44:00 GMThttp://www.tkk7.com/flysky19/articles/93492.htmlhttp://www.tkk7.com/flysky19/comments/93492.htmlhttp://www.tkk7.com/flysky19/articles/93492.html#Feedback0http://www.tkk7.com/flysky19/comments/commentRss/93492.htmlhttp://www.tkk7.com/flysky19/services/trackbacks/93492.html
1.java project环境Q用java.io用相对\径读取文件的例子Q?br /> *目录l构Q?br />  DecisionTree
            |___src
                 |___com.decisiontree.SamplesReader.java
            |___resource
                 |___train.txt,test.txt
 *SamplesReader.java:
  String filepath="resource/train.txt";//注意filepath的内容;
  File file=new File(filepath);
  …?br />
 *我们留意filepath的内容,java.io默认定位到当前用L?"user.dir")下,卻I工程根目

?D:\DecisionTree"下,因此Q此时的相对路径(以user.dir为基路径的\??resource/train.txt"

。这PJVM可以根?user.dir"?resource/train.txt"得到完整的\径(即绝对\

径)"D:\DecisionTree\resource\train.txt"Q从来找到train.txt文g?br />
 *注意Q相对\径的起始处无斜杆"/";例如Q?br />filepath="resource/train.txt";
而不是filepath="/resource/train.txt"; //error!

2、javaEE环境Q用Classloader用相对\径读取xml的例子:
 *参见之前写的文章“通过虚拟路径或相对\径读取一个xml文gQ避免硬~码”?br />
 *内容如下Q?br /> java使用相对路径dxml文gQ?br />一、xml文g一般的存放位置有三个:
1.攑֜WEB-INF下;
2.xml文g攑֜/WEB-INF/classes目录下或classpath的jar包中Q?br />3.攑֜与解析它的javacd一个包中,不一定是classpathQ?br />
二、相对应的两U用相对\径的dҎ(gu)Q?br />
Ҏ(gu)一Q(未验证)
xml文g攑֜WEB-INF目录下,然后
E序代码Q?br />InputStream is=getServletContext().getResourceAsStream( "/WEB-INF/xmlfile.xml" );

Ҏ(gu)二:xml文g攑֜/WEB-INF/classes目录下或classpath的jar包中Q则可以使用ClassLoader的静?br />
Ҏ(gu)getSystemResourceAsStream(String s)dQ?br />E序代码Q?br />String s_xmlpath="com/spf/web/ext/hotspot/hotspotxml/hotspot.xml";
InputStream in=ClassLoader.getSystemResourceAsStream(s_xmlpath);

Ҏ(gu)三:xml在随意某个包路径下:
String s_xmlpath="com/spf/web/ext/hotspot/hotspotxml/hotspot.xml";
ClassLoader classLoader=HotspotXmlParser.class.getClassLoader();
InputStream in=classLoader.getResourceAsStream(s_xmlpath);





]]>
array专题三:ArrayscLUjava中的数组http://www.tkk7.com/flysky19/articles/93480.html不断前进的小乌龟不断前进的小乌龟Fri, 12 Jan 2007 08:41:00 GMThttp://www.tkk7.com/flysky19/articles/93480.htmlhttp://www.tkk7.com/flysky19/comments/93480.htmlhttp://www.tkk7.com/flysky19/articles/93480.html#Feedback0http://www.tkk7.com/flysky19/comments/commentRss/93480.htmlhttp://www.tkk7.com/flysky19/services/trackbacks/93480.html
使用java.util.ArrayscL序和查找数组

1.以下代码演示E序初始化一个整数数l然后调用Arrays.sort升序排序那个数组?br />
   1.
   2.     import java.util.Arrays;
   3.
   4.     public class ArrayDemo1 {
   5.         public static void main(String args[]) {
   6.             int vec[] = {37, 47, 23, -5, 19, 56};
   7.             Arrays.sort(vec);
   8.             for (int i = 0; i < vec.length; i++) {
   9.                 System.out.println(vec[i]);
  10.             }
  11.         }
  12.     }


2.cM的,你可以在排完序的数组上进行二分法查找Q?br />
   1.
   2.     import java.util.Arrays;
   3.
   4.     public class ArrayDemo2 {
   5.         public static void main(String args[]) {
   6.             int vec[] = {-5, 19, 23, 37, 47, 56};
   7.             int slot = Arrays.binarySearch(vec, 35);
   8.             slot = -(slot + 1);
   9.             System.out.println("insertion point = " + slot);
  10.         }
  11.     }


q个E序有个微妙的概念,如果二分法查扑֤败它?yu)返回?br />
    -(insertion point) - 1

q个演示E序以参?5调用查找Ҏ(gu)Q而那个参数在数组中不存在Q方法返回|4Q如果这个值加一?br />
取其负数得?Q这是35应该被插入到数组中的位置Q换a之,?5, 19?3在数l中占据的位|是0

Q??。因此?5应该在烦?的位|,?7, 47以及56g。搜索方法ƈ不进行实际的插入操作而只?br />
指出应该在何处插入?br />

参考资料:
JDK核心API——操Ujava中的数组
http://java.ccidnet.com/art/3737/20060627/589715_1.html



]]>
array专题二:array与ArrayList的{?/title><link>http://www.tkk7.com/flysky19/articles/93476.html</link><dc:creator>不断前进的小乌龟</dc:creator><author>不断前进的小乌龟</author><pubDate>Fri, 12 Jan 2007 08:25:00 GMT</pubDate><guid>http://www.tkk7.com/flysky19/articles/93476.html</guid><wfw:comment>http://www.tkk7.com/flysky19/comments/93476.html</wfw:comment><comments>http://www.tkk7.com/flysky19/articles/93476.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/flysky19/comments/commentRss/93476.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/flysky19/services/trackbacks/93476.html</trackback:ping><description><![CDATA[array专题二:array与ArrayList的{换(《corejava??10)<br /><br />׃javaq_API的很大一部分都是在集合框架徏立之前设计的Q因此有时候需要在传统的数l与C?br />集合之间q行转换?br /><br />*如果你有一个数l,需要将它{化ؓ一个集合,Arrays.asList包装器能够实现这个目的,例如Q?br />String[] values=...;<br />HashSet<String> staff=new HashSet<String>(Arrays.asList(values));<br /><br />*反过来,如果要从集合得到数组Q操作v来就E微ȝ一些。当Ӟ你也可以直接使用toArrayҎ(gu)Q?br /> Object[] values=staff.toArray();<br /> 但是该方法运行的l果是得C个Object的数l。即使知道集合包含一l具体类型的对象Q也不能使用<br /> cd转换Q?br /> String[] values=(String[])staff.toArray();//error!<br /> toArrayҎ(gu)q回的数l是一个Object[]数组Q你无法改变它的cd。相反,你必M用toArrayҎ(gu)?br />某种变体Qؓ它赋予一个长度ؓ0的你要用的cd的数l。然后,q回的数l就是与该类型相同的数组了?br /> String[] values=staff.toArray(new String[0]);<br /> 如果你愿意,你还可以构徏一个指定大的数组Q?br /> staff.toArray(new String[staff.size()]);<br /> 在这U情况下Qƈ没有创徏M新的数组?br /><br /><br /><img src ="http://www.tkk7.com/flysky19/aggbug/93476.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/flysky19/" target="_blank">不断前进的小乌龟</a> 2007-01-12 16:25 <a href="http://www.tkk7.com/flysky19/articles/93476.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>array专题一Q数l(arrayQ与ArrayList的主要区别:效率、类型识别和primitive type?/title><link>http://www.tkk7.com/flysky19/articles/93467.html</link><dc:creator>不断前进的小乌龟</dc:creator><author>不断前进的小乌龟</author><pubDate>Fri, 12 Jan 2007 08:03:00 GMT</pubDate><guid>http://www.tkk7.com/flysky19/articles/93467.html</guid><wfw:comment>http://www.tkk7.com/flysky19/comments/93467.html</wfw:comment><comments>http://www.tkk7.com/flysky19/articles/93467.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/flysky19/comments/commentRss/93467.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/flysky19/services/trackbacks/93467.html</trackback:ping><description><![CDATA[array专题一Q数l(arrayQ与ArrayList的主要区别:效率、类型识别和primitive type?br /><br />1.自己的ȝQ?br />1Q精辟阐qͼQ《TIJ》第323)<br />初学者可以将ArrayList惌成一U“会自动扩增定w的array”?br /><br />2QarrayQ[]Q:最高效Q但是其定w固定且无法动态改变;<br />ArrayListQ容量可动态增长;但牺牲效率;<br /><br />3Q徏议:Q《TIJ》第292)<br />Z效率和类型检验,应尽可能使用arrayQ无法确定数l大时才用ArrayListQ?br /><br />不过当你试着解决更一般化的问题时Qarray的功能就可能q于受限?br /><br />4Qjava中一切皆对象Qarray也是对象。不Z所使用得array型别ZQarray名称本n实际上是个referenceQ指向heap之内得某个实际对象。这个对象可l由“array初始化语法”被自动产生Q也可以以new表达式手动生。(《TIJ》第292)<br /><br />5Qarray可做为函数返回|因ؓ它本w是对象的referenceQ(《TIJ》第295)<br /><br />6)对象数组与基本类型数l在q用上几乎一模一P唯一差别在于Q前者持有得是referenceQ后者直接持有基本型别之|Q《TIJ》第292)<br />eg.<br />Employee[] staff=new Employee[100];<br />int[] num=new int[10];<br /><br />7Q容器所持有的其实是一个个reference指向ObjectQ进而才能存储Q意型别。当然这不包括基本型别,因ؓ基本型别q不l承自Q何classes。(《TIJ》第323)<br /><br />8Q面对arrayQ我们可以直接持有基本型别数值的arrayQeg.int[] num;),也可以持有referenceQ指向对象)的arrayQ但是容器类仅能持有referenceQ指向对象)Q若要将基本型别|于容器内,需要用wrappercR但是wrappercM用v来可能不很容易上手,此外Qprimitives array得效率比起“容U_本型别之外覆c(的referenceQ”的容器好太多了?br /><br />当然Q如果你的操作对象是基本型别Q而且需要在I间不时自动扩增容量,array便不适合Q此时就得用外覆类的容器了?br />Q《TIJ》第295)<br /><br />自己的注释:<br />jdk5可以自动装包和解包,g感觉不到外覆cȝ存在了?br /><br />9Q某些情况下Q容器类即没有转型臛_来的型别Q仍然可以运作无误。有一U情况尤其特别:~译器对String class提供了一些额外的支持Q它可以^滑运作。(《TIJ》第325)<br /><br />10Q你可能会认为应该针对各U基本类型都提供一份特D版的ArrayListQ但javaq未如此。有朝一日,某种模板机制也许能帮助java更妥善的处理此一问题。(《TIJ》第295)<br /><br />自己的注释:<br />jdk5已经支持泛型Q相当于不仅可以“针对各U基本类型都提供一份特D版的ArrayList”,q且可以“针Ҏ(gu)有型别(包括用户自定义的c,如Employeec)都提供一份特D版的ArrayList”?br /><br />q样Q“不能识别型别”已l不再ArrayList的劣势,把不正确的对象置于容器内׃发生~译器错误;而不像以前那L译期不发生错误,执行期才产生异常Q可能会产生难以查觉的程序臭虫?br /><br />此外Q泛型支持的实现原理可以从“《TIJ》第326”的“制作一个具有型别意识的ArrayList”的例子中领(zhn)到一二?br /><br />11Q对数组的一些基本操作,像排序、搜索与比较{是很常见的。因此在Java中提供了Arrayscd助这几个操作Qsort(),binarySearch(),equals(),fill(),asList().<br />Q《Java JDK 5.0学习W记》http://book.csdn.net/bookfiles/135/1001354621.shtmlQ?br /><br />自己的注释:<br />不过ArrayscL有提供删除方法,而ArrayList中有remove()Ҏ(gu)Q不知道是否是不需要在array中做删除{操作的原因Q因为此时应该用链表)?br /><br />12QArrayList的用也很简单:产生ArrayListQ利用add()对象置入,利用get(iQ配合烦引值将它们取出。这一切就和array的用方式完全相同,只不q少了[]而已。(《TIJ》第323)<br /><br />2.参考资料:<br />1Q效率:<br />数组扩容是对ArrayList效率影响比较大的一个因素?br />每当执行Add、AddRange、Insert、InsertRange{添加元素的Ҏ(gu)Q都会检查内部数l的定w是否不够了,如果是,它就会以当前定w的两倍来重新构徏一个数l,旧元素Copy到新数组中,然后丢弃旧数l,在这个界点的扩Ҏ(gu)作,应该来说是比较媄响效率的?br /><br />ArrayList是Array的复杂版?br />ArrayList内部装了一个Objectcd的数l,从一般的意义来说Q它和数l没有本质的差别Q甚至于ArrayList的许多方法,如Index、IndexOf、Contains、Sort{都是在内部数组的基上直接调用Array的对应方法?br /><br />2Q类型识别:<br />ArrayList存入对象Ӟ抛弃cd信息Q所有对象屏蔽ؓObjectQ编译时不检查类型,但是q行时会报错?br /><br />注:jdk5中加入了Ҏ(gu)型的支持Q已l可以在使用ArrayList时进行类型检查?br /><br /><br />从这一点上看来QArrayList与数l的区别主要是׃动态增容的效率问题?br /><br /><br />3QArrayList可以存Q何ObjectQ如StringQEmployee{,但不支持基本数据cdQ除非用wrapper?br /><br /><img src ="http://www.tkk7.com/flysky19/aggbug/93467.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/flysky19/" target="_blank">不断前进的小乌龟</a> 2007-01-12 16:03 <a href="http://www.tkk7.com/flysky19/articles/93467.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java nativeҎ(gu)http://www.tkk7.com/flysky19/articles/93455.html不断前进的小乌龟不断前进的小乌龟Fri, 12 Jan 2007 07:32:00 GMThttp://www.tkk7.com/flysky19/articles/93455.htmlhttp://www.tkk7.com/flysky19/comments/93455.htmlhttp://www.tkk7.com/flysky19/articles/93455.html#Feedback0http://www.tkk7.com/flysky19/comments/commentRss/93455.htmlhttp://www.tkk7.com/flysky19/services/trackbacks/93455.html
java nativeҎ(gu)是指本地Ҏ(gu)Q当在方法中调用一些不是由java语言写的代码或者在Ҏ(gu)中用java语言
直接操纵计算机硬件时要声明ؓnativeҎ(gu)?br />
java中,通过JNI(Java Native Interface,java本地接口Q来实现本地化?br />



参考资料:

1.JAVA中nativeҎ(gu)
http://karoii.bokee.com/5869823.html

2.JNI
http://wiki.matrix.org.cn/Wiki.jsp?page=JNI

3.用JNI调用C或C++动态联接库原来如此?br />http://blog.matrix.org.cn/david_w_johnson/


4.http://myblog.workgroup.cn/blogs/java/
NativeҎ(gu)一般用于两U情况:

1Q在Ҏ(gu)中调用一些不是由java语言写的代码?br />
2Q在Ҏ(gu)中用java语言直接操纵计算机硬件?br />
Other than being implemented in native code, native methods are like all other methods: they

can be overloaded, overridden, final, static, synchronized, public, protected, or private. A

native method cannot, however, be declared abstract or strictfp.

如果使用了nativeҎ(gu)也就丢失了java的方便性和安全性。NativeҎ(gu)的执行依赖于JVM的设计者,比如

在sun的JVM中,可以通过JNI(Java Native Interface) API接口来实现本地化?br />


]]>
ClassLoader主要用于加蝲cLӞ利用反射QnewInstance())生成cd例等Q那么它可以用于加蝲xml、txt文g{吗Q?/title><link>http://www.tkk7.com/flysky19/articles/93432.html</link><dc:creator>不断前进的小乌龟</dc:creator><author>不断前进的小乌龟</author><pubDate>Fri, 12 Jan 2007 06:42:00 GMT</pubDate><guid>http://www.tkk7.com/flysky19/articles/93432.html</guid><wfw:comment>http://www.tkk7.com/flysky19/comments/93432.html</wfw:comment><comments>http://www.tkk7.com/flysky19/articles/93432.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/flysky19/comments/commentRss/93432.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/flysky19/services/trackbacks/93432.html</trackback:ping><description><![CDATA[ <p>2007q??2?br /></p> <p>问题Q?/p> <p>ClassLoader主要用于加蝲cLӞ利用反射QnewInstance())生成cd例等Q那么它可以用于加蝲xml、txt文g{吗Q?/p> <p> <br /> </p> <p>解答Q?/p> <p>可以。只是它与java.io相比Q定位的初始路径不同Q当然各自的功能也各有侧重,java.io侧重于与盘文g打交道,而ClassLoader侧重于与.class文g打交道;java.io更适合于纯java projectQ而ClassLoader更适合于web project?/p> <p>详细见前面写的“j<font size="4">avad文g的两U方法:java.io和java.lang.ClassLoader”一文?/font></p> <img src ="http://www.tkk7.com/flysky19/aggbug/93432.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/flysky19/" target="_blank">不断前进的小乌龟</a> 2007-01-12 14:42 <a href="http://www.tkk7.com/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.tkk7.com/flysky19/articles/93409.html</link><dc:creator>不断前进的小乌龟</dc:creator><author>不断前进的小乌龟</author><pubDate>Fri, 12 Jan 2007 06:00:00 GMT</pubDate><guid>http://www.tkk7.com/flysky19/articles/93409.html</guid><wfw:comment>http://www.tkk7.com/flysky19/comments/93409.html</wfw:comment><comments>http://www.tkk7.com/flysky19/articles/93409.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/flysky19/comments/commentRss/93409.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/flysky19/services/trackbacks/93409.html</trackback:ping><description><![CDATA[ <br />HashMap与HashTable的主要区别是什么?Z么都推荐使用HashMapQ那么HashTableq有用武之地吗?什么时候才使用HashTable呢?<br />ArrayList与Vector的区别是否也一样呢Q?br /><br />{:<br />1.以下内容来自Q(《corejava ?》第119)<br />Hashtablecȝ作用与HashMapcL相同的,实际上它们拥有相同的接口。与VectorcȝҎ(gu)一PHashtablecȝ各个Ҏ(gu)也是同步的。如果你不需要同步也不需要与遗留代码相兼容,你就应该使用HashMapcR?br /><br />注意QHashtable的类名字Qtable?t"是小写,在windowspȝQ如果你使用HashTableQ会报出一些奇怪的出错信息Q因为windows文gpȝ不区分大写Q而java~译器则是区分大写的?br /><br />自己注释Q?br />自己也查了jdk5的api证实了一下,HashMap与HashTable都实C相同的接口,q两个类拥有一模一LҎ(gu)Q不q它们不是承自同一个类?br />HashMapQ?br />java.lang.Object<br />  java.util.AbstractMap<K,V><br />      java.util.HashMap<K,V><br /><script language="JScript" src="/jdk150/H2HHinclude.js"></script>All Implemented Interfaces: <br />Serializable, Cloneable, Map<K,V> <br /><br />Hashtable:<br />java.lang.Object<br />  java.util.Dictionary<K,V><br />      java.util.Hashtable<K,V><br />All Implemented Interfaces: <br />Serializable, Cloneable, Map<K,V> <br /><br />2.以下内容来自Q(《corejava》卷2W?8)<br />现在Z么要用ArrayListcL代替Vector了呢Q原因很单:Vectorcȝ所有方法都是同步的。你可以用两个线E安全的讉KVector对象。但是,如果你只用单个线E来讉KVector对象——这是更加常见的情况——那么你的代码将会在同步操作上浪费相当多的时间。相反,ArrayListcȝҎ(gu)不是同步的。因此我们徏议你在不需要同步时使用ArrayList而不是Vector?br /><br />自己注释QArrayList与Vector也都是实现相同的接口Qƈ且承自相同的AbstractListc;它们的方法几乎也一模一栗?br />ArrayListc:<br />java.lang.Object<br />  java.util.AbstractCollection<E><br />      java.util.AbstractList<E><br />          java.util.ArrayList<E><br />All Implemented Interfaces: <br />Serializable, Cloneable, Iterable<E>, Collection<E>, List<E>, RandomAccess <br /><br />Vectorc:<br />java.lang.Object<br />  java.util.AbstractCollection<E><br />      java.util.AbstractList<E><br />          java.util.Vector<E><br />All Implemented Interfaces: <br />Serializable, Cloneable, Iterable<E>, Collection<E>, List<E>, RandomAccess <br /><br /><br /><img src ="http://www.tkk7.com/flysky19/aggbug/93409.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/flysky19/" target="_blank">不断前进的小乌龟</a> 2007-01-12 14:00 <a href="http://www.tkk7.com/flysky19/articles/93409.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>uri与url的区别(zzQ?/title><link>http://www.tkk7.com/flysky19/articles/93379.html</link><dc:creator>不断前进的小乌龟</dc:creator><author>不断前进的小乌龟</author><pubDate>Fri, 12 Jan 2007 04:04:00 GMT</pubDate><guid>http://www.tkk7.com/flysky19/articles/93379.html</guid><wfw:comment>http://www.tkk7.com/flysky19/comments/93379.html</wfw:comment><comments>http://www.tkk7.com/flysky19/articles/93379.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/flysky19/comments/commentRss/93379.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/flysky19/services/trackbacks/93379.html</trackback:ping><description><![CDATA[自己的ȝQ?br />uriQWeb上可用的每种资源 - HTML文档、图像、视频片Dc程序等 - ׃个通过?br />用资源标志符QUniversal Resource Identifier, U?URI"Q进行定位?<br />语法如下Q?br /> [scheme:] scheme-specific-part <br />例如Q?br />http://www.ruc.edu.cn(url);<br />mailto:jeff@javajeff.com、news:comp.lang.java.help和xyz://whatever?br /><br />urlQ是uri的一个子集;通俗地说QURL是Internet上用来描qC息资源的字符Ԍ主要用在各种WWW客户E序和服务器E序上,特别是著名的Mosaic?br />例如Q?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 /> URIQUniform Resource IdentifierQ统一资源标识W;<br />URLQUniform Resource LocatorQ统一资源定位W;<br />URNQUniform Resource NameQ统一资源名称?br />其中Q?b>URL,URN是URI的子?/b>?br /> Web上地址的基本Ş式是URI,它代表统一资源标识W。有两种形式Q?br /> URLQ目前URI的最普遍形式是无处不在的URL或统一资源定位器?br /> URNQURL的一U更新Ş式,l一资源名称(URN, Uniform Resource Name)不依赖于位置Qƈ且有可能减少失效q接的个数。但是其行q需假以时日Q因为它需要更_֯软g的支持?br /> URI是以某种l一的(标准化的Q方式标识资源的单字W串?br /> URI一般由三部分组成:<br /> 1. 讉K资源的命名机制?<br /> 2. 存放资源的主机名?<br /> 3. 资源自n的名Uͼp\径表C?<br /> 典型情况下,q种字符串以schemeQ命名URI的名字空间的标识W——一l相关的名称Q开_语法如下Q?br /> [scheme:] scheme-specific-part <br /> URI以scheme和冒号开头。Scheme用大?写字母开_后面为空或者跟着更多的大?写字母、数字、加受减号和点号。冒h scheme与scheme-specific-part分开了,q且scheme-specific-part的语法和语义Q意思)由URI的名字空? 军_。如下面的例子:<br /> http://www.cnn.comQ其中h(hun)ttp是schemeQ?/www.cnn.com?scheme-specific-partQƈ且它的scheme与scheme-specific-part被冒号分开了?br /> URI有绝对和相对之分Q绝对的URI指以schemeQ后面跟着冒号Q开头的URI。前面提到的http://www.cnn.com是l对的URI 的一个例子,其它的例子还有mailto:jeff@javajeff.com、news:comp.lang.java.help和xyz: //whatever。你可以把绝对的URI看作是以某种方式引用某种资源Q而这U方式对标识W出现的环境没有依赖。如果用文件系l作cLQ绝对的 URIcM于从根目录开始的某个文g的径?<br /> 与绝对的URI不同的,相对的URI不是以schemeQ后面跟着冒号Q开始的URI? 它的一个例子是articles/articles.html。你可以把相对的URI看作是以某种方式引用某种资源Q而这U方式依赖于标识W出现的环境? 如果用文件系l作cLQ相对的URIcM于从当前目录开始的文g路径?br /><br /> URL是Uniform Resource Location的羃写,译ؓ"l一资源定位W?。通俗地说QURL是Internet上用来描qC息资源的字符Ԍ主要用在各种WWW客户E序和服务器 E序上,特别是著名的Mosaic。采用URL可以用一U统一的格式来描述各种信息资源Q包括文件、服务器的地址和目录等?<br /> URL的格式由下列三部分组成: <br /> W一部分是协议(或称为服务方式)Q?<br /> W二部分是存有该资源的主机IP地址Q有时也包括端口PQ?<br /> W三部分是主源的具体地址。,如目录和文g名等?<br /> W一部分和第二部分之间用"Q?/"W号隔开Q第二部分和W三部分?/"W号隔开。第一部分和第二部分是不可~少的,W三部分有时可以省略?br /> 目前最大的~点是当信息资源的存攑֜点发生变化时Q必dURL作相应的改变。因此h们正在研I新的信息资源表C方法,例如QURI(Universal Resource Identifier)?通用资源标识"Q参见RFC 1630Q、URNQUniform Resource NameQ即"l一资源?和URCQUniform Resource CitationQ即"l一资源引用W?{?br /> URI目前q处在进一步的研究当中。研I的方向是弥补URL目前存在的缺炏V?br /><img src ="http://www.tkk7.com/flysky19/aggbug/93379.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/flysky19/" target="_blank">不断前进的小乌龟</a> 2007-01-12 12:04 <a href="http://www.tkk7.com/flysky19/articles/93379.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>javad文g的两U方法:java.io和java.lang.ClassLoaderhttp://www.tkk7.com/flysky19/articles/93280.html不断前进的小乌龟不断前进的小乌龟Thu, 11 Jan 2007 14:58:00 GMThttp://www.tkk7.com/flysky19/articles/93280.htmlhttp://www.tkk7.com/flysky19/comments/93280.htmlhttp://www.tkk7.com/flysky19/articles/93280.html#Feedback0http://www.tkk7.com/flysky19/comments/commentRss/93280.htmlhttp://www.tkk7.com/flysky19/services/trackbacks/93280.htmljavad文g的两U方法:java.io和java.lang.ClassLoader

什么时候用java.ioQ什么时候用java.lang.ClassLoader呢?
Q注Q要是之前读xml文g时清晰知道javad文g有这两种Ҏ(gu)好了!可以走很多ȝ解相对\?br />的弯路!Q?br />
自己的ȝQ?br />*java.io:相对于当前用L录的相对路径dQ注重与盘文g打交道或者纯java project中用?br />Q虽然ClassLoader方式更通用Q但是如果不是javaEE环境Q要定位到classpath路径下去L件是不合?br />的。)
*java.lang.ClassLoader:相对于classpath的相对\径读取;在javaEE环境中都使用q种方式?br />

整理资料一Qhttp://www.code168.com/bbs/html/2005-12-9/23554625833.html
问:
java打成jar包的后箋问题Q!Q!如何在读取jar包里面的配置文gQ?br />{?Q?br />如果用java.util.ResourceBundle׃用担心什么,它本来就是从class  loader  folder/jar文g里找
properties文g。?
如果你已l注意到了,java取文件有两种Ҏ(gu)Qjava.util.io和java.lang.ClassLoader两种。?
java.io: 
     File  file  =  new  File("..."); 
     FileInputStream  fis  =  new  FileInputStream("..."); 
     FileReader  fr  =  new  FileReader("..."); 
ClassLoader: 
     ClassLoader  loader  =  XXXClass.class.getClassLoader(); 
     or 
     ClassLoader  loader  =  Thread.currentThread().getContextClassLoader(); 
     URL  url  =  loader.getResource("..."); 
     File  file  =  new  File(url.getFile()); 
     InputStream  input  =  loader.getResourceAsStream("..."); 
q两U,一U是从project  loader  folder取,一U是从class  loader  folder取,class  loader 
folder包括jar文g。?
我想你应该明白了吧?自己写个E序test一下就知道了?br />
{?Q?br />File  file  =  new  File(url.getFile());不是用在你这U情늚。?
一般情冉|然classloader已经拿到resource,没有必要画蛇添_再{成File. 
转成File事实上是Z拿到l对路径Q我们碰到过q么一U情c?
一个Web  application,用tomcat启动Qtomcat会徏一个application  folder,folder下面有一个web-inf

 folder,再下面是classes目录Qclasses目录下面是所有的java  classes.E序需要用一个property文g

记录数据Q用io  package只能定位到绝对\径,用class  loader可以是相对\径,不管tomcat在客L

脑上M位置Q但是,如果写文件在classes  folder下面Qtomcat会reload  web  server,面会重?br />
。ؓ了定位到application  folder,与web-infq列Q先用classloader,再{成file拿到全\径,L?br />
面不需要的folder,可以拿?tomecat建的web  application的绝对\径。?
与你的情况不同的是,classloader定位到的文gQ不在jar里头。我认ؓ用java  io不可以定到jar里面

?br />
整理资料二:
Java路径问题最l解x?br />http://www.matrix.org.cn/thread.shtml?topicId=6d0bbeed-9157-11db-ab77-

2bbe780ebfbf&forumId=19

一、相对于当前用户目录的相对\?br />是相对于System.getProperty("user.dir")q回的\径?br />对于一般项目,q是目的根路径。对于JavaEE服务器,q可能是服务器的某个路径。这个ƈ没有l一?br />
规范Q?br />所以,l对不要使用“相对于当前用户目录的相对\径”。然而:
默认情况下,java.io 包中的类LҎ(gu)当前用户目录来分析相对\径名。此目录ql属?user.dir

指定Q通常?Java 虚拟机的调用目录?br />q就是说Q在使用java.io包中的类Ӟ最好不要用相对\径。否则,虽然在J2SE应用E序中可能还?br />
正常Q但是到了J2EEE序中,一定会出问题!而且q个路径Q在不同的服务器中都是不同的Q?br />
二、相对于classpath的相对\?br />如:相对?br />file:/D:/java/eclipse32/workspace/jbpmtest3/bin/q个路径的相对\径。其中,bin是本目?br />
classpath。所有的Java源文件编译后?class文g复制到这个目录中?br />

三、相对\径最佛_?br />推荐使用相对于当前classpath的相对\?br />因此Q我们在使用相对路径Ӟ应当使用相对于当前classpath的相对\径?br />ClassLoadercȝgetResource(String name),getResourceAsStream(String name){方法,使用相对于当

前项目的classpath的相对\径来查找资源?br />d属性文件常用到的ResourceBundlecȝgetBundle(String path)也是如此?br />通过查看ClassLoadercd其相关类的源代码Q我发现Q它实际上还是用了URI形式的绝对\径。通过?br />
到当前classpath的URI形式的绝对\径,构徏了相对\径的URI形式的绝对\径。(q个实际上是猜想Q?br />
因ؓJDK内部调用了SUN的源代码Q而这些代码不属于JDKQ不是开源的。)

四、相对\径本质上q是l对路径
因此Q归根结底,Java本质上只能用绝对\径来L资源。所有的相对路径L资源的方法,都不q是

一些便利方法。不q是API在底层帮助我们构Zl对路径Q从而找到资源的Q?br />



]]>
Java路径问题最l解x案(zzQ?/title><link>http://www.tkk7.com/flysky19/articles/93278.html</link><dc:creator>不断前进的小乌龟</dc:creator><author>不断前进的小乌龟</author><pubDate>Thu, 11 Jan 2007 14:41:00 GMT</pubDate><guid>http://www.tkk7.com/flysky19/articles/93278.html</guid><wfw:comment>http://www.tkk7.com/flysky19/comments/93278.html</wfw:comment><comments>http://www.tkk7.com/flysky19/articles/93278.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/flysky19/comments/commentRss/93278.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/flysky19/services/trackbacks/93278.html</trackback:ping><description><![CDATA[来自Qhttp://www.matrix.org.cn/thread.shtml?topicId=6d0bbeed-9157-11db-ab77-2bbe780ebfbf&forumId=19<br /><br />Java路径问题最l解x?br />                                                                                                           —可定位所有资源的相对路径d<br />-------------------------------------------------------- <br />前言<br />Java的\径问题,非常难搞。最q的工作涉及到创建和d文g的工作,q里我就l大家彻底得解决Java路径问题?br />? ~写了一个方法,比ClassLoader.getResource(String 相对路径)Ҏ(gu)的能力更强。它可以接受?./”这L参数Q允许我们用相对路径来定位classpath外面的资源。这P我们可以用相对于 classpath的\径,定位所有位|的资源Q?br /><br />Java路径<br />Java中用的路径Q分ZU:l对路径和相对\径。具体而言Q又分ؓ四种Q?br />一、URI形式的绝对资源\?br />如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/aaa.b<br />URL是URI的特例。URL的前~/协议Q必LJava认识的。URL可以打开资源Q而URI则不行?br />URL和URI对象可以互相转换Q用各自的toURI(),toURL()Ҏ(gu)卛_Q?br /><br />二、本地系l的l对路径<br />D:/java/eclipse32/workspace/jbpmtest3/bin/aaa.b<br />Java.io包中的类Q需要用这UŞ式的参数?br />但是Q它们一般也提供了URIcd的参敎ͼ而URIcd的参敎ͼ接受的是URI样式的String。因此,通过URI转换Q还是可以把URI样式的绝对\径用在java.io包中的类中?br /><br />三、相对于classpath的相对\?br />如:相对?br />file:/D:/java/eclipse32/workspace/jbpmtest3/bin/q个路径的相对\径。其中,bin是本目的classpath。所有的Java源文件编译后?class文g复制到这个目录中?br /><br /><br />四、相对于当前用户目录的相对\?br />是相对于System.getProperty("user.dir")q回的\径?br />对于一般项目,q是目的根路径。对于JavaEE服务器,q可能是服务器的某个路径。这个ƈ没有l一的规范!<br />所以,l对不要使用“相对于当前用户目录的相对\径”。然而:<br />默认情况下,java.io 包中的类LҎ(gu)当前用户目录来分析相对\径名。此目录ql属?user.dir 指定Q通常?Java 虚拟机的调用目录?br />q就是说Q在使用java.io包中的类Ӟ最好不要用相对\径。否则,虽然在J2SE应用E序中可能还正常,但是CJ2EEE序中,一定会出问题!而且q个路径Q在不同的服务器中都是不同的Q?br /><br />相对路径最佛_?br />推荐使用相对于当前classpath的相对\?br />因此Q我们在使用相对路径Ӟ应当使用相对于当前classpath的相对\径?br />ClassLoadercȝgetResource(String name),getResourceAsStream(String name){方法,使用相对于当前项目的classpath的相对\径来查找资源?br />d属性文件常用到的ResourceBundlecȝgetBundle(String path)也是如此?br />? q查看ClassLoadercd其相关类的源代码Q我发现Q它实际上还是用了URI形式的绝对\径。通过得到当前classpath的URI形式的绝 对\径,构徏了相对\径的URI形式的绝对\径。(q个实际上是猜想Q因为JDK内部调用了SUN的源代码Q而这些代码不属于JDKQ不是开源的。)<br /><br />相对路径本质上还是绝对\?br />因此Q归根结底,Java本质上只能用绝对\径来L资源。所有的相对路径L资源的方法,都不q是一些便利方法。不q是API在底层帮助我们构Zl对路径Q从而找到资源的Q?br /><br />得到classpath和当前类的绝对\径的一些方?br />    下面是一些得到classpath和当前类的绝对\径的一些方法。你可能需要用其中的一些方法来得到你需要的资源的绝对\径?br />1QFileTest.class.getResource("")<br />得到的是当前cFileTest.class文g的URI目录。不包括自己Q?br />如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/com/test/<br />2QFileTest.class.getResource("/")<br />得到的是当前的classpath的绝对URI路径?br />如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/<br />3QThread.currentThread().getContextClassLoader().getResource("")<br />得到的也是当前ClassPath的绝对URI路径?br />如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/<br />4QFileTest.class.getClassLoader().getResource("")<br />得到的也是当前ClassPath的绝对URI路径?br />如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/<br />5QClassLoader.getSystemResource("")<br />得到的也是当前ClassPath的绝对URI路径?br />如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/<br />    <br />我推荐用Thread.currentThread().getContextClassLoader().getResource("")来得到当前的classpath的绝对\径的URI表示法?br /><br />Web应用E序中资源的d<br />    上文中说q,当前用户目录Q即相对于System.getProperty("user.dir")q回的\径?br />对于JavaEE服务器,q可能是服务器的某个路径Q这个ƈ没有l一的规范!<br />而不是我们发布的Web应用E序的根目录Q?br />q样Q在Web应用E序中,我们l对不能使用相对于当前用L录的相对路径?br />在Web应用E序中,我们一般通过ServletContext.getRealPath("/")Ҏ(gu)得到Web应用E序的根目录的绝对\径?br />q样Q我们只需要提供相对于Web应用E序根目录的路径Q就可以构徏出定位资源的l对路径?br />q是我们开发Web应用E序时一般所采取的策略?br /><br />通用的相对\径解军_?br />Java中各U相对\径非常多Q不Ҏ(gu)使用Q非常容易出错。因此,我编写了一个便利方法,帮助更容易的解决相对路径问题?br /><br />Web应用E序中用JavaSEq行的资源寻址问题<br />在JavaSEE序中,我们一般用classpath来作为存放资源的目的地。但是,在Web应用E序中,我们一般用classpath外面的WEB-INF及其子目录作源文件的存放地?br />在Web应用E序中,我们一般通过ServletContext.getRealPath("/")Ҏ(gu)得到Web应用E序的根目录的绝对\径。这P我们只需要提供相对于Web应用E序根目录的路径Q就可以构徏出定位资源的l对路径?br />Web应用E序Q可以作为Web应用E序q行发布和运行。但是,我们也常怼以JavaSE的方式来q行Web应用E序的某个类的mainҎ(gu)。或者,使用JUnit试。这都需要用JavaSE的方式来q行?br />q样Q我们就无法使用ServletContext.getRealPath("/")Ҏ(gu)得到Web应用E序的根目录的绝对\径?br />而JDK提供的ClassLoaderc,<br />它的getResource(String name),getResourceAsStream(String name){方法,使用相对于当前项目的classpath的相对\径来查找资源?br />d属性文件常用到的ResourceBundlecȝgetBundle(String path)也是如此?br />它们都只能用相对\径来dclasspath下的资源Q无法定位到classpath外面的资源?br />Classpath外配|文件读取问?br />如,我们使用试驱动开发的Ҏ(gu)Q开发Spring、Hibernate、iBatis{用配|文件的Web应用E序Q就会遇到问题?br />管Spring自己提供了FileSystemQ也是相对于user,dir目录Q来dWeb配置文g的方法,但是l究不是很方ѝ而且与WebE序中的代码使用方式不一_<br />至于HibernateQiBatis更ȝ了!只有把配|文件移到classpath下,否则Ҏ(gu)不可能用测试驱动开发!<br /><br />    q怎么办?<br /><br />通用的相对\径解军_?br />? 对这个问题,我决定编写一个助手类ClassLoaderUtilQ提供一个便利方法[public static URL getExtendResource(String relativePath)]。在Web应用E序{一切JavaE序中,需要定位classpath外的资源Ӟ都用这个助手类的便利方法,而不使用 Web应用E序Ҏ(gu)的ServletContext.getRealPath("/")Ҏ(gu)来定位资源?br /><br />利用classpath的绝对\径,定位所有资?br />q个便利Ҏ(gu)的实现原理,是“利用classpath的绝对\径,定位所有资源”?br />ClassLoadercȝgetResource("")Ҏ(gu)能够得到当前classpath的绝对\径,q是所有JavaE序都拥有的能力Q具有最大的适应性!<br />而目前的JDK提供的ClassLoadercȝgetResource(String 相对路径)Ҏ(gu)Q只能接受一般的相对路径。这P使用ClassLoadercȝgetResource(String 相对路径)Ҏ(gu)只能定位到classpath下的资源?br />如果Q它能够接受?./”这L参数Q允许我们用相对路径来定位classpath外面的资源,那么我们可以定位位|的资源Q?br />? Ӟ我无法修改ClassLoadercȝq个Ҏ(gu)Q于是,我编写了一个助手类ClassLoaderUtilc,提供了[public static URL getExtendResource(String relativePath)]q个Ҏ(gu)。它能够接受带有?./”符L相对路径Q实C自由L资源的功能?br /><br />通过相对classpath路径实现自由L资源的助手类的源代码Q?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 /> *用来加蝲c,classpath下的资源文Ӟ属性文件等?br /> *getExtendResource(StringrelativePath)Ҏ(gu)Q可以?./W号来加载classpath外部的资源?br /> */<br />publicclass ClassLoaderUtil {<br />    privatestatic Log log=LogFactory.getLog(ClassLoaderUtil.class);<br />    /**<br />     *Thread.currentThread().getContextClassLoader().getResource("")<br />     */<br />    <br />    /**<br />     *加蝲JavacR?使用全限定类?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 />       *得到cd载器<br />       *@return<br />       */<br />     publicstatic ClassLoader getClassLoader() {<br />     <br />        return ClassLoaderUtil.class.getClassLoader();<br />     }<br />     /**<br />       *提供相对于classpath的资源\径,q回文g的输入流<br />       *@paramrelativePath必须传递资源的相对路径。是相对于classpath的\径。如果需要查找classpath外部的资源,需要?./来查?br />       *@return 文g输入?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的资源\径,q回属性对象,它是一个散列表<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("l对路径Q?+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<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 />ClassLoaderUtilcȝpublic static URL getExtendResource(String relativePath)Q虽然很单,但是实可以解决大问题?br />不过q个Ҏ(gu)q是比较陋的。我q想在未来有I时Q进一步增强它的能力。比如,增加Ant风格的匹配符。用**代表多个目录Q?代表多个字符Q?代表一个字W。达到Spring那样的能力,一ơ返回多个资源的URLQ进一步方便大家开发?br /><br />ȝQ?br />1Q尽量不要用相对于System.getProperty("user.dir")当前用户目录的相对\径。这是一颗定时炸弹,随时可能要你的命?br />2Q尽量用URI形式的绝对\径资源。它可以很容易的转变为URI,URLQFile对象?br />3Q? 量使用相对classpath的相对\径。不要用绝对\径。用上面ClassLoaderUtilcȝpublic static URL getExtendResource(String relativePath)Ҏ(gu)已经能够使用相对于classpath的相对\径定位所有位|的资源?br />4Q绝对不要用硬~码的绝对\径。因为,我们完全可以使用ClassLoadercȝgetResource("")Ҏ(gu)得到当前classpath的绝对\径?br />使用编码的l对路径是完全没有必要的Q它一定会让你ȝ很难看!E序无法移植!<br />如果你一定要指定一个绝对\径,那么使用配置文gQ也比硬~码要好得多Q?br />当然Q我q是推荐你用程序得到classpath的绝对\径来D源的l对路径Q?br /><br /><img src ="http://www.tkk7.com/flysky19/aggbug/93278.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/flysky19/" target="_blank">不断前进的小乌龟</a> 2007-01-11 22:41 <a href="http://www.tkk7.com/flysky19/articles/93278.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>String int Integer间的转换(zz)http://www.tkk7.com/flysky19/articles/92976.html不断前进的小乌龟不断前进的小乌龟Wed, 10 Jan 2007 09:44:00 GMThttp://www.tkk7.com/flysky19/articles/92976.htmlhttp://www.tkk7.com/flysky19/comments/92976.htmlhttp://www.tkk7.com/flysky19/articles/92976.html#Feedback0http://www.tkk7.com/flysky19/comments/commentRss/92976.htmlhttp://www.tkk7.com/flysky19/services/trackbacks/92976.html
注:如果使用JDK5.0的话QJVM会自动完成装包解包的?/b>

String int Integer间的转换

  •  如何字?String 转换成整?int?

int i = Integer.valueOf(my_str).intValue();

int i=Integer.parseInt(str);

  • 如何字?String 转换成Integer ?

Integer integer=Integer.valueOf(str);

  • 如何整?int 转换成字?String ?
1.) String s = String.valueOf(i);
 
2.) String s = Integer.toString(i);
 
3.) String s = "" + i;
  • 如何整?int 转换成Integer ?

Integer integer=new Integer(i);

  • 如何Integer 转换成字?String ?

Integer integerQString

  • 如何Integer 转换?int ?

int num=Integer.intValue();

  • 如何String转换成?BigDecimal  ?

 BigDecimal d_id = new BigDecimal(str);

//-----------------日期-------------------------

Calendar calendar=Calendar.getInstance();
  int year=calendar.get(Calendar.YEAR);
  int month=calendar.get(Calendar.MONTH)+1;
  int day=calendar.get(Calendar.DATE);

获取今天的日期字W串
String today=java.text.DateFormat.getDateInstance().format(new java.util.Date());
获取今天的日?br />new java.sql.Date(System.currentTimeMillis())





]]>
数组与ArrayList的关pM区别http://www.tkk7.com/flysky19/articles/92775.html不断前进的小乌龟不断前进的小乌龟Tue, 09 Jan 2007 14:55:00 GMThttp://www.tkk7.com/flysky19/articles/92775.htmlhttp://www.tkk7.com/flysky19/comments/92775.htmlhttp://www.tkk7.com/flysky19/articles/92775.html#Feedback0http://www.tkk7.com/flysky19/comments/commentRss/92775.htmlhttp://www.tkk7.com/flysky19/services/trackbacks/92775.html数组Q[]Q:最高效Q但是其定w固定且无法动态改变;
ArrayListQ容量可动态增长;但牺牲效率;
Q?br />首先使用数组Q无法确定数l大时才用ArrayListQ?br />

1.效率Q?br />数组扩容是对ArrayList效率影响比较大的一个因素?br />每当执行Add、AddRange、Insert、InsertRange{添加元素的Ҏ(gu)Q都会检查内部数l的定w是否不够了,如果是,它就会以当前定w的两倍来重新构徏一个数l,旧元素Copy到新数组中,然后丢弃旧数l,

在这个界点的扩Ҏ(gu)作,应该来说是比较媄响效率的?br />
ArrayList是Array的复杂版?br />ArrayList内部装了一个Objectcd的数l,从一般的意义来说Q它和数l没有本质的差别Q甚至于

ArrayList的许多方法,如Index、IndexOf、Contains、Sort{都是在内部数组的基上直接调用Array的对应方法?br />
2.cd识别Q?br />ArrayList存入对象Ӟ抛弃cd信息Q所有对象屏蔽ؓObjectQ编译时不检查类型,但是q行时会报错?br />
注:jdk5中加入了Ҏ(gu)型的支持Q已l可以在使用ArrayList时进行类型检查?br />
从这一点上看来QArrayList与数l的区别主要是׃动态增容的效率问题?br />

3.ArrayList可以存Q何ObjectQ如StringQEmployee{,但不支持基本数据cdQ除非用wrapper?br />
二、数l与ArrayList的{换(有待补充Q见《corejava?10)
1.ArrayList转换为数l:
ArrayList转换String[]
ArrayList list = new ArrayList();list.add(&quot;a&quot;);list.add(&quot;b&quot;);list.add

(&quot;c&quot;);System.out.println(&quot;a=&quot;+list);String[] b=(String[])list.toArray

(new String[0]);

2.数组转换为ArrayListQ有待补充)

三、ArrayscLUjava中的数组Q有待补充)
http://java.ccidnet.com/art/3737/20060627/589715_1.html

四、实现DecisionTree时对ArrayList与String[]的迷惑与解铃Q有待补充)

http://www.mysdn.cn/Java/J2SEjichulei/20060914/9172.html

Q实际ؓ数组与ArrayList的迷惑)

五、其?br />1.数组和ArrayList都表C可以存一l同cd的对象;都用下标定位和查找元素Q?br />2.数组的定义:
int[] num=new int[10];
Employee[] staff=new Employee[100];

3.ArrayList的用:
List lstQnew ArrayList();
lst.add(employee);

4.起初q没有Arraysc(Q?不记得在哪看CQ不定Q,ArrayscLZ方便数组的一些常用的共同

操作而实现的?br />
5.ArrayList详解Q?br />http://my.opera.com/wujianrong/blog/index.dml/tag/ArrayList

http://blog.csdn.net/realasker/

6.J2SE 5.0中的泛型
http://www.javanb.com/j2se/1/5246.html








]]>
Arrayscd习(zzQ?/title><link>http://www.tkk7.com/flysky19/articles/92768.html</link><dc:creator>不断前进的小乌龟</dc:creator><author>不断前进的小乌龟</author><pubDate>Tue, 09 Jan 2007 14:15:00 GMT</pubDate><guid>http://www.tkk7.com/flysky19/articles/92768.html</guid><wfw:comment>http://www.tkk7.com/flysky19/comments/92768.html</wfw:comment><comments>http://www.tkk7.com/flysky19/articles/92768.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/flysky19/comments/commentRss/92768.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/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 />在论坛和生活中L到不停的找</font> <span lang="EN-US">JAVA</span> <span style="font-family: SimSun;">排序和查扄法的人,问哪里有源代码,呵呵。其?/span> <span lang="EN-US">JAVA</span> <span style="font-family: SimSun;">本nl大家提供了一个很好的c,那就?/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;">。这个类提供了数l的填充Q查找,比较Q排序等一pd的对数组的操作?/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">填充Q?/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;">pdҎ(gu)是给Q数l填充。就是简单的把一个数l全部或者某D|据填成一个特D的倹{?/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;">查找Q?/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;">pdҎ(gu)是,在某cd的数l中?span lang="EN-US">2</span>分法查找特定?span lang="EN-US">Key</span>的元素,q回元素受前提是q个数组是经q排序的Q如果有多个元素?span lang="EN-US">Key</span>值相{的情况下,无法预料Q返回的是哪一个。对于返回|有以下规律,q回?span lang="EN-US"> < 0</span>表示没有扑ֈQ返回?span lang="EN-US"> >= 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;">对于插入Q?span lang="EN-US">Arrays</span>没有Ҏ(gu)法Q一般对数组的插入都是{化ؓ</span> <span lang="EN-US">Collection</span> <span style="font-size: 12pt; font-family: SimSun;">之后再做的,但是<span lang="EN-US">binarySearch</span>q是能帮你找到数l的插入点的Q插入点位置回值的l对值减<span lang="EN-US">1(</span></span> <span style="font-size: 12pt; font-family: 'QS 明朝';" lang="EN-US">|</span> <span style="font-size: 12pt; font-family: SimSun;">q回?/span> <span style="font-size: 12pt; font-family: 'QS 明朝';" 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;">Ҏ(gu)序过的数l查找,法?/span> <span lang="EN-US">2</span> <span style="font-family: SimSun;">分法已经相当快了Q呵c?/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;">pdҎ(gu)是做两个数组的比较的Q相{返?span lang="EN-US">true</span>。这个方法运用的时候,有些地方要注意?span lang="EN-US"><br /></span>比较两个<span lang="EN-US">float</span>数组的时候,Ҏ(gu)个元素比较,E序不是用的<span lang="EN-US">==</span>来判断的Q而是?span lang="EN-US">new Float(f1).equals(new Float(f2))</span>Q这个方法认?/span> <font face="Simsun"> <tt> <span style="font-size: 12pt;" lang="EN-US">NaN</span> </tt> <tt> <span style="font-size: 12pt;">{于它本w,<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>数组也是一L?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;">pdҎ(gu)是对数组排序的?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;">我们已经知道Q?/span> <span lang="EN-US"> <a > <span style="color: windowtext; font-family: SimSun; text-decoration: none;" lang="EN-US"> <span lang="EN-US">在决{树计算模型下,M一个基于比较来定两个元素相对位置的排序算法需?/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;">旉的排序算法,则在渐近的意义上Q这个排序算法就是最优的。许多排序算法都是追求这个目标。快速排序算法它在^均情况下需?/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;">能将一些集合类型的数据方便的变成数l?/span> </p> </span> <br /> <br /> <img src ="http://www.tkk7.com/flysky19/aggbug/92768.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/flysky19/" target="_blank">不断前进的小乌龟</a> 2007-01-09 22:15 <a href="http://www.tkk7.com/flysky19/articles/92768.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>理解java数组http://www.tkk7.com/flysky19/articles/92763.html不断前进的小乌龟不断前进的小乌龟Tue, 09 Jan 2007 14:08:00 GMThttp://www.tkk7.com/flysky19/articles/92763.htmlhttp://www.tkk7.com/flysky19/comments/92763.htmlhttp://www.tkk7.com/flysky19/articles/92763.html#Feedback0http://www.tkk7.com/flysky19/comments/commentRss/92763.htmlhttp://www.tkk7.com/flysky19/services/trackbacks/92763.html1.《java jdk5.0 学习W记》良葛格 W五章数l?br />2.如何理解数组的length?
http://blog.csdn.net/treeroot/archive/2005/01/22/264001.aspx
3.关于java数组的深度思?br />http://dev.csdn.net/author/DeepNightTwo/afb7e220bdf5423ba656f84b6a183b44.html


一.Z么需要数l?Q《java jdk5.0 学习W记》良葛格Q?br />例如Q现在要整理全班的Java考成l,(zhn)希望写个小E序Q全班共?0名学生,所以必L40个变量来存储学生的成l。现在问题来了,Ҏ(gu)W?章学q的变量定义方式Q难道要定义40个名UC同的变量来存储学生的成W数据吗?

当然不必q么ȝQJava提供“数l?Array)让?zhn)可以定义一个以“烦引?Index)作ؓ识别的数据结构。在Java中,可以q么定义一个数lƈ初始数组内容Q?br />
int[] score = {90, 85, 55, 94, 77};

?什么是数组Q?br />java语言中,数组是一U最单的复合数据cd。数l是有序数据的集合,数组中的每个元素h相同的数据类型,可以用一个统一的数l名和下标来唯一地确定数l中的元素。数l有一l数l和多维数组?br />Qhttp://www.linux8.net/html/java/2006-3/29/21_59_23_560.htmlQ?br />
array的定义和使用Q用“[]”做为烦引运符Qindexing operator).(《TIJ》)

?java中数l到底是什么?

1Q不在其他语言中是什么,数组在Java中可得看作一个对象,它有一些值得探讨的特性?br />Q《java jdk5.0 学习W记》良葛格Q?br />
q就意味着与C++中的数组的根本不同,相反QJava中的数组与C++中的STL或Java中的容器cd而更相像一些(只是作ؓ对象Q它的方法要比STL中的容器cL者Collectioncd很多Q?br />
Java中的数组其实是一个对象,但是实是一个特D的对象Q实在是太特D了Q以致我们都不好把它多做对象处理?br />
刚刚开始接触java数组的h都会听到一句类似的话:java是纯面向对象的语aQ他的数l也是一个对象?br />于是乎,我就按照一个对象的方式来用数l,心安理得。直到我接触到C的数l后Q才发现数l作Z个类来用在实现上是多么的“不自然”?br />首先我们看一下表面现象,数组创徏的时候采用的是如下语句:
MyClass[] arr = new MyClass[9];
而普通类采用的是如下语句Q?br />MyClass obj = new MyClass();
是_创徏数组的时候不使用括号传参。得数l和普通类看v来就有很多不同,因ؓ括号里的参数是传递给构造方法的Q进而让人感觉数l类是没有构造方法的?br />Qhttp://dev.csdn.net/author/DeepNightTwo/afb7e220bdf5423ba656f84b6a183b44.htmlQ?br />
2Qjava中数l是对象的依据:

aQ来源:Qhttp://blog.csdn.net/treeroot/archive/2005/01/22/264001.aspxQ?br />
我们定数组的父cLObjectQ?br />  new Object[0].getClass().getSuperClass()  是Object.class

数组没有对应的类文gQString对应String.class.但是数组却没有,而且他们?br />  cd字很古怪,可以q样获得 new int[2].getClass().getName();
  q是和其他对象最大的不同点,因ؓ数组cL在运行时生成的?br />
java.lang.reflect.Array是final的,所以数l肯定不是它的子c?br />  q个cȝ来动态生成数l或者操作数l?获得长度{?.



bQ来源:Qhttp://dev.csdn.net/author/DeepNightTwo/afb7e220bdf5423ba656f84b6a183b44.htmlQ?br />
再往׃惻Iq有很多让h感觉不自然的东西。可以肯定的是,java实数l作Z一个类来处理。还是用上面的例子说明:
可以通过以下Ҏ(gu)得到MyClass[]的Class实例Qarr.getClass()或MyClass[].class。这P我就可以向数l类里面“窥探”了?br />Class clazz = MyClass[].class;
System.out.println(clazz.getConstructors().length);
打印出来的结果是0Q证明数l类实没有构造方法?br />

再看看数l类的“庐q面目”:
System.out.println(clazz);
输出是:
[Larraytest.MyClass

对Java Class文gl构E有了结q道,q个字符串的意思就是一个元素类型ؓarraytest.MyClass的一l数l。也是_数组cd不是和普通类一P以一个全限定路径?cd来作q唯一标示的,而是以[+一个或者多个L+数组元素cd限定路径+cL最为唯一标示的。这?)也是数组和普通类的区别。而这个区别似乎在某种E度上说明数l和普通javacd实现上有很大区别。因为java虚拟?java指o?在处理数l类和普通类的时候,肯定会做出区分。我猜想Q可能会有专门的java虚拟机指令来处理数组?br />
分析到这里,我基本上可以肯定QjavaҎ(gu)l对象化的操作的支持是指令的,也就是说java虚拟机有专门针对数组的指令。数l的Classcd例是java虚拟机动态创建动态加载的Q其l构与普通javacȝClass实例有一些不同?br />
JDK API中有一个java.lang.reflect.Arrayc,q个cL供了很多Ҏ(gu)(l大多数是nativeҎ(gu)Q这在另一个方面证明了javaҎ(gu)l的支持是专用指令支持的Q否则用本地Ҏ(gu)q嘛^_^)Q用来I补我们对数组操作的局限性?br />下面q句话用来创Z个一l的、长度ؓ10的、类型ؓarraytest.MyClass的数l:
arraytest.MyClass[] arr = (arraytest.MyClass[]) Array.newInstance(arraytest.MyClass, 10);

下面q句话用来创Z个二l的??的、类型ؓarraytest.MyClass的数l:
int[] arrModel = new int[]{3,5};
Object arrObj = Array.newInstance(Sub.class, arrModel);
当然你可以用一个数l的引用指向上面的二l数l,q里我们用一个Object的引用指向他?br />使用的时候,我们也是可以利用ArraycL供的Ҏ(gu)来实玎ͼ

System.out.println(Array.getLength(arrObj);//W一l长度ؓ3
System.out.println(Array.getLength(Array.get(arrObj, 2)));//W二l长度ؓ5Q这里如果写3Q就会得C意想之中的java.lang.ArrayIndexOutOfBoundsException

打印l果是如我所想的Q?br />3
5

对于数组的Classcd例,q有一些奇怪的现象Q?br />在运行代?java.lang.reflect.Field fieldarr = clazz.getField("length");的时候,会抛出异常:java.lang.NoSuchFieldException: lengthQ这g在说数组cL有lengthq个域,而这个域其实是我们用的最多的一个(也就是说q个域是肯定存在的)。我惛_于数l的Classcd例、数l的实现{,q有很多“猫腠Z在里面?br />
Z说一句,java数组最多只能是255l的。这个让人看CC的媄子,嘿嘿?br />
“Java把数l当作一个javacL处理”说hҎ(gu)Q用h自然Q但是细l想来,q是有很多不单的地方呀?



cQ来源:《java jdk5.0 学习W记》良葛格 W五章数l?br />
从对数组对象的进一步探讨,可以E微了解Java对对象处理的一些方法。首先来看看一l数l的引用名称的定义:

int[] arr = null;

在这个定义中Qarr表示一个可以参考引用自一l数l对象的变量名称Q但是目前将q个名称参考引用自nullQ表C没有指定q个名称参考引用自实际的对象。在Java中,=q算用于基本数据cdӞ是将值复制给变量Q但当它用于对象Ӟ则是对象指定给参考引用名U来参考引用。也可以同一个对象指定给两个参考引用名Uͼ当对象的值由其中一个参考引用名U进行操作而变更时Q另一个参考引用名U所参考引用到的g会变动。下面来看看范例5.8的示范?br />
ü 范例5.8  AdvancedArray.java

public class AdvancedArray {

    public static void main(String[] args) {

        int[] arr1 = {1, 2, 3, 4, 5};

        int[] tmp1 = arr1;

        int[] tmp2 = arr1;

 

        System.out.print("通过tmp1取出数组|");

        for(int i = 0; i < tmp1.length; i++)

            System.out.print(tmp1[i] + " ");

 

        System.out.print("\n通过tmp2取出数组|");

        for(int i = 0; i < tmp2.length; i++)

            System.out.print(tmp2[i] + " ");

 

        tmp1[2] = 9;

        System.out.print("\n\n通过tmp1取出数组|");

        for(int i = 0; i < tmp1.length; i++)

            System.out.print(tmp1[i] + " ");

 

        System.out.print("\n通过tmp2取出数组|");

        for(int i = 0; i < tmp2.length; i++)

            System.out.print(tmp2[i] + " ");

        System.out.println();

    }

}

执行l果Q?br />
 

通过tmp1取出数组|1 2 3 4 5

通过tmp2取出数组|1 2 3 4 5

 

通过tmp1取出数组|1 2 9 4 5

通过tmp2取出数组|1 2 9 4 5

 

在这个范例中Q通过tmp1名称改变了烦?的元素|׃tmp2也引用自同一数组对象Q所以tmp2取出索引2的元素值是改变后的倹{事实上在范?.8中,有三个引用名U引用自同一个数l对象,也就是arr1、tmp1与tmp2Q所以,如果取出arr1索引2的元素,元素g会是9?br />


了解到在Java中数l是一个对象,而?/span>=指定时是对象指定给数组名来引用Q?span style="">不是数l进行复?/span>。如果想整个数l的值复制给另一个数l该如何作呢Q可以用@环,整个数l的元素值遍历一遍,q指定给另一个数l相对应的烦引位|。范?/span>5.10C了进行数l复制的Ҏ(gu)?/span>

Ü范例5.10  ArrayCopy.java

public class ArrayCopy {

    public static void main(String[] args) {

        int[] arr1 = {1, 2, 3, 4, 5};

        int[] arr2 = new int[5];

 

        for(int i = 0; i < arr1.length; i++)

            arr2[i] = arr1[i];

 

        for(int i = 0; i < arr2.length; i++)

            System.out.print(arr2[i] + " ");

        System.out.println();

    }

}

执行l果Q?/span>

 

1 2 3 4 5

另一个进行数l复制的Ҏ(gu)是?/span>SystemcL供的arraycopy()Ҏ(gu)。其语法如下Q?/span>

System.arraycopy(来源, 起始索引, 目的, 起始索引, 复制长度);

范例5.11改写了范?/span>5.10Q?/span>System.arraycopy()q行数组复制Q执行结果与范例5.10是相同的?/span>

Ü范例5.11  ArrayCopy2.java

public class ArrayCopy2 {

    public static void main(String[] args) {

        int[] arr1 = {1, 2, 3, 4, 5};

        int[] arr2 = new int[5];

 

        System.arraycopy(arr1, 0, arr2, 0, arr1.length);

 

        for(int i = 0; i < arr2.length; i++)

            System.out.print(arr2[i] + " ");

        System.out.println();

    }

}


四?Java中的数组作ؓ对象带来的好?br />1Q越界检?br />
2Qlength fieldQ与传统的C++中的数组相比Qlength字段可以方便的得到数l的大小Q但要注意,仅仅可以得到数组的大,不能得到数组中实际包含多个元素Q因为length 只会告诉我们最多可多元素置入那个数l?br />
3Q?初始化:对象数组在创Z初会自动初始化成nullQ由原始数据cd构成的数l会自动初始化成Ӟ针对数值类型)Q?Char)0 Q针对字W类型)或者false Q针对布?yu)类型)?br />
4Q?数组作ؓq回|首先Q既然数l是对象Q那么就可以把这个对象作回|而且Q不必担心那个数l的是否可用只要需要它?yu)׃自动存在而且垃圾攉器会在我们完成后自动其清除



]]>
有效使用return语句Qreturn可用于控制方法的执行Q比如,若某一环节p|则退出方法等Q?/title><link>http://www.tkk7.com/flysky19/articles/92580.html</link><dc:creator>不断前进的小乌龟</dc:creator><author>不断前进的小乌龟</author><pubDate>Tue, 09 Jan 2007 05:37:00 GMT</pubDate><guid>http://www.tkk7.com/flysky19/articles/92580.html</guid><wfw:comment>http://www.tkk7.com/flysky19/comments/92580.html</wfw:comment><comments>http://www.tkk7.com/flysky19/articles/92580.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/flysky19/comments/commentRss/92580.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/flysky19/services/trackbacks/92580.html</trackback:ping><description><![CDATA[以下内容来自Qhttp://book.csdn.net/bookfiles/170/1001707575.shtml<br /><br /><b>return</b>语句 <p class="MsoNormal" style="text-indent: 20pt;">return语句是用来退出方法的跌{语句Q?/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语句Q方法就在那一行代码停止执行,执行控制立刻返回到调用该方法的代码处?/p><p class="MsoNormal" style="text-indent: 20pt;">          对于q回值类型ؓvoid的方法,return关键字单独作为完整的语句使用Q?/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;">然而,对于q回cd为void的方法,return;语句是可选的。如果省略这条语句,隐含表明Ҏ(gu)的最后一行有一个return;语句。即Q下面两个版本的doSomethingҎ(gu)是等LQ?/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;">另一斚wQ对于返回类型非void的方法体Q必至包括一条明的return语句。这U情况下Qreturn关键字后面必跟随一个求值类型和Ҏ(gu)声明的返回类型一致的表达式。例如,如果Ҏ(gu)定义为具有intq回cdQ那么下列Q何一Ureturn语句都可以接受:</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;">{等。另一个例子,如果Ҏ(gu)定义为具有booleanq回cdQ那么下列Q何一Ureturn语句都可以接受:</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;">Ҏ(gu)体可以包含不只一条return语句。但好的~程习惯是一个方法中只在最末尾包含一条return语句。再看一下前面讨的isHornorsStudentҎ(gu)Q这个方法有两条return语句Q?/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来重写这个方法,该变量捕hl返回的true/falsel果。在Ҏ(gu)最末尾用一条return语句q回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;">如上qC码所C,׃已经lresult变量赋予初值falseQ因此在else子句中明地l它赋值false是不必要的,可以像下面这L化isHornorsStudentҎ(gu)Q?/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>但是有一U情况下多个return语句是可以接受的Q方法需要执行一pd操作Q在q个q程中,M一步失败意味着整个Ҏ(gu)p|?/b>下面的伪代码阐明了这U情况:</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;">          注意QJava~译器会校验是否Ҏ(gu)的所有逻辑路径都返回类型正的l果。例如,下面的方法会产生~译错误Q因为只有在if试成功时才能到达return语句Q如果if试p|Q则return语句被绕q:</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;">q种情况下将产生下面q个~译错误Q?/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.tkk7.com/flysky19/aggbug/92580.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/flysky19/" target="_blank">不断前进的小乌龟</a> 2007-01-09 13:37 <a href="http://www.tkk7.com/flysky19/articles/92580.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>File,FileInputStream,FileReader,InputStreamReader,BufferedReader的用和区别http://www.tkk7.com/flysky19/articles/92286.html不断前进的小乌龟不断前进的小乌龟Sun, 07 Jan 2007 17:30:00 GMThttp://www.tkk7.com/flysky19/articles/92286.htmlhttp://www.tkk7.com/flysky19/comments/92286.htmlhttp://www.tkk7.com/flysky19/articles/92286.html#Feedback0http://www.tkk7.com/flysky19/comments/commentRss/92286.htmlhttp://www.tkk7.com/flysky19/services/trackbacks/92286.html2007q???/p>


File,FileInputStream,FileReader,InputStreamReader,BufferedReader 的用和区别

参考资料:

l         ?core java ?12 ?

l         使用 Java 操作文本文g的方法详?

http://java.ccidnet.com/art/3737/20041108/523627_1.html

l  FileReader 是什么类Q和 FileInputStream 有什么不同?Q?      

 http://book.hackbase.com/ask2/ask107572.htm
自己的整理和领会Q?br />引言Q?br />    
C语言只需要一个File*可以了Q与C不同Qjava有一pd类型,其数量超q?0U。类库的设计者声Uͼ“有

_的理׃ؓ用户提供丰富的流cd的选择Q这样做可以减少E序的错误。”例如,在C语言U,许多为?/p>

输出流写入一个只L式的文g”是很常见的错误。(事实上,qƈ不常见。)

我们认ؓ在CQ+语言中,接口设计者避免程序出错的主要“工具”是心谨慎的态度Q在java语言中更是如

此。流库的高度复杂性迫使程序设计h员}慎微?br />    
1.  Filec?br />  
1 Q?File cMl(?core java ?638 )

File cd装了对用h器的文gpȝq行操作的功能。例如,可以?File c获得文件上ơ修改的旉UdQ?/p>

或者对文gq行删除、重命名。换句话_类x的是文g内容Q?File cd注的是文件在盘上的存储

?

File cȝ主要Ҏ(gu)有: getName(),getCanonicalFile(),lastModified(),isDerector(),isFile(),getPath()

{;

2 Q?File cM FileInputStream cȝ区别Q?

类x的是文g内容Q?File cd注的是文件在盘上的存储?

File 不属于文件流 , 只能代表一个文件或是目录的路径名而已?

提示Q(?core java ?639 )

如果处理文g或者目录名Q就应该使用 File 对象Q而不是字W串。例如, File cȝ equals Ҏ(gu)知道一?/p>

文gpȝ对大写是敏感的Q目录尾的?/ ”字W无关紧要?

自己的领会:

FileInputStream cL?FileReader cȝ构造函数有多个Q其中典型的两个分别为:一个?File 对象?/p>

参数Q而另一个用表C\径的 String 对象作ؓ参数Q自׃前一直觉得直接用?String 指定路径可?/p>

了,一直不明白Z么很多h都先构造一?File 对象Q现在终于明白了Q“如果处理文件或者目录名Q就?/p>

该?File 对象Q而不是字W串。”!

2.       FileInputStream c?

1 Q?FileInputStream cMl:

以字节ؓ单位Q非 unicode Q的处理。字节序列即Q二q制数据。与~码无关Q不存在q问题?

FileInputStream cȝ主要Ҏ(gu)有:

Read Q)Q?read Q?byte[] b Q, read Q?byte[],int off,int len Q?,available();

2 Q?FileInputStream cM FileReader cȝ区别Q?

两个cȝ构造函数的形式和参数都是相同的Q参Cؓ File 对象或者表C\径的 String Q它们到底有何区?/p>

呢?

l         Readers and Writers work only on line based character data, so plain text files.
For anything else, you MUST use Streams.

l         JDK5 API:

FileInputStream is meant for reading streams of raw bytes such as image data. For reading streams

of characters, consider using FileReader.

FileReader is meant for reading streams of characters. For reading streams of raw bytes, consider

using a FileInputStream .

l         FileInputStream Q以字节方式读取; FileReader Q把文g转换为字W流dQ?
l        InputStream提供的是字节的dQ而非文本dQ这是和ReadercȝҎ(gu)区别。用Readerd?/p>

来的是char数组或者String Q用InputStreamd出来的是byte数组?br />l        Readercd其子cL供的字符的dcharQ?6?unicode~码Q,inputStream及其子类提供字节

的dbyteQ?位)Q所以FileReadercL文件按字符的方式dQFileInputStream则按字节的方式

d文gQInputStreamReader可以读如stream转换成字W流方式Q是reader和stream之间的桥?br />l  最初Java是不支持Ҏ(gu)本文件的处理的,Z弥补q个~憾而引入了Reader和Writer两个cR?br />  
l         FileInputStream cM二进制输?/ 输出Q?I/O 速度快且效率搞,但是它的 read Q)Ҏ(gu)d

的是一个字节(二进制数据)Q很不利于h们阅诅R?

l         ?FileReader cdI补了q个~陷Q可以以文本格式输入 / 输出Q非常方便;比如可以使用

while((ch = filereader.read())!=-1 ) 循环来读取文Ӟ可以使用 BufferedReader ?readLine() Ҏ(gu)一

行一行的d文本?

l         当我们读写文本文件的时候,采用 Reader 是非常方便的Q比?FileReader Q?

InputStreamReader ?BufferedReader 。其中最重要的类?InputStreamReader Q它是字节{换ؓ字符的桥

梁?你可以在构造器重指定编码的方式Q如果不指定的话采用底层操作系l的默认~码方式Q例?GBK {?/p>

?

l         FileReader ?InputStreamReader 涉及~码转换 ( 指定~码方式或者采?os 默认~码 ) Q可

能在不同的^C出现q现象Q?FileInputStream 以二q制方式处理Q不会出Cؕ码现?.

3 Q自q领会Q?

l         如果处理U文本文Ӟ使用 FileReader Q因为更方便Q也更适合阅读Q但是要注意~码问题

Q?
l   其他情况Q处理非U文本文ӞQFileInputStream是唯一的选择QFileInputStream是进Socket通讯时会

用到很多Q如文件流是Stream的方式传向服务器Q?br />  
3.       FileReader c?

1Q  ?FileReader cMl:

InputStreamReader cȝ子类Q所有方法( read Q){)都从父类 InputStreamReader 中承而来Q?

2Q  ??InputStreamReader cȝ区别Q?

l         自己的领会:

该类与它的父c?InputStreamReader 的主要不同在于构造函敎ͼ主要区别也就在于构造函敎ͼ?

InputStreamReader 的构造函C看到Q参Cؓ InputStream 和编码方式,可以看出Q当要指定编码方式时Q?/p>

必须使用 InputStreamReader c;?FileReader 构造函数的参数?FileInputStream 同,?File 对象?/p>

表示 path ?String Q可以看出,当要Ҏ(gu) File 对象或?String d一个文件时Q用 FileReader Q我

?FileReader 子类的作用也在于这个小分工吧?

3Q  ?一般用法:

FileReader fr = new FileReader("ming.txt");
   char[] buffer = new char[1024];
   int ch = 0;
   while((ch = fr.read())!=-1 )
   {
    System.out.print((char)ch);
   }

4.       InputStreamReader c?

l         以文本格式输?/ 输出Q可以指定编码格式;

l         主要Ҏ(gu)Q?

getEncoding ()Qread();

l         一般用法:

InputStreamReader isr = new InputStreamReader(new FileInputStream("ming.txt"));
   while((ch = isr.read())!=-1)
   {
    System.out.print((char)ch);
   }

5.       BufferedReader c?

l         Jdk5 api Q?

Read text from a character-input stream, buffering characters so as to provide for the efficient

reading of characters, arrays, and lines.
l    BufferedReader 由ReadercL展而来Q提供通用的缓冲方式文本读取,而且提供了很实用的readLineQ?/p>

d分行文本很适合QBufferedReader是针对Reader的,不直接针Ҏ(gu)Ӟ也不是只针对文gd?br />l  一般用法:
    
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("ming.txt")));
  String data = null;
  while((data = br.readLine())!=null)
  {
   System.out.println(data);
  }
    
  
6.       ȝ以上内容Q得出比较好的规范用法:

1Q  ?File file = new File ("hello.txt");

FileInputStream in=new FileInputStream(file);

2Q  ?File file = new File ("hello.txt");

FileInputStream in=new FileInputStream(file);

InputStreamReader inReader=new InputStreamReader(in);

BufferedReader bufReader=new BufferedReader(inReader);

3Q  ?File file = new File ("hello.txt");

FileReader fileReader=new FileReader(file);

BufferedReader bufReader=new BufferedReader(fileReader);

7.一些写法的区别Q?br />1Q?br />File file = new File ("hello.txt");
FileInputStream in=new FileInputStream(file);
InputStreamReader inReader=new InputStreamReader(in);
BufferedReader bufReader=new BufferedReader(inReader);

2Q?br />FileInputStream inQnull;
File file = new File ("hello.txt");
in=new FileInputStream(file);
BufferedReader bufReader=new BufferedReader(new InputStreamReader(in));

3Q?br />File file = new File ("hello.txt");
BufferedReader bufReader=new BufferedReader(new InputStreamReader(new FileInputStream(file)));

上述两种写法的微区别:
aQ第二种方式中把“FileInputStream inQnull;”定义单独放在开始处Q说明下面应该还有要用到in对象变量的地方;QBufferedReader处用了)

bQ第二种方式没有定义InputStreamReader的对象变量,直接在BufferedReader的构造函Cnew一个,
q种方式与第一U方式的主要区别QInputStreamReader对象只用一ơ!

q对于在q里只需要用一ơ这个InputStreamReader对象的应用来说更好;无需定义InputStreamReader的对象变量,接收由newq回的该对象的引用,因ؓ下面的程序中不需要这个InputStreamReader的对象变量,所以无需定义Q所以这U情况下Q第二种方式比第一U更好一些?br />
cQ第三种方式中,典型的三层嵌套委zօp,清晰看出Reader的委z模式(《corejava?2章有图描q该委派关系Q,FileInputStream和InputStreamReader都没有定义变量,new生成的对象都只是使用一ơ?br />
dQ三U方式的区别也就在于FileInputStream和InputStreamReader对象是否都只使用一ơ,是否需要定义它们的对象变量Q以及个人的~码习惯?/p>

e)但是要注意异常处理,FileInputStream(file)会抛出NotFileFoundExceptionQ如果采用surround方式
Qtry&catchQ处理,应该用第二种方式Q这样可以用System.out.println提示文g未找刎ͼ
当然在函数名后用throws ExceptionQ然后用W三U方式也行,但似乎这适合有用L面的情况Q把异常抛出在客L在处理?br />



]]>
多态?/title><link>http://www.tkk7.com/flysky19/articles/89965.html</link><dc:creator>不断前进的小乌龟</dc:creator><author>不断前进的小乌龟</author><pubDate>Mon, 25 Dec 2006 11:22:00 GMT</pubDate><guid>http://www.tkk7.com/flysky19/articles/89965.html</guid><wfw:comment>http://www.tkk7.com/flysky19/comments/89965.html</wfw:comment><comments>http://www.tkk7.com/flysky19/articles/89965.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/flysky19/comments/commentRss/89965.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/flysky19/services/trackbacks/89965.html</trackback:ping><description><![CDATA[ <p> <font size="4">2006q?2?5?br />学c++和java那么久了Q但是觉得自׃直对装Q承,多态性这三个面向对象的关键特征一直不是很</font> </p> <p> <font size="4">了解。其实应该说是自׃Z解了Q但是找实习ӞW试才知道,面对q些基本得不能再基本的题目,</font> </p> <p> <font size="4">自己却答不出来,猛然发觉Q原来是自己Ҏ(gu)p没有理解透彻Q!Q?/font> </p> <p> <font size="4">一、先用自q语言概括一下“多态性”吧Q?/font> </p> <p> <font size="4">多态性是指在l承层次或者接口与实现cdơ上Q如果子c覆盖了父类的方法,或者说实现cdC接口</font> </p> <p> <font size="4">定义的方法,那么可以通过一般化的用父类或者接口来调用该方法,JVM在运行期能够Ҏ(gu)实际传递的?/font> </p> <p> <font size="4">cd象引用,来调用相应的Ҏ(gu)Q生正的行ؓ。达到“同一函数Q不同行为”的效果。java的多态?/font> </p> <p> <font size="4">是通过动态绑定实现的?/font> </p> <p> <font size="4">例如Q类A中有一aa()Ҏ(gu)Q类B和类Cl承cAQƈ覆盖了类A的aa()Ҏ(gu)Q这时在E序中,如果用类A的引</font> </p> <p> <font size="4">用a调用aaҎ(gu)Qa.aa()QJVM会根据动态绑定机ӞҎ(gu)a的实际类型调用相应方法;如果a=new B(),?/font> </p> <p> <font size="4">么调的是B的方法;如果a=new C(),那么调的是C的方法?/font> </p> <p> <font size="4">二、上q概念包含几个关键点Q?br />首先是多态性的前提Q?br />1.在承层ơ或者接口与实现cdơ上才有多态性;<br />2.子类覆盖了父cȝҎ(gu)Q或者实现类实现了接口定义的Ҏ(gu)Q才有多态性;</font> </p> <p> <font size="4">其次是多态性的表现Q?br />1.可以通过一般化的用父类或者接口来调用某一Ҏ(gu)QJVM在运行期能够Ҏ(gu)实际传递的子类对象引用Q?/font> </p> <p> <font size="4">来调用相应的Ҏ(gu)Q从而生正的行ؓ?/font> </p> <p> <font size="4">最后是多态性的实现原理Q?br />1.java多态性是通过函数的动态绑定机制实现的Q?/font> </p> <p> <font size="4">至于动态绑定的机制是什么,L下一文章“java动态绑定机制”?/font> </p> <p> <font size="4">有待查看的资料:<br />1.C++的书Q(java的书中只对多态性进行阐qͼ但是很少对多态性的概念作出解释Q好像C++中的书中?/font> </p> <p> <font size="4">概念Q?/font> </p> <p> <font size="4">2.《core java?/font> </p> <p> <br /> <font size="4">参考资料:<br />1.单的理解 cȝl承 ?多态?br /></font> <a > <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 > <font size="4">http://dev.csdn.net/article/12/12550.shtm</font> </a> <br /> </p> <img src ="http://www.tkk7.com/flysky19/aggbug/89965.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/flysky19/" target="_blank">不断前进的小乌龟</a> 2006-12-25 19:22 <a href="http://www.tkk7.com/flysky19/articles/89965.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>arguments ?parameter的区?http://www.tkk7.com/flysky19/articles/89963.html不断前进的小乌龟不断前进的小乌龟Mon, 25 Dec 2006 11:09:00 GMThttp://www.tkk7.com/flysky19/articles/89963.htmlhttp://www.tkk7.com/flysky19/comments/89963.htmlhttp://www.tkk7.com/flysky19/articles/89963.html#Feedback0http://www.tkk7.com/flysky19/comments/commentRss/89963.htmlhttp://www.tkk7.com/flysky19/services/trackbacks/89963.html2006q?2?5?br />看《TIJ》时老看到“引数”这个词Q觉得怪别扭的Q但一直没L引数和参数有何区别,先查资料l于明白了:
1.http://blog.chinaunix.net/u/25073/showart_188475.html
一般说来,两个是可以互换的。但?C E序员的习惯是:parameter 是参敎ͼ?argument 是参数的倹{也是_函数原型的参数列表,?parameter listQ比?br />
int sum(int a, int b);

而当使用的时?br />
int sum;
sum = sum(10, 20);

10 ?20 则是 argument?br />
q个习惯也媄响了很多其他语言的程序员。如果要混合两者的意义Q一般用 argumentQ?parameter 则比较少用?br />
argument 有的时候也被称?actual parameter?br />
对应的中文术语是

parameter = 形参 (估计是「Ş式参数」简U?
argument = 实参 (估计是「实际参数」简U?


2.http://royfang.spaces.live.com/blog/cns!53F57C7F0CE9D52C!125.entry
argument和parameter是有区别的,q去的资料中l一译为参数是不准的Q前者翻译成引数Q后者翻译成参数Q这L译才是_的翻译,两者的区别如下文:
What is the difference between an argument and a parameter?
引数和参数有何区别?
While defining method, variables passed in the method are called parameters.
当定义方法时Q传递到Ҏ(gu)中的变量UCؓ参数.
While using those methods, values passed to those variables are called arguments.
当用方法时Q传l变量的值称为引?


]]>
重蝲、覆盖、多?zz)http://www.tkk7.com/flysky19/articles/89703.html不断前进的小乌龟不断前进的小乌龟Sat, 23 Dec 2006 16:14:00 GMThttp://www.tkk7.com/flysky19/articles/89703.htmlhttp://www.tkk7.com/flysky19/comments/89703.htmlhttp://www.tkk7.com/flysky19/articles/89703.html#Feedback0http://www.tkk7.com/flysky19/comments/commentRss/89703.htmlhttp://www.tkk7.com/flysky19/services/trackbacks/89703.html source:http://topic.csdn.net/t/20040224/15/2770426.html
1.首先说重载(overloadQ,是发生在同一cM。与什么父cdcR承毫无关pR?   
  标识一个函数除了函数名外,q有函数的参敎ͼ个数和类型)。也是_一个类中可以有两个或更多的函数Q叫同一个名字而他们的参数不同?   
  他们之间毫无关系Q是不同的函敎ͼ只是可能他们的功能类|所以才命名一P增加可读性,仅此而已Q? 
  它是面向q程的设计方法与面向对象无关。说什么是多态的表现方式Q真是狗屁不通!  
   
 2. 再说覆盖(override),是发生在子类中!也就是说必须有承的情况下才有覆盖发生? 
  我们知道l承一个类Q也有了父cM全部Ҏ(gu)Q如果你感到哪个Ҏ(gu)不爽Q功能要变,那就把那个函数在子类中重新实C遍? 
  q样再调用这个方法的时候,是执行子类中的q程了。父cM的函数就被覆盖了。(当然Q覆盖的时候函数名和参数要和父cM完全一? 
  Q不然你的方法对父类中的Ҏ(gu)׃起Q何作用,因ؓ两者是两个函数Q毫不关p)  
   
3.  最后说多态(polymorphismQ,q个n多大师都有经典论qͼ我不敢多说什么? 
  提醒一句,q个也是必须有承发生的情况下,而且必须有上溯造型的时候才有多?
自己的补充:觉得覆盖是多态的基础Q这Lcd象的引用可以动态调用实际类型的子类的方法;



]]>
Z么会有两个jreQ?60925Q原创)http://www.tkk7.com/flysky19/articles/88935.html不断前进的小乌龟不断前进的小乌龟Tue, 19 Dec 2006 15:22:00 GMThttp://www.tkk7.com/flysky19/articles/88935.htmlhttp://www.tkk7.com/flysky19/comments/88935.htmlhttp://www.tkk7.com/flysky19/articles/88935.html#Feedback0http://www.tkk7.com/flysky19/comments/commentRss/88935.htmlhttp://www.tkk7.com/flysky19/services/trackbacks/88935.html 一?/span> jre ?/span> jdk 有什么区?/span> ??? Z么安?/span> jdk 后会有两?/span> jre Q(一套一般在

c:\program files\java\jre 下,一套自己选择?/span> jdk 安装路径下,一般ؓ

d:\jdk1.5\jre Q)

 

{:

1.1 以下?/span> java.sun.com 上的官方解释Q?/span>

 

Question: Why would anyone want the JRE if the Java 2 SDK has

everything in the JRE and more?

 

Answer: The JRE is smaller and therefore easier to download or

distribute with software than the Java 2 SDK. Most users of Java

technology are people who just want to run applets and applications

developed by others. They're not interested in developing any

applications themselves. The relatively small Java RE is made for such

end users. They can download the Java RE themselves from the web, or

software vendors can include it in their own products. The typical end

-user doesn't need the bulkier Java 2 SDK with its development tools.

 

1.2

自己的理解:

问: jre ?/span> jdk 有什么区?/span> ?

{:

JRE 提供?/span> JAVA E序q行的必要环境^収ͼ

jdk 提供?/span> java 的编E环境,它包含编译调试的环境功能Q包?/span> JRE Q?/span>

 

如果只安装了 jre Q那?/span> cmd 命o行中只能执行 java 指oQ不能执?/span> javac Q?/span>

安装?/span> jdk 后才能执?/span> javac Q因?/span> jre 中不包含用于开发的~译环境Q?/span>

 

问:

Z么安?/span> jdk 后会有两?/span> jre Q?/span>

{:

l         之所以需要两?/span> jre Q是因ؓ可以分担工作Q当用户只需要执?/span> java 的程序时Q那

l ?/span> c:\program files\java\jre 下的 jre ?/span> ok Q当用户?/span> java E序员,需?/span> java 开发环境,那么开发时Q系l就会优先去䏀?/span> java ?/span> javac ”这些命令本w的目录或者他们的父目录的 jre Q这样开发时一般运行的?/span> jdk 下的 jre Q而运行外部程序时Q一般运行的?/span>

l c:\program files\ 下的 jre Q实C分工Q不同的 jre 负责各自范围的内容;

 

l         详细的解释和学习Q参看王的 <<java 深度历险 >> 的第二章“深?/span> java 2 SDK ?/span>

l Q讲得非常明白到位!

相关内容摘录如下Q(囄Q?/span>

(zhn)所埯的是哪一?/span> java.exe ?

既然(zhn)的電腦裡頭臛_有兩?/span> JRE Q那D來決定用哪一?/span> JRE ?/span> ? 這個重

責大d落在 java.exe 的n上?/span>

當我們在命o列?/span>

java XXX

的時候, java.exe 的工作就是找到合適的 JRE 來執行類 ?/span> 檔?/span> java.exe 依照?/span>

下邏輯來找 JRE:

1. 自己的目錄下?/span> ?/span> ?/span> JRE 目錄?/span> ( 這個部分這樣 ?/span> 並不是非常精,原因

請詳?/span> JDK 原始|這此不特 別說 ?/span> )

2. 父目錄底?/span> JRE 子目錄?/span>

3. 查詢 Windows

Registry( HKEY_LOCAL_MACHINE\Software\JavaSoft\Java

Runtime Environment\ ) ?span lang="EN-US">

所以, java.exe 的執行結果和(zhn)電腦裡面哪一?/span> java.exe 被執行,然後哪一

?/span> JRE 被拿來執?/span> Java 應用E式有莫大的關係?/span>

 

l         另外Q在实际的项目开发中Q我们发现很多时?/span> eclipse 老报错,提示 java 虚拟?/span>

l 内存不Q但是机器的内存?/span> 2G 的,怎么可能内存不呢?后来发现?/span> jvm 所支持

l 的内存最高只能设|ؓ 64M 的缘故,q时我们把一?/span> jre 拯?/span> eclipse 的目录下Q让 eclipse 单独跑一?/span> jre Q多?/span> jvm 分管工作Q?/span> jvm 内存不的问题就解决了?/span>

 

 

二?/span> jdk 下的 lib ?/span> jre 下的 lib 有何区别Q?/span>

自己的理解:

jdk 下的 lib 包括 java 开发环境的 jar 包, jre 下的 lib 只是q行 java E序?/span> jar 包;



]]>
վ֩ģ壺 þþþseɫ͵͵޾Ʒav| ҹƵ| ޳ɫwwwþվҹ| ޳aƬ߹ۿר| Ƶ߹ۿ| ɫٸ߳18p| ƷƵ| 18ҹ˿| Ʒɫ99þþƷ| ƷСƵapp| þþþù| Ƶ߹ۿѿƬ | ձѸ| 2019ĻѵӰ߲ | ձɫַ| ޾ƷƷɫ| ޺Сvideos| ޹AVӰԺ| ѿƵ| ѹۿҹ| ɫƵ߹ۿŷ޹ۺ | µĻ| ޾Ʒa߹ۿ| ɾƷһ| ޹Ʒۿþ| պavѲ| ëƬѹۿƵ| ҹδʮվ2| ˳Ƶۿ| 97Ƶ˰| ƷרëƬ| ޾Ʒ˳߹ۿ | youjizz| þþþþavѿƬ| ҹƷѹۿ| ӰԺһ| avavav| Ƶ߹ۿ| ƬaëƬ| Vһۿ ަvþþ | ձ|