??xml version="1.0" encoding="utf-8" standalone="yes"?>
]]>
问题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 />
]]>
]]>
跟杨惠讨论如何徏立决{树的时候,她说实际上就是进栈出栈,当时真是一头雾水呀。隐U知道《TIJ》中说栈是存放数据的一个地方(实际是RAMQ,以前学数据结构时的栈是什么已l不记得了。今天终于下军_先理清堆与栈的概c?br />
二、明操作系l?或编译原?的堆与栈和数据结构的堆与栈是不同的概?br />参考资料摘录:
1.http://www.bloghome.cn/posts/52992
aQ预备知识—程序的内存分配
一个由c/C++~译的程序占用的内存分ؓ以下几个部分
1、栈区(stackQ?q译器自动分配释放 Q存攑և数的参数|局部变量的值等。其操作方式cM?br />
数据l构中的栈?br />2、堆区(heapQ??一般由E序员分配释放, 若程序员不释放,E序l束时可能由O(jin)S回收 。注意它?br />
数据l构中的堆是两回事,分配方式倒是cM于链表,呵呵?br />3、全局区(静态区Q(staticQ—,全局变量和静态变量的存储是放在一块的Q初始化的全局变量和静
态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在盔R的另一块区域?- E序l束后有
pȝ释放
4、文字常量区 —常量字W串是攑֜q里的?E序l束后由pȝ释放
5、程序代码区—存攑ևC的二q制代码?br />
bQ小l:
堆和栈的区别可以用如下的比喻来看出:
使用栈就象我们去饭馆里吃饭,只管点菜Q发出申P、付钱、和吃(使用Q,吃饱了就赎ͼ不必理会切菜、洗菜等准备工作和洗、刷锅等扫尾工作Q他的好处是快捷Q但是自由度?br />使用堆就象是自己动手做喜Ƣ吃的菜_比较ȝQ但是比较符合自q口味Q而且自由度大?br />
堆和栈的区别主要分:
操作pȝ斚w的堆和栈Q如上面说的那些Q不多说了?br />q有是数据l构斚w的堆和栈Q这些都是不同的概念。这里的堆实际上指的是Q满_性质的)优先队列的一U数据结构,W?个元素有最高的优先权;栈实际上是满先进后出的性质的数学或数据l构?br />虽然堆栈Q堆栈的说法是连h叫,但是他们q是有很大区别的Q连着叫只是由于历史的原因?br />
2.http://topic.csdn.net/t/20051107/15/4376867.html
看了大家Ҏ(gu)作系l中堆与栈的说明Q受益匪。我只是在数据结构的层面上说明一下堆与栈Q这是两个完全相关的数据l构。栈l构是后进先出的那个顺序结构,M的数据结构书中都有说明的Q而堆l构是一完全二叉树Q这二叉树的特Ҏ(gu)每个l点的值都比它两个孩子l点中的值小(或者大Q当然如果它有孩子结点的?。栈l构主要用在临时存储局部结果上Q堆l构的特点主要是可以快速地q箋取最?因此当然可以排序?Q这是我对这两个数据l构的理解?br />
3.http://www.cnblogs.com/liangqihui/archive/2005/07/29/202989.html
在google.com搜烦 “编译原理与实践”,看第7章,׃明白大概?
[_֍] Re: 请问堆和栈有什么区? [re: yuan_weiqi]
很喜Ƣ你生气的样子,grin
呵呵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 />
三、由C/C++~译的程序占用的内存分配Q堆与栈的区?br />http://www.bloghome.cn/posts/52992
堆与栈的区别
c /liaxiz 发表?006-10-14 23:32
一、预备知识—程序的内存分配
一个由c/C++~译的程序占用的内存分ؓ以下几个部分
1、栈区(stackQ?q译器自动分配释放 Q存攑և数的参数|局部变量的值等。其操作方式cM?br />
数据l构中的栈?br />2、堆区(heapQ??一般由E序员分配释放, 若程序员不释放,E序l束时可能由O(jin)S回收 。注意它?br />
数据l构中的堆是两回事,分配方式倒是cM于链表,呵呵?br />3、全局区(静态区Q(staticQ—,全局变量和静态变量的存储是放在一块的Q初始化的全局变量和静
态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在盔R的另一块区域?- E序l束后有
pȝ释放
4、文字常量区 —常量字W串是攑֜q里的?E序l束后由pȝ释放
5、程序代码区—存攑ևC的二q制代码?br />
例子E序
q是一个前辈写的,非常详细
//main.cpp
int a = 0; 全局初始化区
char *p1; 全局未初始化?br />main()
{
int b; ?br /> char s[] = "abc"; ?br /> char *p2; ?br /> char *p3 = "123456"; 123456\0在常量区Qp3在栈上?br /> static int c =0Q ?全局Q静态)初始化区
p1 = (char *)malloc(10);
p2 = (char *)malloc(20); 分配得来?0?0字节的区域就在堆区?br /> strcpy(p1, "123456"); 123456\0攑֜帔R区,~译器可能会它与p3所指向
?123456"优化成一个地?br />}
二、堆和栈的理论知?br />
2.1甌方式
stack:
ql自动分配?例如Q声明在函数中一个局部变?int b; pȝ自动在栈中ؓb开辟空?br />heap:
需要程序员自己甌Qƈ指明大小Q在c中malloc函数
如p1 = (char *)malloc(10);
在C++中用newq算W?br />如p2 = (char *)malloc(10);
但是注意p1、p2本n是在栈中的?br />
2.2
甌后系l的响应
栈:只要栈的剩余I间大于所甌I间Q系l将为程序提供内存,否则报异常提示栈溢出?br />堆:首先应该知道操作pȝ有一个记录空闲内存地址的链表,当系l收到程序的甌Ӟ
会遍历该链表Q寻扄一个空间大于所甌I间的堆l点Q然后将该结点从I闲l点链表中删除,q将?br />
l点的空间分配给E序Q另外,对于大多数系l,会在q块内存I间中的首地址处记录本ơ分配的大小Q?br />
q样Q代码中的delete语句才能正确的释放本内存I间。另外,׃扑ֈ的堆l点的大不一定正好等?br />
甌的大,pȝ会自动的多余的那部分重新放入空闲链表中?br />
2.3甌大小的限?br />栈:在Windows?栈是向低地址扩展的数据结构,是一块连l的内存的区域。这句话的意思是栈顶的地址
和栈的最大容量是pȝ预先规定好的Q在 WINDOWS下,栈的大小?MQ也有的说是1MQM是一个编译时
q定的常数Q,如果甌的空间超q栈的剩余空间时Q将提示overflow。因此,能从栈获得的I间较小
?br />堆:堆是向高地址扩展的数据结构,是不q箋的内存区域。这是由于系l是用链表来存储的空闲内存地址
的,自然是不q箋的,而链表的遍历方向是由低地址向高地址。堆的大受限于计算机系l中有效的虚?br />
内存。由此可见,堆获得的I间比较灉|Q也比较大?br />
2.4甌效率的比较:
栈由pȝ自动分配Q速度较快。但E序员是无法控制的?br />堆是由new分配的内存,一般速度比较慢,而且Ҏ(gu)产生内存片,不过用v来最方便.
另外Q在WINDOWS下,最好的方式是用VirtualAlloc分配内存Q他不是在堆Q也不是在栈是直接在q程?br />
地址I间中保留一快内存,虽然用v来最不方ѝ但是速度快,也最灉|
2.5堆和栈中的存储内?br />栈: 在函数调用时Q第一个进栈的是主函数中后的下一条指令(函数调用语句的下一条可执行语句Q的
地址Q然后是函数的各个参敎ͼ在大多数的C~译器中Q参数是由右往左入栈的Q然后是函数中的局部变
量。注意静态变量是不入栈的?br />当本ơ函数调用结束后Q局部变量先出栈Q然后是参数Q最后栈指针指向最开始存的地址Q也是d
C的下一条指令,E序p点l运行?br />堆:一般是在堆的头部用一个字节存攑֠的大。堆中的具体内容有程序员安排.
2.6存取效率的比?br />
char s1[] = "aaaaaaaaaaaaaaa";
char *s2 = "bbbbbbbbbbbbbbbbb";
aaaaaaaaaaa是在q行时刻赋值的Q?br />而bbbbbbbbbbb是在~译时就定的;
但是Q在以后的存取中Q在栈上的数l比指针所指向的字W串(例如?快?br />比如Q?br />#include
void main()
{
char a = 1;
char c[] = "1234567890";
char *p ="1234567890";
a = c[1];
a = p[1];
return;
}
对应的汇~代?br />10: a = c[1];
00401067 8A 4D F1 mov cl,byte ptr [ebp-0Fh]
0040106A 88 4D FC mov byte ptr [ebp-4],cl
11: a = p[1];
0040106D 8B 55 EC mov edx,dword ptr [ebp-14h]
00401070 8A 42 01 mov al,byte ptr [edx+1]
00401073 88 45 FC mov byte ptr [ebp-4],al
W一U在d时直接就把字W串中的元素d寄存器cl中,而第二种则要先把指针D到edx中,在根?br />
edxd字符Q显然慢了?br />
2.7结Q?br />堆和栈的区别可以用如下的比喻来看出:
使用栈就象我们去饭馆里吃饭,只管点菜Q发出申P、付钱、和吃(使用Q,吃饱了就赎ͼ不必理会?br />
菜、洗菜等准备工作和洗、刷锅等扫尾工作Q他的好处是快捷Q但是自由度?br />使用堆就象是自己动手做喜Ƣ吃的菜_比较ȝQ但是比较符合自q口味Q而且自由度大?br />
堆和栈的区别主要分:
操作pȝ斚w的堆和栈Q如上面说的那些Q不多说了?br />q有是数据l构斚w的堆和栈Q这些都是不同的概念。这里的堆实际上指的是Q满_性质的)优先
队列的一U数据结构,W?个元素有最高的优先权;栈实际上是满先进后出的性质的数学或数据l构
?br />虽然堆栈Q堆栈的说法是连h叫,但是他们q是有很大区别的Q连着叫只是由于历史的原因?br />
-----------------------------------------------------------------------------------------------------------------
?heap)和栈(stack)是C/C++~程不可避免会碰到的两个基本概念。首先,q两个概念都可以在讲?br />
据结构的书中扑ֈQ他们都是基本的数据l构Q虽然栈更ؓ单一些?br />
在具体的C/C++~程框架中,q两个概念ƈ不是q行的。对底层机器代码的研I可以揭C,栈是机器
pȝ提供的数据结构,而堆则是C/C++函数库提供的?br />
具体地说Q现代计机(串行执行机制)Q都直接在代码底层支持栈的数据结构。这体现在,有专门的
寄存器指向栈所在的地址Q有专门的机器指令完成数据入栈出栈的操作。这U机制的特点是效率高Q支?br />
的数据有限,一般是整数Q指针,点数等pȝ直接支持的数据类型,q不直接支持其他的数据结构。因
为栈的这U特点,Ҏ(gu)的用在E序中是非常频繁的。对子程序的调用是直接利用栈完成的。机器的
call指o里隐含了把返回地址推入栈,然后跌{臛_E序地址的操作,而子E序中的ret指o则隐含从?br />
栈中弹出q回地址q蟩转之的操作。C/C++中的自动变量是直接利用栈的例子,q也是Z么当函数q?br />
回时Q该函数的自动变量自动失效的原因(因ؓ堆栈恢复了调用前的状??br />
和栈不同Q堆的数据结构ƈ不是ql?无论是机器系l还是操作系l?支持的,而是由函数库提供?br />
。基本的malloc/realloc/free函数l护了一套内部的堆数据结构。当E序使用q些函数去获得新的内?br />
I间Ӟq套函数首先试图从内部堆中寻扑֏用的内存I间Q如果没有可以用的内存I间Q则试图利用
pȝ调用来动态增加程序数据段的内存大,新分配得到的I间首先被组l进内部堆中去,然后再以适当
的Ş式返回给调用者。当E序释放分配的内存空间时Q这片内存空间被q回内部堆结构中Q可能会被适当
的处?比如和其他空闲空间合q成更大的空闲空?Q以更适合下一ơ内存分配申诗这套复杂的分配?br />
制实际上相当于一个内存分配的~冲?Cache)Q用这套机制有如下若干原因Q?br />
1. pȝ调用可能不支持Q意大的内存分配。有些系l的pȝ调用只支持固定大及其倍数的内?br />
h(按页分配)Q这L话对于大量的内存分cL说会造成费?br />
2. pȝ调用甌内存可能是代h늚。系l调用可能涉及用h和核心态的转换?br />
3. 没有理的内存分配在大量复杂内存的分配释放操作下很容易造成内存片?br />
堆和栈的Ҏ(gu)
从以上知识可知,栈是pȝ提供的功能,特点是快速高效,~点是有限制Q数据不灉|Q而堆是函?br />
库提供的功能Q特Ҏ(gu)灉|方便Q数据适应面广泛,但是效率有一定降低。栈是系l数据结构,对于q程
/U程是唯一的;堆是函数库内部数据结构,不一定唯一。不同堆分配的内存逻辑上无法互相操作。栈I?br />
间分静态分配和动态分配两U。静态分配是~译器完成的Q比如自动变?auto)的分配。动态分配由
alloca函数完成。栈的动态分配无需释放(是自动的)Q也没有释攑և数。ؓ可移植的E序赯Q栈的动
态分配操作是不被鼓励的!堆空间的分配L动态的Q虽然程序结束时所有的数据I间都会被释攑֛pȝ
Q但是精的甌内存/释放内存匚w是良好程序的基本要素?br />
四、参考资料:
1.堆与栈的区别
http://www.bloghome.cn/posts/52992
2.内存分配中堆与栈的区?br />http://blog.bioon.cn/user1/8688/archives/2006/53255.shtml
http://blog.csdn.net/tiger406/archive/2006/09/07/1192110.aspx
3.请问堆和栈有什么区?-讨论{案,现在开始求慎解
http://www.cnblogs.com/liangqihui/archive/2005/07/29/202989.html
]]>
二、做《机器学习》作业的时候,怎么也想不明白两个问题:
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
]]>
用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://m.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呢Q?br />查了一下资料和apiQ觉得可以用两种Ҏ(gu)Q?br />法一Q?br />用@环直到结束,q样取得字符串的长度Q然后再从长度往前取Q?br />法二Q?br />先取得前面的子串Q然后再用replaceҎ(gu)Q例如:
String s1="abcde";
String s2="abc";
String s3="";
s3=s1.replace(s2,"");
System.out.println(s3);//s3="de";
哈哈Q自q是太W了Q其实so easyQ:
String subs = s.substring((s.length()-5),s.length());
启发资料Q?br />JavaScript 中如何取得一串字W串除后5个的其h全部
http://topic.csdn.net/t/20060110/15/4508133.html
String subs = s.substring(0,s.length-5);
最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);
}
问题Q?/p>
ClassLoader主要用于加蝲cLӞ利用反射QnewInstance())生成cd例等Q那么它可以用于加蝲xml、txt文g{吗Q?/p>
解答Q?/p>
可以。只是它与java.io相比Q定位的初始路径不同Q当然各自的功能也各有侧重,java.io侧重于与盘文g打交道,而ClassLoader侧重于与.class文g打交道;java.io更适合于纯java projectQ而ClassLoader更适合于web project?/p>
详细见前面写的“javad文g的两U方法:java.io和java.lang.ClassLoader”一文?/font>
int i = Integer.valueOf(my_str).intValue();
int i=Integer.parseInt(str);
Integer integer=Integer.valueOf(str);
Integer integer=new Integer(i);
Integer integerQString
int num=Integer.intValue();
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())
一
填充Q?/font>
Arrays.fill( type[] a, type val) pdҎ(gu)是给Q数l填充。就是简单的把一个数l全部或者某D|据填成一个特D的倹{?/span>
?/span>
查找Q?/span>
binarySearch(type[] a, type key) pdҎ(gu)是,在某cd的数l中?span lang="EN-US">2分法查找特定?span lang="EN-US">Key
的元素,q回元素受前提是q个数组是经q排序的Q如果有多个元素?span lang="EN-US">Key值相{的情况下,无法预料Q返回的是哪一个。对于返回|有以下规律,q回?span lang="EN-US"> < 0表示没有扑ֈQ返回?span lang="EN-US"> >= 0说明扑ֈ了?span lang="EN-US">
对于插入Q?span lang="EN-US">Arrays没有Ҏ(gu)法Q一般对数组的插入都是{化ؓ
Collection
之后再做的,但是binarySearchq是能帮你找到数l的插入点的Q插入点位置回值的l对值减1(
|
q回?/span>
| - 1
)
?/span>
Ҏ(gu)序过的数l查找,法?/span> 2 分法已经相当快了Q呵c?/span>
?/span>
比较:
equals(type[] a, type[] b)
pdҎ(gu)是做两个数组的比较的Q相{返?span lang="EN-US">true。这个方法运用的时候,有些地方要注意?span lang="EN-US">
比较两个float数组的时候,Ҏ(gu)个元素比较,E序不是用的==来判断的Q而是?span lang="EN-US">new Float(f1).equals(new Float(f2))Q这个方法认?/span>
NaN
{于它本w,0.0f不等?span lang="EN-US">-0.0f。对?span lang="EN-US">double数组也是一L?span lang="EN-US">
对于Object[]数组呢,是用?span lang="EN-US">(e1==null ? e2==null : e1.equals(e2))?span lang="EN-US">
?排序:
sort(type[] a)
pdҎ(gu)是对数组排序的?span lang="EN-US">Sun用的排序法是调整快速排序法,采用的是Jon
L. Bentley and M. Douglas McIlroy's "Engineering a Sort Function",
Software-Practice and Experience, Vol. 23(11) P. 1249-1265 (November
1993)。这个算法排序要n* O(n)旉的大量数据,只需?span lang="EN-US">O(n1ogn)旉?span lang="EN-US">
关于快速排序法参考:(http://algorithm.myrice.com/algorithm/commonalg/sort/internal_sorting/quick_sort/quick_sort.ht
m
快速排?/span>
Quick Sort
我们已经知道Q?/span> 在决{树计算模型下,M一个基于比较来定两个元素相对位置的排序算法需?/span> Ω(nlogn) 计算旉 。如果我们能设计一个需?/span> O(n1ogn) 旉的排序算法,则在渐近的意义上Q这个排序算法就是最优的。许多排序算法都是追求这个目标。快速排序算法它在^均情况下需?/span> O(nlogn) 旉。这个算法是?/span> C.A.R.Hoare 发明的?/span> )
?数组的{?
?/span> Arrays.asList(Object[] a) 能够实现数组?/span> ArrayList 的{换。同时利?/span> Collection.toArray() 能将一些集合类型的数据方便的变成数l?/span>
了解到在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();
}
}return语句是用来退出方法的跌{语句Q?/p>
只要遇到return语句Q方法就在那一行代码停止执行,执行控制立刻返回到调用该方法的代码处?/p>
对于q回值类型ؓvoid的方法,return关键字单独作为完整的语句使用Q?/p>
然而,对于q回cd为void的方法,return;语句是可选的。如果省略这条语句,隐含表明Ҏ(gu)的最后一行有一个return;语句。即Q下面两个版本的doSomethingҎ(gu)是等LQ?/p>
?/p>
另一斚wQ对于返回类型非void的方法体Q必至包括一条明的return语句。这U情况下Qreturn关键字后面必跟随一个求值类型和Ҏ(gu)声明的返回类型一致的表达式。例如,如果Ҏ(gu)定义为具有intq回cdQ那么下列Q何一Ureturn语句都可以接受:
{等。另一个例子,如果Ҏ(gu)定义为具有booleanq回cdQ那么下列Q何一Ureturn语句都可以接受:
Ҏ(gu)体可以包含不只一条return语句。但好的~程习惯是一个方法中只在最末尾包含一条return语句。再看一下前面讨的isHornorsStudentҎ(gu)Q这个方法有两条return语句Q?/p>
使用局部boolean变量result来重写这个方法,该变量捕hl返回的true/falsel果。在Ҏ(gu)最末尾用一条return语句q回result变量的|
如上qC码所C,׃已经lresult变量赋予初值falseQ因此在else子句中明地l它赋值false是不必要的,可以像下面这L化isHornorsStudentҎ(gu)Q?/p>
但是有一U情况下多个return语句是可以接受的Q方法需要执行一pd操作Q在q个q程中,M一步失败意味着整个Ҏ(gu)p|?/b>下面的伪代码阐明了这U情况:
注意QJava~译器会校验是否Ҏ(gu)的所有逻辑路径都返回类型正的l果。例如,下面的方法会产生~译错误Q因为只有在if试成功时才能到达return语句Q如果if试p|Q则return语句被绕q:
q种情况下将产生下面q个~译错误Q?/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 />
了解。其实应该说是自׃Z解了Q但是找实习ӞW试才知道,面对q些基本得不能再基本的题目,
自己却答不出来,猛然发觉Q原来是自己Ҏ(gu)p没有理解透彻Q!Q?/font>
一、先用自q语言概括一下“多态性”吧Q?/font>
多态性是指在l承层次或者接口与实现cdơ上Q如果子c覆盖了父类的方法,或者说实现cdC接口
定义的方法,那么可以通过一般化的用父类或者接口来调用该方法,JVM在运行期能够Ҏ(gu)实际传递的?/font>
cd象引用,来调用相应的Ҏ(gu)Q生正的行ؓ。达到“同一函数Q不同行为”的效果。java的多态?/font>
是通过动态绑定实现的?/font>
例如Q类A中有一aa()Ҏ(gu)Q类B和类Cl承cAQƈ覆盖了类A的aa()Ҏ(gu)Q这时在E序中,如果用类A的引
用a调用aaҎ(gu)Qa.aa()QJVM会根据动态绑定机ӞҎ(gu)a的实际类型调用相应方法;如果a=new B(),?/font>
么调的是B的方法;如果a=new C(),那么调的是C的方法?/font>
二、上q概念包含几个关键点Q?br />首先是多态性的前提Q?br />1.在承层ơ或者接口与实现cdơ上才有多态性;
2.子类覆盖了父cȝҎ(gu)Q或者实现类实现了接口定义的Ҏ(gu)Q才有多态性;
其次是多态性的表现Q?br />1.可以通过一般化的用父类或者接口来调用某一Ҏ(gu)QJVM在运行期能够Ҏ(gu)实际传递的子类对象引用Q?/font>
来调用相应的Ҏ(gu)Q从而生正的行ؓ?/font>
最后是多态性的实现原理Q?br />1.java多态性是通过函数的动态绑定机制实现的Q?/font>
至于动态绑定的机制是什么,L下一文章“java动态绑定机制”?/font>
有待查看的资料:
1.C++的书Q(java的书中只对多态性进行阐qͼ但是很少对多态性的概念作出解释Q好像C++中的书中?/font>
概念Q?/font>
2.《core java?/font>
参考资料:
1.单的理解 cȝl承 ?多态?br />
http://bbs.nou.com.cn/thread-93841-1-1.html
2.JAVA中动态性实例解?br />
http://dev.csdn.net/article/12/12550.shtm
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 包;