国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
Java面試題集
第1 頁共59 頁
面試題集
面試題集共分為以下十部分:
一、Core Java: 1 — 95 題1 — 24 頁
基礎(chǔ)及語法: 1 — 61 題1 — 13 頁
異常: 62 — 69 題13 — 15 頁
集合: 70 — 80 題15 — 18 頁
線程: 81 — 90 題18 — 21 頁
IO & Socket: 91 — 95 題21 — 24 頁
二、OOAD & UML: 96 — 101 題24 — 25 頁
三、XML: 102 — 105 題26 — 29 頁
四、SQL: 106 — 109 題29 — 31 頁
五、JDBC & Hibernate: 110 — 121 題31 — 35 頁
六、Web: 122 — 161 題35 — 44 頁
七、EJB & Spring: 162 — 179 題44 — 47 頁
八、數(shù)據(jù)結(jié)構(gòu)& 算法& 計(jì)算機(jī)基礎(chǔ): 180 — 187 題47 — 51 頁
九、C++: 188 — 201 題51 — 55 頁
十、Weblogic 及其它(附加部分) 1 —— 13 題55 — 57 頁
一、CoreJava 部分:(共95 題:基礎(chǔ)91 道,中等難度4 道)
基礎(chǔ)及語法部分:(共61 題:基礎(chǔ)60 道、中等難度1 道)
1、面向?qū)ο蟮奶卣饔心男┓矫? 【基礎(chǔ)】
答:面向?qū)ο蟮奶卣髦饕幸韵聨讉€(gè)方面:
1)抽象:抽象就是忽略一個(gè)主題中與當(dāng)前目標(biāo)無關(guān)的那些方面,以便更充分地
注意與當(dāng)前目標(biāo)有關(guān)的方面。抽象并不打算了解全部問題,而只是選擇其中的一
部分,暫時(shí)不用部分細(xì)節(jié)。抽象包括兩個(gè)方面,一是過程抽象,二是數(shù)據(jù)抽象。
2)繼承:繼承是一種聯(lián)結(jié)類的層次模型,并且允許和鼓勵(lì)類的重用,它提供了
一種明確表述共性的方法。對象的一個(gè)新類可以從現(xiàn)有的類中派生,這個(gè)過程稱
為類繼承。新類繼承了原始類的特性,新類稱為原始類的派生類(子類),而原
始類稱為新類的基類(父類)。派生類可以從它的基類那里繼承方法和實(shí)例變量,
并且類可以修改或增加新的方法使之更適合特殊的需要。
3)封裝:封裝是把過程和數(shù)據(jù)包圍起來,對數(shù)據(jù)的訪問只能通過已定義的界面。
面向?qū)ο笥?jì)算始于這個(gè)基本概念,即現(xiàn)實(shí)世界可以被描繪成一系列完全自治、封
裝的對象,這些對象通過一個(gè)受保護(hù)的接口訪問其他對象。
4)多態(tài)性:多態(tài)性是指允許不同類的對象對同一消息作出響應(yīng)。多態(tài)性包括參
數(shù)化多態(tài)性和包含多態(tài)性。多態(tài)性語言具有靈活、抽象、行為共享、代碼共享的
優(yōu)勢,很好的解決了應(yīng)用程序函數(shù)同名問題。
2、作用域public,private,protected,以及不寫時(shí)的區(qū)別?【基礎(chǔ)】
答:區(qū)別如下:
作用域當(dāng)前類同包子孫類其他
public √ √ √ √
第2 頁共59 頁
protected √ √ √ ×
default √ √ × ×
private √ × × ×
不寫時(shí)默認(rèn)為default。
3、String 是最基本的數(shù)據(jù)類型嗎? 【基礎(chǔ)】
答:不是。
4、float 型float f=3.4是否正確? 【基礎(chǔ)】
答:不正確;精度不準(zhǔn)確,應(yīng)該用強(qiáng)制類型轉(zhuǎn)換,如下所示:float f=(float)3.4 。
5、語句float f=1.3;編譯能否通過?【基礎(chǔ)】
答:不能;應(yīng)該用強(qiáng)制類型轉(zhuǎn)換,如下所示:float f=(float)1.3; 。
6、short s1 = 1; s1 = s1 + 1;有什么錯(cuò)?
short s1 = 1; s1 += 1;有什么錯(cuò)? 【基礎(chǔ)】
答:short s1 = 1; s1 = s1 + 1;s1+1運(yùn)算結(jié)果是int 型,需要強(qiáng)制轉(zhuǎn)換類型;
short s1 = 1; s1 += 1;可以正確編譯,自動(dòng)類型提升。
7、Java 有沒有g(shù)oto? 【基礎(chǔ)】
答:goto 是java 中的保留字,現(xiàn)在沒有在java 中使用。
8、int 和Integer 有什么區(qū)別? 【基礎(chǔ)】
答:Java 提供兩種不同的類型:引用類型和原始類型(或內(nèi)置類型);
int 是java 的原始數(shù)據(jù)類型,Integer 是java 為int 提供的封裝類。
Java 為每個(gè)原始類型提供了封裝類:
原始類型: boolean,char,byte,short,int,long,float,double
封裝類型:Boolean,Character,Byte,Short,Integer,Long,F(xiàn)loat,Double
引用類型和原始類型的行為完全不同,并且它們具有不同的語義。引用類型和
原始類型具有不同的特征和用法,它們包括:大小和速度問題,這種類型以哪種
類型的數(shù)據(jù)結(jié)構(gòu)存儲,當(dāng)引用類型和原始類型用作某個(gè)類的實(shí)例數(shù)據(jù)時(shí)所指定的
缺省值。對象引用實(shí)例變量的缺省值為null,而原始類型實(shí)例變量的缺省值與
它們的類型有關(guān)。
9、&和&&的區(qū)別?【基礎(chǔ)】
答:&是位運(yùn)算符,表示按位與運(yùn)算,&&是邏輯運(yùn)算符,表示邏輯與(and)。
10、簡述邏輯操作(&,|,^)與條件操作(&&,||)的區(qū)別?【基礎(chǔ)】
答:區(qū)別主要有兩點(diǎn):a.條件操作只能操作布爾型的,而邏輯操作不僅可以操作
布爾型,而且可以操作數(shù)值型b.邏輯操作不會產(chǎn)生短路。
11、heap 和stack 有什么區(qū)別?【基礎(chǔ)】
答:棧是一種線形集合,其添加和刪除元素的操作應(yīng)在同一段完成,棧按照后進(jìn)
先出的方式進(jìn)行處理;堆是棧的一個(gè)組成元素。
第3 頁共59 頁
12、Math.round(11.5) 等于多少? Math.round(-11.5)等于多少? 【基礎(chǔ)】
答:Math.round(11.5)==12 Math.round(-11.5)==-11 round 方法返回與參數(shù)
最接近的長整數(shù),參數(shù)加1/2 后求其floor。
13、swtich 是否能作用在byte 上,是否能作用在long 上,是否能作用在String
上? 【基礎(chǔ)】
答:switch(expr1)中,expr1 是一個(gè)整數(shù)表達(dá)式。因此傳遞給switch 和case
語句的參數(shù)應(yīng)該是int、short、char 或者byte。long,string 都不能作用
于swtich。
14、編程題: 用最有效率的方法算出2 乘以8 等於幾? 【基礎(chǔ)】
答: 2 << 3。
15、有沒有l(wèi)ength()這個(gè)方法? String 有沒有l(wèi)ength()這個(gè)方法?【基礎(chǔ)】
答:數(shù)組沒有l(wèi)ength()這個(gè)方法,有l(wèi)ength 的屬性。String 有l(wèi)ength()這個(gè)
方法。
16、在JAVA 中,如何跳出當(dāng)前的多重嵌套循環(huán)?【基礎(chǔ)】
答:在最外層循環(huán)前加label 標(biāo)識,然后用break:label 方法即可跳出多重循環(huán)。
17、構(gòu)造器Constructor 是否可被override? 【基礎(chǔ)】
答:構(gòu)造器Constructor 不能被繼承,因此不能重寫Overriding,但可以被重
載Overloading。
18、兩個(gè)對象值相同(x.equals(y) == true),但卻可有不同的hash code,這
句話對不對? 【基礎(chǔ)】
答:不對,有相同的hash code。
19、是否可以繼承String 類? 【基礎(chǔ)】
答:String 類是final 類,故不可以繼承。
20、以下二條語句返回值為true 的有:
A:“beijing”==“beijing”;
B:“beijing”.equalsIgnoreCase(new String(“beijing”));【基礎(chǔ)】
答:A 和B 。
21、當(dāng)一個(gè)對象被當(dāng)作參數(shù)傳遞到一個(gè)方法后,此方法可改變這個(gè)對象的屬性,
并可返回變化后的結(jié)果,那么這里到底是值傳遞還是引用傳遞? 【基礎(chǔ)】
答:是值傳遞。Java 編程語言只有值傳遞參數(shù)。當(dāng)一個(gè)對象實(shí)例作為一個(gè)參數(shù)
被傳遞到方法中時(shí),參數(shù)的值就是對該對象的引用。對象的內(nèi)容可以在被調(diào)用的
方法中改變,但對象的引用是永遠(yuǎn)不會改變的。
22、我們在web 應(yīng)用開發(fā)過程中經(jīng)常遇到輸出某種編碼的字符,如iso8859-1
等,如何輸出一個(gè)某種編碼的字符串?【基礎(chǔ)】
答:public String translate(String str){
第4 頁共59 頁
String tempStr = "";
try{
tempStr = new String(str.getBytes("ISO-8859-1"), "GBK");
tempStr = tempStr.trim();
}catch (Exception e){
System.err.println(e.getMessage());
}
return tempStr;
}
23、String 和StringBuffer 的區(qū)別? 【基礎(chǔ)】
答:JAVA 平臺提供了兩個(gè)類:String 和StringBuffer,它們可以儲存和操作字
符串,即包含多個(gè)字符的字符數(shù)據(jù)。這個(gè)String 類提供了數(shù)值不可改變的字符
串。而這個(gè)StringBuffer 類提供的字符串進(jìn)行修改。當(dāng)你知道字符數(shù)據(jù)要改變
的時(shí)候你就可以使用StringBuffer。典型地,你可以使用StringBuffers 來動(dòng)
態(tài)構(gòu)造字符數(shù)據(jù)。
24、String, StringBuffer StringBuilder 的區(qū)別?!净A(chǔ)】
答:String 的長度是不可變的;
StringBuffer 的長度是可變的,如果你對字符串中的內(nèi)容經(jīng)常進(jìn)行操作,
特別是內(nèi)容要修改時(shí),那么使用StringBuffer,如果最后需要String,那么使
用StringBuffer 的toString()方法;線程安全;
StringBuilder 是從JDK 5 開始,為StringBuffer 該類補(bǔ)充了一個(gè)單個(gè)線
程使用的等價(jià)類;通常應(yīng)該優(yōu)先使用StringBuilder 類,因?yàn)樗С炙邢嗤?/div>
的操作,但由于它不執(zhí)行同步,所以速度更快。
25、Overload 和Override 的區(qū)別。Overloaded 的方法是否可以改變返回值的類
型? 【基礎(chǔ)】
答:方法的重寫Overriding 和重載Overloading 是Java 多態(tài)性的不同表現(xiàn)。重
寫Overriding 是父類與子類之間多態(tài)性的一種表現(xiàn),重載Overloading 是一個(gè)
類中多態(tài)性的一種表現(xiàn)。如果在子類中定義某方法與其父類有相同的名稱和參
數(shù),我們說該方法被重寫(Overriding)。子類的對象使用這個(gè)方法時(shí),將調(diào)用
子類中的定義,對它而言,父類中的定義如同被“屏蔽”了。如果在一個(gè)類中定
義了多個(gè)同名的方法,它們或有不同的參數(shù)個(gè)數(shù)或有不同的參數(shù)類型,則稱為方
法的重載(Overloading)。Overloaded 的方法是可以改變返回值的類型。
26、定義類A 和類B 如下:【基礎(chǔ)】
class A {
int a=1;
double d=2.0;
void show(){
System.out.println("Class A: a="+a +"\td="+d);
}
}
class B extends A{
第5 頁共59 頁
float a=3.0f;
String d="Java program.";
void show(){
super.show( );
System.out.println("Class B: a="+a +"\td="+d);
}
}
(1) 若在應(yīng)用程序的main 方法中有以下語句:
A a=new A();
a.show();
則輸出的結(jié)果如何?
(2) 若在應(yīng)用程序的main 方法中定義類B 的對象b:
A b=new B();
b.show();
則輸出的結(jié)果如何?
答:輸出結(jié)果為:
1)Class A: a=1 d=2.0 ;
2)Class A: a=1 d=2.0
Class B: a=3.0 d=Java program。
27、描述一下JVM 加載class 文件的原理機(jī)制? 【基礎(chǔ)】
答:JVM 中類的裝載是由ClassLoader 和它的子類來實(shí)現(xiàn)的,Java ClassLoader
是一個(gè)重要的Java 運(yùn)行時(shí)系統(tǒng)組件。它負(fù)責(zé)在運(yùn)行時(shí)查找和裝入類文件的類。
28、char 型變量中能不能存貯一個(gè)中文漢字?為什么? 【基礎(chǔ)】
答:能夠定義成為一個(gè)中文的,因?yàn)閖ava 中以unicode 編碼,一個(gè)char 占16
個(gè)字節(jié),所以放一個(gè)中文是沒問題的。
29、abstract class 和interface 有什么區(qū)別? 【基礎(chǔ)】
答:聲明方法的存在而不去實(shí)現(xiàn)它的類被叫做抽象類(abstract class),它用
于要?jiǎng)?chuàng)建一個(gè)體現(xiàn)某些基本行為的類,并為該類聲明方法,但不能在該類中實(shí)現(xiàn)
該類的情況。不能創(chuàng)建abstract 類的實(shí)例。然而可以創(chuàng)建一個(gè)變量,其類型是
一個(gè)抽象類,并讓它指向具體子類的一個(gè)實(shí)例。不能有抽象構(gòu)造函數(shù)或抽象靜態(tài)
方法。Abstract 類的子類為它們父類中的所有抽象方法提供實(shí)現(xiàn),否則它們也
是抽象類為。取而代之,在子類中實(shí)現(xiàn)該方法。知道其行為的其它類可以在類中
實(shí)現(xiàn)這些方法。接口(interface)是抽象類的變體。新型多繼承性可通過實(shí)現(xiàn)
這樣的接口而獲得。接口中的所有方法都是抽象的,所有成員變量都是public
static final 的。一個(gè)類可以實(shí)現(xiàn)多個(gè)接口,當(dāng)類實(shí)現(xiàn)特殊接口時(shí),它定義(即
將程序體給予)所有這種接口的方法。然后,它可以在實(shí)現(xiàn)了該接口的類的任何
對象上調(diào)用接口的方法。由于有抽象類,它允許使用接口名作為引用變量的類型。
通常的動(dòng)態(tài)聯(lián)編將生效。引用可以轉(zhuǎn)換到接口類型或從接口類型轉(zhuǎn)換,
instanceof 運(yùn)算符可以用來決定某對象的類是否實(shí)現(xiàn)了接口。
第6 頁共59 頁
30、Static Nested Class 和Inner Class 的不同?【基礎(chǔ)】
答:Static Nested Class 是被聲明為靜態(tài)(static)的內(nèi)部類,它可以不依賴
于外部類實(shí)例被實(shí)例化。而通常的內(nèi)部類需要在外部類實(shí)例化后才能實(shí)例化。
31、java 中會存在內(nèi)存泄漏嗎,請簡單描述?!净A(chǔ)】
答:會;存在無用但可達(dá)的對象,這些對象不能被GC 回收,導(dǎo)致耗費(fèi)內(nèi)存資源。
32、abstract 的method 是否可同時(shí)是static,是否可同時(shí)是native,是否可同
時(shí)是synchronized? 【基礎(chǔ)】
答:都不能。
33、靜態(tài)變量和實(shí)例變量的區(qū)別?【基礎(chǔ)】
答:靜態(tài)變量也稱為類變量,歸全類共有,它不依賴于某個(gè)對象,可通過類名直
接訪問;而實(shí)例變量必須依存于某一實(shí)例,只能通過對象才能訪問到它。
34、是否可以從一個(gè)static 方法內(nèi)部發(fā)出對非static 方法的調(diào)用?【基礎(chǔ)】
答:不可以,如果其中包含對象的method(),不能保證對象初始化。
35、寫clone()方法時(shí),通常都有一行代碼,是什么?【基礎(chǔ)】
答:Clone 有缺省行為:super.clone(),他負(fù)責(zé)產(chǎn)生正確大小的空間,并逐位
復(fù)制。
36、GC 是什么? 為什么要有GC? 【基礎(chǔ)】
答:GC 是垃圾收集的意思(Gabage Collection),內(nèi)存處理是編程人員容易出
現(xiàn)問題的地方,忘記或者錯(cuò)誤的內(nèi)存回收會導(dǎo)致程序或系統(tǒng)的不穩(wěn)定甚至崩潰,
Java 提供的GC 功能可以自動(dòng)監(jiān)測對象是否超過作用域從而達(dá)到自動(dòng)回收內(nèi)存的
目的,Java 語言沒有提供釋放已分配內(nèi)存的顯示操作方法。Java 程序員不用
擔(dān)心內(nèi)存管理,因?yàn)槔占鲿詣?dòng)進(jìn)行管理。要請求垃圾收集,可以調(diào)用下
面的方法之一:System.gc() 或Runtime.getRuntime().gc() 。
37、垃圾回收的優(yōu)點(diǎn)和原理。并考慮2 種回收機(jī)制?!净A(chǔ)】
答:Java 語言中一個(gè)顯著的特點(diǎn)就是引入了垃圾回收機(jī)制,使c++程序員最頭疼
的內(nèi)存管理的問題迎刃而解,它使得Java 程序員在編寫程序的時(shí)候不再需要考
慮內(nèi)存管理。由于有個(gè)垃圾回收機(jī)制,Java 中的對象不再有“作用域”的概念,
只有對象的引用才有“作用域”。垃圾回收可以有效的防止內(nèi)存泄露,有效的使
用可以使用的內(nèi)存。垃圾回收器通常是作為一個(gè)單獨(dú)的低級別的線程運(yùn)行,不可
預(yù)知的情況下對內(nèi)存堆中已經(jīng)死亡的或者長時(shí)間沒有使用的對象進(jìn)行清楚和回
收,程序員不能實(shí)時(shí)的調(diào)用垃圾回收器對某個(gè)對象或所有對象進(jìn)行垃圾回收?;?/div>
收機(jī)制有分代復(fù)制垃圾回收和標(biāo)記垃圾回收,增量垃圾回收。
38、垃圾回收器的基本原理是什么?垃圾回收器可以馬上回收內(nèi)存嗎?有什么辦
法主動(dòng)通知虛擬機(jī)進(jìn)行垃圾回收?【基礎(chǔ)】
答:對于GC 來說,當(dāng)程序員創(chuàng)建對象時(shí),GC 就開始監(jiān)控這個(gè)對象的地址、大小
以及使用情況。通常,GC 采用有向圖的方式記錄和管理堆(heap)中的所有對象。
通過這種方式確定哪些對象是"可達(dá)的",哪些對象是"不可達(dá)的"。當(dāng)GC 確定一
第7 頁共59 頁
些對象為"不可達(dá)"時(shí),GC 就有責(zé)任回收這些內(nèi)存空間??梢?。程序員可以手動(dòng)
執(zhí)行System.gc(),通知GC 運(yùn)行,但是Java 語言規(guī)范并不保證GC 一定會執(zhí)行。
39、String s=new String(“xyz”);創(chuàng)建了幾個(gè)String Object? 【基礎(chǔ)】
答:兩個(gè)對象,一個(gè)是"xyx",一個(gè)是指向"xyx"的引用對象s。
40、接口是否可繼承接口? 抽象類是否可實(shí)現(xiàn)(implements)接口? 抽象類是否可
繼承實(shí)體類(concrete class)? 【基礎(chǔ)】
答:接口可以繼承接口。抽象類可以實(shí)現(xiàn)(implements)接口,抽象類可繼承實(shí)體
類,但前提是實(shí)體類必須有明確的構(gòu)造函數(shù)。
41、Java 的接口和C++的虛類的相同和不同處。【基礎(chǔ)】
答:由于Java 不支持多繼承,而有可能某個(gè)類或?qū)ο笠褂梅謩e在幾個(gè)類或?qū)?/div>
象里面的方法或?qū)傩裕F(xiàn)有的單繼承機(jī)制就不能滿足要求。與繼承相比,接口有
更高的靈活性,因?yàn)榻涌谥袥]有任何實(shí)現(xiàn)代碼。當(dāng)一個(gè)類實(shí)現(xiàn)了接口以后,該類
要實(shí)現(xiàn)接口里面所有的方法和屬性,并且接口里面的屬性在默認(rèn)狀態(tài)下面都是
public static,所有方法默認(rèn)情況下是public.一個(gè)類可以實(shí)現(xiàn)多個(gè)接口。
42、一個(gè)“.java”源文件中是否可以包含多個(gè)類(不是內(nèi)部類)?有什么限制?
【基礎(chǔ)】
答:可以;必須只有一個(gè)類名與文件名相同。
43、說出一些常用的類,包,接口,請各舉5 個(gè)?!净A(chǔ)】
答:常用的類:BufferedReader BufferedWriter FileReader FileWirter
String Integer;
常用的包:java.lang java.awt java.io java.util java.sql;
常用的接口:Remote List Map Document NodeList
44、Anonymous Inner Class (匿名內(nèi)部類) 是否可以extends(繼承)其它類?
是否可以implements(實(shí)現(xiàn))interface(接口)? 【基礎(chǔ)】
答:可以繼承其他類或?qū)崿F(xiàn)其他接口,在swing 編程中常用此方式。
45、內(nèi)部類可以引用他包含類的成員嗎?有沒有什么限制?【基礎(chǔ)】
答:一個(gè)內(nèi)部類對象可以訪問創(chuàng)建它的外部類對象的內(nèi)容。
46、java 中實(shí)現(xiàn)多態(tài)的機(jī)制是什么?【基礎(chǔ)】
答:方法的覆蓋Overriding 和重載Overloading 是java 多態(tài)性的不同表現(xiàn);覆
蓋Overriding 是父類與子類之間多態(tài)性的一種表現(xiàn),重載Overloading 是一個(gè)
類中多態(tài)性的一種表現(xiàn)。
47、在java 中一個(gè)類被聲明為final 類型,表示了什么意思?【基礎(chǔ)】
答:表示該類不能被繼承,是頂級類。
48、下面哪些類可以被繼承? 【基礎(chǔ)】
1)java.lang.Thread (T)
第8 頁共59 頁
2)java.lang.Number (T)
3)java.lang.Double (F)
4)java.lang.Math (F)
5)java.lang.Void (F)
6)java.lang.Class (F)
7)java.lang.ClassLoader (T)
答:1、2、7 可以被繼承。
49、指出下面程序的運(yùn)行結(jié)果: 【基礎(chǔ)】
class A{
static{
System.out.print("1");
}
public A(){
System.out.print("2");
}
}
class B extends A{
static{
System.out.print("a");
}
public B(){
System.out.print("b");
}
}
public class Hello{
public static void main(String[] ars){
A ab = new B(); //執(zhí)行到此處,結(jié)果: 1a2b
ab = new B(); //執(zhí)行到此處,結(jié)果: 1a2b2b
}
}
答:輸出結(jié)果為1a2b2b;類的static 代碼段,可以看作是類首次加載(虛擬機(jī)加
載)執(zhí)行的代碼,而對于類加載,首先要執(zhí)行其基類的構(gòu)造,再執(zhí)行其本身的構(gòu)造。
50、繼承時(shí)候類的執(zhí)行順序問題,一般都是選擇題,問你將會打印出什么?【基礎(chǔ)】
父類:
package test;
public class FatherClass {
public FatherClass() {
System.out.println("FatherClass Create");
}
}
子類:
package test;
第9 頁共59 頁
import test.FatherClass;
public class ChildClass extends FatherClass {
public ChildClass() {
System.out.println("ChildClass Create");
}
public static void main(String[] args) {
FatherClass fc = new FatherClass();
ChildClass cc = new ChildClass();
}
}
答:輸出結(jié)果為:
FatherClass Create
FatherClass Create
ChildClass Create
51、內(nèi)部類的實(shí)現(xiàn)方式? 【基礎(chǔ)】
答:示例代碼如下:
package test;
public class OuterClass {
private class InterClass {
public InterClass() {
System.out.println("InterClass Create");
}
}
public OuterClass() {
InterClass ic = new InterClass();
System.out.println("OuterClass Create");
}
public static void main(String[] args) {
OuterClass oc = new OuterClass();
}
}
輸出結(jié)果為:
InterClass Create
OuterClass Create
52、關(guān)于內(nèi)部類: 【基礎(chǔ)】
public class OuterClass {
private double d1 = 1.0;
//insert code here
}
You need to insert an inner class declaration at line 3,Which two
inner class declarations are valid?(Choose two.)
A. class InnerOne{
第10 頁共59 頁
public static double methoda() {return d1;}
}
B. public class InnerOne{
static double methoda() {return d1;}
}
C. private class InnerOne{
double methoda() {return d1;}
}
D. static class InnerOne{
protected double methoda() {return d1;}
}
E. abstract class InnerOne{
public abstract double methoda();
}
答:答案為C、E;說明如下:
1)靜態(tài)內(nèi)部類可以有靜態(tài)成員,而非靜態(tài)內(nèi)部類則不能有靜態(tài)成員;故A、B
錯(cuò);
2)靜態(tài)內(nèi)部類的非靜態(tài)成員可以訪問外部類的靜態(tài)變量,而不可訪問外部類
的非靜態(tài)變量;故D 錯(cuò);
3)非靜態(tài)內(nèi)部類的非靜態(tài)成員可以訪問外部類的非靜態(tài)變量;故C 正確。
53、數(shù)據(jù)類型之間的轉(zhuǎn)換:
1)如何將數(shù)值型字符轉(zhuǎn)換為數(shù)字?
2)如何將數(shù)字轉(zhuǎn)換為字符?
3)如何取小數(shù)點(diǎn)前兩位并四舍五入? 【基礎(chǔ)】
答:1)調(diào)用數(shù)值類型相應(yīng)包裝類中的方法parse***(String)或valueOf(String)
即可返回相應(yīng)基本類型或包裝類型數(shù)值;
2)將數(shù)字與空字符串相加即可獲得其所對應(yīng)的字符串;另外對于基本類型
數(shù)字還可調(diào)用String 類中的valueOf(…)方法返回相應(yīng)字符串,而對于包裝類型
數(shù)字則可調(diào)用其toString()方法獲得相應(yīng)字符串;
3)可用該數(shù)字構(gòu)造一java.math.BigDecimal 對象,再利用其round()方法
進(jìn)行四舍五入到保留小數(shù)點(diǎn)后兩位,再將其轉(zhuǎn)換為字符串截取最后兩位。
54、字符串操作:如何實(shí)現(xiàn)字符串的反轉(zhuǎn)及替換?【基礎(chǔ)】
答:可用字符串構(gòu)造一StringBuffer 對象,然后調(diào)用StringBuffer 中的reverse
方法即可實(shí)現(xiàn)字符串的反轉(zhuǎn),調(diào)用replace 方法即可實(shí)現(xiàn)字符串的替換。
55、編碼轉(zhuǎn)換:怎樣將GB2312 編碼的字符串轉(zhuǎn)換為ISO-8859-1 編碼的字符串?
【基礎(chǔ)】
答:示例代碼如下:
String s1 = "你好";
String s2 = new String(s1.getBytes("GB2312"), "ISO-8859-1");
56、寫一個(gè)函數(shù),要求輸入一個(gè)字符串和一個(gè)字符長度,對該字符串進(jìn)行分
隔。【基礎(chǔ)】
第11 頁共59 頁
答:函數(shù)代碼如下:
public String[] split(String str, int chars){
int n = (str.length()+ chars - 1)/chars;
String ret[] = new String[n];
for(int i=0; i<n; i++){
if(i < n-1){
ret[i] = str.substring(i*chars , (i+1)*chars);
}else{
ret[i] = str.substring(i*chars);
}
}
return ret;
}
57、寫一個(gè)函數(shù),2 個(gè)參數(shù),1 個(gè)字符串,1 個(gè)字節(jié)數(shù),返回截取的字符串,要
求字符串中的中文不能出現(xiàn)亂碼:如(“我ABC”,4)應(yīng)該截為“我AB”,輸入(“我
ABC 漢DEF”,6)應(yīng)該輸出為“我ABC”而不是“我ABC+漢的半個(gè)”?!净A(chǔ)】
答:代碼如下:
public String subString(String str, int subBytes) {
int bytes = 0; // 用來存儲字符串的總字節(jié)數(shù)
for (int i = 0; i < str.length(); i++) {
if (bytes == subBytes) {
return str.substring(0, i);
}
char c = str.charAt(i);
if (c < 256) {
bytes += 1; // 英文字符的字節(jié)數(shù)看作1
} else {
bytes += 2; // 中文字符的字節(jié)數(shù)看作2
if(bytes - subBytes == 1){
return str.substring(0, i);
}
}
}
return str;
}
58、日期和時(shí)間:
1)如何取得年月日、小時(shí)分秒?
2)如何取得從1970 年到現(xiàn)在的毫秒數(shù)?
3)如何取得某個(gè)日期是當(dāng)月的最后一天?
4)如何格式化日期?【基礎(chǔ)】
答:1)創(chuàng)建java.util.Calendar 實(shí)例(Calendar.getInstance()),調(diào)用其get()
方法傳入不同的參數(shù)即可獲得參數(shù)所對應(yīng)的值,如:
第12 頁共59 頁
calendar.get(Calendar.YEAR);//獲得年
2)以下方法均可獲得該毫秒數(shù):
Calendar.getInstance().getTimeInMillis();
System.currentTimeMillis();
3)示例代碼如下:
Calendar time = Calendar.getInstance();
time.set(Calendar.DAY_OF_MONTH,
time.getActualMaximum(Calendar.DAY_OF_MONTH));
4)利用java.text.DataFormat 類中的format()方法可將日期格式化。
59、Java 編程,打印昨天的當(dāng)前時(shí)刻。【基礎(chǔ)】
答:public class YesterdayCurrent{
public static void main(String[] args){
Calendar cal = Calendar.getInstance();
cal.add(Calendar.DATE, -1);
System.out.println(cal.getTime());
}
}
60、java 和javasciprt 的區(qū)別?!净A(chǔ)】
答:JavaScript 與Java 是兩個(gè)公司開發(fā)的不同的兩個(gè)產(chǎn)品。Java 是SUN 公司推
出的新一代面向?qū)ο蟮某绦蛟O(shè)計(jì)語言,特別適合于Internet 應(yīng)用程序開發(fā);而
JavaScript 是Netscape 公司的產(chǎn)品,其目的是為了擴(kuò)展Netscape Navigator
功能,而開發(fā)的一種可以嵌入Web 頁面中的基于對象和事件驅(qū)動(dòng)的解釋性語言,
它的前身是Live Script;而Java 的前身是Oak 語言。下面對兩種語言間的異
同作如下比較:
1)基于對象和面向?qū)ο螅?/div>
Java 是一種真正的面向?qū)ο蟮恼Z言,即使是開發(fā)簡單的程序,必須設(shè)計(jì)對象;
JavaScript 是種腳本語言,它可以用來制作與網(wǎng)絡(luò)無關(guān)的,與用戶交互作用
的復(fù)雜軟件。它是一種基于對象(Object Based)和事件驅(qū)動(dòng)(Event Driver)
的編程語言。因而它本身提供了非常豐富的內(nèi)部對象供設(shè)計(jì)人員使用;
2)解釋和編譯:
Java 的源代碼在執(zhí)行之前,必須經(jīng)過編譯;
JavaScript 是一種解釋性編程語言,其源代碼不需經(jīng)過編譯,由瀏覽器解釋
執(zhí)行;
3)強(qiáng)類型變量和類型弱變量:
Java 采用強(qiáng)類型變量檢查,即所有變量在編譯之前必須作聲明;
JavaScript 中變量聲明,采用其弱類型。即變量在使用前不需作聲明,而是
解釋器在運(yùn)行時(shí)檢查其數(shù)據(jù)類型;
4)代碼格式不一樣。
61、什么時(shí)候用assert?【中等難度】
答:assertion(斷言)在軟件開發(fā)中是一種常用的調(diào)試方式,很多開發(fā)語言中都
支持這種機(jī)制。一般來說,assertion 用于保證程序最基本、關(guān)鍵的正確性。
assertion 檢查通常在開發(fā)和測試時(shí)開啟。為了提高性能,在軟件發(fā)布后,
第13 頁共59 頁
assertion 檢查通常是關(guān)閉的。在實(shí)現(xiàn)中,斷言是一個(gè)包含布爾表達(dá)式的語句,
在執(zhí)行這個(gè)語句時(shí)假定該表達(dá)式為true;如果表達(dá)式計(jì)算為false,那么系統(tǒng)
會報(bào)告一個(gè)Assertionerror。
斷言用于調(diào)試目的:
assert(a > 0); // throws an Assertionerror if a <= 0
斷言可以有兩種形式:
assert Expression1 ;
assert Expression1 : Expression2 ;
Expression1 應(yīng)該總是產(chǎn)生一個(gè)布爾值。
Expression2 可以是得出一個(gè)值的任意表達(dá)式;這個(gè)值用于生成顯示更多調(diào)
試信息的String 消息。
斷言在默認(rèn)情況下是禁用的,要在編譯時(shí)啟用斷言,需使用source 1.4 標(biāo)記:
javac -source 1.4 Test.java
要在運(yùn)行時(shí)啟用斷言,可使用-enableassertions 或者-ea 標(biāo)記。
要在運(yùn)行時(shí)選擇禁用斷言,可使用-da 或者-disableassertions 標(biāo)記。
要在系統(tǒng)類中啟用斷言,可使用-esa 或者-dsa 標(biāo)記。還可以在包的基礎(chǔ)上
啟用或者禁用斷言。可以在預(yù)計(jì)正常情況下不會到達(dá)的任何位置上放置斷言。斷
言可以用于驗(yàn)證傳遞給私有方法的參數(shù)。不過,斷言不應(yīng)該用于驗(yàn)證傳遞給公有
方法的參數(shù),因?yàn)椴还苁欠駟⒂昧藬嘌?,公有方法都必須檢查其參數(shù)。不過,既
可以在公有方法中,也可以在非公有方法中利用斷言測試后置條件。另外,斷言
不應(yīng)該以任何方式改變程序的狀態(tài)。
異常部分:(共8 題:基礎(chǔ)8 道)
62、Java 中的異常處理機(jī)制的簡單原理和應(yīng)用?【基礎(chǔ)】
答:當(dāng)JAVA 程序違反了JAVA 的語義規(guī)則時(shí),JAVA 虛擬機(jī)就會將發(fā)生的錯(cuò)誤表
示為一個(gè)異常。違反語義規(guī)則包括2 種情況。一種是JAVA 類庫內(nèi)置的語義檢查。
例如數(shù)組下標(biāo)越界,會引發(fā)IndexOutOfBoundsException;訪問null 的對象時(shí)會
引發(fā)NullPointerException。另一種情況就是JAVA 允許程序員擴(kuò)展這種語義檢
查,程序員可以創(chuàng)建自己的異常,并自由選擇在何時(shí)用throw 關(guān)鍵字引發(fā)異常。
所有的異常都是java.lang.Thowable 的子類。
63、error 和exception 有什么區(qū)別? 【基礎(chǔ)】
答:error 表示系統(tǒng)級的錯(cuò)誤和程序不必處理的異常,是恢復(fù)不是不可能但很困
難的情況下的一種嚴(yán)重問題;比如內(nèi)存溢出,不可能指望程序能處理這樣的情況;
exception 表示需要捕捉或者需要程序進(jìn)行處理的異常,是一種設(shè)計(jì)或?qū)崿F(xiàn)
問題;也就是說,它表示如果程序運(yùn)行正常,從不會發(fā)生的情況。
64、try {}里有一個(gè)return 語句,那么緊跟在這個(gè)try 后的finally {}里的code
會不會被執(zhí)行,什么時(shí)候被執(zhí)行,在return 前還是后? 【基礎(chǔ)】
答:會執(zhí)行,在return 前執(zhí)行。
65、JAVA 語言如何進(jìn)行異常處理,關(guān)鍵字:throws,throw,try,catch,finally
分別代表什么意義?在try 塊中可以拋出異常嗎?【基礎(chǔ)】
答:Java 通過面向?qū)ο蟮姆椒ㄟM(jìn)行異常處理,把各種不同的異常進(jìn)行分類,并
第14 頁共59 頁
提供了良好的接口。在Java 中,每個(gè)異常都是一個(gè)對象,它是Throwable 類或
其它子類的實(shí)例。當(dāng)一個(gè)方法出現(xiàn)異常后便拋出一個(gè)異常對象,該對象中包含有
異常信息,調(diào)用這個(gè)對象的方法可以捕獲到這個(gè)異常并進(jìn)行處理。Java 的異常
處理是通過5 個(gè)關(guān)鍵詞來實(shí)現(xiàn)的:try、catch、throw、throws 和finally。一
般情況下是用try 來執(zhí)行一段程序,如果出現(xiàn)異常,系統(tǒng)會拋出(throws)一個(gè)
異常,這時(shí)候你可以通過它的類型來捕捉(catch)它,或最后(finally)由缺
省處理器來處理;
try 用來指定一塊預(yù)防所有“異?!钡某绦?;
catch 子句緊跟在try 塊后面,用來指定你想要捕捉的“異?!钡念愋?;
throw 語句用來明確地拋出一個(gè)“異?!保?/div>
throws 用來標(biāo)明一個(gè)成員函數(shù)可能拋出的各種“異?!保?/div>
Finally 為確保一段代碼不管發(fā)生什么“異?!倍急粓?zhí)行一段代碼;
可以在一個(gè)成員函數(shù)調(diào)用的外面寫一個(gè)try 語句,在這個(gè)成員函數(shù)內(nèi)部寫另一
個(gè)try 語句保護(hù)其他代碼。每當(dāng)遇到一個(gè)try 語句,“異常”的框架就放到堆棧
上面,直到所有的try 語句都完成。如果下一級的try 語句沒有對某種“異?!?/div>
進(jìn)行處理,堆棧就會展開,直到遇到有處理這種“異常”的try 語句。
66、運(yùn)行時(shí)異常與一般異常有何異同?【基礎(chǔ)】
答:異常表示程序運(yùn)行過程中可能出現(xiàn)的非正常狀態(tài),運(yùn)行時(shí)異常表示虛擬機(jī)的
通常操作中可能遇到的異常,是一種常見運(yùn)行錯(cuò)誤。java 編譯器要求方法必須
聲明拋出可能發(fā)生的非運(yùn)行時(shí)異常,但是并不要求必須聲明拋出未被捕獲的運(yùn)行
時(shí)異常。
67、給我一個(gè)你最常見到的runtime exception?【基礎(chǔ)】
答:ArithmeticException, ArrayStoreException, BufferOverflowException,
BufferUnderflowException, CannotRedoException, CannotUndoException,
ClassCastException, CMMException, ConcurrentModificationException,
DOMException, EmptyStackException, IllegalArgumentException,
IllegalMonitorStateException, IllegalPathStateException,
IllegalStateException, ImagingOpException, IndexOutOfBoundsException,
MissingResourceException, NegativeArraySizeException,
NoSuchElementException, NullPointerException, ProfileDataException,
ProviderException, RasterFormatException, SecurityException,
SystemException, UndeclaredThrowableException,
UnmodifiableSetException, UnsupportedOperationException
68、final, finally, finalize 的區(qū)別? 【基礎(chǔ)】
答:final:修飾符(關(guān)鍵字);如果一個(gè)類被聲明為final,意味著它不能再
派生出新的子類,不能作為父類被繼承,因此一個(gè)類不能既被聲明為abstract
的,又被聲明為final 的;將變量或方法聲明為final,可以保證它們在使用中
不被改變;被聲明為final 的變量必須在聲明時(shí)給定初值,而在以后的引用中只
能讀取,不可修改;被聲明為final 的方法也同樣只能使用,不能重載。
finally:再異常處理時(shí)提供finally 塊來執(zhí)行任何清除操作;如果拋出一
個(gè)異常,那么相匹配的catch 子句就會執(zhí)行,然后控制就會進(jìn)入finally 塊(如
果有的話)。
第15 頁共59 頁
finalize:方法名;Java 技術(shù)允許使用finalize() 方法在垃圾收集器將
對象從內(nèi)存中清除出去之前做必要的清理工作。這個(gè)方法是由垃圾收集器在確定
這個(gè)對象沒有被引用時(shí)對這個(gè)對象調(diào)用的。它是在Object 類中定義的,因此所
有的類都繼承了它。子類覆蓋finalize() 方法以整理系統(tǒng)資源或者執(zhí)行其他清
理工作。finalize() 方法是在垃圾收集器刪除對象之前對這個(gè)對象調(diào)用的。
69、類Example A 繼承Exception,類ExampleB 繼承Example A;【基礎(chǔ)】
有如下代碼片斷:
try{
throw new ExampleB(“b”);
}catch(ExampleA e){
System.out.printfln(“ExampleA”);
}catch(Exception e){
System.out.printfln(“Exception”);
}
輸出的內(nèi)容應(yīng)該是:
A:ExampleA B:Exception C:b D:無
答:輸出為A。
集合部分:(共11 題:基礎(chǔ)11 道)
70、介紹JAVA 中的Collection FrameWork(及如何寫自己的數(shù)據(jù)結(jié)構(gòu))【基礎(chǔ)】
答:Collection FrameWork 如下:
Collection
├List
│├LinkedList
│├ArrayList
│└Vector
│ └Stack
└Set
Map
├Hashtable
├HashMap
└WeakHashMap
Collection 是最基本的集合接口,一個(gè)Collection 代表一組Object,即
Collection 的元素(Elements); Map 提供key 到value 的映射。
71、List,Set,Map 是否繼承自Collection 接口?【基礎(chǔ)】
答:List,Set 是;Map 不是。
72、你所知道的集合類都有哪些?主要方法?【基礎(chǔ)】
答:最常用的集合類是List 和Map。List 的具體實(shí)現(xiàn)包括ArrayList 和
Vector,它們是可變大小的列表,比較適合構(gòu)建、存儲和操作任何類型對象的元
素列表。List 適用于按數(shù)值索引訪問元素的情形。Map 提供了一個(gè)更通用的
第16 頁共59 頁
元素存儲方法。Map 集合類用于存儲元素對(稱作“鍵”和“值”),其中每
個(gè)鍵映射到一個(gè)值。
73、說出ArrayList,Vector, LinkedList 的存儲性能和特性?【基礎(chǔ)】
答:ArrayList 和Vector 都是使用數(shù)組方式存儲數(shù)據(jù),此數(shù)組元素?cái)?shù)大于實(shí)際
存儲的數(shù)據(jù)以便增加和插入元素,它們都允許直接按序號索引元素,但是插入元
素要涉及數(shù)組元素移動(dòng)等內(nèi)存操作,所以索引數(shù)據(jù)快而插入數(shù)據(jù)慢,Vector 由
于使用了synchronized 方法(線程安全),通常性能上較ArrayList 差,而
LinkedList 使用雙向鏈表實(shí)現(xiàn)存儲,按序號索引數(shù)據(jù)需要進(jìn)行前向或后向遍歷,
但是插入數(shù)據(jù)時(shí)只需要記錄本項(xiàng)的前后項(xiàng)即可,所以插入速度較快。
74、Collection 和Collections 的區(qū)別?【基礎(chǔ)】
答:Collection 是java.util 下的接口,它是各種集合的父接口,繼承于它的
接口主要有Set 和List;Collections 是個(gè)java.util 下的類,是針對集合的
幫助類,提供一系列靜態(tài)方法實(shí)現(xiàn)對各種集合的搜索、排序、線程安全化等操作。
75、HashMap 和Hashtable 的區(qū)別? 【基礎(chǔ)】
答:二者都實(shí)現(xiàn)了Map 接口,是將惟一鍵映射到特定的值上;主要區(qū)別在于:
1)HashMap 沒有排序,允許一個(gè)null 鍵和多個(gè)null 值,而Hashtable 不允許;
2)HashMap 把Hashtable 的contains 方法去掉了,改成containsvalue 和
containsKey,因?yàn)閏ontains 方法容易讓人引起誤解;
3)Hashtable 繼承自Dictionary 類,HashMap 是Java1.2 引進(jìn)的Map 接口的實(shí)現(xiàn);
4)Hashtable 的方法是Synchronize 的,而HashMap 不是,在多個(gè)線程訪問
Hashtable 時(shí),不需要自己為它的方法實(shí)現(xiàn)同步,而HashMap 就必須為之提供外
同步。
Hashtable 和HashMap 采用的hash/rehash 算法大致一樣,所以性能不會有很
大的差異。
76、Arraylist 與Vector 區(qū)別?【基礎(chǔ)】
答:就ArrayList 與Vector 主要從二方面來說:
1)同步性:Vector 是線程安全的(同步),而ArrayList 是線程序不安全的;
2)數(shù)據(jù)增長:當(dāng)需要增長時(shí),Vector 默認(rèn)增長一倍,而ArrayList 卻是一半。
77、List、Map、Set 三個(gè)接口,存取元素時(shí),各有什么特點(diǎn)?【基礎(chǔ)】
答:List 以特定次序來持有元素,可有重復(fù)元素。Set 無法擁有重復(fù)元素,內(nèi)部
排序。Map 保存key-value 值,value 可多值。
78、Set 里的元素是不能重復(fù)的,那么用什么方法來區(qū)分重復(fù)與否呢? 是用==還
是equals()? 它們有何區(qū)別? 【基礎(chǔ)】
答:Set 里的元素是不能重復(fù)的,用equals ()方法來區(qū)分重復(fù)與否。覆蓋
equals()方法用來判斷對象的內(nèi)容是否相同,而”==”判斷地址是否相等,用來
決定引用值是否指向同一對象。
79、用程序給出隨便大小的10 個(gè)數(shù),序號為1-10,按從小到大順序輸出,并輸
出相應(yīng)的序號。【基礎(chǔ)】
第17 頁共59 頁
答:代碼如下:
package test;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Random;
public class RandomSort {
public static void printRandomBySort() {
Random random = new Random(); // 創(chuàng)建隨機(jī)數(shù)生成器
List list = new ArrayList();
// 生成10 個(gè)隨機(jī)數(shù),并放在集合list 中
for (int i = 0; i < 10; i++) {
list.add(random.nextInt(1000));
}
Collections.sort(list); // 對集合中的元素進(jìn)行排序
Iterator it = list.iterator();
int count = 0;
while (it.hasNext()) { // 順序輸出排序后集合中的元素
System.out.println(++count + ": " + it.next());
}
}
public static void main(String[] args) {
printRandomBySort();
}
}
80、用JAVA 實(shí)現(xiàn)一種排序,JAVA 類實(shí)現(xiàn)序列化的方法? 在COLLECTION 框架中,
實(shí)現(xiàn)比較要實(shí)現(xiàn)什么樣的接口?【基礎(chǔ)】
答:用插入法進(jìn)行排序代碼如下:
package test;
import java.util.*;
class InsertSort {
ArrayList al;
public InsertSort(int num,int mod) {
al = new ArrayList(num);
Random rand = new Random();
System.out.println("The ArrayList Sort Before:");
for (int i=0;i<num ;i++ ){
al.add(new Integer(Math.abs(rand.nextInt()) % mod +
1));
System.out.println("al["+i+"]="+al.get(i));
}
}
第18 頁共59 頁
public void SortIt(){
tempInt;
int MaxSize=1;
for(int i=1;i<al.size();i++){
tempInt = (Integer)al.remove(i);
if(tempInt.intValue() >=
((Integer)al.get(MaxSize-1)).intValue()){
al.add(MaxSize,tempInt);
MaxSize++;
System.out.println(al.toString());
}else{
for (int j=0;j<MaxSize ;j++ ){
if (((Integer)al.get(j)).intValue()
>=tempInt.intValue()){
al.add(j,tempInt);
MaxSize++;
System.out.println(al.toString());
break;
}
}
}
}
System.out.println("The ArrayList Sort After:");
for(int i=0;i<al.size();i++){
System.out.println("al["+i+"]="+al.get(i));
}
}
public static void main(String[] args){
InsertSort is = new InsertSort(10,100);
is.SortIt();
}
}
JAVA 類實(shí)現(xiàn)序例化的方法是實(shí)現(xiàn)java.io.Serializable 接口;
Collection 框架中實(shí)現(xiàn)比較要實(shí)現(xiàn)Comparable 接口和Comparator 接口。
線程部分:(共10 題:基礎(chǔ)7 道,中等難度3 道)
81、sleep() 和wait() 有什么區(qū)別? 【基礎(chǔ)】
答:sleep 是線程類(Thread)的方法,導(dǎo)致此線程暫停執(zhí)行指定時(shí)間,給執(zhí)行
機(jī)會給其他線程,但是監(jiān)控狀態(tài)依然保持,到時(shí)后會自動(dòng)恢復(fù)。調(diào)用sleep 不會
釋放對象鎖。wait 是Object 類的方法,對此對象調(diào)用wait 方法導(dǎo)致本線程放
棄對象鎖,進(jìn)入等待此對象的等待鎖定池,只有針對此對象發(fā)出notify 方法(或
notifyAll)后本線程才進(jìn)入對象鎖定池準(zhǔn)備獲得對象鎖進(jìn)入運(yùn)行狀態(tài)。
第19 頁共59 頁
82、當(dāng)一個(gè)線程進(jìn)入一個(gè)對象的一個(gè)synchronized 方法后,其它線程是否可進(jìn)
入此對象的其它方法? 【基礎(chǔ)】
答:其它線程只能訪問該對象的其它非同步方法,同步方法則不能進(jìn)入。
83、請說出你所知道的線程同步的方法。【基礎(chǔ)】
答:wait():使一個(gè)線程處于等待狀態(tài),并且釋放所持有的對象的lock;
sleep():使一個(gè)正在運(yùn)行的線程處于睡眠狀態(tài),是一個(gè)靜態(tài)方法,調(diào)用此方
法要捕捉InterruptedException 異常;
notify():喚醒一個(gè)處于等待狀態(tài)的線程,注意的是在調(diào)用此方法的時(shí)候,
并不能確切的喚醒某一個(gè)等待狀態(tài)的線程,而是由JVM 確定喚醒哪個(gè)線程,而且
不是按優(yōu)先級;
notityAll():喚醒所有處入等待狀態(tài)的線程,注意并不是給所有喚醒線程一
個(gè)對象的鎖,而是讓它們競爭。
84、多線程有幾種實(shí)現(xiàn)方法,都是什么?同步有幾種實(shí)現(xiàn)方法,都是什么? 【基礎(chǔ)】
答:多線程有兩種實(shí)現(xiàn)方法,分別是繼承Thread 類與實(shí)現(xiàn)Runnable 接口,同步
的實(shí)現(xiàn)方面有兩種,分別是synchronized,wait 與notify。
85、同步和異步有何異同,在什么情況下分別使用他們?舉例說明?!净A(chǔ)】
答:如果數(shù)據(jù)將在線程間共享。例如正在寫的數(shù)據(jù)以后可能被另一個(gè)線程讀到,
或者正在讀的數(shù)據(jù)可能已經(jīng)被另一個(gè)線程寫過了,那么這些數(shù)據(jù)就是共享數(shù)據(jù),
必須進(jìn)行同步存取。當(dāng)應(yīng)用程序在對象上調(diào)用了一個(gè)需要花費(fèi)很長時(shí)間來執(zhí)行的
方法,并且不希望讓程序等待方法的返回時(shí),就應(yīng)該使用異步編程,在很多情況
下采用異步途徑往往更有效率。
86、啟動(dòng)一個(gè)線程是用run()還是start()?【基礎(chǔ)】
答:啟動(dòng)一個(gè)線程是調(diào)用start()方法,使線程所代表的虛擬處理機(jī)處于可運(yùn)行
狀態(tài),這意味著它可以由JVM 調(diào)度并執(zhí)行。這并不意味著線程就會立即運(yùn)行。
run()方法可以產(chǎn)生必須退出的標(biāo)志來停止一個(gè)線程。
87、線程的基本概念、線程的基本狀態(tài)以及狀態(tài)之間的關(guān)系?【基礎(chǔ)】
答:線程指在程序執(zhí)行過程中,能夠執(zhí)行程序代碼的一個(gè)執(zhí)行單位,每個(gè)程序至
少都有一個(gè)線程,也就是程序本身;
Java 中的線程有四種狀態(tài)分別是:運(yùn)行、就緒、掛起、結(jié)束。
88、簡述synchronized 和java.util.concurrent.locks.Lock 的異同?【中等
難度】
答:主要相同點(diǎn):Lock 能完成synchronized 所實(shí)現(xiàn)的所有功能;
主要不同點(diǎn):Lock 有比synchronized 更精確的線程語義和更好的性能。
synchronized 會自動(dòng)釋放鎖,而Lock 一定要求程序員手工釋放,并且必須在
finally 從句中釋放。
89、java 中有幾種方法可以實(shí)現(xiàn)一個(gè)線程?用什么關(guān)鍵字修飾同步方法?
stop()和suspend()方法為何不推薦使用?【中等難度】
答:有兩種實(shí)現(xiàn)方法,分別是繼承Thread 類與實(shí)現(xiàn)Runnable 接口;
第20 頁共59 頁
用synchronized 關(guān)鍵字修飾同步方法;
反對使用stop(),是因?yàn)樗话踩?。它會解除由線程獲取的所有鎖定,而
且如果對象處于一種不連貫狀態(tài),那么其他線程能在那種狀態(tài)下檢查和修改它
們。結(jié)果很難檢查出真正的問題所在;
suspend()方法容易發(fā)生死鎖。調(diào)用suspend()的時(shí)候,目標(biāo)線程會停下來,
但卻仍然持有在這之前獲得的鎖定。此時(shí),其他任何線程都不能訪問鎖定的資源,
除非被“掛起”的線程恢復(fù)運(yùn)行。對任何線程來說,如果它們想恢復(fù)目標(biāo)線程,
同時(shí)又試圖使用任何一個(gè)鎖定的資源,就會造成死鎖。故不應(yīng)該使用suspend(),
而應(yīng)在自己的Thread 類中置入一個(gè)標(biāo)志,指出線程應(yīng)該活動(dòng)還是掛起。若標(biāo)志
指出線程應(yīng)該掛起,便用wait()命其進(jìn)入等待狀態(tài)。若標(biāo)志指出線程應(yīng)當(dāng)恢復(fù),
則用一個(gè)notify()重新啟動(dòng)線程。
90、設(shè)計(jì)4 個(gè)線程,其中兩個(gè)線程每次對j 增加1,另兩個(gè)線程對j 每次減少1;
寫出程序。【中等難度】
答:以下程序使用內(nèi)部類實(shí)現(xiàn)線程,對j 增減的時(shí)候沒有考慮順序問題:
public class TestThread {
private int j;
public TestThread(int j) {this.j = j;}
private synchronized void inc(){
j++;
System.out.println(j + "--Inc--" +
Thread.currentThread().getName());
}
private synchronized void dec(){
j--;
System.out.println(j + "--Dec--" +
Thread.currentThread().getName());
}
public void run() {
(new Dec()).start();
new Thread(new Inc()).start();
(new Dec()).start();
new Thread(new Inc()).start();
}
class Dec extends Thread {
public void run() {
for(int i=0; i<100; i++){
dec();
}
}
}
class Inc implements Runnable {
public void run() {
for(int i=0; i<100; i++){
第21 頁共59 頁
inc();
}
}
}
public static void main(String[] args) {
(new TestThread(5)).run();
}
}
IO 流及Socket 部分:(共5 題:基礎(chǔ)5 道)
91、什么是java 序列化,如何實(shí)現(xiàn)java 序列化?【基礎(chǔ)】
答:序列化就是一種用來處理對象流的機(jī)制,所謂對象流也就是將對象的內(nèi)容進(jìn)
行流化??梢詫α骰蟮膶ο筮M(jìn)行讀寫操作,也可將流化后的對象傳輸于網(wǎng)絡(luò)之
間。序列化是為了解決在對對象流進(jìn)行讀寫操作時(shí)所引發(fā)的問題;
序列化的實(shí)現(xiàn):將需要被序列化的類實(shí)現(xiàn)Serializable 接口,該接口沒有需實(shí)
現(xiàn)的方法,implements Serializable 只是為了標(biāo)注該對象是可被序列化的,然
后使用一個(gè)輸出流(如FileOutputStream)來構(gòu)造一個(gè)ObjectOutputStream(對
象流)對象,接著,使用ObjectOutputStream 對象的writeObject(Object obj)
方法就可以將參數(shù)為obj 的對象寫出(即保存其狀態(tài)),要恢復(fù)的話則用輸入流。
92、java 中有幾種類型的流?JDK 為每種類型的流提供了一些抽象類以供繼承,
請說出他們分別是哪些類?【基礎(chǔ)】
答:字節(jié)流,字符流。字節(jié)流繼承于InputStream、OutputStream,字符流繼承
于Reader、Writer。在java.io 包中還有許多其他的流,主要是為了提高性能
和使用方便。
93、文件和目錄(IO)操作:
1)如何列出某個(gè)目錄下的所有文件?
2)如何列出某個(gè)目錄下的所有子目錄?
3)如何判斷一個(gè)文件或目錄是否存在?
4)如何讀寫文件?【基礎(chǔ)】
答:1)示例代碼如下:
File file = new File("e:\\總結(jié)");
File[] files = file.listFiles();
for(int i=0; i<files.length; i++){
if(files[i].isFile()) System.out.println(files[i]);
}
2)示例代碼如下:
File file = new File("e:\\總結(jié)");
File[] files = file.listFiles();
for(int i=0; i<files.length; i++){
if(files[i].isDirectory()) System.out.println(files[i]);
}
3)創(chuàng)建File 對象,調(diào)用其exsit()方法即可返回是否存在,如:
第22 頁共59 頁
System.out.println(new File("d:\\t.txt").exists());
4)示例代碼如下:
//讀文件:
FileInputStream fin = new FileInputStream("e:\\tt.txt");
byte[] bs = new byte[100];
while(true){
int len = fin.read(bs);
if(len <= 0) break;
System.out.print(new String(bs,0,len));
}
fin.close();
//寫文件:
FileWriter fw = new FileWriter("e:\\test.txt");
fw.write("hello world!" + System.getProperty("line.separator"));
fw.write("你好!北京!");
fw.close();
94、寫一個(gè)方法,輸入一個(gè)文件名和一個(gè)字符串,統(tǒng)計(jì)這個(gè)字符串在這個(gè)文件中出
現(xiàn)的次數(shù)?!净A(chǔ)】
答:代碼如下:
public int countWords(String file, String find) throws Exception
{
int count = 0;
Reader in = new FileReader(file);
int c;
while ((c = in.read()) != -1) {
while (c == find.charAt(0)) {
for (int i = 1; i < find.length(); i++) {
c = in.read();
if (c != find.charAt(i)) break;
if (i == find.length() - 1) count++;
}
}
}
return count;
}
95、Java 的通信編程,編程題(或問答),用JAVA SOCKET 編程,讀服務(wù)器幾個(gè)
字符,再寫入本地顯示?【基礎(chǔ)】
答:Server 端程序:
package test;
import java.net.*;
import java.io.*;
第23 頁共59 頁
public class Server{
private ServerSocket ss;
private Socket socket;
private BufferedReader in;
private PrintWriter out;
public Server(){
try {
ss=new ServerSocket(10000);
while(true){
socket = ss.accept();
String RemoteIP =
socket.getInetAddress().getHostAddress();
String RemotePort = ":"+socket.getLocalPort();
System.out.println("A client come in!IP:"
+ RemoteIP+RemotePort);
in = new BufferedReader(new
InputStreamReader(socket.getInputStream()));
String line = in.readLine();
System.out.println("Cleint send is :" + line);
out =
new PrintWriter(socket.getOutputStream(),true);
out.println("Your Message Received!");
out.close();
in.close();
socket.close();
}
}catch (IOException e){
out.println("wrong");
}
}
public static void main(String[] args){
new Server();
}
}
Client 端程序:
package test;
import java.io.*;
import java.net.*;
public class Client {
Socket socket;
BufferedReader in;
PrintWriter out;
public Client(){
第24 頁共59 頁
try {
System.out.println("Try to Connect to
127.0.0.1:10000");
socket = new Socket("127.0.0.1",10000);
System.out.println("The Server Connected!");
System.out.println("Please enter some Character:");
BufferedReader line = new BufferedReader(new
InputStreamReader(System.in));
out = new PrintWriter(socket.getOutputStream(),true);
out.println(line.readLine());
in = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
System.out.println(in.readLine());
out.close();
in.close();
socket.close();
}catch(IOException e){
out.println("Wrong");
}
}
public static void main(String[] args) {
new Client();
}
}
二、OOA/D 與UML 部分:(共6 題:基礎(chǔ)2 道,中等難度4 道)
96、UML 是什么?常用的幾種圖?【基礎(chǔ)】
答:UML 是標(biāo)準(zhǔn)建模語言;常用圖包括:用例圖,靜態(tài)圖(包括類圖、對象圖和包
圖),行為圖,交互圖(順序圖,合作圖),實(shí)現(xiàn)圖。
97、編程題: 寫一個(gè)Singleton 出來。【基礎(chǔ)】
答:Singleton 模式主要作用是保證在Java 應(yīng)用程序中,一個(gè)類Class 只有一
個(gè)實(shí)例存在。舉例:定義一個(gè)類,它的構(gòu)造函數(shù)為private 的,它有一個(gè)static
的private 的該類變量,在類初始化時(shí)實(shí)例話,通過一個(gè)public 的getInstance
方法獲取對它的引用,繼而調(diào)用其中的方法。
第一種形式:
public class Singleton {
private Singleton(){}
private static Singleton instance = new Singleton();
public static Singleton getInstance(){
return instance;
}
第25 頁共59 頁
}
第二種形式:
public class Singleton {
private static Singleton instance = null;
public static synchronized Singleton getInstance(){
if (instance==null)
instance=new Singleton();
return instance;
}
}
其他形式: 定義一個(gè)類,它的構(gòu)造函數(shù)為private 的,所有方法為static 的。
一般認(rèn)為第一種形式要更加安全些。
98、說說你所熟悉或聽說過的j2ee 中的幾種常用模式?及對設(shè)計(jì)模式的一些看
法?!局械入y度】
答:Session Facade Pattern:使用SessionBean 訪問EntityBean;
Message Facade Pattern:實(shí)現(xiàn)異步調(diào)用;
EJB Command Pattern:使用Command JavaBeans 取代SessionBean,實(shí)現(xiàn)
輕量級訪問;
Data Transfer Object Factory:通過DTO Factory 簡化EntityBean 數(shù)據(jù)
提供特性;
Generic Attribute Access:通過AttibuteAccess 接口簡化EntityBean
數(shù)據(jù)提供特性;
Business Interface:通過遠(yuǎn)程(本地)接口和Bean 類實(shí)現(xiàn)相同接口規(guī)范
業(yè)務(wù)邏輯一致性;
EJB 架構(gòu)的設(shè)計(jì)好壞將直接影響系統(tǒng)的性能、可擴(kuò)展性、可維護(hù)性、組件可
重用性及開發(fā)效率。項(xiàng)目越復(fù)雜,項(xiàng)目隊(duì)伍越龐大則越能體現(xiàn)良好設(shè)計(jì)的重要性。
99、Java 中常用的設(shè)計(jì)模式?說明工廠模式?【中等難度】
答:Java 中的23 種設(shè)計(jì)模式:Factory( 工廠模式),Builder( 建造模式), Factory
Method(工廠方法模式),Prototype(原始模型模式),Singleton(單例模式),
Facade(門面模式),Adapter(適配器模式), Bridge(橋梁模式), Composite
(合成模式),Decorator(裝飾模式), Flyweight(享元模式), Proxy(代
理模式),Command(命令模式), Interpreter(解釋器模式), Visitor(訪
問者模式),Iterator(迭代子模式), Mediator(調(diào)停者模式), Memento
(備忘錄模式),Observer(觀察者模式),State(狀態(tài)模式),Strategy(策
略模式),Template Method(模板方法模式), Chain Of Responsibleity(責(zé)
任鏈模式)。
工廠模式:工廠模式是一種經(jīng)常被使用到的模式,根據(jù)工廠模式實(shí)現(xiàn)的類可以根
據(jù)提供的數(shù)據(jù)生成一組類中某一個(gè)類的實(shí)例,通常這一組類有一個(gè)公共的抽象父
類并且實(shí)現(xiàn)了相同的方法,但是這些方法針對不同的數(shù)據(jù)進(jìn)行了不同的操作。首
先需要定義一個(gè)基類,該類的子類通過不同的方法實(shí)現(xiàn)了基類中的方法。然后需
要定義一個(gè)工廠類,工廠類可以根據(jù)條件生成不同的子類實(shí)例。當(dāng)?shù)玫阶宇惖膶?shí)
第26 頁共59 頁
例后,開發(fā)人員可以調(diào)用基類中的方法而不必考慮到底返回的是哪一個(gè)子類的實(shí)
例。
100、開發(fā)中都用到了那些設(shè)計(jì)模式?用在什么場合? 【中等難度】
答:每個(gè)模式都描述了一個(gè)在我們的環(huán)境中不斷出現(xiàn)的問題,然后描述了該問題
的解決方案的核心。通過這種方式,你可以無數(shù)次地使用那些已有的解決方案,
無需在重復(fù)相同的工作。主要用到了MVC 的設(shè)計(jì)模式,用來開發(fā)JSP/Servlet
或者J2EE 的相關(guān)應(yīng)用;及簡單工廠模式等。
101、你對軟件開發(fā)中迭代的含義的理解;【中等難度】
答:軟件開發(fā)中,各個(gè)開發(fā)階段不是順序執(zhí)行的,應(yīng)該是并行執(zhí)行,也就是迭代
的意思。這樣對于開發(fā)中的需求變化,及人員變動(dòng)都能得到更好的適應(yīng)。
三、XML 部分:(共4 題:基礎(chǔ)1 道,中等難度1 道,較難2 道)
102、XML 文檔定義有幾種形式?它們之間有何本質(zhì)區(qū)別?解析XML 文檔有哪幾
種方式?【基礎(chǔ)】
答:1)兩種形式:dtd 以及schema;
2)本質(zhì)區(qū)別:schema 本身是xml 的,可以被XML 解析器解析(這也是從DTD
上發(fā)展schema 的根本目的);
3)解析方式:有DOM,SAX,STAX 等:
DOM:處理大型文件時(shí)其性能下降的非常厲害。這個(gè)問題是由DOM 的樹結(jié)
構(gòu)所造成的,這種結(jié)構(gòu)占用的內(nèi)存較多,而且DOM 必須在解析文件之前把整個(gè)文
檔裝入內(nèi)存,適合對XML 的隨機(jī)訪問;
SAX:不同于DOM,SAX 是事件驅(qū)動(dòng)型的XML 解析方式。它順序讀取XML 文
件,不需要一次全部裝載整個(gè)文件。當(dāng)遇到像文件開頭,文檔結(jié)束,或者標(biāo)簽開
頭與標(biāo)簽結(jié)束時(shí),它會觸發(fā)一個(gè)事件,用戶通過在其回調(diào)事件中寫入處理代碼來
處理XML 文件,適合對XML 的順序訪問;
STAX:Streaming API for XML (StAX)。
103、你在項(xiàng)目中用到了xml 技術(shù)的哪些方面?如何實(shí)現(xiàn)的? 【中等難度】
答:用到了數(shù)據(jù)存貯,信息配置兩方面。在做數(shù)據(jù)交換平臺時(shí),將不能數(shù)據(jù)源的
數(shù)據(jù)組裝成XML 文件,然后將XML 文件壓縮打包加密后通過網(wǎng)絡(luò)傳送給接收者,
接收解密與解壓縮后再同XML 文件中還原相關(guān)信息進(jìn)行處理。在做軟件配置時(shí),
利用XML 可以很方便的進(jìn)行,軟件的各種配置參數(shù)都存貯在XML 文件中。
104、用jdom 解析xml 文件時(shí)如何解決中文問題?如何解析? 【較難】
答:看如下代碼,用編碼方式加以解決
package test;
import java.io.*;
public class DOMTest{
private String inFile = "c:\people.xml";
private String outFile = "c:\people.xml";
public static void main(String args[]){
new DOMTest();
第27 頁共59 頁
}
public DOMTest(){
try{
javax.xml.parsers.DocumentBuilder builder =
javax.xml.parsers.DocumentBuilderFactory.
newInstance().newDocumentBuilder();
org.w3c.dom.Document doc = builder.newDocument();
org.w3c.dom.Element root = doc.createElement("老師");
org.w3c.dom.Element wang = doc.createElement("王");
org.w3c.dom.Element liu = doc.createElement("劉");
wang.appendChild(doc.createTextNode("我是王老師"));
root.appendChild(wang);
doc.appendChild(root);
javax.xml.transform.Transformer transformer =
javax.xml.transform.TransformerFactory.
newInstance().newTransformer();
transformer.setOutputProperty(
javax.xml.transform.OutputKeys.ENCODING,"gb2312");
transformer.setOutputProperty(
javax.xml.transform.OutputKeys.INDENT, "yes");
transformer.transform(new
javax.xml.transform.dom.DOMSource(doc),
new javax.xml.transform.stream.StreamResult(outFile));
}catch (Exception e){
System.out.println (e.getMessage());
}
}
}
105、編程用JAVA 解析XML 的方式。【較難】
答:用SAX 方式解析XML,XML 文件如下:
<?xml version="1.0" encoding="gb2312"?>
<person>
<name>王小明</name>
<college>信息學(xué)院</college>
<telephone>6258113</telephone>
<notes>男,1955 年生,博士,95 年調(diào)入海南大學(xué)</notes>
</person>
事件回調(diào)類SAXHandler.java :
import java.io.*;
import java.util.Hashtable;
import org.xml.sax.*;
第28 頁共59 頁
public class SAXHandler extends HandlerBase{
private Hashtable table = new Hashtable();
private String currentElement = null;
private String currentValue = null;
public void setTable(Hashtable table){
this.table = table;
}
public Hashtable getTable(){
return table;
}
public void startElement(String tag, AttributeList attrs)
throws SAXException{
currentElement = tag;
}
public void characters(char[] ch, int start, int length)
throws SAXException{
currentValue = new String(ch, start, length);
}
public void endElement(String name) throws SAXException{
if (currentElement.equals(name))
table.put(currentElement, currentValue);
}
}
JSP 內(nèi)容顯示源碼,SaxXml.jsp:
<HTML>
<HEAD>
<TITLE>剖析XML 文件people.xml</TITLE>
</HEAD>
<BODY>
<%@ page errorPage="ErrPage.jsp"
contentType="text/html;charset=GB2312" %>
<%@ page import="java.io.*" %>
<%@ page import="java.util.Hashtable" %>
<%@ page import="org.w3c.dom.*" %>
<%@ page import="org.xml.sax.*" %>
<%@ page import="javax.xml.parsers.SAXParserFactory" %>
<%@ page import="javax.xml.parsers.SAXParser" %>
<%@ page import="SAXHandler" %>
<%
File file = new File("c:\people.xml");
FileReader reader = new FileReader(file);
Parser parser;
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser();
第29 頁共59 頁
SAXHandler handler = new SAXHandler();
sp.parse(new InputSource(reader), handler);
Hashtable hashTable = handler.getTable();
out.println("<TABLE BORDER=2><CAPTION>" +
"教師信息表</CAPTION>");
out.println("<TR><TD>姓名</TD>" + "<TD>" +
(String)hashTable.get(new String("name")) +
"</TD></TR>");
out.println("<TR><TD>學(xué)院</TD>" + "<TD>" +
(String)hashTable.get(new String("college"))
+"</TD></TR>");
out.println("<TR><TD>電話</TD>" + "<TD>" +
(String)hashTable.get(new String("telephone"))
+ "</TD></TR>");
out.println("<TR><TD>備注</TD>" + "<TD>" +
(String)hashTable.get(new String("notes"))
+ "</TD></TR>");
out.println("</TABLE>");
%>
</BODY>
</HTML>
四、數(shù)據(jù)庫及SQL 部分:(共4 題:基礎(chǔ)3 道,中等難度1 道)
106、有3 個(gè)表(15 分鐘):【基礎(chǔ)】
Student 學(xué)生表(學(xué)號,姓名,性別,年齡,組織部門)
Course 課程表(編號,課程名稱)
Sc 選課表(學(xué)號,課程編號,成績)
表結(jié)構(gòu)如下:
第30 頁共59 頁
1)寫一個(gè)SQL 語句,查詢選修了’計(jì)算機(jī)原理’的學(xué)生學(xué)號和姓名(3 分鐘)
2)寫一個(gè)SQL 語句,查詢’周星馳’同學(xué)選修了的課程名字(3 分鐘)
3)寫一個(gè)SQL 語句,查詢選修了5 門課程的學(xué)生學(xué)號和姓名(9 分鐘)
答:1)SQL 語句如下:
select stu.sno, stu.sname from Student stu
where (select count(*) from sc where sno=stu.sno and cno =
(select cno from Course where cname='計(jì)算機(jī)原理')) != 0;
2)SQL 語句如下:
select cname from Course
where cno in ( select cno from sc where sno =
(select sno from Student where sname='周星馳'));
3)SQL 語句如下:
select stu.sno, stu.sname from student stu
where (select count(*) from sc where sno=stu.sno) = 5;
107、有三張表,學(xué)生表S,課程C,學(xué)生課程表SC,學(xué)生可以選修多門課程,一門課
程可以被多個(gè)學(xué)生選修,通過SC 表關(guān)聯(lián)。【基礎(chǔ)】
1)寫出建表語句;
2)寫出SQL 語句,查詢選修了所有選修課程的學(xué)生;
3)寫出SQL 語句,查詢選修了至少5 門以上的課程的學(xué)生。
答:1)建表語句如下(mysql 數(shù)據(jù)庫):
create table s(id integer primary key, name varchar(20));
create table c(id integer primary key, name varchar(20));
create table sc(
sid integer references s(id),
cid integer references c(id),
primary key(sid,cid)
);
2)SQL 語句如下:
select stu.id, stu.name from s stu
where (select count(*) from sc where sid=stu.id)
= (select count(*) from c);
3)SQL 語句如下:
select stu.id, stu.name from s stu
where (select count(*) from sc where sid=stu.id)>=5;
108、數(shù)據(jù)庫表(Test)結(jié)構(gòu)如下:【基礎(chǔ)】
ID NAME AGE MANAGER(所屬主管人ID)
106 A 30 104
109 B 19 104
104 C 20 111
107 D 35 109
112 E 25 120
119 F 45 NULL
第31 頁共59 頁
要求:列出所有年齡比所屬主管年齡大的人的ID 和名字?
答:SQL 語句如下:
select employee.name from test employee
where employee.age > (select manager.age from test manager
where manager.id=employee.manager);
109、有如下兩張表:【中等難度】
表city: 表state:
CityNo CityName StateNo
BJ 北京(Null)
SH 上海(Null)
GZ 廣州GD
DL 大連LN
第32 頁共59 頁
欲得
到如下結(jié)果: City
No City Name State No State Name BJ
北京(Null) (Null) DL
大連LN 遼寧GZ
廣州GD 廣東SH
上海(Null) (Null) 寫相
應(yīng)的SQL 語句。
答:SQL 語句為:
SELECT C.CITYNO, C.CITYNAME, C.STATENO, S.STATENAME
FROM CITY C, STATE S
WHERE C.STATENO=S.STATENO(+)
ORDER BY(C.CITYNO);
五、JDBC 及Hibernate:(共12 題:基礎(chǔ)10 道,中等難度2 道)
110、數(shù)據(jù)庫,比如100 用戶同時(shí)來訪,要采取什么技術(shù)解決?【基礎(chǔ)】
答:可采用連接池。
111、什么是ORM?【基礎(chǔ)】
答:對象關(guān)系映射(Object—Relational Mapping,簡稱ORM)是一種為了解決
面向?qū)ο笈c面向關(guān)系數(shù)據(jù)庫存在的互不匹配的現(xiàn)象的技術(shù);簡單的說,ORM 是通
過使用描述對象和數(shù)據(jù)庫之間映射的元數(shù)據(jù),將java 程序中的對象自動(dòng)持久化
到關(guān)系數(shù)據(jù)庫中;本質(zhì)上就是將數(shù)據(jù)從一種形式轉(zhuǎn)換到另外一種形式。
112、Hibernate 有哪5 個(gè)核心接口?【基礎(chǔ)】
答:Configuration 接口:配置Hibernate,根據(jù)其啟動(dòng)hibernate,創(chuàng)建
SessionFactory 對象;
SessionFactory 接口:初始化Hibernate,充當(dāng)數(shù)據(jù)存儲源的代理,創(chuàng)建
session 對象,sessionFactory 是線程安全的,意味著它的同一個(gè)實(shí)例可以被應(yīng)
用的多個(gè)線程共享,是重量級、二級緩存;
Session 接口:負(fù)責(zé)保存、更新、刪除、加載和查詢對象,是線程不安全的,
避免多個(gè)線程共享同一個(gè)session,是輕量級、一級緩存;
Transaction 接口:管理事務(wù);
Query 和Criteria 接口:執(zhí)行數(shù)據(jù)庫的查詢。
113、關(guān)于hibernate: 【基礎(chǔ)】
1)在hibernate 中,在配置文件呈標(biāo)題一對多,多對多的標(biāo)簽是什么;
2)Hibernate 的二級緩存是什么;
3)Hibernate 是如何處理事務(wù)的;
答:1)一對多的標(biāo)簽為<one-to-many> ;多對多的標(biāo)簽為<many-to-many>;
2)sessionFactory 的緩存為hibernate 的二級緩存;
3)Hibernate 的事務(wù)實(shí)際上是底層的JDBC Transaction 的封裝或者是JTA
Transaction 的封裝;默認(rèn)情況下使用JDBCTransaction。
State
No
State
Name
GD 廣東
LN 遼寧
SD 山東
NMG 內(nèi)蒙古
第33 頁共59 頁
114、Hibernate 的應(yīng)用(Hibernate 的結(jié)構(gòu))?【基礎(chǔ)】
答://首先獲得SessionFactory 的對象
SessionFactory sessionFactory = new Configuration().configure().
buildSessionFactory();
//然后獲得session 的對象
Session session = sessionFactory.openSession();
//其次獲得Transaction 的對象
Transaction tx = session.beginTransaction();
//執(zhí)行相關(guān)的數(shù)據(jù)庫操作:增,刪,改,查
session.save(user); //增加, user 是User 類的對象
session.delete(user); //刪除
session.update(user); //更新
Query query = session.createQuery(“from User”); //查詢
List list = query.list();
//提交事務(wù)
tx.commit();
//如果有異常,我們還要作事務(wù)的回滾,恢復(fù)到操作之前
tx.rollback();
//最后還要關(guān)閉session,釋放資源
session.close();
115、什么是重量級?什么是輕量級?【基礎(chǔ)】
答:輕量級是指它的創(chuàng)建和銷毀不需要消耗太多的資源,意味著可以在程序中經(jīng)
常創(chuàng)建和銷毀session 的對象;重量級意味不能隨意的創(chuàng)建和銷毀它的實(shí)例,會
占用很多的資源。
116、數(shù)據(jù)庫的連接字符串?【基礎(chǔ)】
答:MS SQL Server
//第二種連接方式
Class.forName(“com.microsoft.jdbc.sqlserver.SQLServerDriver”).
newInstance();
conn = DriverManager.getConnection(“jdbc:Microsoft:sqlserver
://localhost:1433;DatabaseName=pubs”,”sa”,””);
//Oracle
Class.forName(“oracle.jdbc.driver.OracleDriver”).newInstance();
conn = DriverManager.getConnection(“jdbc:oracle:thin:
@localhost:1521:sid”, uid, pwd);
//Mysql
Class.forName(“org.git.mm.mysql.Driver”).newInstance();
conn = DriverManager.getConnection(“jdbc:mysql
://localhost:3306/pubs”,”root”,””);
處理中文的問題:
jdbc:mysql://localhost:3306/pubs?useUnicode=true
&characterEncoding=GB2312
第34 頁共59 頁
117、事務(wù)處理?【基礎(chǔ)】
答:Connection 類中提供了3 個(gè)事務(wù)處理方法:
setAutoCommit(Boolean autoCommit):設(shè)置是否自動(dòng)提交事務(wù),默認(rèn)為自動(dòng)
提交事務(wù),即為true,通過設(shè)置false 禁止自動(dòng)提交事務(wù);
commit():提交事務(wù);
rollback():回滾事務(wù)。
118、Java 中訪問數(shù)據(jù)庫的步驟?Statement 和PreparedStatement 之間的區(qū)別?
【基礎(chǔ)】
答:Java 中訪問數(shù)據(jù)庫的步驟如下:
1)注冊驅(qū)動(dòng);
2)建立連接;
3)創(chuàng)建Statement;
4)執(zhí)行sql 語句;
5)處理結(jié)果集(若sql 語句為查詢語句);
6)關(guān)閉連接。
PreparedStatement 被創(chuàng)建時(shí)即指定了SQL 語句,通常用于執(zhí)行多次結(jié)構(gòu)相
同的SQL 語句。
119、用你熟悉的語言寫一個(gè)連接ORACLE 數(shù)據(jù)庫的程序,能夠完成修改和查詢工
作?!净A(chǔ)】
答:JDBC 示例程序如下:
public void testJdbc(){
Connection con = null;
PreparedStatement ps = null;
ResultSet rs = null;
try{
//step1:注冊驅(qū)動(dòng);
Class.forName("oracle.jdbc.driver.OracleDriver");
//step 2:獲取數(shù)據(jù)庫連接;
con=DriverManager.getConnection(
"jdbc:oracle:thin:@192.168.0.39:1521:TARENADB",
"sd0605","sd0605");
/************************查詢************************/
//step 3:創(chuàng)建Statement;
String sql = "SELECT id, fname, lname, age, FROM
Person_Tbl";
ps = con.prepareStatement(sql);
//step 4 :執(zhí)行查詢語句,獲取結(jié)果集;
rs = ps.executeQuery();
//step 5:處理結(jié)果集—輸出結(jié)果集中保存的查詢結(jié)果;
while (rs.next()){
System.out.print("id = " + rs.getLong("id"));
System.out.print(" , fname = " +
第35 頁共59 頁
rs.getString("fname"));
System.out.print(" , lname = " +
rs.getString("lname"));
System.out.print(" , age = " + rs.getInt("age"));
}
/************************JDBC 修改*********************/
sql = "UPDATE Person_Tbl SET age=23 WHERE id = ?";
ps = con.prepareStatement(sql);
ps.setLong(1, 88);
int rows = ps.executeUpdate();
System.out.println(rows + " rows affected.");
} catch (Exception e){
e.printStackTrace();
} finally{
try{
con.close(); //關(guān)閉數(shù)據(jù)庫連接,以釋放資源。
} catch (Exception e1) {
}
}
}
120、JDBC,Hibernate 分頁怎樣實(shí)現(xiàn)?【中等難度】
答:方法分別為:
1) Hibernate 的分頁:
Query query = session.createQuery("from Student");
query.setFirstResult(firstResult);//設(shè)置每頁開始的記錄號
query.setMaxResults(resultNumber);//設(shè)置每頁顯示的記錄數(shù)
Collection students = query.list();
2) JDBC 的分頁:根據(jù)不同的數(shù)據(jù)庫采用不同的sql 分頁語句
例如: Oracle 中的sql 語句為: "SELECT * FROM (SELECT a.*, rownum r FROM
TB_STUDENT) WHERE r between 2 and 10" 查詢從記錄號2 到記錄號10 之間的
所有記錄
121、在ORACLE 大數(shù)據(jù)量下的分頁解決方法。一般用截取ID 方法,還有是三層
嵌套方法?!局械入y度】
答:一種分頁方法
<%
int i=1;
int numPages=14;
String pages = request.getParameter("page") ;
int currentPage = 1;
currentPage = (pages==null)?(1):{Integer.parseInt(pages)}
sql = "select count(*) from tables";
ResultSet rs = DBLink.executeQuery(sql) ;
第36 頁共59 頁
while(rs.next()) i = rs.getInt(1) ;
int intPageCount=1;
intPageCount=(i%numPages==0)?(i/numPages):(i/numPages+1);
int nextPage ;
int upPage;
nextPage = currentPage+1;
if (nextPage>=intPageCount) nextPage=intPageCount;
upPage = currentPage-1;
if (upPage<=1) upPage=1;
rs.close();
sql="select * from tables";
rs=DBLink.executeQuery(sql);
i=0;
while((i<numPages*(currentPage-1))&&rs.next()){i++;}
%>
//輸出內(nèi)容
//輸出翻頁連接
合計(jì):<%=currentPage%>/<%=intPageCount%>頁
<a href="List.jsp?page=1">第一頁</a>
<a href="List.jsp?page=<%=upPage%>">上一頁</a>
<%
for(int j=1;j<=intPageCount;j++){
if(currentPage!=j){
%>
<a href="list.jsp?page=<%=j%>">[<%=j%>]</a>
<%
}else{
out.println(j);
}
}
%>
<a href="List.jsp?page=<%=nextPage%>">下一頁</a>
<a href="List.jsp?page=<%=intPageCount%>">最后頁</a>
六、Web 部分:(共題:基礎(chǔ)40 道,基礎(chǔ)37 道,中等難度3 道)
122、說出Servlet 的生命周期,并說出Servlet 和CGI 的區(qū)別? 【基礎(chǔ)】
答:Web 容器加載Servlet 并將其實(shí)例化后,Servlet 生命周期開始,容器運(yùn)行
其init 方法進(jìn)行Servlet 的初始化,請求到達(dá)時(shí)運(yùn)行其service 方法,service
方法自動(dòng)派遣運(yùn)行與請求對應(yīng)的doXXX 方法(doGet,doPost)等,當(dāng)服務(wù)器決
定將實(shí)例銷毀的時(shí)候調(diào)用其destroy 方法。與cgi 的區(qū)別在于servlet 處于服務(wù)
器進(jìn)程中,它通過多線程方式運(yùn)行其service 方法,一個(gè)實(shí)例可以服務(wù)于多個(gè)請
求,并且其實(shí)例一般不會銷毀,而CGI 對每個(gè)請求都產(chǎn)生新的進(jìn)程,服務(wù)完成后
就銷毀,所以效率上低于servlet。
第37 頁共59 頁
123、Servlet 的基本架構(gòu)?!净A(chǔ)】
答:public class ServletName extends HttpServlet {
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
}
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
}
}
124、forward 和redirect 的區(qū)別? 【基礎(chǔ)】
答:forward 是容器中控制權(quán)的轉(zhuǎn)向,是服務(wù)器請求資源,服務(wù)器直接訪問目標(biāo)
地址的URL,把那個(gè)URL 的響應(yīng)內(nèi)容讀取過來,然后把這些內(nèi)容再發(fā)給瀏覽器,
瀏覽器根本不知道服務(wù)器發(fā)送的內(nèi)容是從哪兒來的,所以它的地址欄中還是原來
的地址。redirect 就是服務(wù)端根據(jù)邏輯,發(fā)送一個(gè)狀態(tài)碼,告訴瀏覽器重新去請
求那個(gè)地址,一般來說瀏覽器會用剛才請求的所有參數(shù)重新請求,所以
session,request 參數(shù)都可以獲取,并且從瀏覽器的地址欄中可以看到跳轉(zhuǎn)后的
鏈接地址。前者更加高效,在前者可以滿足需要時(shí),盡量使用forward()方法,
并且,這樣也有助于隱藏實(shí)際的鏈接;在有些情況下,比如,需要跳轉(zhuǎn)到一個(gè)其
它服務(wù)器上的資源,則必須使用sendRedirect()方法。
125、JSP 中動(dòng)態(tài)INCLUDE 與靜態(tài)INCLUDE 的區(qū)別?【基礎(chǔ)】
答:動(dòng)態(tài)INCLUDE 用jsp:include 動(dòng)作實(shí)現(xiàn)<jsp:include page="included.jsp"
flush="true" />它總是會檢查所含文件中的變化,適合用于包含動(dòng)態(tài)頁面,并
且可以帶參數(shù);靜態(tài)INCLUDE 用include 偽碼實(shí)現(xiàn),它不會檢查所含文件的變化,
適用于包含靜態(tài)頁面<%@ include file="included.htm" %>
126、說出數(shù)據(jù)連接池的工作機(jī)制是什么? 【基礎(chǔ)】
答:J2EE 服務(wù)器啟動(dòng)時(shí)會建立一定數(shù)量的池連接,并一直維持不少于此數(shù)目的
池連接??蛻舳顺绦蛐枰B接時(shí),池驅(qū)動(dòng)程序會返回一個(gè)未使用的池連接并將其
表記為忙。如果當(dāng)前沒有空閑連接,池驅(qū)動(dòng)程序就新建一定數(shù)量的連接,新建連
接的數(shù)量有配置參數(shù)決定。當(dāng)使用的池連接調(diào)用完成后,池驅(qū)動(dòng)程序?qū)⒋诉B接表
記為空閑,其他調(diào)用就可以使用這個(gè)連接。
127、JSP 的內(nèi)置對象及方法?【基礎(chǔ)】
答:request 表示HttpServletRequest 對象。它包含了有關(guān)瀏覽器請求的信息,
并且提供了幾個(gè)用于獲取cookie, header 和session 數(shù)據(jù)的有用的方法。
response 表示HttpServletResponse 對象,并提供了幾個(gè)用于設(shè)置送回瀏
覽器的響應(yīng)的方法(如cookies,頭信息等)。
out 對象是javax.jsp.JspWriter 的一個(gè)實(shí)例,并提供了幾個(gè)方法使你能用
于向?yàn)g覽器回送輸出結(jié)果。
pageContext 表示一個(gè)javax.servlet.jsp.PageContext 對象。它是用于方
便存取各種范圍的名字空間、servlet 相關(guān)的對象的API,并且包裝了通用的
第38 頁共59 頁
servlet 相關(guān)功能的方法。
session 表示一個(gè)請求的javax.servlet.http.HttpSession 對象。Session
可以存貯用戶的狀態(tài)信息。
application 表示一個(gè)javax.servle.ServletContext 對象。這有助于查找
有關(guān)servlet 引擎和servlet 環(huán)境的信息。
config 表示一個(gè)javax.servlet.ServletConfig 對象。該對象用于存取
servlet 實(shí)例的初始化參數(shù)。
page 表示從該頁面產(chǎn)生的一個(gè)servlet 實(shí)例。
128、JSP 的常用指令?【基礎(chǔ)】
答:<%@page language=”java” contenType=”text/html;charset=gb2312”
session=”true” buffer=”64kb” autoFlush=”true” isThreadSafe=”true”
info=”text” errorPage=”error.jsp” isErrorPage=”true” isELIgnored=”
true” pageEncoding=”gb2312” import=”java.sql.*”%>
isErrorPage:是否能使用Exception 對象;isELIgnored:是否忽略EL 表達(dá)式;
<%@include file=”filename”%>
<%@taglib prefix=”c”uri=”http://……”%>
129、jsp 有哪些動(dòng)作?作用分別是什么? 【基礎(chǔ)】
答:JSP 共有以下6 種基本動(dòng)作:
jsp:include:在頁面被請求的時(shí)候引入一個(gè)文件;
jsp:useBean:尋找或者實(shí)例化一個(gè)JavaBean。;
jsp:setProperty:設(shè)置JavaBean 的屬性。;
jsp:getProperty:輸出某個(gè)JavaBean 的屬性;
jsp:forward:把請求轉(zhuǎn)到一個(gè)新的頁面;
jsp:plugin:根據(jù)瀏覽器類型為Java 插件生成OBJECT 或EMBED 標(biāo)記。
130、jsp 有哪些內(nèi)置對象?作用分別是什么? 【基礎(chǔ)】
答:JSP 共有以下9 種基本內(nèi)置組件(可與ASP 的6 種內(nèi)部組件相對應(yīng)):
request:用戶端請求,此請求會包含來自GET/POST 請求的參數(shù);
response:網(wǎng)頁傳回用戶端的回應(yīng);
pageContext:網(wǎng)頁的屬性是在這里管理;
session:與請求有關(guān)的會話期;
application:servlet 正在執(zhí)行的內(nèi)容;
out:用來傳送回應(yīng)的輸出;
config:servlet 的構(gòu)架部件;
page:JSP 網(wǎng)頁本身;
exception:針對錯(cuò)誤網(wǎng)頁,未捕捉的例外。
131、get 和post 的區(qū)別?【基礎(chǔ)】
答:Form 中的get 和post 方法,在數(shù)據(jù)傳輸過程中分別對應(yīng)了HTTP 協(xié)議中的
GET 和POST 方法。二者主要區(qū)別如下:
1)Get 是用來從服務(wù)器上獲得數(shù)據(jù),而Post 是用來向服務(wù)器上傳遞數(shù)據(jù);
2)Get 將表單中數(shù)據(jù)按照variable=value 的形式,添加到action 所指向的
URL 后面,并且兩者使用“?”連接,而各個(gè)變量之間使用“&”連接;Post 是將
第39 頁共59 頁
表單中的數(shù)據(jù)放在form 的數(shù)據(jù)體中,按照變量和值相對應(yīng)的方式,傳遞到action
所指向URL;
3)Get 是不安全的,因?yàn)樵趥鬏斶^程,數(shù)據(jù)被放在請求的URL 中;Post 的
所有操作對用戶來說都是不可見的;
4)Get 傳輸?shù)臄?shù)據(jù)量小,這主要是因?yàn)槭躑RL 長度限制;而Post 可以傳輸
大量的數(shù)據(jù),所以在上傳文件只能使用Post;
5)Get 限制Form 表單的數(shù)據(jù)集必須為ASCII 字符,而Post 支持整個(gè)ISO10646
字符集;
6)Get 是Form 的默認(rèn)方法。
132、什么情況下調(diào)用doGet()和doPost()?【基礎(chǔ)】
答:Jsp 頁面中的form 標(biāo)簽里的method 屬性為get 時(shí)調(diào)用doGet(),為post
時(shí)調(diào)用doPost()。
133、如何從form 表單中得取checkbox 的值;【基礎(chǔ)】
答:可在頁面把checkbox 的name 屬性取同一個(gè),value 屬性取每個(gè)條目的id,
后臺用getParamter(“name”)能取到checkbox 的一組值。
134、頁面中有一個(gè)命名為bank No 的下拉列表,寫腳本獲取當(dāng)前選項(xiàng)的索引值。
【基礎(chǔ)】
答:用java 或javaScript 的處理方式分別如下:
Java: request.getParameter(“bank No”);
javaScript:
var selectItems = document.getElementsByName(“bank No”);
selectItems[0].value;
135、javascript 常用的方面;【基礎(chǔ)】
答:常用于數(shù)據(jù)輸入校驗(yàn)和頁面特殊效果等。
136、常用的web 容器和開發(fā)工具;【基礎(chǔ)】
答:最常用的容器包括:tomcat、weblogic;
開發(fā)工具有:eclipse,jbuilder。
137、請畫出Servlet 2.2 以上Web Application 的基本目錄結(jié)構(gòu)(2 分鐘)【基
礎(chǔ)】
答:目錄結(jié)構(gòu)如下圖所示:
webapps
|
Applocation
|
__________________
| |
JSP 頁面WEB-INF
|
___________________
第40 頁共59 頁
| | |
classes lib web.xml
138、JSP 和Servlet 有哪些相同點(diǎn)和不同點(diǎn),他們之間的聯(lián)系是什么?【基礎(chǔ)】
答:JSP 是Servlet 技術(shù)的擴(kuò)展,本質(zhì)上是Servlet 的簡易方式,更強(qiáng)調(diào)應(yīng)用的
外表表達(dá)。JSP 編譯后是"類servlet"。Servlet 和JSP 最主要的不同點(diǎn)在于,
Servlet 的應(yīng)用邏輯是在Java 文件中,并且完全從表示層中的HTML 里分離開來。
而JSP 的情況是Java 和HTML 可以組合成一個(gè)擴(kuò)展名為.jsp 的文件。JSP 側(cè)重于
視圖,Servlet 主要用于控制邏輯。
139、jsp 的四種范圍?【基礎(chǔ)】
答:a.page 是代表與一個(gè)頁面相關(guān)的對象和屬性。一個(gè)頁面由一個(gè)編譯好的
Java servlet 類(可以帶有任何的include 指令,但是沒有include 動(dòng)作)
表示。這既包括servlet 又包括被編譯成servlet 的JSP 頁面
b.request 是代表與Web 客戶機(jī)發(fā)出的一個(gè)請求相關(guān)的對象和屬性。一個(gè)
請求可能跨越多個(gè)頁面,涉及多個(gè)Web 組件(由于forward 指令和include 動(dòng)
作的關(guān)系)
c.session 是代表與用于某個(gè)Web 客戶機(jī)的一個(gè)用戶體驗(yàn)相關(guān)的對象和屬
性。一個(gè)Web 會話可以也經(jīng)常會跨越多個(gè)客戶機(jī)請求
d.application 是代表與整個(gè)Web 應(yīng)用程序相關(guān)的對象和屬性。這實(shí)質(zhì)上
是跨越整個(gè)Web 應(yīng)用程序,包括多個(gè)頁面、請求和會話的一個(gè)全局作用域。
140、Request 對象的主要方法? 【基礎(chǔ)】
答:setAttribute(String name,Object):設(shè)置名字為name 的屬性值
getAttribute(String name):返回由name 指定的屬性值
getAttributeNames():返回request 對象所有屬性的名字集合(枚舉)
getCookies():返回客戶端的所有Cookie 對象,結(jié)果是一個(gè)Cookie 數(shù)組
getCharacterEncoding():返回請求中的字符編碼方式
getContentLength():返回請求的Body 的長度
getHeader(String name):獲得HTTP 協(xié)議定義的文件頭信息
getHeaders(String name):返回指定名的request Header 的所有值(枚舉)
getHeaderNames():返回所有request Header 的名字(枚舉)
getInputStream():返回請求的輸入流,用于獲得請求中的數(shù)據(jù)
getMethod():獲得客戶端向服務(wù)器端傳送數(shù)據(jù)的方法
getParameter(String name):獲得客戶端請求中傳送的name 指定的參數(shù)值
getParameterNames():獲得客戶端傳送給服務(wù)器端的所有參數(shù)的名字(枚
舉)
getParameterValues(String name):獲得有name 指定的參數(shù)的所有值
getProtocol():獲取客戶端向服務(wù)器端傳送數(shù)據(jù)所依據(jù)的協(xié)議名稱
getQueryString():獲得查詢字符串
getRequestURI():獲取發(fā)出請求字符串的客戶端地址
getRemoteAddr():獲取客戶端的IP 地址
getRemoteHost():獲取客戶端的名字
getSession([Boolean create]):返回和請求相關(guān)Session
getServerName():獲取服務(wù)器的名字
第41 頁共59 頁
getServletPath():獲取客戶端所請求的腳本文件的路徑
getServerPort():獲取服務(wù)器的端口號
removeAttribute(String name):刪除請求中的一個(gè)屬性
141、如何實(shí)現(xiàn)servlet 的單線程模式?【基礎(chǔ)】
答:<%@page isThreadSafe=”false”%>
142、頁面間對象傳遞的方法?!净A(chǔ)】
答:request,session,application,cookie 等。
143、詳細(xì)描述MVC。【基礎(chǔ)】
答:基于Java 的Web 應(yīng)用系統(tǒng)采用MVC 架構(gòu)模式,即model(模型)、view(視
圖)、control(控制)分離設(shè)計(jì);這是目前WEB 應(yīng)用服務(wù)系統(tǒng)的主流設(shè)計(jì)方向。
Model:即處理業(yè)務(wù)邏輯的模塊,每一種處理一個(gè)模塊;
View:負(fù)責(zé)頁面顯示,顯示MODEL 處理結(jié)果給用戶,主要實(shí)現(xiàn)數(shù)據(jù)到頁面轉(zhuǎn)
換過程;
Control:負(fù)責(zé)每個(gè)請求的分發(fā),把FORM 數(shù)據(jù)傳遞給MODEL 處理,把處理結(jié)
果的數(shù)據(jù)傳遞給VIEW 顯示。
144、MVC 的各個(gè)部分都有那些技術(shù)來實(shí)現(xiàn)?如何實(shí)現(xiàn)? 【基礎(chǔ)】
答:MVC 是Model-View-Controller 的簡寫。"Model" 代表的是應(yīng)用的業(yè)務(wù)邏
輯(通過JavaBean,EJB 組件實(shí)現(xiàn)), "View" 是應(yīng)用的表示面(由JSP 頁面產(chǎn)
生),"Controller" 是提供應(yīng)用的處理過程控制(一般是一個(gè)Servlet),通
過這種設(shè)計(jì)模型把應(yīng)用邏輯,處理過程和顯示邏輯分成不同的組件實(shí)現(xiàn)。這些組
件可以進(jìn)行交互和重用。
145、應(yīng)用服務(wù)器有那些?【基礎(chǔ)】
答:BEA WebLogic Server, IBM WebSphere Application Server, Oracle9i
Application Server, JBoss, Tomcat。
146、Servlet 執(zhí)行時(shí)一般實(shí)現(xiàn)哪幾個(gè)方法?【基礎(chǔ)】
答:public void init(ServletConfig config)
public ServletConfig getServletConfig()
public String getServletInfo()
public void service(ServletRequest request,ServletResponse
response)
public void destroy()
147、struts 的入口類?【基礎(chǔ)】
答:是ActionServlet,所有的struts 請求都經(jīng)由該類轉(zhuǎn)發(fā)處理。
148、STRUTS 的應(yīng)用(如STRUTS 架構(gòu))?【基礎(chǔ)】
答:Struts 是采用Java Servlet/JavaServer Pages 技術(shù)開發(fā)Web 應(yīng)用程序的
開放源碼的framework。采用Struts 能開發(fā)出基于MVC(Model-View-
Controller)設(shè)計(jì)模式的應(yīng)用構(gòu)架。Struts 有如下的主要功能:
第42 頁共59 頁
1)包含一個(gè)controller servlet,能將用戶的請求發(fā)送到相應(yīng)的Action 對象;
2)JSP 自由tag 庫,并且在controller servlet 中提供關(guān)聯(lián)支持,幫助開發(fā)
人員創(chuàng)建交互式表單應(yīng)用;
3)提供了一系列實(shí)用對象:XML 處理、通過Java reflection APIs 自動(dòng)處理
JavaBeans 屬性、國際化的提示和消息。
149、幾種會話跟蹤技術(shù)?【基礎(chǔ)】
答:cookie、URL 重寫、設(shè)置表單隱藏域。
150、BS 與CS 的聯(lián)系與區(qū)別?【基礎(chǔ)】
答:C/S 是Client/Server 的縮寫,是客戶機(jī)與服務(wù)器結(jié)構(gòu)的應(yīng)用程序,服務(wù)器
通常采用高性能的PC、工作站或小型機(jī),并采用大型數(shù)據(jù)庫系統(tǒng),如Oracle、
Sybase、Informix 或SQL Server??蛻舳诵枰惭b專用的客戶端軟件。B/S是
Brower/Server 的縮寫,是瀏覽器和服務(wù)器結(jié)構(gòu)的應(yīng)用程序,即Web 應(yīng)用程序,
客戶機(jī)上只要安裝一個(gè)瀏覽器(Browser),如Netscape Navigator 或Internet
Explorer,服務(wù)器安裝Oracle、Sybase、Informix 或SQL Server 等數(shù)據(jù)庫。
在這種結(jié)構(gòu)下,用戶界面完全通過WWW 瀏覽器實(shí)現(xiàn),一部分事務(wù)邏輯在前端實(shí)現(xiàn),
但是主要事務(wù)邏輯在服務(wù)器端實(shí)現(xiàn)。瀏覽器通過Web Server 同數(shù)據(jù)庫進(jìn)行數(shù)據(jù)
交互。
C/S 與B/S 區(qū)別:
1)硬件環(huán)境不同:
C/S 一般建立在專用的網(wǎng)絡(luò)上, 小范圍里的網(wǎng)絡(luò)環(huán)境, 局域網(wǎng)之間再通過
專門服務(wù)器提供連接和數(shù)據(jù)交換服務(wù);
B/S 建立在廣域網(wǎng)之上的, 不必是專門的網(wǎng)絡(luò)硬件環(huán)境,例與電話上網(wǎng), 租
用設(shè)備. 信息自己管理. 有比C/S 更強(qiáng)的適應(yīng)范圍, 一般只要有操作系統(tǒng)和瀏
覽器就行;
2)對安全要求不同:
C/S 一般面向相對固定的用戶群, 對信息安全的控制能力很強(qiáng). 一般高度
機(jī)密的信息系統(tǒng)采用C/S 結(jié)構(gòu)適宜. 可以通過B/S 發(fā)布部分可公開信息;
B/S 建立在廣域網(wǎng)之上, 對安全的控制能力相對弱, 可能面向不可知的用
戶;
3)對程序架構(gòu)不同:
C/S 程序可以更加注重流程, 可以對權(quán)限多層次校驗(yàn), 對系統(tǒng)運(yùn)行速度可
以較少考慮;
B/S 對安全以及訪問速度的多重的考慮, 建立在需要更加優(yōu)化的基礎(chǔ)之上.
比C/S 有更高的要求B/S 結(jié)構(gòu)的程序架構(gòu)是發(fā)展的趨勢, 從MS 的.Net 系列的
BizTalk 2000 Exchange 2000 等, 全面支持網(wǎng)絡(luò)的構(gòu)件搭建的系統(tǒng). SUN 和
IBM 推的JavaBean 構(gòu)件技術(shù)等,使B/S 更加成熟;
4)軟件重用不同:
C/S 程序可以不可避免的整體性考慮, 構(gòu)件的重用性不如在B/S 要求下的
構(gòu)件的重用性好;
B/S 對的多重結(jié)構(gòu),要求構(gòu)件相對獨(dú)立的功能. 能夠相對較好的重用.就入
買來的餐桌可以再利用,而不是做在墻上的石頭桌子;
5)系統(tǒng)維護(hù)不同:
第43 頁共59 頁
C/S 程序由于整體性, 必須整體考察, 處理出現(xiàn)的問題以及系統(tǒng)升級. 升
級難. 可能是再做一個(gè)全新的系統(tǒng);
B/S 構(gòu)件組成,方面構(gòu)件個(gè)別的更換,實(shí)現(xiàn)系統(tǒng)的無縫升級. 系統(tǒng)維護(hù)開銷
減到最小.用戶從網(wǎng)上自己下載安裝就可以實(shí)現(xiàn)升級;
6)處理問題不同:
C/S 程序可以處理用戶面固定, 并且在相同區(qū)域, 安全要求高需求, 與操
作系統(tǒng)相關(guān). 應(yīng)該都是相同的系統(tǒng);
B/S 建立在廣域網(wǎng)上, 面向不同的用戶群, 分散地域, 這是C/S 無法作到
的. 與操作系統(tǒng)平臺關(guān)系最??;
7)用戶接口不同:
C/S 多是建立的Window 平臺上,表現(xiàn)方法有限,對程序員普遍要求較高;
B/S 建立在瀏覽器上, 有更加豐富和生動(dòng)的表現(xiàn)方式與用戶交流. 并且大
部分難度減低,減低開發(fā)成本;
8)信息流不同:
C/S 程序一般是典型的中央集權(quán)的機(jī)械式處理, 交互性相對低;
B/S 信息流向可變化, B-B B-C B-G 等信息、流向的變化, 更像交易中心。
151、過濾器有哪些作用?【基礎(chǔ)】
答:可以驗(yàn)證客戶是否來自可信的網(wǎng)絡(luò),可以對客戶提交的數(shù)據(jù)進(jìn)行重新編碼,
可以從系統(tǒng)里獲得配置的信息,可以過濾掉客戶的某些不應(yīng)該出現(xiàn)的詞匯,可以
驗(yàn)證用戶是否登錄,可以驗(yàn)證客戶的瀏覽器是否支持當(dāng)前的應(yīng)用,可以記錄系統(tǒng)
的日志等等。
152、過濾器的用法?(對客戶端的請求統(tǒng)一編碼和對客戶端進(jìn)行認(rèn)證)【基礎(chǔ)】
答:首先要實(shí)現(xiàn)(implements)Filter 接口,同時(shí)覆蓋Filter 接口的三個(gè)方法:
init(FilterConfig config) //用于獲得FilterConfig 對象;
doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) //進(jìn)行過濾處理一些業(yè)務(wù);
destroy() //銷毀Filter。
153、簡述HttpSession 的作用、使用方法,可用代碼說明。(3 分鐘)【基礎(chǔ)】
答:HttpSession 中可以跟蹤并儲存用戶信息,把值設(shè)置到屬性中,有2 個(gè)方法:
setAttribute(),getAttrribute();
例如:在一個(gè)方法中用session.setAttribute(“student”,student);在
session 中設(shè)置一個(gè)屬性名為student,值為一個(gè)名為student 的對象。而后可在
同一session 范圍內(nèi)用getAttribute(“student”)取出該屬性,得到student
對象。
154、介紹在JSP 中如何使用JavaBeans?【基礎(chǔ)】
答:在JSP 中使用JavaBean 常用的動(dòng)作有:
1)<jsp:useBean />:用來創(chuàng)建和查找bean 對象;
2)<jsp:setProperty />:用來設(shè)置bean 的屬性,即調(diào)用其setXxx()方法;
3)<jsp:getProperty />:用來獲得bean 的屬性,即調(diào)用其getXxx()方法。
第44 頁共59 頁
155、JSP 和Servlet 中的請求轉(zhuǎn)發(fā)分別如何實(shí)現(xiàn)?【基礎(chǔ)】
答:JSP 中的請求轉(zhuǎn)發(fā)可利用forward 動(dòng)作實(shí)現(xiàn):<jsp:forward />;
Serlvet 中實(shí)現(xiàn)請求轉(zhuǎn)發(fā)的方式為:
getServletContext().getRequestDispatcher(path).forward(req,res)。
156、Web.Xml 的作用?【基礎(chǔ)】
答:用于配置web 應(yīng)用的信息;如listener、filter 及servlet 的配置信息等。
157、寫出熟悉的JSTL 標(biāo)簽?!净A(chǔ)】
答:<c:if>、<c:choose>、<c: when>、<c: otherwise>、<c:forEach>、<c:set>。
158、說出struts 中的標(biāo)簽?!净A(chǔ)】
答:<bean:message /> <html:errors />
<bean:include /> <html:messages />
<bean:define /> <html:html>
<bean:write /> <html:form>
<bean:resource /> <html:link>
<bean:cokkie /> <html:text>
<bean:heder /> <logic:present />
<bean:parameter /> <logic:equal />
<bean:size />
159、JSP 標(biāo)簽的作用?如何定義?【中等難度】
答:作用:分離jsp 頁面的內(nèi)容和邏輯;
業(yè)務(wù)邏輯開發(fā)者可以創(chuàng)建自定義標(biāo)簽;
封裝業(yè)務(wù)邏輯;
可重用并且易維護(hù);
易于手工修改、易于工具維護(hù);
提供簡潔的語法;
定義:
寫標(biāo)簽處理器;
寫tld 文件;
講標(biāo)簽處理器和tld 文件放到同一個(gè)包里面;
把jsp 頁面和標(biāo)簽庫配置部署在一起。
160、寫一個(gè)自定義標(biāo)簽;【中等難度】
答:代碼如下:
import javax.servlet.jsp.tagext.*;
import javax.servlet.jsp.*;
import java.io.*;
public class TimeTag extends SimpleTagSupport{
private boolean isServer = true;
public void setServer(boolean isServer){
this.isServer = isServer;
}
第45 頁共59 頁
public void doTag() throws JspException, IOException{
JspWriter out = getJspContext().getOut();
if(isServer) {
out.println(new java.util.Date());
}else{
out.println("<script language=\"javascript\">");
out.println("document.write(new Date());");
out.println("</script>");
}
}
}
161、javascript 的優(yōu)缺點(diǎn)和內(nèi)置對象;【中等難度】
答:1)優(yōu)點(diǎn):簡單易用,與Java 有類似的語法,可以使用任何文本編輯工具編
寫,只需要瀏覽器就可執(zhí)行程序,并且事先不用編譯,逐行執(zhí)行,無需進(jìn)行嚴(yán)格
的變量聲明,而且內(nèi)置大量現(xiàn)成對象,編寫少量程序可以完成目標(biāo);
2)缺點(diǎn):不適合開發(fā)大型應(yīng)用程序;
3)Javascript 有11 種內(nèi)置對象:
Array、String、Date、Math、Boolean、Number、
Function、Global、Error、RegExp、Object。
七、EJB 及Spring 部分:
(共18 題:基礎(chǔ)4 道,中等難度13 道,較難1 道)
162、EJB 與JAVA BEAN 的區(qū)別?【基礎(chǔ)】
答:Java Bean 是可復(fù)用的組件,對Java Bean 并沒有嚴(yán)格的規(guī)范,理論上講,
任何一個(gè)Java 類都可以是一個(gè)Bean。但通常情況下,由于Java Bean 是被容器
所創(chuàng)建(如Tomcat)的,所以Java Bean 應(yīng)具有一個(gè)無參的構(gòu)造器,另外,通
常Java Bean 還要實(shí)現(xiàn)Serializable 接口用于實(shí)現(xiàn)Bean 的持久性。Java Bean
實(shí)際上相當(dāng)于微軟COM 模型中的本地進(jìn)程內(nèi)COM 組件,它是不能被跨進(jìn)程訪問的。
Enterprise Java Bean 相當(dāng)于DCOM,即分布式組件。它是基于Java 的遠(yuǎn)程方
法調(diào)用(RMI)技術(shù)的,所以EJB 可以被遠(yuǎn)程訪問(跨進(jìn)程、跨計(jì)算機(jī))。但EJB
必須被布署在諸如Webspere、WebLogic 這樣的容器中,EJB 客戶從不直接訪問
真正的EJB 組件,而是通過其容器訪問。EJB 容器是EJB 組件的代理,EJB 組件
由容器所創(chuàng)建和管理??蛻敉ㄟ^容器來訪問真正的EJB 組件。
163、EJB 的幾種類型?【基礎(chǔ)】
答:會話( Session)Bean、實(shí)體( Entity)Bean、消息驅(qū)動(dòng)的( Message Driven)Bean;
會話Bean 又可分為有狀態(tài)(Stateful)和無狀態(tài)(Stateless)兩種;實(shí)體Bean
可分為Bean 管理的持續(xù)性(BMP)和容器管理的持續(xù)性(CMP)兩種。
164、remote 接口和home 接口主要作用?【基礎(chǔ)】
答:remote 接口定義了業(yè)務(wù)方法,用于EJB 客戶端調(diào)用業(yè)務(wù)方法;
home 接口是EJB 工廠用于創(chuàng)建和移除查找EJB 實(shí)例。
第46 頁共59 頁
165、客服端口調(diào)用EJB 對象的幾個(gè)基本步驟?【基礎(chǔ)】
答:設(shè)置JNDI 服務(wù)工廠以及JNDI 服務(wù)地址系統(tǒng)屬性,查找Home 接口,從Home
接口調(diào)用Create 方法創(chuàng)建Remote 接口,通過Remote 接口調(diào)用其業(yè)務(wù)方法。
166、EJB 的角色和三個(gè)對象?【中等難度】
答:一個(gè)完整的基于EJB 的分布式計(jì)算結(jié)構(gòu)由六個(gè)角色組成,這六個(gè)角色可以由
不同的開發(fā)商提供,每個(gè)角色所作的工作必須遵循Sun 公司提供的EJB 規(guī)范,以
保證彼此之間的兼容性。這六個(gè)角色分別是EJB 組件開發(fā)者(Enterprise Bean
Provider) 、應(yīng)用組合者(Application Assembler)、部署者(Deployer) 、
EJB 服務(wù)器提供者(EJB Server Provider)、EJB 容器提供者(EJB Container
Provider)、系統(tǒng)管理員(System Administrator),這里面,EJB 容器是EJB
之所以能夠運(yùn)行的核心。EJB 容器管理著EJB 的創(chuàng)建,撤消,激活,去活,與數(shù)
據(jù)庫的連接等等重要的核心工作;三個(gè)對象是Remote(Local)接口、
Home(LocalHome)接口,Bean 類。
167、EJB 是基于哪些技術(shù)實(shí)現(xiàn)的?并說出SessionBean 和EntityBean 的區(qū)別,
StatefulBean 和StatelessBean 的區(qū)別?!局械入y度】
答:EJB 包括Session Bean、Entity Bean、Message Driven Bean,基于JNDI、
RMI、JTA 等技術(shù)實(shí)現(xiàn)。
SessionBean 在J2EE 應(yīng)用程序中被用來完成一些服務(wù)器端的業(yè)務(wù)操作,例
如訪問數(shù)據(jù)庫、調(diào)用其他EJB 組件。EntityBean 被用來代表應(yīng)用系統(tǒng)中用到的
數(shù)據(jù)。
對于客戶機(jī),SessionBean 是一種非持久性對象,它實(shí)現(xiàn)某些在服務(wù)器上運(yùn)
行的業(yè)務(wù)邏輯。
對于客戶機(jī),EntityBean 是一種持久性對象,它代表一個(gè)存儲在持久性存
儲器中的實(shí)體的對象視圖,或是一個(gè)由現(xiàn)有企業(yè)應(yīng)用程序?qū)崿F(xiàn)的實(shí)體。
Session Bean 還可以再細(xì)分為Stateful Session Bean 與Stateless
Session Bean ,這兩種的Session Bean 都可以將系統(tǒng)邏輯放在method 之中執(zhí)
行,不同的是Stateful Session Bean 可以記錄呼叫者的狀態(tài),因此通常來說,
一個(gè)使用者會有一個(gè)相對應(yīng)的Stateful Session Bean 的實(shí)體。Stateless
Session Bean 雖然也是邏輯組件,但是他卻不負(fù)責(zé)記錄使用者狀態(tài),也就是說
當(dāng)使用者呼叫Stateless Session Bean 的時(shí)候,EJB Container 并不會找尋特
定的Stateless Session Bean 的實(shí)體來執(zhí)行這個(gè)method。換言之,很可能數(shù)
個(gè)使用者在執(zhí)行某個(gè)Stateless Session Bean 的methods 時(shí),會是同一個(gè)
Bean 的Instance 在執(zhí)行。從內(nèi)存方面來看, Stateful Session Bean 與
Stateless Session Bean 比較, Stateful Session Bean 會消耗J2EE Server
較多的內(nèi)存,然而Stateful Session Bean 的優(yōu)勢卻在于他可以維持使用者的
狀態(tài)。
168、bean 實(shí)例的生命周期?【中等難度】
答:對于Stateless Session Bean、Entity Bean、Message Driven Bean 一般
存在緩沖池管理,而對于Entity Bean 和Statefull Session Bean 存在Cache
管理,通常包含創(chuàng)建實(shí)例,設(shè)置上下文、創(chuàng)建EJB Object(create)、業(yè)務(wù)方
法調(diào)用、remove 等過程,對于存在緩沖池管理的Bean,在create 之后實(shí)例并不
第47 頁共59 頁
從內(nèi)存清除,而是采用緩沖池調(diào)度機(jī)制不斷重用實(shí)例,而對于存在Cache 管理的
Bean 則通過激活和去激活機(jī)制保持Bean 的狀態(tài)并限制內(nèi)存中實(shí)例數(shù)量。
169、EJB 的激活機(jī)制?【中等難度】
答:以Stateful Session Bean 為例:其Cache 大小決定了內(nèi)存中可以同時(shí)存
在的Bean 實(shí)例的數(shù)量,根據(jù)MRU 或NRU 算法,實(shí)例在激活和去激活狀態(tài)之間遷
移,激活機(jī)制是當(dāng)客戶端調(diào)用某個(gè)EJB 實(shí)例業(yè)務(wù)方法時(shí),如果對應(yīng)EJB Object
發(fā)現(xiàn)自己沒有綁定對應(yīng)的Bean 實(shí)例則從其去激活Bean 存儲中(通過序列化機(jī)制
存儲實(shí)例)回復(fù)(激活)此實(shí)例。狀態(tài)變遷前會調(diào)用對應(yīng)的ejbActive 和
ejbPassivate 方法。
170、EJB 包括(SessionBean,EntityBean)說出他們的生命周期,及如何管理
事務(wù)的?【中等難度】
答:SessionBean:Stateless Session Bean 的生命周期是由容器決定的,當(dāng)客
戶機(jī)發(fā)出請求要建立一個(gè)Bean 的實(shí)例時(shí),EJB 容器不一定要?jiǎng)?chuàng)建一個(gè)新的Bean
的實(shí)例供客戶機(jī)調(diào)用,而是隨便找一個(gè)現(xiàn)有的實(shí)例提供給客戶機(jī)。當(dāng)客戶機(jī)第一
次調(diào)用一個(gè)Stateful Session Bean 時(shí),容器必須立即在服務(wù)器中創(chuàng)建一個(gè)新
的Bean 實(shí)例,并關(guān)聯(lián)到客戶機(jī)上,以后此客戶機(jī)調(diào)用Stateful Session Bean 的
方法時(shí)容器會把調(diào)用分派到與此客戶機(jī)相關(guān)聯(lián)的Bean 實(shí)例。EntityBean:Entity
Beans 能存活相對較長的時(shí)間,并且狀態(tài)是持續(xù)的。只要數(shù)據(jù)庫中的數(shù)據(jù)存在,
Entity beans 就一直存活。而不是按照應(yīng)用程序或者服務(wù)進(jìn)程來說的。即使EJB
容器崩潰了,Entity beans 也是存活的。Entity Beans 生命周期能夠被容器或
者Beans 自己管理。EJB 通過以下技術(shù)管理事務(wù):對象管理組織(OMG)的對象
實(shí)務(wù)服務(wù)(OTS),Sun Microsystems 的Transaction Service(JTS)、Java
Transaction API(JTA),開發(fā)組(X/Open)的XA 接口。
171、EJB 的事務(wù)是如何實(shí)現(xiàn)的?何時(shí)進(jìn)行回滾;【中等難度】
答:是通過使用容器或Bean 自身管理事務(wù)的;
當(dāng)產(chǎn)生一個(gè)系統(tǒng)異常時(shí)容器就自動(dòng)回滾事務(wù)。
172、EJB 容器提供的服務(wù)?【中等難度】
答:主要提供生命周期管理、代碼產(chǎn)生、持續(xù)性管理、安全、事務(wù)管理、鎖和并
發(fā)行管理等服務(wù)。
173、EJB 需直接實(shí)現(xiàn)它的業(yè)務(wù)接口或Home 接口嗎?請簡述理由?!局械入y度】
答:遠(yuǎn)程接口和Home 接口不需要直接實(shí)現(xiàn),他們的實(shí)現(xiàn)代碼是由服務(wù)器產(chǎn)生的,
程序運(yùn)行中對應(yīng)實(shí)現(xiàn)類會作為對應(yīng)接口類型的實(shí)例被使用。
174、請對以下在J2EE 中常用的名詞進(jìn)行解釋(或簡單描述) 【中等難度】
答:web 容器:給處于其中的應(yīng)用程序組件(JSP,SERVLET)提供一個(gè)環(huán)境,使
JSP,SERVLET 直接跟容器中的環(huán)境變量接口交互,不必關(guān)注其它系統(tǒng)問題。主要
由WEB 服務(wù)器來實(shí)現(xiàn)。例如:TOMCAT,WEBLOGIC,WEBSPHERE 等。該容器提供的接
口嚴(yán)格遵守J2EE 規(guī)范中的WEB APPLICATION 標(biāo)準(zhǔn)。我們把遵守以上標(biāo)準(zhǔn)的WEB
服務(wù)器就叫做J2EE 中的WEB 容器;
EJB 容器:Enterprise java bean 容器。更具有行業(yè)領(lǐng)域特色。他提供給
第48 頁共59 頁
運(yùn)行在其中的組件EJB 各種管理功能。只要滿足J2EE 規(guī)范的EJB 放入該容器,
馬上就會被容器進(jìn)行高效率的管理。并且可以通過現(xiàn)成的接口來獲得系統(tǒng)級別的
服務(wù)。例如郵件服務(wù)、事務(wù)管理;
JNDI:(Java Naming & Directory Interface)JAVA 命名目錄服務(wù)。主要
提供的功能是:提供一個(gè)目錄系統(tǒng),讓其它各地的應(yīng)用程序在其上面留下自己的
索引,從而滿足快速查找和定位分布式應(yīng)用程序的功能;
JMS:(Java Message Service)JAVA 消息服務(wù)。主要實(shí)現(xiàn)各個(gè)應(yīng)用程序之
間的通訊。包括點(diǎn)對點(diǎn)和廣播;
JTA:( Java Transaction API)JAVA 事務(wù)服務(wù)。提供各種分布式事務(wù)服務(wù)。
應(yīng)用程序只需調(diào)用其提供的接口即可;
JAF:(Java Action FrameWork)JAVA 安全認(rèn)證框架。提供一些安全控制
方面的框架。讓開發(fā)者通過各種部署和自定義實(shí)現(xiàn)自己的個(gè)性安全控制策略;
RMI/IIOP:(Remote Method Invocation /internet 對象請求中介協(xié)議)他
們主要用于通過遠(yuǎn)程調(diào)用服務(wù)。例如,遠(yuǎn)程有一臺計(jì)算機(jī)上運(yùn)行一個(gè)程序,它提
供股票分析服務(wù),我們可以在本地計(jì)算機(jī)上實(shí)現(xiàn)對其直接調(diào)用。當(dāng)然這是要通過
一定的規(guī)范才能在異構(gòu)的系統(tǒng)之間進(jìn)行通信。RMI 是JAVA 特有的。
175、J2EE 是什么?【中等難度】
答:J2EE 是Sun 公司提出的多層(multi-diered),分布式(distributed),基于組
件(component-base)的企業(yè)級應(yīng)用模型(enterpriese application model).在
這樣的一個(gè)應(yīng)用系統(tǒng)中,可按照功能劃分為不同的組件,這些組件又可在不同計(jì)
算機(jī)上,并且處于相應(yīng)的層次(tier)中。所屬層次包括客戶層(clietn tier)組
件,web 層和組件,Business 層和組件,企業(yè)信息系統(tǒng)(EIS)層。
176、J2EE 是技術(shù)還是平臺還是框架?【中等難度】
答:J2EE 本身是一個(gè)標(biāo)準(zhǔn),一個(gè)為企業(yè)分布式應(yīng)用的開發(fā)提供的標(biāo)準(zhǔn)平臺;
J2EE 也是一個(gè)框架,包括JDBC、JNDI、RMI、JMS、EJB、JTA 等技術(shù)。
177、請寫出spring 中I0C 的三種實(shí)現(xiàn)機(jī)制?!局械入y度】
答:三種機(jī)制為:通過setter 方法注入、通過構(gòu)造方法注入和接口注入。
178、寫出你熟悉的開源框架以及各自的作用?!局械入y度】
答:框架:hibernate、spring、struts;
Hibernate 主要用于數(shù)據(jù)持久化;
Spring 的控制反轉(zhuǎn)能起到解耦合的作用;
Struts 主要用于流程控制。
179、EJB 規(guī)范規(guī)定EJB 中禁止的操作有哪些?【較難】
答:1)不能操作線程和線程API(線程API 指非線程對象的方法,如notify,wait
等);
2)不能操作awt;
3)不能實(shí)現(xiàn)服務(wù)器功能;
4)不能對靜態(tài)屬性存??;
5)不能使用IO 操作直接存取文件系統(tǒng);
6)不能加載本地庫;
第49 頁共59 頁
7)不能將this 作為變量和返回;
8)不能循環(huán)調(diào)用。
八、數(shù)據(jù)結(jié)構(gòu)、算法及計(jì)算機(jī)基礎(chǔ)部分:
(共8 題:基礎(chǔ)6 道,中等難度1 道,較難1 道)
180、一個(gè)byte 幾個(gè)單位?【基礎(chǔ)】
答:8bit。
181、常用UNIX 命令(Linux 的常用命令)(至少10 個(gè))【基礎(chǔ)】
答:ls pwd mkdir rm cp mv cd ps ftp telnet ping env more echo
182、后序遍歷下列二叉樹,訪問結(jié)點(diǎn)的順序是?【基礎(chǔ)】
A
/ \
B C
/ \ \
D E F
/ / \
G N I
/ \
J K
答:順序?yàn)椋篋JGEBKNIFCA 。
183、排序都有哪幾種方法?請列舉。用JAVA 實(shí)現(xiàn)一個(gè)快速排序?!净A(chǔ)】
答:排序的方法有:插入排序(直接插入排序、希爾排序),交換排序(冒泡排
序、快速排序),選擇排序(直接選擇排序、堆排序),歸并排序,分配排序(箱
排序、基數(shù)排序);
快速排序的偽代碼:
//使用快速排序方法對a[ 0 :n- 1 ]排序
從a[ 0 :n- 1 ]中選擇一個(gè)元素作為middle,該元素為支點(diǎn);
把余下的元素分割為兩段left 和right,使得left 中的元素都小于等于支點(diǎn),
而right 中的元素都大于等于支點(diǎn);
遞歸地使用快速排序方法對left 進(jìn)行排序;
遞歸地使用快速排序方法對right 進(jìn)行排序;
所得結(jié)果為left + middle + right。
184、寫一種常見排序?!净A(chǔ)】
答:C++中冒泡排序:
void swap( int& a, int& b ){
int c=a; a = b; b = c;
}
void bubble( int* p, int len ){
bool bSwapped;
第50 頁共59 頁
do {
bSwapped = false;
for( int i=1; i<len; i++ ){
if( p[i-1]>p[i] ){
swap( p[i-1], p[i] );
bSwapped = true;
}
}
}while( bSwapped );
}
185、寫一個(gè)一小段程序檢查數(shù)字是否為質(zhì)數(shù);以上的程序你采用的哪種語言寫
的?采用該種語言的理由是什么?【基礎(chǔ)】
答:代碼如下:
#include <math.h>
bool prime( int n ){
if(n<=0) exit(0);
for( int i=2; i<=n; i++ )
for( int j=2; j<=sqrt(i); j++)
if((n%j==0) && (j!=n))
return false;
return true;
}
采用C++,因?yàn)槠溥\(yùn)行效率高。
186、編程題:設(shè)有n個(gè)人依圍成一圈,從第1個(gè)人開始報(bào)數(shù),數(shù)到第m個(gè)人出
列,然后從出列的下一個(gè)人開始報(bào)數(shù),數(shù)到第m個(gè)人又出列,…,如此反復(fù)到所
有的人全部出列為止。設(shè)n個(gè)人的編號分別為1,2,…,n,打印出出列的順序;
要求用java 實(shí)現(xiàn)?!局械入y度】
答:代碼如下:
package test;
public class CountGame {
private static boolean same(int[] p,int l,int n){
for(int i=0;i<l;i++){
if(p[i]==n){
return true;
}
}
return false;
}
public static void play(int playerNum, int step){
int[] p=new int[playerNum];
int counter = 1;
while(true){
第51 頁共59 頁
if(counter > playerNum*step){
break;
}
for(int i=1;i<playerNum+1;i++){
while(true){
if(same(p,playerNum,i)==false) break;
else i=i+1;
}
if(i > playerNum)break;
if(counter%step==0){
System.out.print(i + " ");
p[counter/step-1]=i;
}
counter+=1;
}
}
System.out.println();
}
public static void main(String[] args) {
play(10, 7);
}
}
187、寫一個(gè)方法1000 的階乘?!据^難】
答:C++的代碼實(shí)現(xiàn)如下:
#include <iostream>
#include <iomanip>
#include <vector>
using namespace std;
class longint {
private:
vector<int> iv;
public:
longint(void) { iv.push_back(1); }
longint& multiply(const int &);
friend ostream& operator<<(ostream &, const longint &);
};
ostream& operator<<(ostream &os, const longint &v) {
vector<int>::const_reverse_iterator iv_iter = v.iv.rbegin();
os << *iv_iter++;
for ( ; iv_iter < v.iv.rend(); ++iv_iter) {
os << setfill('0') << setw(4) << *iv_iter;
}
return os;
第52 頁共59 頁
}
longint& longint::multiply(const int &rv) {
vector<int>::iterator iv_iter = iv.begin();
int overflow = 0, product = 0;
for ( ; iv_iter < iv.end(); ++iv_iter) {
product = (*iv_iter) * rv;
product += overflow;
overflow = 0;
if (product > 10000) {
overflow = product / 10000;
product -= overflow * 10000;
}
iv_iter = product;
}
if (0 != overflow) {
iv.push_back(overflow);
}
return *this;
}
int main(int argc, char **argv) {
longint result;
int l = 0;
if(argc==1){
cout << "like: multiply 1000" << endl;
exit(0);
}
sscanf(argv[1], "%d", &l);
for (int i = 2; i <= l; ++i) {
result.multiply(i);
}
cout << result << endl;
return 0;
}
九、C++部分:(共14 題:基礎(chǔ)10 道,中等1 道,較難3 道)
188、以下三條輸出語句分別輸出什么?【基礎(chǔ)】
char str1[] = "abc";
char str2[] = "abc";
const char str3[] = "abc";
const char str4[] = "abc";
const char* str5 = "abc";
const char* str6 = "abc";
第53 頁共59 頁
cout << boolalpha << (str1==str2) << endl; //輸出什么?
cout << boolalpha << (str3==str4) << endl; //輸出什么?
cout << boolalpha << (str5==str6) << endl; //輸出什么?
答:輸出為:false、false、true。
189、以下反向遍歷array 數(shù)組的方法有什么錯(cuò)誤?【基礎(chǔ)】
vector<int> array;
array.push_back(1);
array.push_back(2);
array.push_back(3);
//反向遍歷array 數(shù)組:
for(vector<int>::size_type i=array.size()-1; i>=0; --i){
cout << array[i] << endl;
}
答:for 循環(huán)中的變量i 的類型不應(yīng)定義為vector<int>::size_type,
因?yàn)樵擃愋蜑闊o符號數(shù)值類型,故循環(huán)條件將恒成立,為死循環(huán),應(yīng)將其類型定
義為有符號的int 類型。
190、以下代碼有什么問題?【基礎(chǔ)】
cout << (true ? 1 : "1") << endl;
答:運(yùn)算符中兩個(gè)可選值的類型不同。
191、以下代碼有什么問題?【基礎(chǔ)】
typedef vector<int> IntArray;
IntArray array;
array.push_back(1);
array.push_back(2);
array.push_back(2);
array.push_back(3);
//刪除array 數(shù)組中所有的2
for(IntArray::iterator itor=array.begin(); itor!=array.end();
++itor){
if(2==*itor) {
array.erase(itor);
}
}
答:for 循環(huán)中的if 語句后的array.erase(itor)語句,它將迭代器itor 所指
向的元素刪除后會自動(dòng)下移一位,故應(yīng)在其后加上語句:itor--;
192、以下代碼中的兩個(gè)sizeof 用法有問題嗎?【基礎(chǔ)】
void upperCase(char str[]){ //將str 中的小寫字母轉(zhuǎn)換成大寫字母
for(int i=0; i<sizeof(str)/sizeof(str[0]); ++i){
if('a'<=str[i] && str[i]<='z')
str[i] -= ('a'-'A');
}
第54 頁共59 頁
}
int main(){
char str[] = "aBcDe";
cout << "str 字符串長度為:" << sizeof(str)/sizeof(str[0]);
cout << endl;
upperCase(str);
cout << str << endl;
return 0;
}
答:在upperCase 方法中,for 循環(huán)的sizeof(str)的值將總是4,所以該方法
只能將參數(shù)中的字符串的前四個(gè)字符轉(zhuǎn)換成大寫字母。
193、以下代碼能夠編譯通過嗎?為什么?【基礎(chǔ)】
unsigned int const size1 = 2;
char str1[size1];
unsigned int temp = 0;
cin >> temp;
unsigned int const size2 = temp;
char str2[size2];
答:能;
194、以下代碼有什么問題?【基礎(chǔ)】
struct Test{
Test(int){}
Test(){}
void fun(){}
};
void main(void){
Test a(1);
a.fun();
Test b();
b.fun();
}
答:main 函數(shù)的返回類型應(yīng)為int;不能對b 調(diào)用fun()方法。
195、以下代碼中的輸出語句輸出0 嗎?為什么?【基礎(chǔ)】
struct CLS{
int m_i;
CLS(int i):m_i(i){ }
CLS(){ CLS(0);}
};
int main(){
CLS obj;
cout <<obj.m_i << endl;
第55 頁共59 頁
}
答:輸出不是0;
196、C++中的空類,默認(rèn)產(chǎn)生哪些類成員函數(shù)?【基礎(chǔ)】
答:空類中默認(rèn)包含的成員函數(shù)如下:
class Empty{
public:
Empty(); //缺省構(gòu)造函數(shù)
Empty( const Empty& ); //拷貝構(gòu)造函數(shù)
~Empty(); //析構(gòu)函數(shù)
Empty& operator=( const Empty& ); //賦值運(yùn)算符
Empty* operator&(); //取址運(yùn)算符
const Empty* operator&() const; //取址運(yùn)算符const
};
197、統(tǒng)計(jì)一篇文章中單詞個(gè)數(shù)?!净A(chǔ)】
答:代碼如下:
include<iostream>
#include<fstream>
using namespace std;
int main(){
ifstream fin("t.txt");
if(!fin){
cout<<"can't open file"<<endl;
return -1;
}
int count = 0;
char buf[256];
memset(buf, 0, 256);
while(1){
fin2>>buf;
if(fin2.eof())
break;
count++;
}
cout<<"The number of the words is : "<<count<<endl;
fin2.close();
return 0;
}
198、寫一個(gè)函數(shù),完成內(nèi)存之間的拷貝?!局械入y度】
答:代碼如下:
void* mymemcpy(void* dest, const void* src, size_t count){
char* pdest = static_cast<char*>(dest);
const char* psrc = static_cast<const char*>(src);
第56 頁共59 頁
if(pdest>psrc && pdest<psrc+count){ //能考慮到這種情況就行了
for(size_t i=count-1; i!=-1; --i){
pdest[i] = psrc[i];
}
}else{
for(size_t i=0; i<count; ++i){
pdest[i] = psrc[i];
}
}
return dest;
}
int main(){
char str[] = "0123456789";
mymemcpy(str+1, str+0, 9);
cout << str << endl; //將輸出"0012345678"
return 0;
}
199、非C++內(nèi)建類型A 和B,在哪幾種情況下B 能隱式轉(zhuǎn)化為A?【較難】
答:a)class B : public A{……}//B 公有繼承自A,可以是間接繼承的
b)class B{operator A();}//B 實(shí)現(xiàn)了隱式轉(zhuǎn)化為A 的轉(zhuǎn)化
c)class A{ A(const B&);}//A 實(shí)現(xiàn)了non-explicit 的參數(shù)為B 構(gòu)造函數(shù)
(可以有其他帶帶默認(rèn)值的參數(shù))
d)A& operator= (const A&);//賦值操作,雖不是正宗的隱式類型轉(zhuǎn)換,
但也可以勉強(qiáng)算一個(gè)
200、以下代碼有什么問題?【較難】
void char2Hex(char c){ //將字符以16 進(jìn)制顯示
char ch = c/0x10 + '0';
if(ch>'9') ch += ('A'-'9'-1);
char cl = c%0x10 + '0';
if(cl>'9') cl += ('A'-'9'-1);
cout << ch << cl << ' ';
}
int main(){
char str[] = "I love 中國";
for(size_t i=0; i<strlen(str); ++i)
char2Hex(str[i]);
cout << endl;
return 0;
}
答:
201、以下兩條輸出語句分別輸出什么?【較難】
float a = 1.0f;
第57 頁共59 頁
cout << (int)a << endl;
cout << (int&)a << endl;
cout << boolalpha << ((int)a==(int&)a) << endl; //輸出什么
float b = 0.0f;
cout << (int)b << endl;
cout << (int&)b << endl;
cout << boolalpha << ((int)b==(int&)b) << endl;//輸出什么
答:第一處輸出false,第二處輸出true。
十、WebLogic 及其它:(共13 題:附加部分,超出授課范圍)
1、如何給weblogic 指定大小的內(nèi)存?
答:在啟動(dòng)Weblogic 的腳本中(位于所在Domian 對應(yīng)服務(wù)器目錄下的
startServerName),增加set MEM_ARGS=-Xms32m -Xmx200m,可以調(diào)整最小內(nèi)
存為32M,最大200M。
2、如何設(shè)定的weblogic 的熱啟動(dòng)模式(開發(fā)模式)與產(chǎn)品發(fā)布模式?
答:可以在管理控制臺中修改對應(yīng)服務(wù)器的啟動(dòng)模式為開發(fā)或產(chǎn)品模式之一,或
者修改服務(wù)的啟動(dòng)文件或者commenv 文件,增加set PRODUCTION_MODE=true。
3、如何啟動(dòng)時(shí)不需輸入用戶名與密碼?
答:修改服務(wù)啟動(dòng)文件,增加WLS_USER 和WLS_PW 項(xiàng);也可以在boot.properties
文件中增加加密過的用戶名和密碼。
4、在weblogic 管理控制臺中對一個(gè)應(yīng)用域(或者說是一個(gè)網(wǎng)站,Domain)進(jìn)行jms
及ejb 或連接池等相關(guān)信息進(jìn)行配置后,實(shí)際保存在什么文件中?
答:保存在此Domain 的config.xml 文件中,它是服務(wù)器的核心配置文件。
5、說說weblogic 中一個(gè)Domain 的缺省目錄結(jié)構(gòu)?比如要將一個(gè)簡單的
helloWorld.jsp 放入何目錄下,然后在瀏覽器上打入http://主機(jī):端口號
//helloword.jsp 就可以看到運(yùn)行結(jié)果了? 又比如這其中用到了一個(gè)自己寫的
javaBean 該如何辦?
答:Domain 目錄\服務(wù)器目錄\applications,將應(yīng)用目錄放在此目錄下將可以
作為應(yīng)用訪問,如果是Web 應(yīng)用,應(yīng)用目錄需要滿足Web 應(yīng)用目錄要求,jsp 文
件可以直接放在應(yīng)用目錄中,Javabean 需要放在應(yīng)用目錄的WEB-INF 目錄的
classes 目錄中,設(shè)置服務(wù)器的缺省應(yīng)用將可以實(shí)現(xiàn)在瀏覽器上無需輸入應(yīng)用
名。
6、在weblogic 中發(fā)布ejb 需涉及到哪些配置文件?
答:不同類型的EJB 涉及的配置文件不同,都涉及到的配置文件包括ejbjar.
xml,weblogic-ejb-jar.xml,CMP 實(shí)體Bean 一般還需要weblogic-cmprdbms-
jar.xml
7、如何在weblogic 中進(jìn)行ssl 配置與客戶端的認(rèn)證配置或說說j2ee(標(biāo)準(zhǔn))進(jìn)
行ssl 的配置?
第58 頁共59 頁
答:缺省安裝中使用DemoIdentity.jks 和DemoTrust.jks KeyStore 實(shí)現(xiàn)SSL,
需要配置服務(wù)器使用Enable SSL,配置其端口,在產(chǎn)品模式下需要從CA 獲取私
有密鑰和數(shù)字證書,創(chuàng)建identity 和trust keystore,裝載獲得的密鑰和數(shù)字
證書。可以配置此SSL 連接是單向還是雙向的。
8、如何查看在weblogic 中已經(jīng)發(fā)布的EJB?
答:可以使用管理控制臺,在它的Deployment 中可以查看所有已發(fā)布的EJB。
9、CORBA 是什么?用途是什么?
答:CORBA 標(biāo)準(zhǔn)是公共對象請求代理結(jié)構(gòu)(Common Object Request Broker
Architecture),由對象管理組織(Object Management Group,縮寫為OMG)標(biāo)
準(zhǔn)化。它的組成是接口定義語言(IDL), 語言綁定(binding:也譯為聯(lián)編)和允許
應(yīng)用程序間互操作的協(xié)議。其目的為:用不同的程序設(shè)計(jì)語言書寫在不同的進(jìn)
程中運(yùn)行,為不同的操作系統(tǒng)開發(fā)。
10、在weblogic 中開發(fā)消息Bean 時(shí)的persistent 與non-persisten 的差別?
答:persistent 方式的MDB 可以保證消息傳遞的可靠性,也就是如果EJB 容器出
現(xiàn)問題而JMS 服務(wù)器依然會將消息在此MDB 可用的時(shí)候發(fā)送過來,而nonpersistent
方式的消息將被丟棄。
11、LINUX 下線程,GDI 類的解釋?
答:LINUX 實(shí)現(xiàn)的就是基于核心輕量級進(jìn)程的"一對一"線程模型,一個(gè)線程實(shí)體
對應(yīng)一個(gè)核心輕量級進(jìn)程,而線程之間的管理在核外函數(shù)庫中實(shí)現(xiàn);GDI 類為圖
像設(shè)備編程接口類庫。
12、Jdo 是什么?
答:JDO 是Java 對象持久化的新的規(guī)范,為java data object 的簡稱,也是一
個(gè)用于存取某種數(shù)據(jù)倉庫中的對象的標(biāo)準(zhǔn)化API。JDO 提供了透明的對象存儲,
因此對開發(fā)人員來說,存儲數(shù)據(jù)對象完全不需要額外的代碼(如JDBC API 的使
用)。這些繁瑣的例行工作已經(jīng)轉(zhuǎn)移到JDO 產(chǎn)品提供商身上,使開發(fā)人員解脫出
來,從而集中時(shí)間和精力在業(yè)務(wù)邏輯上。另外,JDO 很靈活,因?yàn)樗梢栽谌魏?/div>
數(shù)據(jù)底層上運(yùn)行。JDBC 只是面向關(guān)系數(shù)據(jù)庫(RDBMS)JDO 更通用,提供到任何
數(shù)據(jù)底層的存儲功能,比如關(guān)系數(shù)據(jù)庫、文件、XML 以及對象數(shù)據(jù)庫(ODBMS)
等等,使得應(yīng)用可移植性更強(qiáng)。
13、WEB SERVICE 名詞解釋;JAXP、JAXM 的解釋;SOAP、UDDI,WSDL 解釋?
答:Web Service 是基于網(wǎng)絡(luò)的、分布式的模塊化組件,它執(zhí)行特定的任務(wù),遵
守具體的技術(shù)規(guī)范,這些規(guī)范使得Web Service 能與其他兼容的組件進(jìn)行互操
作;
JAXP(Java API for XML Parsing)定義了在Java 中使用DOM, SAX, XSLT
的通用的接口,這樣在你的程序中你只要使用這些通用的接口,當(dāng)你需要改變具
體的實(shí)現(xiàn)時(shí)候也不需要修改代碼;
JAXM(Java API for XML Messaging)是為SOAP 通信提供訪問方法和傳輸機(jī)
制的API;
WSDL 是一種XML 格式,用于將網(wǎng)絡(luò)服務(wù)描述為一組端點(diǎn),這些端點(diǎn)對包含
第59 頁共59 頁
面向文檔信息或面向過程信息的消息進(jìn)行操作。這種格式首先對操作和消息進(jìn)行
抽象描述,然后將其綁定到具體的網(wǎng)絡(luò)協(xié)議和消息格式上以定義端點(diǎn)。相關(guān)的具
體端點(diǎn)即組合成為抽象端點(diǎn)(服務(wù));
SOAP 即簡單對象訪問協(xié)議(Simple Object Access Protocol),它是用于交
換XML 編碼信息的輕量級協(xié)議;
UDDI 的目的是為電子商務(wù)建立標(biāo)準(zhǔn);UDDI 是一套基于Web 的、分布式的、
為Web Service 提供的、信息注冊中心的實(shí)現(xiàn)標(biāo)準(zhǔn)規(guī)范,同時(shí)也包含一組使企業(yè)
能將自身提供的Web Service 注冊,以使別的企業(yè)能夠發(fā)現(xiàn)的訪問協(xié)議的實(shí)現(xiàn)標(biāo)
準(zhǔn)。
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服