企業(yè)面試題總匯_第1頁(yè)
企業(yè)面試題總匯_第2頁(yè)
企業(yè)面試題總匯_第3頁(yè)
企業(yè)面試題總匯_第4頁(yè)
企業(yè)面試題總匯_第5頁(yè)
已閱讀5頁(yè),還剩58頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

企業(yè)面試題總匯請(qǐng)列舉至少3個(gè)JDK安裝目錄下的可執(zhí)行程序(如:javac),并列舉幾個(gè)常用的命令行參數(shù)javac將Java源代碼換成字節(jié)代javac<選項(xiàng)><源文件>可能的選項(xiàng)包括:-g生成所有調(diào)試信息-g:none生成無(wú)調(diào)試信息-g:{lines,vars,source}生成只有部分調(diào)試信息-O優(yōu)化;可能妨礙調(diào)試或者增大類文件-nowarn生成無(wú)警告-verbose輸出關(guān)于編譯器正在做的信息-deprecation輸出使用了不鼓勵(lì)使用的API的源程序位置-classpath<路徑>指定用戶類文件的位置-sourcepath<路徑>指定輸入源文件的位置-bootclasspath<路徑>覆蓋自舉類文件的位置-extdirs<目錄(多個(gè))>覆蓋安裝的擴(kuò)展類的位置-d<目錄>指定輸出類文件的位置用法:2.jar打架包,查看架包jar{ctxu}[vfm0M][jar-文件][manifest-文件][-C目錄](méi)文件名...選項(xiàng):-c創(chuàng)建新的存檔-t列出存檔內(nèi)容的列表-x展開(kāi)存檔中的命名的(或所有的)文件-u更新已存在的存檔-v生成詳細(xì)輸出到標(biāo)準(zhǔn)輸出上-f指定存檔文件名-m包含來(lái)自標(biāo)明文件的標(biāo)明信息-0只存儲(chǔ)方式;未用ZIP壓縮格式-M不產(chǎn)生所有項(xiàng)的清單(manifest)文件-i為指定的jar文件產(chǎn)生索引信息用法:3.javadoc:根據(jù)Java源代碼及其說(shuō)明語(yǔ)句生成的HTML文檔javadoc[options][packagenames][sourcefiles][classnames][@files]-overview<file>讀取HTML格式的概述文檔-public僅顯示public類和成員-protected顯示protected/public類和成員(缺?。?package顯示package/protected/public類和成員-private顯示所有類和成員-help顯示命令行選項(xiàng)-doclet<class>通過(guò)候選doclet生成輸出-docletpath<path>指定doclet類文件的查找位置-sourcepath<pathlist>指定源文件的查找位置-classpath<pathlist>指定用戶類文件的查找位置用法:4.javah:產(chǎn)生可以調(diào)用Java過(guò)程的C過(guò)程,或建立能被Java程序調(diào)用的C過(guò)程的頭文件javah[options]<classes>其中[options]包括:-help打印該幫助信息-classpath<path>類的加載路徑-bootclasspath<path>自舉類的加載路徑-d<dir>輸出目錄-o<file>輸出文件(僅能使用-d或-o之一)-jni生成JNI風(fēng)格的頭文件(缺?。?old生成JDK1.0風(fēng)格的頭文件-stubs生成stubs文件-version打印版本信息-verbose輸出有關(guān)本命令所做工作的信息-force始終寫輸出文件用法:請(qǐng)分析命題:“Java采用自動(dòng)垃圾回收技術(shù)(GC),因此不會(huì)出現(xiàn)內(nèi)存泄露”對(duì)象的建立和放置都是在內(nèi)存堆棧上面進(jìn)行的。程序或者其他的對(duì)象可以鎖定一塊堆棧地址來(lái)進(jìn)行其他對(duì)象的引用。當(dāng)一個(gè)對(duì)象沒(méi)有任何引用的時(shí)候,Java的自動(dòng)垃圾回收機(jī)制就發(fā)揮作用,自動(dòng)刪除這個(gè)對(duì)象所占用的空間,釋放內(nèi)存以避免內(nèi)存泄漏。但是內(nèi)存泄漏并不是就此而完全避免了,當(dāng)程序員疏忽大意地忘記解除一個(gè)對(duì)象不應(yīng)該有的引用的時(shí)候,內(nèi)存泄漏仍然不可避免,不過(guò)發(fā)生的幾率要比不啟用垃圾回收機(jī)制的C++程序少很多。但是總體來(lái)講,自動(dòng)垃圾回收機(jī)制要安全和簡(jiǎn)單許多。請(qǐng)簡(jiǎn)單描述單子模式(單例模式)的各種不同實(shí)現(xiàn)方式,及各自優(yōu)缺點(diǎn)。請(qǐng)列舉至少2中其他的設(shè)計(jì)模式及應(yīng)用場(chǎng)景/*單例設(shè)計(jì)模式主要有2種實(shí)現(xiàn)方式:懶漢式、餓漢式。

他們分別有如下實(shí)現(xiàn):

餓漢式:

//餓漢式單例類.在類初始化時(shí),已經(jīng)自行實(shí)例化

*/

public

class

Singleton1

{

//私有的默認(rèn)構(gòu)造子

private

Singleton1()

{}

//已經(jīng)自行實(shí)例化

private

static

final

Singleton1

single

=

new

Singleton1();

//靜態(tài)工廠方法

public

static

Singleton1

getInstance()

{

return

single;

}

}

懶漢式:

//懶漢式單例類.在第一次調(diào)用的時(shí)候?qū)嵗?/p>

public

class

Singleton2

{

//私有的默認(rèn)構(gòu)造子

private

Singleton2()

{}

//注意,這里沒(méi)有final

private

static

Singleton2

single=null;

//靜態(tài)工廠方法

public

synchronized

static

Singleton2

getInstance()

{

if

(single

==

null)

{

single

=

new

Singleton2();

}

return

single;

}

}

/*其他設(shè)計(jì)模式:

1.適配器模式

應(yīng)用場(chǎng)景:比如說(shuō)在朋友聚會(huì)上遇到一個(gè)德國(guó)人sarsh,可以我不會(huì)德語(yǔ),她不會(huì)中文,我只好求助于我的朋友mary了,他作為我和sarsh之間的adapt,讓我和sarsh可以交流了。

2.裝飾模式

應(yīng)用場(chǎng)景:想要自己做禮物送給朋友,拿出去年在華山頂上的照片,在背面寫上“最好的禮物”再到街上禮品店買個(gè)相框,在找隔壁學(xué)美術(shù)的朋友設(shè)計(jì)一個(gè)漂亮的盒子裝起來(lái),我們都是Decorator。*/

4、輸出結(jié)果public

static

void

main(String[]

args)throws

Exception{

String

str

=

"中國(guó)";

System.out.println(str.getBytes("UTF-8").length);

System.out.println(str.getBytes("GBK").length);

System.out.println(str.getBytes("ISO-8859-1").length);

System.out.println(new

String(str.getBytes("ISO-8859-1"),("ISO-8859-1"));

System.out.println(new

String(str.getBytes("UTF-8"),("UTF-8"));

System.out.println(new

String(str.getBytes("GBK"),("GBK"));

}

輸出結(jié)果:642??中國(guó)中國(guó)使用二分查找法查找字符串?dāng)?shù)組{"a","b","c","d","e","f","g","h"}中"g"元素public

class

Query4Half

{

static

int

bsearch(

String[]

a,

String

v

)

{

int

l,

r;

l

=

0;

r

=

a.length-1;

while

(

l

<=

r

)

{

int

m

=

(l+r)/2;

if

(

a[m].compareTo(v)==0

)

return

m;

else

if

(

a[m].compareTo(v)>0

)

r

=

m-1;

else

if

(

a[m].compareTo(v)<0

)

l

=

m+1;

}

return

-1;

}

public

static

void

main(String[]

args)

{

String

str[]

=

{"a","b","c","d","e","f","g","h"};

int

bsearch

=

bsearch(str,

"g");

System.out.println(bsearch);

}

請(qǐng)?jiān)敿?xì)闡述Spring事務(wù)機(jī)制的實(shí)現(xiàn)原理?Spring的事務(wù)管理機(jī)制實(shí)現(xiàn)的原理,就是通過(guò)AOP,使用動(dòng)態(tài)代理對(duì)所有需要事務(wù)管理的Bean進(jìn)行加載,并根據(jù)配置在invoke方法中對(duì)當(dāng)前調(diào)用的方法名進(jìn)行判定,并在method.invoke方法前后為其加上合適的事務(wù)管理代碼,這樣就實(shí)現(xiàn)了Spring式的事務(wù)管理。Spring聲明式事務(wù)的優(yōu)點(diǎn)執(zhí)行情況提交或者回滾事務(wù)。聲明式事務(wù)最大的優(yōu)點(diǎn)就是不需要通過(guò)編程的方式管理事務(wù),這樣就不需要在業(yè)務(wù)邏輯代碼中摻雜事務(wù)管理的代碼,只需在配置文件中做相關(guān)的事務(wù)規(guī)則聲明(或通過(guò)等價(jià)的基于標(biāo)注的方式),便可以將事務(wù)規(guī)則應(yīng)用到業(yè)務(wù)邏輯中。因?yàn)槭聞?wù)管理本身就是一個(gè)典型的橫切邏輯,正是AOP的用武之地。Spring開(kāi)發(fā)團(tuán)隊(duì)也意識(shí)到了這一點(diǎn),為聲明式事務(wù)提供了簡(jiǎn)單而強(qiáng)大的支持。聲明式事務(wù)管理曾經(jīng)是EJB引以為傲的一個(gè)亮點(diǎn),如今Spring讓POJO在事務(wù)管理方面也擁有了和EJB一樣的待遇,讓開(kāi)發(fā)人員在EJB容器之外也用上了強(qiáng)大的聲明式事務(wù)管理功能,這主要得益于Spring依賴注入容器和SpringAOP的支持。依賴注入容器為聲明式事務(wù)管理提供了基礎(chǔ)設(shè)施,使得Bean對(duì)于Spring框架而言是可管理的;而SpringAOP則是聲明式事務(wù)管理的直接實(shí)現(xiàn)者,這一點(diǎn)通過(guò)清單8可以看出來(lái)。通常情況下,筆者強(qiáng)烈建議在開(kāi)發(fā)中使用聲明式事務(wù),不僅因?yàn)槠浜?jiǎn)單,更主要是因?yàn)檫@樣使得純業(yè)務(wù)代碼不被污染,極大方便后期的代碼維護(hù)。和編程式事務(wù)相比,聲明式事務(wù)唯一不足地方是,后者的最細(xì)粒度只能作用到方法級(jí)別,無(wú)法做到像編程式事務(wù)那樣可以作用到代碼塊級(jí)別。但是即便有這樣的需求,也存在很多變通的方法,比如,可以將需要進(jìn)行事務(wù)管理的代碼塊獨(dú)立為方法等等。Struts采用了什么設(shè)計(jì)模式?并詳細(xì)說(shuō)明各個(gè)組成部分?struts采用了MVC設(shè)計(jì)模式,嚴(yán)格按照mvc設(shè)計(jì)模式進(jìn)行設(shè)計(jì),實(shí)現(xiàn)解耦和,struts2經(jīng)過(guò)前端控制器來(lái)轉(zhuǎn)發(fā)請(qǐng)求,控制請(qǐng)求流向(也就是我們的控制層)。然后Struts經(jīng)過(guò)模型層去處理數(shù)據(jù),把處理結(jié)果再交給控制層進(jìn)行視圖解析。這樣一個(gè)過(guò)程嚴(yán)格按照MVC設(shè)計(jì)模式。請(qǐng)簡(jiǎn)要說(shuō)明WebService的組成部分?以及各個(gè)部分使用的協(xié)議?WebService框架核心是基于簡(jiǎn)單對(duì)象訪問(wèn)協(xié)議(SimpleObjectAccessProtocol,SOAP)、Web服務(wù)描述語(yǔ)言(WebServiceDescriptionLanguage,WSDL)以及通用描述、發(fā)現(xiàn)和集成(UniversalDescriptionDiscoveryandIntegration,UDDI)。web服務(wù)中三種發(fā)送接受協(xié)議SOAP/HTTPGET/HTTPPOST在web服務(wù)中,有三種可供選擇的發(fā)送和接受信息的協(xié)議:SOAP,HTTPGET,HTTPPOST,但是SOAP支持的數(shù)據(jù)類型更為廣泛SOAP=RPC+HTTP+XMLSOAP簡(jiǎn)單的理解,就是這樣的一個(gè)開(kāi)放協(xié)議SOAP=RPC+HTTP+XML:采用HTTP作為底層通訊協(xié)議;RPC作為一致性的調(diào)用途徑,XML作為數(shù)據(jù)傳送的格式,允許服務(wù)提供者和服務(wù)客戶經(jīng)過(guò)防火墻在INTERNET進(jìn)行通訊交互。10、請(qǐng)用Java代碼實(shí)現(xiàn)一個(gè)鏈表結(jié)構(gòu)public

class

MyList<AnyType>

{

private

class

Node<AnyType>{

public

Node<AnyType>

pre;

public

Node<AnyType>

next;

public

AnyType

data;

public

Node(AnyType

d,

Node<AnyType>p,

Node<AnyType>

n){}

public

Node(){}

}

private

int

theSize;

private

Node<AnyType>

Header;

private

Node<AnyType>

Tail;

public

MyList(){}

public

void

add(AnyType

item){}

public

boolean

isEmpty(){}

public

int

size(){}

public

AnyType

get(

int

idx){}

public

void

print(){}

}

/*Node<AnyType>類定義了雙向鏈表中節(jié)點(diǎn)的結(jié)構(gòu),它是一個(gè)私有類,而其屬性和構(gòu)造函數(shù)都是公有的,這樣,其父類可以直接訪問(wèn)其屬性,而外部類根本不知道Node類的存在。Data是節(jié)點(diǎn)中的數(shù)據(jù)與,pre指向前一個(gè)Node節(jié)點(diǎn),next指向后一個(gè)Node節(jié)點(diǎn)。其構(gòu)造函數(shù)的實(shí)現(xiàn)如下,不解釋:

View

Code*/

public

Node(AnyType

d,

Node<AnyType>p,

Node<AnyType>

n){

this.data

=

d;

this.pre

=

p;

this.next

=

n;

}

public

Node(){

this.data

=

null;

this.pre

=

null;

this.next

=

null;

}

/*下面我們看一下鏈表的構(gòu)造函數(shù)實(shí)現(xiàn):

View

Code*/

public

MyList(){

theSize

=

0;

Header

=

new

Node<AnyType>(null,null,null);

Tail

=

new

Node<AnyType>(null,Header,null);

Header.next

=

Tail;

}

/*我們構(gòu)造了一個(gè)帶有頭、尾節(jié)點(diǎn)的雙向鏈表,頭節(jié)點(diǎn)的Next指向尾節(jié)點(diǎn),為節(jié)點(diǎn)的pre指向頭節(jié)點(diǎn)。鏈表長(zhǎng)度起始為0。

繼續(xù)貼上鏈表類其它方法的實(shí)現(xiàn),不解釋了,應(yīng)該比較清楚:*/

//View

Code

public

void

add(AnyType

item){

Node<AnyType>

aNode

=

new

Node<AnyType>(item,null,null);

Tail.pre.next

=

aNode;

aNode.pre

=

Tail.pre;

aNode.next

=

Tail;

Tail.pre

=

aNode;

theSize++;

}

public

boolean

isEmpty(){

return

(

theSize

==

0);

}

public

int

size(){

return

theSize;

}

public

AnyType

get(

int

idx){

if(idx

>

theSize-1

||

idx

<

0)

throw

new

IndexOutOfBoundsException();

Node<AnyType>

current

=

new

Node<AnyType>(null,Header,null);

for(int

i

=

0;

i<idx;

i++)

current

=

current.next;

return

current.data;

}

public

void

print(){

Node<AnyType>

current

=

Header.next;

while(current.next

!=

null){

//如果AnyType是你自己定義

//的數(shù)據(jù)類型,那么請(qǐng)務(wù)必提供

//一個(gè)toString方法,要么就不

//要在鏈表里實(shí)現(xiàn)print方法。

System.out.println(current.data.toString());

current

=

current.next;

}

}

11、Object類(或子類)的finalize()方法在什么情況下被調(diào)用?當(dāng)某個(gè)對(duì)象被系統(tǒng)收集為無(wú)用信息的時(shí)候,finalize()將被自動(dòng)調(diào)用,但是jvm不保證finalize()一定被調(diào)用,也就是說(shuō),finalize()的調(diào)用是不確定的...12、Servlet中forward()與redirect()的區(qū)別是什么?redirect()會(huì)丟失request的所有信息它屬于頁(yè)面級(jí)的重定向,僅僅讓你的瀏覽器重新訪問(wèn)一個(gè)新的url,作為瀏覽者,能很明顯的看到瀏覽器url地址的變化,這和點(diǎn)擊了一個(gè)普通的超鏈接的后果是一樣的。而RequestDispatcher的forward()方法,是轉(zhuǎn)發(fā),需要request和response最為參數(shù),就是將用戶的請(qǐng)求,連同請(qǐng)求信息等內(nèi)容,一起轉(zhuǎn)發(fā)到服務(wù)器的另外一個(gè)servlet去處理,它不會(huì)丟失request信息。這一過(guò)程是服務(wù)器內(nèi)部完成的,作為訪問(wèn)者,是感覺(jué)不到了,或者說(shuō)是透明的,因此訪客瀏覽器的url是不會(huì)發(fā)生變化的。forward是轉(zhuǎn)發(fā),redirect是跳轉(zhuǎn)。相同點(diǎn)都是為了兩個(gè)組件之間的相互調(diào)用。forward的運(yùn)行原理是服務(wù)器端內(nèi)部的調(diào)用,所以它不需要通過(guò)瀏覽器來(lái)請(qǐng)求,所url地址不會(huì)改變,request的作用范圍也沒(méi)有中斷過(guò),它的作用域仍然有效。而redirect是重定向,是服務(wù)器發(fā)送消息告訴瀏覽器,讓瀏覽器重新向新的地址請(qǐng)求,所以,url地址是會(huì)改變的,由于重新請(qǐng)求了,因而request也中斷了,重新請(qǐng)求了,它的作用范圍也失效了,放在request里面的信息也隨之而清空了。13、請(qǐng)列出你所了解的若干個(gè)不同類型的runtimeexceptionNullPointerException-空指針引用異常ClassCastException-類型強(qiáng)制轉(zhuǎn)換異常。IllegalArgumentException-傳遞非法參數(shù)異常。ArithmeticException-算術(shù)運(yùn)算異常ArrayStoreException-向數(shù)組中存放與聲明類型不兼容對(duì)象異常IndexOutOfBoundsException-下標(biāo)越界異常NegativeArraySizeException-創(chuàng)建一個(gè)大小為負(fù)數(shù)的數(shù)組錯(cuò)誤異常NumberFormatException-數(shù)字格式異常SecurityException-安全異常UnsupportedOperationException-不支持的操作異常14、請(qǐng)說(shuō)明數(shù)據(jù)庫(kù)主鍵、外鍵的作用。以及獨(dú)立主鍵的好處及壞處SQL的主鍵和外鍵的作用:外鍵取值規(guī)則:空值或參照的主鍵值。(1)插入非空值時(shí),如果主鍵表中沒(méi)有這個(gè)值,則不能插入。(2)更新時(shí),不能改為主鍵表中沒(méi)有的值。(3)刪除主鍵表記錄時(shí),你可以在建外鍵時(shí)選定外鍵記錄一起級(jí)聯(lián)刪除還是拒絕刪除。(4)更新主鍵記錄時(shí),同樣有級(jí)聯(lián)更新和拒絕執(zhí)行的選擇。簡(jiǎn)而言之,SQL的主鍵和外鍵就是起約束作用。15、簡(jiǎn)述什么是事物?事物存在哪些屬性?數(shù)據(jù)庫(kù)事務(wù)是指作為單個(gè)邏輯工作單元執(zhí)行的一系列操作。屬性:ACID1、一致性:將事務(wù)中所做的操作捆綁成一個(gè)原子單元,即對(duì)于事務(wù)所進(jìn)行的數(shù)據(jù)修改等操作,要么全部執(zhí)行,要么全部不執(zhí)行。2、原子性:事務(wù)在完成時(shí),必須使所有的數(shù)據(jù)都保持一致?tīng)顟B(tài),而且在相關(guān)數(shù)據(jù)中,所有規(guī)則都必須應(yīng)用于事務(wù)的修改,以保持所有數(shù)據(jù)的完整性。事務(wù)結(jié)束時(shí),所有的內(nèi)部數(shù)據(jù)結(jié)構(gòu)都應(yīng)該是正確的。3、隔離性:由并發(fā)事務(wù)所做的修改必須與任何其他事務(wù)所做的修改相隔離。事務(wù)查看數(shù)據(jù)時(shí)數(shù)據(jù)所處的狀態(tài),要么是被另一并發(fā)事務(wù)修改之前的狀態(tài),要么是被另一并發(fā)事務(wù)修改之后的狀態(tài),即事務(wù)不會(huì)查看由另一個(gè)并發(fā)事務(wù)正在修改的數(shù)據(jù)。這種隔離方式也叫可串行性。4、持久性:事務(wù)完成之后,它對(duì)系統(tǒng)的影響是永久的,即使出現(xiàn)系統(tǒng)故障也是如此。16、如何寫出高性能的SQL語(yǔ)句?(1)整合簡(jiǎn)單,無(wú)關(guān)聯(lián)數(shù)據(jù)庫(kù)訪問(wèn):如果你有幾個(gè)簡(jiǎn)單數(shù)據(jù)庫(kù)查詢語(yǔ)句,你可以把它們整合到個(gè)查詢中(即使它們的間沒(méi)有關(guān)系)(2)刪除重復(fù)記錄:最高效刪除重復(fù)記錄思路方法(使用了ROWID)例子:DELETEFROMEMPEWHEREE.ROWID>(SELECTMIN(X.ROWID)FROMEMPXWHEREX.EMP_NO=E.EMP_NO);(3)用TRUNCATE替代DELETE:當(dāng)刪除表中記錄時(shí),在通常情況下,回滾段(rollbacksegments)用來(lái)存放可以被恢復(fù)信息.如果你沒(méi)有COMMIT事務(wù),ORACLE會(huì)將數(shù)據(jù)恢復(fù)到刪除的前狀態(tài)(準(zhǔn)確地說(shuō)是恢復(fù)到執(zhí)行刪除命令的前狀況)而當(dāng)運(yùn)用TRUNCATE時(shí),回滾段不再存放任何可被恢復(fù)信息.當(dāng)命令運(yùn)行后,數(shù)據(jù)不能被恢復(fù).因此很少資源被,執(zhí)行時(shí)間也會(huì)很短.(譯者按:TRUNCATE只在刪除全表適用,TRUNCATE是DDL不是DML)(4)選擇最有效率表名順序(只在基于規(guī)則優(yōu)化器中有效):ORACLE解析器按照從右到左順序處理FROM子句中表名FROM子句中寫在最后表(基礎(chǔ)表drivingtable)將被最先處理在FROM子句中包含多個(gè)表情況下,你必須選擇記錄條數(shù)最少表作為基礎(chǔ)表如果有3個(gè)以上表連接查詢,那就需要選擇交叉表(ersectiontable)作為基礎(chǔ)表,交叉表是指那個(gè)被其它表所引用表.(5)WHERE子句中連接順序.:ORACLE采用自下而上順序解析WHERE子句,根據(jù)這個(gè)原理,表的間連接必須寫在其它WHERE條件的前,那些可以過(guò)濾掉最大數(shù)量記錄條件必須寫在WHERE子句末尾.(6)SELECT子句中避免使用'*':ORACLE在解析過(guò)程中,會(huì)將'*'依次轉(zhuǎn)換成所有列名,這個(gè)工作是通過(guò)查詢數(shù)據(jù)字典完成,這意味著將耗費(fèi)更多時(shí)間(7)減少訪問(wèn)數(shù)據(jù)庫(kù)次數(shù):ORACLE在內(nèi)部執(zhí)行了許多工作:解析SQL語(yǔ)句,估算索引利用率,綁定變量,讀數(shù)據(jù)塊等;(8)在SQL*Plus,SQL*Forms和Pro*C中重新設(shè)置ARRAYSIZE參數(shù),可以增加每次數(shù)據(jù)庫(kù)訪問(wèn)檢索數(shù)據(jù)量,建議值為200(9)使用DECODE來(lái)減少處理時(shí)間:使用DECODE可以避免重復(fù)掃瞄相同記錄或重復(fù)連接相同表.(11)用Where子句替換HAVING子句;17、列舉JSP的內(nèi)置對(duì)象,同一應(yīng)用中頁(yè)面有哪些方法?九大內(nèi)置對(duì)象:1.輸出輸入對(duì)象:request對(duì)象、response對(duì)象、out對(duì)象2.通信控制對(duì)象:pageContext對(duì)象、session對(duì)象、application對(duì)象3.Servlet對(duì)象:page對(duì)象、config對(duì)象4.錯(cuò)誤處理對(duì)象:exception對(duì)象①、直接在URL請(qǐng)求后添加如:<ahref="thexuan.jsp?action=transparams&detail=directe">直接傳遞參數(shù)</a>特別的在使用response.sendRedirect做頁(yè)面轉(zhuǎn)向的時(shí)候,也可以用如下代碼:response.sendRedirect("thexuan.jsp?action=transparams&detail=directe"),可用request.getParameter(name)取得參數(shù) ②、jsp:param它可以實(shí)現(xiàn)主頁(yè)面向包含頁(yè)面?zhèn)鬟f參數(shù),如下:<

jsp:include

page="Relative

URL">

<

jsp:param

name="param

name"

value="paramvalue"

/>

<

/jsp:include>

還可以實(shí)現(xiàn)在使用jsp:forward動(dòng)作做頁(yè)面跳轉(zhuǎn)時(shí)傳遞參數(shù),如下:<

jsp:forward

page="Relative

URL">

<

jsp:param

name="paramname"

value="paramvalue"

/>

<

/jsp:forward>

通過(guò)這種方式和一般的表單參數(shù)一樣的,也可以通過(guò)request.getParameter(name)取得參數(shù)3、設(shè)置session和request通過(guò)顯示的把參數(shù)放置到session和request中,以達(dá)到傳遞參數(shù)的目的session.setAttribute(name,value);request.setAttribute(name,value)取參數(shù):value=(valueclassName)session.getAttribute(name);value=(valueclassName)request.getAttribute(name);大家肯定已經(jīng)注意到了,在取參數(shù)的時(shí)候,做了類型轉(zhuǎn)換,這是因?yàn)榉胖迷趕ession和request中的對(duì)象的屬性被看作java.lang.Object類型的了,如果不轉(zhuǎn)換,在將直付給value時(shí)會(huì)報(bào)classcastexception異常。18、JSP如何獲取HTMLFORM中的數(shù)據(jù)?html頁(yè)面的表單<form

action="myjsp.jsp"

method="post">

你要輸入的數(shù)據(jù):<input

type="text"

name="data

">

</form>

在表單中,action動(dòng)作和method合起來(lái)表示把數(shù)據(jù)交給mujsp.jsp頁(yè)面去處理,在jsp頁(yè)面呢,用<%

request.getParmerter("data");%>獲取html頁(yè)面?zhèn)鬟f過(guò)來(lái)的數(shù)據(jù),要注意的是,有時(shí)候連個(gè)頁(yè)面之間的傳遞會(huì)出現(xiàn)中文亂碼現(xiàn)象,解決亂碼的做法是:在jsp頁(yè)面加上<%

request.setCharacterEncoding("GB2312");

request.setCharacterEncoding("GB2312");

%>

這樣就不用擔(dān)心編碼問(wèn)題了另一種:是form表單提交方式獲取表單數(shù)據(jù)。19、JSP中redirect和forward的區(qū)別是什么?(類似12)forward是使用同一個(gè)request,也就是說(shuō)用forward傳遞后可以在頁(yè)面中獲取request中的變量或?qū)傩?。redirect是新建一個(gè)request用新建的request傳遞。比如有三個(gè)jsp文件,第一個(gè)里面有<inputname="name">提交到第二個(gè)頁(yè)面進(jìn)行處理,若想在第三個(gè)頁(yè)面中獲取name的值就要用forward。20、JSP中對(duì)象的傳遞有哪些方法?request,session,application,cookie區(qū)別:page的生命周期最短,依次是request,session,application.他們保存在服務(wù)器端.cookie是保存在客戶端的,用來(lái)解決HTTP無(wú)狀態(tài)問(wèn)題.范圍不同,最小的是page然后request,session,application范圍依次增大.21、Http協(xié)議中返回狀態(tài)200、404、302、301、500、502各式什么含義?200(成功)服務(wù)器已成功處理了請(qǐng)求。通常,這表示服務(wù)器提供了請(qǐng)求的網(wǎng)頁(yè)。301(永久移動(dòng))請(qǐng)求的網(wǎng)頁(yè)已永久移動(dòng)到新位置。服務(wù)器返回此響應(yīng)(對(duì)GET或HEAD請(qǐng)求的響應(yīng))時(shí),會(huì)自動(dòng)將請(qǐng)求者轉(zhuǎn)到新位置。302(臨時(shí)移動(dòng))服務(wù)器目前從不同位置的網(wǎng)頁(yè)響應(yīng)請(qǐng)求,但請(qǐng)求者應(yīng)繼續(xù)使用原有位置來(lái)進(jìn)行以后的請(qǐng)求。404(未找到)服務(wù)器找不到請(qǐng)求的網(wǎng)頁(yè)。500(服務(wù)器內(nèi)部錯(cuò)誤)服務(wù)器遇到錯(cuò)誤,無(wú)法完成請(qǐng)求。502(錯(cuò)誤網(wǎng)關(guān))服務(wù)器作為網(wǎng)關(guān)或代理,從上游服務(wù)器收到無(wú)效響應(yīng)。22、描述Cookie和Session的作用,區(qū)別和各自的應(yīng)用范圍,Session工作原理實(shí)現(xiàn)sessionid的保存和傳輸。是cookie,將http的請(qǐng)求變得有狀態(tài)。session的實(shí)現(xiàn)是web服務(wù)器的事情,不過(guò)很顯然默認(rèn)是利用會(huì)話cookie,也就是存放在瀏覽器內(nèi)存里的那種cookie來(lái)實(shí)現(xiàn)的,在cookie里只是存放了SessionID,然后在服務(wù)器上建立了一張表,對(duì)應(yīng)客戶端的SessionID。這張表是存放在服務(wù)器上的進(jìn)程中的,也就是服務(wù)器的內(nèi)存里,也就是Application里。當(dāng)客戶端請(qǐng)求服務(wù)器的時(shí)候,如果服務(wù)器發(fā)現(xiàn)這是一個(gè)新的請(qǐng)求,就會(huì)分配給他一個(gè)SessionID,也就是在瀏覽器寫入一個(gè)sessionID的cookie。你可以試一下,在你請(qǐng)求過(guò)一次服務(wù)器之后,在服務(wù)器遍歷客戶端所有的cookie,就會(huì)發(fā)現(xiàn)這個(gè)叫做SessionID的cookie。但是,這只是session實(shí)現(xiàn)sessionid狀態(tài)記錄的一種方法,如果客戶端瀏覽器禁用了cookie,很多網(wǎng)站還是可以正常登錄,還是可以正確識(shí)別瀏覽器的身份,這就是通過(guò)url重寫的方式,每次交互都攜帶sessionid的信息。還有一種方式,就是表單重寫,有些服務(wù)器會(huì)在表單中增加隱藏域,來(lái)回傳遞sessionid。所以在了解了這個(gè)session的原理之后我們可以自己來(lái)造一個(gè)自己的session,可以使用cookie,也可以使用url重寫方式,也可以使用表單方式。session的結(jié)束問(wèn)題還有知道了session的原理就會(huì)明白一個(gè)session會(huì)話如何結(jié)束,除非服務(wù)器端可以清除一個(gè)session會(huì)話,客戶端是沒(méi)有能力清除session的,關(guān)閉瀏覽器的時(shí)候并不能夠結(jié)束當(dāng)前的會(huì)話(忽略瀏覽器關(guān)閉事件),在不依賴于cookie的session中最明顯,你可以記下你的sessionID那串字符串,關(guān)閉瀏覽器,打開(kāi),把sessionID自己替換,你就可以恢復(fù)剛才的會(huì)話了。所謂的20分鐘session超時(shí),是服務(wù)器每隔20分鐘對(duì)于不活動(dòng)的session清除而已。還有要指出的是依賴于cookie的session是存放在瀏覽器內(nèi)存中的,所以一個(gè)瀏覽器的進(jìn)程就會(huì)產(chǎn)生一個(gè)session,可以通過(guò)任務(wù)管理器查看進(jìn)程,對(duì)于IE來(lái)說(shuō),只有雙擊桌面上的瀏覽器快捷方式才能新啟動(dòng)一個(gè)進(jìn)程的,當(dāng)然其他類似啟動(dòng)iexplorer.exe的行為也可以到這里你會(huì)發(fā)現(xiàn)在依賴于cookie的session中,是需要瀏覽器的支持的!對(duì)于js的ajax請(qǐng)求,確切的說(shuō)是xmlhttp這個(gè)組件發(fā)送的http請(qǐng)求,雖然是你使用js的代碼自己制造的,但是依然是借助于瀏覽器發(fā)送的,所以可以獲得session。23、數(shù)組String[]str和Stringstr分別怎么獲取長(zhǎng)度?size和length()24、請(qǐng)用JAVA實(shí)現(xiàn)快速排序算法public

class

QuickSort

{

public

static

int

Partition(int

a[],int

p,int

r){

int

x=a[r-1];

int

i=p-1;

int

temp;

for(int

j=p;j<=r-1;j++){

if(a[j-1]<=x){

//

swap(a[j-1],a[i-1]);

i++;

temp=a[j-1];

a[j-1]=a[i-1];

a[i-1]=temp;

}

}

//swap(a[r-1,a[i+1-1]);

temp=a[r-1];

a[r-1]=a[i+1-1];

a[i+1-1]=temp;

return

i+1;

}

public

static

void

QuickSort(int

a[],int

p,int

r){

if(p<r){

int

q=Partition(a,p,r);

QuickSort(a,p,q-1);

QuickSort(a,q+1,r);

}

}

public

static

void

main(String[]

args){

int

a[]={23,53,77,36,84,76,93,13,45,23};

QuickSort(a,1,10);

for

(int

i=1;i<=10;i++)

System.out.println(a[i-1]);

}

}

25、請(qǐng)簡(jiǎn)單闡述一下Socket通訊原理,以及Socket基于TCP和UDP協(xié)議實(shí)現(xiàn)的優(yōu)缺點(diǎn)Socket通信的原理大致分為以下幾個(gè)步驟。服務(wù)器端的步驟如下。(1)建立服務(wù)器端的Socket,開(kāi)始偵聽(tīng)整個(gè)網(wǎng)絡(luò)中的連接請(qǐng)求。(2)當(dāng)檢測(cè)到來(lái)自客戶端的連接請(qǐng)求時(shí),向客戶端發(fā)送收到連接請(qǐng)求的信息,并建立與客戶端之間的連接。(3)當(dāng)完成通信后,服務(wù)器關(guān)閉與客戶端的Socket連接。客戶端的步驟如下。(1)建立客戶端的Socket,確定要連接的服務(wù)器的主機(jī)名和端口。(2)發(fā)送連接請(qǐng)求到服務(wù)器,并等待服務(wù)器的回饋信息。(3)連接成功后,與服務(wù)器進(jìn)行數(shù)據(jù)的交互。(4)數(shù)據(jù)處理完畢后,關(guān)閉自身的Socket連接。TCP:面向連接、傳輸可靠(保證數(shù)據(jù)正確性,保證數(shù)據(jù)順序)、用于傳輸大量數(shù)據(jù)(流模式)、速度慢,建立連接需要開(kāi)銷較多(時(shí)間,系統(tǒng)資源)。UDP:面向非連接、傳輸不可靠、用于傳輸少量數(shù)據(jù)(數(shù)據(jù)包模式)、速度快。26、對(duì)象封裝的原則是什么?封裝原則:隱藏對(duì)象的屬性和實(shí)現(xiàn)細(xì)節(jié),僅對(duì)外公開(kāi)接口,并且控制訪問(wèn)級(jí)別在OOP(面向?qū)ο螅┚幊讨?,用類?lái)實(shí)現(xiàn)上面的要求。用類實(shí)現(xiàn)封裝,用封裝來(lái)實(shí)現(xiàn)高內(nèi)聚,低耦合高聚合是說(shuō)一個(gè)對(duì)象的功能都在內(nèi)部搞定,緊緊地結(jié)合在一起低耦合是說(shuō)對(duì)象之間的依賴要松散,不要牽一發(fā)動(dòng)全身只有這樣,當(dāng)系統(tǒng)規(guī)模擴(kuò)大時(shí),才能比較方便27、請(qǐng)列舉幾種SQL優(yōu)化的方法?1:mysql所在服務(wù)器內(nèi)核優(yōu)化;此優(yōu)化可由系統(tǒng)運(yùn)維人員完成2:mysql配置參數(shù)優(yōu)化(f);此優(yōu)化需進(jìn)行壓力測(cè)試來(lái)進(jìn)行參數(shù)調(diào)整3:sql語(yǔ)句及表優(yōu)化 ①、當(dāng)只要一行數(shù)據(jù)時(shí)使用LIMIT1

②、為搜索字段建索引

③、在Join表的時(shí)候使用相當(dāng)類型的列,并將其索引

④、千萬(wàn)不要ORDERBYRAND()

⑤、避免SELECT*

⑥、永遠(yuǎn)為每張表設(shè)置一個(gè)ID 使用ENUM而不是VARCHAR

⑧、盡可能的使用NOTNULL ⑨、固定長(zhǎng)度的表會(huì)更快

垂直分割

拆分大的DELETE或INSERT語(yǔ)句 越小的列會(huì)越快

28、請(qǐng)列舉幾種重復(fù)提交的方式?F5重復(fù)提交、瀏覽器前進(jìn)和后退按鈕重復(fù)提交、使用frameset框架右鍵的此框架重新載入:1、使用遮罩,讓用戶提交完成之前等待。提交成功后執(zhí)行頁(yè)面重定向(redirect)。轉(zhuǎn)到提交成功信息頁(yè)面;29、描述在MVC架構(gòu)模式下,表單從頁(yè)面提交內(nèi)容,最后到內(nèi)容保存到數(shù)據(jù)持久層中間要做哪些步驟處理?30、序列化的作用,應(yīng)用場(chǎng)景所謂java對(duì)象序列化就是將對(duì)象的狀態(tài)轉(zhuǎn)換成字節(jié)流,以后可以通過(guò)這些值再生成相同狀態(tài)的對(duì)象!對(duì)象序列化是對(duì)象持久化的一種實(shí)現(xiàn)方法,它是將一個(gè)對(duì)象的屬性和方法轉(zhuǎn)化為一種序列化的格式以用于存儲(chǔ)和傳輸,反序列化就是根據(jù)這些保存的信息重建對(duì)象的過(guò)程。運(yùn)用場(chǎng)景1:Java的JavaBeans:Bean的狀態(tài)信息通常是在設(shè)計(jì)時(shí)配置的,Bean的狀態(tài)信息必須被存起來(lái),以便當(dāng)程序運(yùn)行時(shí)能恢復(fù)這些狀態(tài)信息,這需要將對(duì)象的狀態(tài)保存到文件中,而后能夠通過(guò)讀入對(duì)象狀態(tài)來(lái)重新構(gòu)造對(duì)象,恢復(fù)程序狀態(tài)。例如Java.io包有兩個(gè)序列化對(duì)象的類。ObjectOutputStream負(fù)責(zé)將對(duì)象寫入字節(jié)流,ObjectInputStream從字節(jié)流重構(gòu)對(duì)象。運(yùn)用場(chǎng)景2:activiti工作流設(shè)置流程變量31、一個(gè)表中的ID有多個(gè)記錄,把所有這個(gè)id的記錄查出,并顯示共有多少條記錄數(shù)(SQL實(shí)現(xiàn))SELECT

id,COUNT(id)

FROM

`table`

GROUP

BY

id

HAVING

COUNT(id)

>

1

SELECT

*

FROM

(SELECT

id,COUNT(id)

sumid

FROM

`table`

GROUP

BY

id)

t

WHERE

t.sumid

>

1

32、查詢表A中存在ID重復(fù)三次以上的記錄。(使用SQL實(shí)現(xiàn))SELECT

id,COUNT(id)

FROM

`table`

GROUP

BY

id

HAVING

COUNT(id)

>

3

SELECT

*

FROM

(SELECT

id,COUNT(id)

sumid

FROM

`table`

GROUP

BY

id)

t

WHERE

t.sumid

>

3

33、Collection和Collections有什么區(qū)別?Collection是集合類的上級(jí)接口,繼承與他的接口主要有Set和List.Collections是針對(duì)集合類的一個(gè)幫助類,他提供一系列靜態(tài)方法實(shí)現(xiàn)對(duì)各種集合的搜索、排序、線程安全化等操作。34、Strings=newString("abc");請(qǐng)問(wèn)有幾個(gè)String對(duì)象?分別是兩個(gè)或一個(gè),“xyz”對(duì)應(yīng)一個(gè)對(duì)象,這個(gè)對(duì)象放在字符串常量緩沖區(qū),常量“xyz”不管出現(xiàn)多少遍,都是緩沖區(qū)中的那一個(gè)。如果以前就用過(guò)‘xyz’直接從緩沖區(qū)拿。如果沒(méi)有就在字符串緩沖區(qū)創(chuàng)建這個(gè)“xyz”字符串對(duì)象,NewString每寫一遍,就創(chuàng)建一個(gè)新的對(duì)象。35、XML是什么?針對(duì)它常用的工具包是什么?XML全稱為ExtensibleMarkupLanguage,意思是可擴(kuò)展的標(biāo)記語(yǔ)言。XML語(yǔ)法上和HTML比較相似,但HTML中的元素是固定的,而XML的標(biāo)簽是可以由用戶自定義的,常用在保存關(guān)系型數(shù)據(jù)和配置文件。針對(duì)它常用的工具包是DOM4J36、Hibernate的特點(diǎn)及其工作原理,為什么大多數(shù)公司都使用Hibernate?Hibernate是一個(gè)開(kāi)放源代碼的對(duì)象關(guān)系映射框架,它對(duì)JDBC進(jìn)行了非常輕量級(jí)的對(duì)象封裝,使得Java程序員可以隨心所欲的使用對(duì)象編程思維來(lái)操縱數(shù)據(jù)庫(kù)。Hibernate可以應(yīng)用在任何使用JDBC的場(chǎng)合,既可以在Java的客戶端程序使用,也可以在Servlet/JSP的Web應(yīng)用中使用,另外hibernate還提供一級(jí)緩存和二級(jí)緩存??梢赃M(jìn)行簡(jiǎn)單的數(shù)據(jù)庫(kù)優(yōu)化和簡(jiǎn)潔的HQL編寫。使用hibernate需要根據(jù)項(xiàng)目來(lái)確定。不能根據(jù)公司確定。Hibernate缺點(diǎn)(1)Hibernate在批量數(shù)據(jù)處理時(shí)有弱勢(shì)(2)針對(duì)單一對(duì)象簡(jiǎn)單的增刪查改,適合于Hibernate,而對(duì)于批量的修改,刪除,不適合用Hibernate,這也是OR框架的弱點(diǎn);要使用數(shù)據(jù)庫(kù)的特定優(yōu)化機(jī)制的時(shí)候,不適合用Hibernate。37、Spring的工作流程、以及核心機(jī)制?核心機(jī)制:IOC-控制翻轉(zhuǎn)。對(duì)象的創(chuàng)建交由spring容器創(chuàng)建。常用方式有構(gòu)造器創(chuàng)建、靜態(tài)工廠、實(shí)例工廠。底層使用反射技術(shù)實(shí)現(xiàn)。DI-依賴注入。對(duì)象的依賴屬性由容器注入。一般使用set方法注入38、Spring中的事物隔離級(jí)別有哪些?事物隔離和傳播的特點(diǎn)ISOLATION_DEFAULT

默認(rèn)級(jí)別,根據(jù)數(shù)據(jù)庫(kù)選擇對(duì)應(yīng)隔離級(jí)別

ISOLATION_READ_UNCOMMITTED

可以讀取未提交數(shù)據(jù)

ISOLATION_READ_COMMITTED

只能讀取已提交數(shù)據(jù),解決臟讀問(wèn)題(Oracle默認(rèn)級(jí)別)

ISOLATION_REPEATABLE_READ

是否讀取其他事務(wù)提交修改后的數(shù)據(jù),解決不可重復(fù)讀問(wèn)題(MySQL默認(rèn)級(jí)別)

ISOLATION_SERIALIZABLE

是否讀取其他事務(wù)提交添加后的數(shù)據(jù),解決幻影讀問(wèn)題39、Flex的優(yōu)劣點(diǎn)及工作流程40、不同語(yǔ)言開(kāi)發(fā)的程序之間如何進(jìn)行通信?Webservice41、try{}里有一個(gè)return語(yǔ)句,那么緊跟在這個(gè)try后的finally{}里德code會(huì)不會(huì)被執(zhí)行?什么時(shí)候被執(zhí)行,在return之前還是后?public

class

Test

{

public

static

void

main(String[]

args)

{

System.out.println(new

Test().test());;

}

static

int

test()

{

int

x

=

1;

try

{

return

x;

}

finally

{

++x;

}

}

}

/*執(zhí)行結(jié)果

*/

1

/*運(yùn)行結(jié)果是1,為什么呢?主函數(shù)調(diào)用子函數(shù)并得到結(jié)果的過(guò)程,好比主函數(shù)準(zhǔn)備一個(gè)空罐子,當(dāng)子函數(shù)要返回結(jié)果時(shí),先把結(jié)果放在罐子里,然后再將程序邏輯返回到主函數(shù)。所謂返回,就是子函數(shù)說(shuō),我不運(yùn)行了,你主函數(shù)繼續(xù)運(yùn)行吧,這沒(méi)什么結(jié)果可言,結(jié)果是在說(shuō)這話之前放進(jìn)罐子里的。

*/

42、在web開(kāi)發(fā)中,將GBK字符串,以u(píng)tf-8的格式進(jìn)行轉(zhuǎn)換輸出newString("string".getBytes("GBK"),"UTF-8");43、有一個(gè)長(zhǎng)字符串,它的內(nèi)部包含多個(gè)子字符串、子字符串之間用空格隔離,給出算法:如何去掉里面重復(fù)的字符串。44、java遞歸調(diào)用輸出一個(gè)目錄下的所有子目錄及文件名稱public

void

fun(File

file){

File[]

files

=

file.listFiles();

for(File

_file

:

files){

if(_file.isDirectory()){

fun2(_file);

}else{

System.out.println(_file);

}

}

}

45、一個(gè)月的圖片的網(wǎng)站,用戶每檢索一次、閱讀一張、下載一張圖片就會(huì)扣除相應(yīng)的簽署,如果讓你來(lái)設(shè)計(jì)計(jì)費(fèi)模板、采用何種方式最能節(jié)省各方面的資源,談?wù)勏敕ǎ?6、java中可見(jiàn)的訪問(wèn)修飾符的含義public:訪問(wèn)不受限制。protected:訪問(wèn)僅限于包含類或從包含類派生的類型。只有包含該成員的類以及繼承的類可以存取.Internal:訪問(wèn)僅限于當(dāng)前程序集。只有當(dāng)前工程可以存取.protectedinternal:訪問(wèn)僅限于當(dāng)前程序集或從包含類派生的類型。private:訪問(wèn)僅限于包含類型。只有包含該成員的類可以存取.47、java用什么來(lái)判斷對(duì)象是否是屬于某個(gè)類或借口的事例?Instanceof48、Java中,int和Integer有什么區(qū)別int是java提供的8種原始數(shù)據(jù)類型之一。Java為每個(gè)原始類型提供了封裝類,Integer是java為int提供的封裝類。int的默認(rèn)值為0,而Integer的默認(rèn)值為null,即Integer可以區(qū)分出未賦值和值為0的區(qū)別,int則無(wú)法表達(dá)出未賦值的情況,例如,要想表達(dá)出沒(méi)有參加考試和考試成績(jī)?yōu)?的區(qū)別,則只能使用Integer。在JSP開(kāi)發(fā)中,Integer的默認(rèn)為null,所以用el表達(dá)式在文本框中顯示時(shí),值為空白字符串,而int默認(rèn)的默認(rèn)值為0,所以用el表達(dá)式在文本框中顯示時(shí),結(jié)果為0,所以,int不適合作為web層的表單數(shù)據(jù)的類型。在Hibernate中,如果將OID定義為Integer類型,那么Hibernate就可以根據(jù)其值是否為null而判斷一個(gè)對(duì)象是否是臨時(shí)的,如果將OID定義為了int類型,還需要在hbm映射文件中設(shè)置其unsaved-value屬性為0。另外,Integer提供了多個(gè)與整數(shù)相關(guān)的操作方法,例如,將一個(gè)字符串轉(zhuǎn)換成整數(shù),Integer中還定義了表示整數(shù)的最大值和最小值的常量49、Java中,HashMap和Hashtable的區(qū)別?HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因?yàn)閏ontains方法容易讓人引起誤解。Hashtable繼承自Dictionary類,而HashMap是Java1.2引進(jìn)的Mapinterface的一個(gè)實(shí)現(xiàn)。最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多個(gè)線程訪問(wèn)Hashtable時(shí),不需要自己為它的方法實(shí)現(xiàn)同步,而HashMap就必須為之提供外同步。Hashtable和HashMap采用的hash/rehash算法都大概一樣,所以性能不會(huì)有很大的差異。就HashMap與HashTable主要從三方面來(lái)說(shuō)。1.歷史原因:Hashtable是基于陳舊的Dictionary類的,HashMap是Java1.2引進(jìn)的Map接口的一個(gè)實(shí)現(xiàn)2.同步性:Hashtable是線程安全的,也就是說(shuō)是同步的,而HashMap是線程序不安全的,不是同步的3.值:只有HashMap可以讓你將空值作為一個(gè)表的條目的key或value50、51Java中,String和StringBuffer的區(qū)別?1,String:字符串常量,字符串長(zhǎng)度不可變!!!2,StringBuffer:字符串變量(Synchronized,即線程安全),如果要頻繁對(duì)字符串內(nèi)容進(jìn)行修改,出于效率考慮最好使用StringBuffer,如果想轉(zhuǎn)成String類型,可以調(diào)用StringBuffer的toString();StringBuffer上的主要操作是append和insert方法,可重載這些方法,以接受任意類型的數(shù)據(jù)。append方法始終將這些字符添加到緩沖區(qū)的末端;而insert方法則在指定的點(diǎn)添加字符。3,(*延伸)StringBuilder字符串變量(非線程安全),這是在JDK5.0新增加的!!!,該對(duì)象是一個(gè)線程不安全的字符串容器,在單線程操作的情況下此對(duì)象可以用于取代StringBuffer!!!4,(String和StringBuffer)兩者者之間的區(qū)別:這兩者之間的區(qū)別主要區(qū)別在性能上,String,每次對(duì)存放進(jìn)String當(dāng)中的字符串進(jìn)行更改的時(shí)候,都會(huì)生成一個(gè)新的String對(duì)象,然后指針指向該對(duì)象(雖然Java不承認(rèn)自己有指針這回事),而一旦當(dāng)產(chǎn)生的沒(méi)有引用指向?qū)ο筮^(guò)多的時(shí)候,這個(gè)時(shí)候GC就會(huì)出動(dòng),對(duì)其進(jìn)行清理,這個(gè)時(shí)候,性能就會(huì)有所降低!!!而使用StringBuffer的時(shí)候,每次都會(huì)對(duì)該對(duì)象本身進(jìn)行操作,而不是去創(chuàng)建一個(gè)新的對(duì)象,所以在多數(shù)情況下還是推薦使用該對(duì)象!!!但是某些特殊的情況下,使用String并不會(huì)比StringBuffer慢!!!例如:Stringstr="String1"+"String2";&&StringBuffersb=newStringBuffer();sb.append("String1").append("String2");在這里的Stringstr="String1"+"String2"實(shí)際上被翻譯成了str="String1String2";52、Thread和Runnable有什么不同?首先,Java中Thread和Runnable是實(shí)現(xiàn)并發(fā)線程的兩種方式!!!,通過(guò)兩者中的任意一個(gè)都可以達(dá)到線程并發(fā)的目的!!!區(qū)別: 0,Thread是一個(gè)Class,Runnable是一個(gè)interface!!! 1,通過(guò)extendsThread,可獲得start(),sleep(),并覆蓋run(),使用時(shí)直接用start(),但有時(shí)不太方便通過(guò)繼承(extends)而進(jìn)行多線程,例如已繼承了其它Class(Java不允許多重繼承)時(shí),就應(yīng)該實(shí)現(xiàn)(implements)Runnable寫多線程程序。 2,注意,implementsRunnable創(chuàng)建的只有run()方法而沒(méi)有start(),因此要利用其它機(jī)制來(lái)啟動(dòng)。這要?jiǎng)?chuàng)建兩個(gè)對(duì)象,第一個(gè)是Runnable的, 第二個(gè)是Thread的,然后把第一個(gè)當(dāng)成參數(shù)傳給第二個(gè)!!! 3,由下面的程序可以看出,實(shí)現(xiàn)Runnable的多線程程序要比,繼承Thread的多線程程序靈活的多!!! 4,這里還有一點(diǎn),就是說(shuō)使用Runnable實(shí)現(xiàn)多線程可以達(dá)到資源共享目的,讓多個(gè)Thread對(duì)象接收同一個(gè)Runnable實(shí)現(xiàn)類的參數(shù),這樣就是多個(gè)線程操作同一塊資源!!! 例如://Runnable

接口的多線程程序舉例!!!

private

class

RunnableThread

implements

Runnable{

/*這個(gè)方法中寫,多線程執(zhí)行的程序!!!,因?yàn)檫@里是實(shí)現(xiàn)了Runnable所以就算再去繼承其他的class也不會(huì)違反java成不能多繼承的規(guī)定!!!*/

public

void

run(){

}

}

/*通過(guò)將Runnable的實(shí)現(xiàn)類作為參數(shù)傳遞給一個(gè)Thread對(duì)象,然后通過(guò)開(kāi)啟Thread對(duì)象,就能讓其執(zhí)行自己復(fù)寫的方法,并且是并發(fā)操作!!!*/

Thread

runnThread

=

new

Thread(new

RunnableThread());

RunnThread.start();

/*1,繼承自Thread類的多線程程序

private

class

GenThread

extends

Thread

{

//這個(gè)方法中寫,多線程需要執(zhí)行的方法!!!

public

void

run()

{

}

}

Thread

theGenThread

=

new

GenThread();

theGenThread.start();

53、struts的Action是不是線程安全的?如果不是,有什么方法可以保證Action的線程安全,如果是,請(qǐng)說(shuō)明原因Struts1的實(shí)現(xiàn)底層是servlet,是單利的,所以在Struts1的開(kāi)發(fā)過(guò)程中有很多的時(shí)候是需要注意單例導(dǎo)致的線程安全性的問(wèn)題。Struts2核心是攔截器,是多例的,每一次的請(qǐng)求都會(huì)創(chuàng)建一個(gè)新的實(shí)例出來(lái),所以它本身是沒(méi)有線程安全性問(wèn)題的。54、Spring的工作機(jī)制以及為什么要使用?Spring的工作記機(jī)制:springmvc將所有的請(qǐng)求都提交給DispatcherServlet,它會(huì)委托應(yīng)用系統(tǒng)的其他模塊負(fù)責(zé)對(duì)請(qǐng)求進(jìn)行真正的處理工作。DispatcherServlet查詢一個(gè)或多個(gè)HandlerMapping,找到處理請(qǐng)求的Controller。DispatcherServlet請(qǐng)求提交到目標(biāo)ControllerController進(jìn)行業(yè)務(wù)邏輯處理后,會(huì)返回一個(gè)ModelAndViewDispatcher查詢一個(gè)或多個(gè)ViewResolver視圖解析器,找到ModelAndView對(duì)象制定的視圖對(duì)象視圖對(duì)象負(fù)責(zé)渲染返回給客戶端。AOP:讓開(kāi)發(fā)人員可以創(chuàng)建非行為性的關(guān)注點(diǎn),稱為橫切關(guān)注點(diǎn),并將它們插入到應(yīng)用程序代碼中。使用AOP后,公共服務(wù)(日志、持久性、事務(wù)等)就可以分解成方面并應(yīng)用到域?qū)ο笊?。同時(shí)不會(huì)增加域?qū)ο蟮膶?duì)象模型的復(fù)雜性。IoC:允許創(chuàng)建一個(gè)可以構(gòu)造對(duì)象的應(yīng)用環(huán)境,然后向這些對(duì)象傳遞他們的協(xié)作對(duì)象。如倒置所表明的,IoC就像反過(guò)來(lái)的JNDI。沒(méi)有使用一堆抽象工廠、服務(wù)定位器、單元素(singleton)和直接構(gòu)造(straightconstruction),每一個(gè)對(duì)象都是用其協(xié)作對(duì)象構(gòu)造的。因此由容器負(fù)責(zé)管理協(xié)作對(duì)象(collaborator)Spring既是一個(gè)AOP框架,也是一個(gè)IoC容器。Spring最好的地方是它有助于您替換對(duì)象。有了Spring,只要用JavaBean屬性和配置文件加入依賴性(協(xié)作對(duì)象)。然后可以很容易地在需要時(shí)替換具有類似接口的寫作對(duì)象。55、寫出兩種Java設(shè)計(jì)模式中不同的單例模式singleton/*第一種(懶漢,線程不安全):所謂懶漢,就是說(shuō)當(dāng)這個(gè)對(duì)象在需要進(jìn)行獲取的時(shí)候,再去對(duì)該對(duì)象進(jìn)行創(chuàng)建*/

public

class

Singleton{

private

static

Singleton

instance;

//通過(guò)將構(gòu)造方法私有化達(dá)到,不能直接通過(guò)new

類名(),創(chuàng)建類的目的!!!

private

Singleton(){}

public

static

Singleton

getInstance(){

if

(instance

==

null){

instance

=

new

Singleton();

}

return

instance;

}

}

/*第二種(懶漢,線程安全):這里的線程安全看起來(lái)十分的美好,但是效率卻十分的低,所以一般的情況下不會(huì)使用這種方式*/

public

class

Singleton

{

private

static

Singleton

instance;

private

Singleton(){}

//通過(guò)在此使用同步方法,進(jìn)行將其變成線程安全的!!!

public

static

synchronized

Singleton

getInstance(){

if

(instance

==

null)

{

instance

=

new

Singleton();

}

return

instance;

}

}

/*第三種(餓漢

:

線程安全)

:

當(dāng)該類一旦進(jìn)行加載(classLoader機(jī)制),就需要對(duì)其該類中的對(duì)象進(jìn)行創(chuàng)建,同樣因此也就使其避免了線程的安全問(wèn)題*/

public

class

Singleton

{

private

static

Singleton

instance

=

new

Singleton();

private

Singleton(){}

public

static

Singleton

getInstance()

{

return

instance;

}

}

/*第四種(枚舉):該方法是Effective

Java作者Josh

Bloch

提倡的方式,它不僅能避免多線程同步問(wèn)題,保證只有一個(gè)實(shí)例,即使使用反射機(jī)制也無(wú)法多次實(shí)例化一個(gè)枚舉量*/

public

enum

Singleton

{

INSTANCE;

private

Singleton();

}

56、如果client已經(jīng)有一個(gè)接口來(lái)訪問(wèn)所需要的服務(wù),我們已經(jīng)有現(xiàn)成的類來(lái)提供這樣的服務(wù),但是服務(wù)提供的方法和client訪問(wèn)所需要的方法不匹配,那么如何設(shè)計(jì)變成來(lái)提供client服務(wù)?可以寫一個(gè)代理類,將client中接口的方法寫在代理類中,在代理類中調(diào)用服務(wù)提供的方法。如果用的spring的話,通過(guò)配置就能解決這個(gè)問(wèn)題。57、在HTML中如何包含JavaScript?<!--

方法一:通過(guò)外部源文件來(lái)包含javascript,這是最正確的方式,把結(jié)構(gòu)從行為中分離出來(lái)

-->

<head>

<script

type=”text/javascript”src=”source.jsp”></script>

</head>

<!--

方法二:在<head>中包含js代碼

-->

<head>

<script

type=”text/javascript”

>

//javascript代碼

</script>

</head>

<!--

方式三:把嵌入式的腳本添加到文檔的<body>中,

維一的理由是要使用document.write()方法,但我們有更好方法來(lái)替代他。如:createElement()方法,

appendChild()方法,

非EMCAscript標(biāo)準(zhǔn)的

innerHTML屬性-->

<body>

<script

type=”text/javascript”

>

document.write(“html”);

</script>

</body>

<!--

方式四:非官方EMCA標(biāo)準(zhǔn)的

javascript:前綴

;可以成功打開(kāi)一個(gè)新的窗口-->

<a

href="javascript:window.open('');"

>進(jìn)入</a>

58、Javascript中,對(duì)象person有name屬性,寫出兩種獲取name屬性的方法<!--第一種:使用“

.

”來(lái)訪問(wèn)對(duì)象屬性-->

P

<!--第二種:使用“[]”來(lái)訪問(wèn)對(duì)象屬性-->

Person[name]

59、GC是什么,為什么要有GC? 1,GC:垃圾回收(GarbageCollection),Java的內(nèi)存管理,其內(nèi)置的垃圾回收,是Java語(yǔ)言的優(yōu)秀成果,它允許開(kāi)發(fā)者創(chuàng)建新的對(duì)象不需要明確內(nèi)存分配和釋放,因?yàn)槔厥掌髯詣?dòng)回收內(nèi)存當(dāng)中的對(duì)象。 2,垃圾收集釋放從手工處理內(nèi)存釋放的程序員。其結(jié)果是,某些類別的缺陷被消除或顯著減少:這也正是Java的特點(diǎn)(相對(duì)于C++來(lái)說(shuō),程序員不再需要通過(guò)痛苦的記憶哪里的內(nèi)存是釋放掉的,而哪一些是沒(méi)有釋放掉的)內(nèi)存不安全釋放的問(wèn)題:1,當(dāng)一塊內(nèi)存被釋放,同時(shí)還存在著指向它,而那些指針中的一個(gè)被廢棄發(fā)生。屆時(shí)內(nèi)存可能已被重新分配到其他使用,具有不可預(yù)知的結(jié)果。2,當(dāng)程序試圖發(fā)生釋放的內(nèi)存已被釋放,并可能已經(jīng)被再次分配的區(qū)域。3,某些種類的內(nèi)存泄漏,其中一個(gè)程序無(wú)法釋放由已成為對(duì)象占用的內(nèi)存可達(dá),從而導(dǎo)致內(nèi)存消耗殆盡。(垃圾收集通常不處理的數(shù)據(jù)是可到達(dá)的無(wú)界積累,但實(shí)際上將不被使用的程序)……60、XML文檔定義有幾種形式?他們之間有何本質(zhì)區(qū)別?解析XML文檔有幾種方式?XML文檔定義有幾種形式:dtd文檔類型定義和SchemaXML模式本質(zhì)區(qū)別:XMLSchema和DTD都用于文檔驗(yàn)證XMLSchema是內(nèi)容開(kāi)放模型,可擴(kuò)展,功能性強(qiáng),而DTD可擴(kuò)展性差。XMLSchema支持豐富的數(shù)據(jù)類型,而DTD不支持元素的數(shù)據(jù)類型,對(duì)屬性的類型定義也很有限。XMLSchema支持命名空間機(jī)制,而DTD不支持。XMLSchema可針對(duì)不同情況對(duì)整個(gè)XML文檔或文檔局部進(jìn)行驗(yàn)證;而DTD缺乏這種靈活性。XMLSchema完全遵循XML規(guī)范,符合XML語(yǔ)法,可以和DOM結(jié)合使用,功能強(qiáng)大;而DTD語(yǔ)法本身有自身的語(yǔ)法和要求,難以學(xué)習(xí)。解析XML文檔有幾種方式:DOM:所有內(nèi)容都封裝成對(duì)象,并且裝入內(nèi)存中,如果是大本文處理的時(shí)候,性能下降。可以做增刪改查等一系列操作。Sax:事件驅(qū)動(dòng).在讀取的過(guò)程中.將遇到的文檔的各個(gè)部分的內(nèi)容.拆分各個(gè)事件.當(dāng)我們遇到什么事件的時(shí)候,可以選擇做相應(yīng)事.sax只能做查詢。61、什么是java序列化,如何實(shí)現(xiàn)java序列化?我們有時(shí)候?qū)⒁粋€(gè)java對(duì)象變成字節(jié)流的形式傳出去或者從一個(gè)字節(jié)流中恢復(fù)成一個(gè)java對(duì)象,例如,要將java對(duì)象存儲(chǔ)到硬盤或者傳送給網(wǎng)絡(luò)上的其他計(jì)算機(jī),這個(gè)過(guò)程我們可以自己寫代碼去把一個(gè)java對(duì)象變成某個(gè)格式的字節(jié)流再傳輸,但是,jre本身就提供了這種支持,我們可以調(diào)用OutputStream的writeObject方法來(lái)做,如果要讓java幫我們做,要被傳輸?shù)膶?duì)象必須實(shí)現(xiàn)serializable接口,這樣,javac編譯時(shí)就會(huì)進(jìn)行特殊處理,編譯的類才可以被writeObject方法操作,這就是所謂的序列化。需要被序列化的類必須實(shí)現(xiàn)Serializable接口,該接口是一個(gè)mini接口,其中沒(méi)有需要實(shí)現(xiàn)的方法,implementsSerializable只是為了標(biāo)注該對(duì)象是可被序列化的。例如,在web開(kāi)發(fā)中,如果對(duì)象被保存在了Session中,tomcat在重啟時(shí)要把Session對(duì)象序列化到硬盤,這個(gè)對(duì)象就必須實(shí)現(xiàn)Serializable接口。如果對(duì)象要經(jīng)過(guò)分布式系統(tǒng)進(jìn)行網(wǎng)絡(luò)傳輸或通過(guò)rmi等遠(yuǎn)程調(diào)用,這就需要在網(wǎng)絡(luò)上傳輸對(duì)象,被傳輸?shù)膶?duì)象就必須實(shí)現(xiàn)Serializable接口。62、使用js和JQuery的方式獲取表達(dá)中對(duì)象Js

:

document.getElementById(“aa”)查詢id為aa的元素,

document.getElementsByName(“aa”)取name為aa的元素,

document.getElementsByTagName("aa")獲取標(biāo)簽名

jquery對(duì)應(yīng)有$("#aa"),$("div[name=aa]"),$("div")

如$(".aa")取class為aa的元素,$(":text")取頁(yè)面type=text的輸入元素等很多,功能比js強(qiáng)大很多

//document.getElementById(“xxx”)

//jQuery(“#xxx”);

63、JQuery中什么方法用來(lái)把內(nèi)容追加到指定元素的末尾?JQeuery可以使用

after()

方法在被選元素后插入指定的內(nèi)容。

語(yǔ)法:

$(selector).after(content)

$(“p”).after(function(){

//為

p元素的后面需要添加的內(nèi)容

});

64、JQuery給按鈕添加點(diǎn)擊事件?JQuery給

按鈕添加事件的語(yǔ)法格式是:$(selector).click()

例如:$(selector).click(function(){

//添加JQuery代碼

});

65、是否可以從一個(gè)static方法內(nèi)部發(fā)出對(duì)非static方法的調(diào)用?不可以。因?yàn)榉莝tatic方法是要與對(duì)象關(guān)聯(lián)在一起的,必須創(chuàng)建一個(gè)對(duì)象后,才可以在該對(duì)象上進(jìn)行方法調(diào)用,而static方法調(diào)用時(shí)不需要?jiǎng)?chuàng)建對(duì)象,可以直接調(diào)用。也就是說(shuō),當(dāng)一個(gè)static方法被調(diào)用時(shí),可能還沒(méi)有創(chuàng)建任何實(shí)例對(duì)象,如果從一個(gè)static方法中發(fā)出對(duì)非static方法的調(diào)用,那個(gè)非static方法是關(guān)聯(lián)到哪個(gè)對(duì)象上的呢?這個(gè)邏輯無(wú)法成立,所以,一個(gè)static方法內(nèi)部發(fā)出對(duì)非static方法的調(diào)用。66、如何把一段逗號(hào)分隔的字符串轉(zhuǎn)換成一個(gè)數(shù)組?//方式一:使用String的split

方法

public

static

String[]

convertStrToArray(String

str){

String[]

strArray

=

null;

strArray

=

str.split(",");

return

strArray;

}

//方式二:使用StringTokenizer實(shí)現(xiàn)

//api說(shuō)明:StringTokenizer

是出于兼容性的原因而被保留的遺留類

//(雖然在新代碼中并不鼓勵(lì)使用它)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論