實(shí)現(xiàn)一個(gè)棧,使其push,pop,min(取得棧中的最小元素)均為O(1)
我的解













































posted @ 2007-07-18 20:57 Job Hu 閱讀(902) | 評(píng)論 (0) | 編輯 收藏
隨筆 - 8, 文章 - 0, 評(píng)論 - 6, 引用 - 0
|
實(shí)現(xiàn)一個(gè)棧,使其push,pop,min(取得棧中的最小元素)均為O(1)
實(shí)現(xiàn)一個(gè)棧,使其push,pop,min(取得棧中的最小元素)均為O(1)
我的解 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() posted @ 2007-07-18 20:57 Job Hu 閱讀(902) | 評(píng)論 (0) | 編輯 收藏 二叉排序樹變?yōu)殡p向鏈表把一個(gè)二叉排序樹(也許不叫這個(gè))變?yōu)檫f增的雙向鏈表,不能夠生成額外的結(jié)點(diǎn). 3=4=5=6=7=8=9 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() posted @ 2007-07-18 20:37 Job Hu 閱讀(648) | 評(píng)論 (0) | 編輯 收藏 Byte in Java![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() b == c 127 == 0x7F b == c 128 == 0x80 -128 == c 128 == (c&0xFF) posted @ 2007-07-17 23:22 Job Hu 閱讀(293) | 評(píng)論 (0) | 編輯 收藏 Java Language Keywords
Here's a list of keywords in the Java programming language.
You cannot
use any of the following as identifiers in your programs. The keywords
const and goto are reserved, even though they are not
currently used.
true , false , and null
might seem like keywords, but they are actually literals; you cannot
use them as identifiers in your programs.
posted @ 2007-07-09 22:38 Job Hu 閱讀(201) | 評(píng)論 (1) | 編輯 收藏 Tomcat筆記(三)
來(lái)看看ContainerBase的start方法:
1
![]() ![]() ![]() 2 ![]() 3 ![]() 4 ![]() ![]() ![]() 5 ![]() 6 ![]() 7 ![]() 8 ![]() 9 ![]() 10 ![]() 11 ![]() 12 ![]() 13 ![]() 14 ![]() 15 ![]() 16 ![]() 17 ![]() 18 ![]() 19 ![]() 20 ![]() 21 ![]() 22 ![]() 23 ![]() 24 ![]() 25 ![]() 26 ![]() 27 ![]() 28 ![]() 29 ![]() 30 ![]() 31 ![]() 32 ![]() 33 ![]() 34 ![]() 35 ![]() 36 ![]() 37 ![]() ![]() ![]() 38 ![]() 39 ![]() 40 ![]() 41 ![]() 42 ![]() 43 ![]() 44 ![]() 45 ![]() 46 ![]() 47 ![]() 48 ![]() 49 ![]() 50 ![]() 51 ![]() 52 ![]() 53 ![]() 54 ![]() 55 ![]() 56 ![]() 所有和cluster、realm相關(guān)都放在最后來(lái)研究了,不管怎么樣先把tomcat如何處理request的整個(gè)過(guò)程串起來(lái)對(duì)現(xiàn)在的我來(lái)說(shuō)是最重要的。另外還有Tomcat中的很多部件都用到了JMX API,即SNMP的Java實(shí)現(xiàn)來(lái)進(jìn)行性能檢測(cè)和管理,這個(gè)也會(huì)放在最后研究。 ContainerBase就看這么多了,下面來(lái)看看StandardEngine這個(gè)類。除去和cluster、realm、JMX相關(guān)的方法后,StanderdEngine剩下的方法就很很少了。 StandardEngine有一個(gè)Service類型的成員。Java doc中指出Service就是由很多共享同一個(gè)Container的Connector組成。一個(gè)Service對(duì)應(yīng)于一個(gè)Container,來(lái)自這個(gè)Service的任何一個(gè)Connector的request都會(huì)由其對(duì)應(yīng)的Container進(jìn)行處理??吹浆F(xiàn)在的感覺(jué)就是Connector對(duì)Container提供request對(duì)象,并接受Container返回的response對(duì)象。在Tomcat中有很多類別都被用來(lái)體現(xiàn)現(xiàn)request或者response,例如org.apache.catalina.connector .Request就是Coyote request的一個(gè)wrapper類,Coyote這個(gè)framework幫助封裝了底層的網(wǎng)絡(luò)復(fù)雜性,向上提供一個(gè)統(tǒng)一的接口。我想tomcat既能夠成為一個(gè)standalone的http、jsp/Servlet服務(wù)器,也能夠同apache http server集成,很可能就是依賴于Coyote提供的統(tǒng)一接口。 在構(gòu)造函數(shù)中會(huì)將StandardEngine這個(gè)Pipeline的最后一個(gè)Valve,即Basic設(shè)置為StandardEngineValve。來(lái)看看StandardEnginValue的invoke方法 1
![]() 2 ![]() ![]() ![]() 3 ![]() 4 ![]() 5 ![]() 6 ![]() ![]() ![]() 7 ![]() 8 ![]() 9 ![]() 10 ![]() 11 ![]() 12 ![]() 13 ![]() 14 ![]() 15 ![]() 16 ![]() 17 ![]() 18 ![]() 可以看出在處理到StandardEngine這個(gè)Pipeline的最后一個(gè)Valve時(shí),會(huì)根據(jù)當(dāng)前request所指定的Host,將當(dāng)前的request和response傳遞給該Host這個(gè)Pipeline的第一個(gè)Valve進(jìn)行處理。 我想Tomcat中的Engine、Host、Context、Wrapper處理request生成response的過(guò)程大概是這樣的: Engine在收到request后在其Pipeline中的每一個(gè)Valve對(duì)request進(jìn)行處理,也可能會(huì)生成response的某些部分,在最后一個(gè)Valve中將request和response傳給下一級(jí)Container即Host的第一個(gè)Valve。Host重復(fù)同樣過(guò)程,繼續(xù)傳遞給Context,Context再傳遞給Wrapper。由于Wrapper代表的是Servlet對(duì)象,因此在Wrapper處所有的處理都結(jié)束了,response對(duì)象生成完畢。當(dāng)然了,如果在某一級(jí)中無(wú)法找到request要求的下一級(jí)對(duì)象,則整個(gè)處理過(guò)程也會(huì)立即結(jié)束。posted @ 2007-05-30 22:58 Job Hu 閱讀(360) | 評(píng)論 (1) | 編輯 收藏 Tomcat筆記(二)ContainerBase對(duì)Pipeline接口的實(shí)現(xiàn)完全依賴于其內(nèi)部的一個(gè)Pipeline類型的成員pipeline(實(shí)現(xiàn)類為StandardPipeline)。 StandardPipeline除實(shí)現(xiàn)Pipeline接口外,也實(shí)現(xiàn)了Lifecycle接口。這個(gè)類的start和stop方法,首先檢查是否已經(jīng)被start或stop,如果是則會(huì)拋出一個(gè)LifecycleException的異常,否則便fire和生命期改變的相關(guān)事件,并調(diào)用其內(nèi)部valve對(duì)象(如果該valve對(duì)象也實(shí)現(xiàn)了Lifecycle接口)的start和stop方法。addValve方法用來(lái)向StandardPipeline中加入Valve對(duì)象,新加入的Value對(duì)象被放在一個(gè)叫做Basic的特殊Valve(就是一個(gè)Pipeline的最后一個(gè)Valve)的前面,如果在添加Valve的時(shí)候該StandardPipeline已經(jīng)處于start狀態(tài),則會(huì)進(jìn)行一些注冊(cè)(調(diào)用apache commons庫(kù)的一個(gè)類,完全沒(méi)有看懂這個(gè)地方是什么作用>_<) posted @ 2007-05-28 07:39 Job Hu 閱讀(307) | 評(píng)論 (0) | 編輯 收藏 一個(gè)簡(jiǎn)化的java線程池示例
//以前寫在blogger上的一篇老文了
曾經(jīng)很好奇線程池是怎么實(shí)現(xiàn)的,.net中有現(xiàn)成的線程池可以使用,但是java中沒(méi)有。還有就是Servlet的service方法是怎么樣為每一個(gè) Request在不同的線程中獨(dú)立服務(wù)的,由于Servlet接口沒(méi)有繼承自Runnable接口,因此無(wú)法直接由一個(gè)Servlet對(duì)象生成多個(gè)線程。后來(lái)在網(wǎng)上找到了一個(gè)java版本的線程池的例子(http://www.informit.com/articles/article.asp?p= 30483&seqNum=1&rl=1)在該例子的基礎(chǔ)上簡(jiǎn)化得到了下面這個(gè)版本的java線程池,記錄在這里。 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() posted @ 2007-05-15 12:53 Job Hu 閱讀(906) | 評(píng)論 (3) | 編輯 收藏 Tomcat筆記(一)包org.apache.catalina主要由接口組成。我們可以把這些接口分為幾個(gè)大類。 第一類接口主要是對(duì)web application及其各個(gè)組成部分的抽象。這些接口以Container為父接口,分別為Context,Engine,Host,Wrapper。 Engine代表的是整個(gè)Catalina Servlet引擎。 Host代表的是Catalina Servlet引擎中的一個(gè)虛擬主機(jī)。 Context Wrapper代表的是某一個(gè)具體的servlet 下面我從Container的抽象實(shí)現(xiàn)ContainerBase來(lái)切入Container,Context,Engine,Host,Wrapper的實(shí)現(xiàn)。 由于Container接口是web application中各部分的抽象的公共部分,因此其實(shí)現(xiàn)類ContrainerBase是一個(gè)抽象類。對(duì)于Container接口的各個(gè)子接口的實(shí)現(xiàn)類,則通過(guò)繼承ContainerBase來(lái)實(shí)現(xiàn)接口Container接口。例如Engine接口繼承Container接口,Engine的實(shí)現(xiàn)類StandardEnginer繼承ContainerBase類。 ContainerBase實(shí)現(xiàn)得接口有Container,Lifecycle,MBeanRegistration, Pipeline,Serializable。其中Lifecycle,Pipeline和Container屬于同一個(gè)包。 Lifecycle接口定義了一個(gè)具有生命期屬性的組件所必須提供的方法:start(啟動(dòng)一個(gè)組件),stop(停止一個(gè)組件);除此之外該接口還定義了與具有生命期屬性的組件的Listener相關(guān)的3個(gè)方法,用來(lái)添加、刪除、查找對(duì)該組件的生命期階段變化感興趣的Listener。 Pipeline在Tomcat中是一個(gè)或者多個(gè)Value的組合,Value用來(lái)對(duì)Request進(jìn)行處理,生成Response或者將Request和Response傳給下一個(gè)Value進(jìn)行處理。Tomcat并沒(méi)有象通常一樣將Pipeline和Value作為同一個(gè)接口,即使用Composite模式,而是Pipeline和Value分別作為集合和元素,Pipeline只能加入Value而不能加入Pipeline,Value則不能包含任何子Value。 ContainerBase對(duì)lifecycle接口的實(shí)現(xiàn)分為兩類,addLifecycleListener、findLifecycleListener、removeLifecycleListener都是通過(guò)調(diào)用ContainerBase的一個(gè)LifecycleSupport成員實(shí)現(xiàn);start和stop方法則為ContainerBase自己實(shí)現(xiàn)。我一開始以為L(zhǎng)ifecycleSupport也實(shí)現(xiàn)了lifecycle接口,但實(shí)際上并不是這樣,原因是start和stop方法與具體的組件密切相關(guān)。此外LifecycleSupport中還包括一個(gè)名為fireLifecycleEvent的方法,該方法遍歷所有的LifeCycleListener,并觸發(fā)Lifecycle事件??傮w上看LifecycleSupport實(shí)現(xiàn)了所有實(shí)現(xiàn)Lifecycle接口的組件的公共部分,維護(hù)一個(gè)LifecycleListener的數(shù)組,提供了添加、修改、獲取LifecycleListener和觸發(fā)各個(gè)Listener的方法。一個(gè)有趣的情況是,LifecycleSupport是一個(gè)final類,無(wú)法被繼承,利用java的語(yǔ)言性質(zhì)強(qiáng)制執(zhí)行了面向?qū)ο笾薪M合優(yōu)于繼承的思想。 posted @ 2007-04-25 22:21 Job Hu 閱讀(353) | 評(píng)論 (1) | 編輯 收藏 |
|||||||||||||||||||||||||||||||||||||||||||||||||||