Java筆試題集
Java部分
1.求兩個數(shù)的最大公約數(shù)
解答:
歐幾理德原理:輾轉(zhuǎn)相除法
public static int zdgys(int a,int b){
int x = a%b;
if(x==0) return b;
else return zdgys(b,x);
}
2. 關(guān)于java垃圾回收器的認(rèn)識
解答:
對于GC來說,當(dāng)程序員創(chuàng)建對象時,GC就開始監(jiān)控這個對象的地址、大小以及使用情況。通常,GC采用有向圖的方式記錄和管理堆(heap)中的所有對象。通過這種方式確定哪些對象是"可達(dá)的",哪些對象是"不可達(dá)的"。當(dāng)GC確定一些對象為"不可達(dá)"時,GC就有責(zé)任回收這些內(nèi)存空間。可以。程序員可以手動執(zhí)行System.gc(),通知GC運(yùn)行,但是Java語言規(guī)范并不保證GC一定會執(zhí)行。
3. 請問如何設(shè)計一個類,使其只能被初始化為一個實例。
解答:
Singleton模式主要作用是保證在Java應(yīng)用程序中,一個類Class只有一個實例存在。
第一種形式: 定義一個類,它的構(gòu)造函數(shù)為private的,它有一個static的private的該類變量,在類初始化時實例話,通過一個public的getInstance方法獲取對它的引用,繼而調(diào)用其中的方法。
附件:
package parent.career.blest;
class Singleton {
private Singleton(){}//在外部用new關(guān)鍵字會報錯,只供內(nèi)部使用
//注意這是private 只供內(nèi)部調(diào)用
private static Singleton instance = new Singleton();
//這里提供了一個供外部訪問本class的靜態(tài)方法,可以直接訪問
public static Singleton getInstance() {
return instance;
}
public void say(String str){
System.out.println(str);
}
}
class commonClass{
public commonClass(){
System.out.println("這是一個普通類");
}
}
public class mySingleton{
public static void main(String args[])
{
Singleton sl = Singleton.getInstance();
Singleton sl2 = Singleton.getInstance();
sl.say("hello,world!");
sl2.say("hello,world again!");
System.out.println(sl==sl2);//輸出true,說明sl,sl2指向同一個實例
commonClass cC = new commonClass();
commonClass cC2 = new commonClass();
System.out.println(cC==cC2);//輸出false,說明cC,cC2分別指向不同的實例
}
}
4.有一個1001個元素的數(shù)組a[n],每個元素都在1到1000這些整數(shù)中取值,其中有一個數(shù)值重復(fù)了,現(xiàn)在要設(shè)計一個算法找出這個數(shù)字,且每個元素只能被訪問一次。不能用輔助的存儲容器。
解答:
This number = (a[0]+a[1]+a[3]+……a[1000])-(1+2+3+……+1000)
servlet生命周期以及servlet基本構(gòu)架
解答:
servlet有良好的生存期的定義,包括加載和實例化、初始化、處理請求以及服務(wù)結(jié)束。這個生存期由javax.servlet.Servlet接口的init,service和destroy方法表達(dá)。
Servlet的基本架構(gòu):
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 {
}
}
5. 死鎖的四個必要條件
解答:
>互斥條件:某段時間內(nèi)某資源只能由一個進(jìn)程使用。
>請求和保持:進(jìn)程因請求資源而阻塞時,對已分配給它的資源保持不放。
>不剝奪條件:資源在未使用完前,不能被剝奪,由使用進(jìn)程釋放。
>環(huán)路條件:發(fā)生死鎖時,有向圖必構(gòu)成一環(huán)路。
7.EJB是基于哪些技術(shù)實現(xiàn)的?并說出SessionBean和EntityBean的區(qū)別,StatefulBean和StatelessBean的區(qū)別。
解答:
EJB包括Session Bean、Entity Bean、Message Driven Bean,基于JNDI、RMI、JAT等技術(shù)實現(xiàn)。
SessionBean在J2EE應(yīng)用程序中被用來完成一些服務(wù)器端的業(yè)務(wù)操作,例如訪問數(shù)據(jù)庫、調(diào)用其他EJB組件。EntityBean被用來代表應(yīng)用系統(tǒng)中用到的數(shù)據(jù)。
對于客戶機(jī),SessionBean是一種非持久性對象,它實現(xiàn)某些在服務(wù)器上運(yùn)行的業(yè)務(wù)邏輯。
對于客戶機(jī),EntityBean是一種持久性對象,它代表一個存儲在持久性存儲器中的實體的對象視圖,或是一個由現(xiàn)有企業(yè)應(yīng)用程序?qū)崿F(xiàn)的實體。
Session Bean 還可以再細(xì)分為 Stateful Session Bean 與 Stateless Session Bean ,這兩種的 Session Bean都可以將系統(tǒng)邏輯放在 method之中執(zhí)行,不同的是 Stateful Session Bean 可以記錄呼叫者的狀態(tài),因此通常來說,一個使用者會有一個相對應(yīng)的 Stateful Session Bean 的實體。Stateless Session Bean 雖然也是邏輯組件,但是他卻不負(fù)責(zé)記錄使用者狀態(tài),也就是說當(dāng)使用者呼叫 Stateless Session Bean 的時候,EJB Container 并不會找尋特定的 Stateless Session Bean 的實體來執(zhí)行這個 method。換言之,很可能數(shù)個使用者在執(zhí)行某個 Stateless Session Bean 的 methods 時,會是同一個 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)。
8.sleep() 和 wait() 有什么區(qū)別?
解答:
sleep是線程類(Thread)的方法,導(dǎo)致此線程暫停執(zhí)行指定時間,給執(zhí)行機(jī)會給其他線程,但是監(jiān)控狀態(tài)依然保持,到時后會自動恢復(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)。
9.forward 和redirect的區(qū)別
解答:
forward是服務(wù)器請求資源,服務(wù)器直接訪問目標(biāo)地址的URL,把那個URL的響應(yīng)內(nèi)容讀取過來,然后把這些內(nèi)容再發(fā)給瀏覽器,瀏覽器根本不知道服務(wù)器發(fā)送的內(nèi)容是從哪兒來的,所以它的地址欄中還是原來的地址。
redirect就是服務(wù)端根據(jù)邏輯,發(fā)送一個狀態(tài)碼,告訴瀏覽器重新去請求那個地址,一般來說瀏覽器會用剛才請求的所有參數(shù)重新請求,所以session,request參數(shù)都可以獲取。
10.冒泡排序算法
解答:
package parent.career.blest;
/**
* 冒泡排序算法演示:從小到大排列數(shù)組元素
* 原理:第一個元素和后面的一個元素比較,比較結(jié)果再和后面一個元素比較,依次類推
* 接著,第二個和后面元素比較,依次類推
*/
public class Maopao{
public static int[] mppx(int[] array){
for(int i =0;i<array.length; i++){
for(int j=i; j<array.length; j++){
int temp;
if(array[i]>array[j]){
temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
}
return array;
}
public static void main(String args[]){
//測試
int[] ar ={12,23,1,23,45,11,42,9,45,2,16,77,86,56,43};
ar = mppx(ar);
for(int i = 0;i<ar.length;i++){
System.out.print(ar[i]+" ");
}
}
}
11.從鍵盤接收一個整數(shù),并用遞歸求其階乘。
解答:
package parent.career.blest;
import java.io.*;
/**
* 用遞歸求階乘算法
* 從鍵盤接收一個整數(shù),然后求其階乘
*/
public class DG_JC{
public static int DG(int n){
if(n==1) return 1;
else return n*DG(n-1);
}
public static void main(String args[]){
int n = 0;
System.out.print("請輸入一個整數(shù):");
try{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
n = Integer.parseInt(br.readLine());
br.close();
}catch(IOException e){
e.printStackTrace();
}
System.out.println("階乘"+n+"! = "+DG(n));
}
}
12.什么時候使用assert?
解答:斷言是一個包含布爾表達(dá)式的語句,在執(zhí)行這個語句時假定該表達(dá)式為 true。如果表達(dá)式計算為 false,那么系統(tǒng)會報告一個 Assertionerror。它用于調(diào)試目的:
|
assert(a > 0); // throws an Assertionerror if a <= 0 |
斷言可以有兩種形式:
assert Expression1 ;
assert Expression1 : Expression2 ;
Expression1 應(yīng)該總是產(chǎn)生一個布爾值。
Expression2 可以是得出一個值的任意表達(dá)式。這個值用于生成顯示更多調(diào)試信息的 String 消息。
斷言在默認(rèn)情況下是禁用的。要在編譯時啟用斷言,需要使用 source 1.4 標(biāo)記:
javac -source 1.4 Test.java
要在運(yùn)行時啟用斷言,可使用 -enableassertions 或者 -ea 標(biāo)記。
要在運(yùn)行時選擇禁用斷言,可使用 -da 或者 -disableassertions 標(biāo)記。
要系統(tǒng)類中啟用斷言,可使用 -esa 或者 -dsa 標(biāo)記。還可以在包的基礎(chǔ)上啟用或者禁用斷言。
13.談?wù)?/span>final, finally, finalize的區(qū)別。
解答:
final—修飾符(關(guān)鍵字)如果一個類被聲明為final,意味著它不能再派生出新的子類,不能作為父類被繼承。因此一個類不能既被聲明為 abstract的,又被聲明為final的。將變量或方法聲明為final,可以保證它們在使用中不被改變。被聲明為final的變量必須在聲明時給定初值,而在以后的引用中只能讀取,不可修改。被聲明為final的方法也同樣只能使用,不能重載。
finally—再異常處理時提供 finally 塊來執(zhí)行任何清除操作。如果拋出一個異常,那么相匹配的 catch 子句就會執(zhí)行,然后控制就會進(jìn)入 finally 塊(如果有的話)。
finalize—方法名。Java 技術(shù)允許使用 finalize() 方法在垃圾收集器將對象從內(nèi)存中清除出去之前做必要的清理工作。這個方法是由垃圾收集器在確定這個對象沒有被引用時對這個對象調(diào)用的。它是在 Object 類中定義的,因此所有的類都繼承了它。子類覆蓋 finalize() 方法以整理系統(tǒng)資源或者執(zhí)行其他清理工作。finalize() 方法是在垃圾收集器刪除對象之前對這個對象調(diào)用的。
14. Collection 和 Collections的區(qū)別。
解答:
Collections是個java.util下的類,它包含有各種有關(guān)集合操作的靜態(tài)方法。
Collection是個java.util下的接口,它是各種集合結(jié)構(gòu)的父接口。
15.說出ArrayList,Vector, LinkedList的存儲性能和特性
解答:
ArrayList和Vector都是使用數(shù)組方式存儲數(shù)據(jù),此數(shù)組元素數(shù)大于實際存儲的數(shù)據(jù)以便增加和插入元素,它們都允許直接按序號索引元素,但是插入元素要涉及數(shù)組元素移動等內(nèi)存操作,所以索引數(shù)據(jù)快而插入數(shù)據(jù)慢,Vector由于使用了synchronized方法(線程安全),通常性能上較ArrayList差,而LinkedList使用雙向鏈表實現(xiàn)存儲,按序號索引數(shù)據(jù)需要進(jìn)行前向或后向遍歷,但是插入數(shù)據(jù)時只需要記錄本項的前后項即可,所以插入速度較快。
16.ArrayList和Vector的區(qū)別,HashMap和Hashtable的區(qū)別
解答:就ArrayList與Vector主要從二方面來說:
一.同步性:Vector是線程安全的,也就是說是同步的,而ArrayList是線程不安全的,不是同步的
二.數(shù)據(jù)增長:當(dāng)需要增長時,Vector默認(rèn)增長為原來一培,而ArrayList卻是原來的一半
就HashMap與HashTable主要從三方面來說:
一.歷史原因:Hashtable是基于陳舊的Dictionary類的,HashMap是Java 1.2引進(jìn)的Map接口的一個實現(xiàn)
二.同步性:Hashtable是線程安全的,也就是說是同步的,而HashMap是線程序不安全的,不是同步的
三.值:只有HashMap可以讓你將空值作為一個表的條目的key或value
17.不用字符串處理函數(shù),怎么實現(xiàn)以單詞為單位的逆序
例如:從控制臺輸入 hello word **
輸出:** word hello
解答:
public class hello{
public static void main(String[] args) throws IOException {
for (int i = args.length - 1; i >= 0; i--) {
System.out.print(args[i] + " ");
}
}//執(zhí)行時,跟數(shù)組元素,如:java hello wei gui ping (現(xiàn)在args[]={wei,gui,ping})
18.構(gòu)造一個類來描述屏幕上的一個點(diǎn),該類的構(gòu)成包括點(diǎn)的x和y兩個坐標(biāo),以及一些對點(diǎn)進(jìn)行的操作,包括:取得點(diǎn)的坐標(biāo)值,對點(diǎn)的坐標(biāo)進(jìn)行賦值,編寫應(yīng)用程序生成該類的對象并對其進(jìn)行操作。
解答:
Class Point{
Private float x;
Private float y;
Public Point(){
This.x = 0;
This.y = 0;
}
Public Point(float x, float y){
This.x = x;
This.y = y;
}
Public void move(float m,float n ){
//將點(diǎn)移動向x方向移動m,向y方向移動n
This.x += m;
This.y += n;
}
Public void show(){
//顯示坐標(biāo)位置
System.out.println(“坐標(biāo)為(”+this.getX()+”,”+this.getY()+”)”);
}
//getter/setter方法
Public void setX(float x){
This.x = x;
}
Public float getX(){
Return this.x;
}
Public void setY(float y){
This.y = y;
}
Public float getY(){
Return this.y;
}
}
19.寫出下列算法的時間復(fù)雜度。
(1)冒泡排序 O(n*n)
(2)選擇排序 O(n*n)
(3)插入排序 O(n*n)
(4)快速排序 O(n*log n)
(5)堆排序 O(n*log n)
(6)歸并排序 O(n*log n)
20. EJB與JAVA BEAN的區(qū)別以及EJB的基本架構(gòu)?
答:Java Bean 是可復(fù)用的組件,對Java Bean并沒有嚴(yán)格的規(guī)范,理論上講,任何一個Java類都可以是一個Bean。但通常情況下,由于Java Bean是被容器所創(chuàng)建(如Tomcat)的,所以Java Bean應(yīng)具有一個無參的構(gòu)造器,另外,通常Java Bean還要實現(xiàn)Serializable接口用于實現(xiàn)Bean的持久性。Java Bean實際上相當(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ī))。但EJB必須被布署在諸如Webspere、WebLogic這樣的容器中,EJB客戶從不直接訪問真正的EJB組件,而是通過其容器訪問。EJB容器是EJB組件的代理,EJB組件由容器所創(chuàng)建和管理。客戶通過容器來訪問真正的EJB組件。
EJB的基本架構(gòu)
答:一個EJB包括三個部分:
Remote Interface 接口的代碼
package Beans;
import javax.ejb.EJBObject;
import java.rmi.RemoteException;
public interface Add extends EJBObject
{
//some method declare
}
Home Interface 接口的代碼
package Beans;
import java.rmi.RemoteException;
import jaax.ejb.CreateException;
import javax.ejb.EJBHome;
public interface AddHome extends EJBHome
{
//some method declare
}
EJB類的代碼
package Beans;
import java.rmi.RemoteException;
import javax.ejb.SessionBean;
import javx.ejb.SessionContext;
public class AddBean Implements SessionBean
{
//some method declare
}
21.Java中的Reflection作什么用?
解答:
自省是軟件分析自己的能力。這個功能由Class類中的java.lang.reflect包和元素所提供。自省是一個重要的功能,當(dāng)我們使用被稱為Java Beans的組件時將用到它。它允許你在運(yùn)行時而不是在編譯時分析一個軟件組件并且動態(tài)的描述它的功能。例如,通過使用自省,你能決定一個類支持哪些方法、構(gòu)造函數(shù)和成員屬性。
22.Java中的序列化(serialization)?
解答:
序列化(serialization)是把一個對象的狀態(tài)寫入一個字節(jié)流的過程。當(dāng)你想要把你的程序狀態(tài)存在一個固定的存儲區(qū)域例如文件時,它是很管用的。稍后,你就可以運(yùn)用序列化過程存儲這些對象。
Serializable接口:只有一個實現(xiàn)Serializable接口的對象可以被序列化工具存儲和恢復(fù)。Serializable接口沒有定義任何成員沒,它只用來表示一個類可以被序列化。如果一個類可以序列化,它的所有子類都可以序列化。
聲明成transient的變量不被序列化工具存儲。同樣,static變量也不被存儲。
23.客服端調(diào)用EJB對象的幾個基本步驟
解答:
設(shè)置JNDI服務(wù)工廠以及JNDI服務(wù)地址系統(tǒng)屬性,查找Home接口,從Home接口調(diào)用Create方法創(chuàng)建Remote接口,通過Remote接口調(diào)用其業(yè)務(wù)方法。
24.請對以下在J2EE中常用的名詞進(jìn)行解釋(或簡單描述)
web容器:給處于其中的應(yīng)用程序組件(JSP,SERVLET)提供一個環(huán)境,使JSP,SERVLET直接更容器中的環(huán)境變量接**互,不必關(guān)注其它系統(tǒng)問題。主要有WEB服務(wù)器來實現(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)域特色。他提供給運(yùn)行在其中的組件EJB各種管理功能。只要滿足J2EE規(guī)范的EJB放入該容器,馬上就會被容器進(jìn)行高效率的管理。并且可以通過現(xiàn)成的接口來獲得系統(tǒng)級別的服務(wù)。例如郵件服務(wù)、事務(wù)管理。
JNDI:(Java Naming & Directory Interface)JAVA命名目錄服務(wù)。主要提供的功能是:提供一個目錄系統(tǒng),讓其它各地的應(yīng)用程序在其上面留下自己的索引,從而滿足快速查找和定位分布式應(yīng)用程序的功能。
JMS:(Java Message Service)JAVA消息服務(wù)。主要實現(xiàn)各個應(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ā)者通過各種部署和自定義實現(xiàn)自己的個性安全控制策略。
RMI/IIOP:(Remote Method Invocation /internet對象請求中介協(xié)議)他們主要用于通過遠(yuǎn)程調(diào)用服務(wù)。例如,遠(yuǎn)程有一臺計算機(jī)上運(yùn)行一個程序,它提供股票分析服務(wù),我們可以在本地計算機(jī)上實現(xiàn)對其直接調(diào)用。當(dāng)然這是要通過一定的規(guī)范才能在異構(gòu)的系統(tǒng)之間進(jìn)行通信。RMI是JAVA特有的。
25.MVC的各個部分都有那些技術(shù)來實現(xiàn)?如何實現(xiàn)?
解答:
MVC是Model-View-Controller的簡寫。"Model" 代表的是應(yīng)用的業(yè)務(wù)邏輯(通過JavaBean,EJB組件實現(xiàn)), "View" 是應(yīng)用的表示面(由JSP頁面產(chǎn)生),"Controller" 是提供應(yīng)用的處理過程控制(一般是一個Servlet),通過這種設(shè)計模型把應(yīng)用邏輯,處理過程和顯示邏輯分成不同的組件實現(xiàn)。這些組件可以進(jìn)行交互和重用。
26.STRUTS的應(yīng)用(如STRUTS架構(gòu))
解答:
Struts是采用Java Servlet/JavaServer Pages技術(shù),開發(fā)Web應(yīng)用程序的開放源碼的framework。 采用Struts能開發(fā)出基于MVC(Model-View-Controller)設(shè)計模式的應(yīng)用構(gòu)架。 Struts有如下的主要功能: 一.包含一個controller servlet,能將用戶的請求發(fā)送到相應(yīng)的Action對象。 二.JSP自由tag庫,并且在controller servlet中提供關(guān)聯(lián)支持,幫助開發(fā)員創(chuàng)建交互式表單應(yīng)用。 三.提供了一系列實用對象:XML處理、通過Java reflection APIs自動處理JavaBeans屬性、國際化的提示和消息。
數(shù)據(jù)庫部分
1.設(shè)有關(guān)系EMP(ENO,ENAME,SALARY,DNO),其中各屬性的含義依次為職工號、姓名、工資和所在部門號,以及關(guān)系DEPT(DNO,DNAME,MANAGER),其中各屬性含義依次為部門號、部門名稱、部門經(jīng)理的職工號。(回答下列題目)
(1). 列出各部門中工資不低于600元的職工的平均工資。
解答:
SELECT AVG(月工資) FROM EMP GROUP BY 部門號
WHERE SALARY >=600
(2). 請用SQL語句將“銷售部”的那些工資數(shù)額低于600的職工的工資上調(diào)10%。
解答:
CREAT VIEW V AT職工表
WHERE (部門號==銷售部AND 工資<600);
UPDATA V
SET 工資=工資*1.1