- 相關推薦
上汽集團Java開發筆試題目
一、J2EE(總分20分。每題2分)
簡述String和StringBuffer的區別。
String 對一串字符進行操作。不可變。一旦被創建,就不能修改它的值。
StringBuffer 也是對一串字符進行操作,但是可變類。
運行時異常(RuntimeException)與一般異常有何不同?
一般異常是可捕捉到的。運行時異常是不可預知的異常。
Sleep()和wait()有什么區別?
sleep是線程類(Thread)的方法,導致此線程暫停執行指定時間,把執行機會給其他線程,但是監控狀態依然保持,到時后會自動恢復。調用sleep不會釋放對象鎖。
wait().會釋放鎖
實現多線程有幾種方法?
三種,
1.繼承Thread類,重寫run函數
2.實現Runnable接口,重寫run函數
3.實現Callable接口,重寫call函數
簡述線程的基本狀態及狀態之間的關系。
Thread.ThreadState 屬性提供一個位掩碼,用它指示線程的當前狀態。一個線程至少總是處于 ThreadState 枚舉中一個可能狀態,并且可以同時處于多個狀態。
一旦線程由于調用 Thread.Start 而離開 Unstarted 狀態,則它將永遠無法返回到 Unstarted 狀態。同樣,線程也永遠無法離開 Stopped 狀態。
什么是線程同步,何如實現線程的同步?
當兩個或多個線程需要訪問同一資源時,它們需要以某種順序來確保該資源某一時刻只能被一個線程使用的方式稱為同步。要想實現同步操作,必須要獲得每一個線程對象的鎖。獲得它可以保證在同一時刻只有一個線程訪問對象中的共享關鍵代碼,并且在這個鎖被釋放之前,其他線程就不能再進入這個共享代碼。此時,如果還有其他線程想要獲得該對象的鎖,只得進入等待隊列等待。只有當擁有該對象鎖的線程退出共享代碼時,鎖被釋放,等待隊列中第一個線程才能獲得該鎖,從而進入共享代碼區。
JSP或Servlet中的forward和redirect有什么區別?
forward是服務器內部重定向,程序收到請求后重新定向到另一個程序,客戶機并不知道;redirect則是服務器收到請求后發送一個狀態頭給客戶,客戶將再請求一次,這里多了兩次網絡通信的來往。redirect 是送到客戶端后再一次 request , 所以資料不被保留.
簡述JDBC調用數據庫的基本步驟。
1,加載驅動
2,創建連接
3,獲取語句對象
4,執行sql語句
5,如果是查詢,還可以使用結果集
6,關閉連接
7,捕捉和處理異常
簡述Servlet的生命周期。
Servlet被服務器實例化后,容器運行其init方法,請求到達時運行其service方法,service方法自動派遣運行與請求對應的do方法(doGet,doPost)等,當服務器決定將實例銷毀的時候調用其destroy方法。
二、算法(總共20分)
請列舉幾種排序算法,并用JAVA實現快速排序算法。(6分)
冒泡排序,快速排序,shaker排序,堆排序。
public void quick(Integer[] str) {
if (str.length > 0) { //查看數組是否為空
_quickSort(str, 0, str.length – 1);
}
}
public void _quickSort(Integer[] list, int low, int high) {
if (low < high) {
int middle = getMiddle(list, low, high); //將list數組進行一分為二
_quickSort(list, low, middle – 1); //對低字表進行遞歸排序
_quickSort(list, middle + 1, high); //對高字表進行遞歸排序
}
}
public int getMiddle(Integer[] list, int low, int high) {
int tmp = list[low]; //數組的第一個作為中軸
while (low < high) {
while (low < high && list[high] > tmp) {
high–;
}
list[low] = list[high]; //比中軸小的記錄移到低端
while (low < high && list[low] < tmp) {
low++;
}
list[high] = list[low]; //比中軸大的記錄移到高端
}
list[low] = tmp; //中軸記錄到尾
return low; //返回中軸的位置
}
用Java實現二叉樹前序遍歷、中序遍歷和后序遍歷。(8分)
public class Tree {
private int data;// 數據節點
private Tree left;// 左子樹
private Tree right;// 右子樹
public Tree(int data) {
this.data = data;
this.left = null;
this.right = null;
}
/**
* 創建二叉樹,返回根結點
*/
public static Tree createTree(int[] input) {
Tree root = null;
Tree temp = null;
for (int i = 0; i < input.length; i++) {
// 創建根節點
if (root == null) {
root = temp = new Tree(input[i]);
} else {
// 回到根結點
temp = root;
// 添加節點
while (temp.data != input[i]) {
if (input[i] <= temp.data) {
if (temp.left != null) {
temp = temp.left;
} else {
temp.left = new Tree(input[i]);
}
} else {
if (temp.right != null) {
temp = temp.right;
} else {
temp.right = new Tree(input[i]);
}
}
}
}
}
return root;
}
/**
* 前序遍歷
*/
public static void preOrder(Tree tree) {
if (tree != null) {
System.out.print(tree.data + “”);
preOrder(tree.left);
preOrder(tree.right);
}
}
/**
* 中序遍歷
*/
public static void midOrder(Tree tree) {
if (tree != null) {
midOrder(tree.left);
System.out.print(tree.data + “”);
midOrder(tree.right);
}
}
/**
* 后序遍歷
*/
public static void posOrder(Tree tree) {
if (tree != null) {
posOrder(tree.left);
posOrder(tree.right);
System.out.print(tree.data + “”);
}
}
/**
* 求二叉樹的深度
*/
public static int length(Tree tree){
int depth1;
int depth2;
if(tree == null) return 0;
//左子樹的深度
depth1 = length(tree.left);
//右子樹的深度
depth2 = length(tree.right);
if(depth1>depth2)
return depth1+1;
else
return depth2+1;
}
public static void main(String[] args) {
int[] input = { 4, 2, 6, 1, 3, 5, 7,8,10 };
Tree tree = createTree(input);
System.out.print(“前序遍歷:“);
preOrder(tree);
System.out.print(“\n中序遍歷:“);
midOrder(tree);
System.out.print(“\n后序遍歷:“);
posOrder(tree);
}
}
三、閱讀代碼,并回答問題(6分)
Public String listToString( Vector strList) { String str = new String(); SortedSet set = new TreeSet(); set.addAll(strList); for(Iterator iter=set.iterator(); iter.hasNext(); String currStr = (String) iter.next(); Str += currStr + “;”; } return str; |
問題1:
這段代碼完成什么功能?如果輸入列表{“To” , “SAIC” , “Welcome”},輸入結果是什么?
數組元素拼接。TreeSet是按字母順序存儲的,結果是:SAIC;To;Welcome;
問題2這段代碼中有什么地方有錯誤或者可以改善的地方嗎?
錯誤:for(Iterator iter=set.iterator(); iter.hasNext();后面缺少“)”
改善:拼接到最后時,最后一個分號應去掉。
四、設計模式(總分10分,每題5分)
編程實現設計模式:Singleton(單例模式)。
class Singleton {
private static Singleton s;
private Singleton(){
}
public static Singleton getSigleton()
{
if(s==null)s=new Singleton();
return s;
}
}
畫出抽象工廠(Abstract Factory)的UML類圖。
五、數據庫(總分20分)
SOL查詢語句的左外連接、右外連接、全外連接、內聯接之間的區別。
左外連接的結果集包括LEFT OUTER子句中指定的左表的所有行,而不僅僅是連接列所匹配的行
右外連接是左向外連接的反向連接。將返回右表的所有行。
全外連接返回左表和右表中的所有行。當某行在另一個表中沒有匹配行時,則另一個表的選擇列表列包含空值。如果表之間有匹配行,則整個結果集行包含基表的數據值。
內連接使用比較運算符根據每個表共有的列的值匹配兩個表中的行。
舉例說明GROUP BY 和HAVING 子句的意義和使用方法。
每個部門有多少人
就要用到GROUP BY
select DepartmentID as ‘部門名稱‘,
COUNT(*) as ‘個數‘ from BasicDepartment group by DepartmentID
顯示每個地區的總面積.僅顯示那些面積超過1000000的地區。
SELECT region, SUM(area)
FROM bbc
GROUP BY region
HAVING SUM(area)>1000000
IN和 EXISTS的區別(4分)
比如in(1,2) 就是 = 1 or = 2的一種簡單寫法,所以一般在元素少的時候使用IN,如果多的話就用exists指定一個子查詢。
編寫SQL語句
為管理崗位業務培訓信息,建立3個表。
S(S#,SN,SD,SA)S#,SN,SD,SA分別代表學號、
學員姓名、所屬單位、學員年齡
C(C#,CN)C#,CN分別代表課程編號,課程名稱。
SC(S#,C#,G)S#,C#,G 分別代表學號,課程編號、學習成績
問題1:使用標準嵌套SQL語句查詢選修課程名稱為“稅收基礎“的學員學號和姓名。
Select
ssc s#, ssc.sn
from c
left join
( select s.*,sc.c#
From sc
Left join s
on s.s#=sc.s#
) as ssc
on ssc.c#=c.c#
where c.cn=’稅收基礎‘
問題2:查詢選修課程為“C2″的所有學員的學號、姓名、所屬單位、成績,并按照所屬單位升序、成績降序排列。
select sc.c#,s.sn,s.sd,sc.g
From sc
Left join s
on s.s#=sc.s#
where c. c#=’ C2′
order by s.sd asc,sc.g.desc
問題3:查詢所有學員選修課程的數量,列出學號、姓名、所選課程數,并按照課程數降序排列。
Select sc.s#,s.sn, sc.count
(
select count(s#) as count,s#
from sc
group by sc.s#
) sc
Left join s
on s.s#=sc.s#
order by sc.count desc
問題4:查詢選修課程數超過5次學員的學號、姓名、所屬單位、所選課程數,并按照學號升序排列。
SELECT
S#,
SN,
SD,
(SELECTCOUNT(DISTINCT C#)FROM SC
Where S#=s. S#
) as count
FROM S
WHERE S# IN(
SELECT [S#] FROM SC
GROUP BY [S#]
HAVING COUNT(DISTINCT [C#])>5)
六、框架(總分30分)
JSF
以JSF為例簡述MVC設計模式。
簡述JSF請求處理三命周期
1. 恢復視圖
2. 應用請求的值;處理驗證
3. 更新模型值;處理事件
4. 調用程序;處理事件
5. 進行響應;處理事件
JSF中的Backing Bea是干什么用的?
Backing bean定義了頁面上的UI組件的屬性和處理邏輯。每一個backing bean的屬性對應一個組件或者組件的值。Backing bean同時定義了一組執行組件功能的方法,比如驗證組件的數據,處理組件觸發的事件,當組件activate時處理與導航相關的操作。
JSF中的Converter是干什么用的?
輸入變換:在用戶提交時對用戶輸入值進行變換
輸出變換:在畫面顯示前對顯示值進行變換
JSF中的Validator是干什么用的?
對用戶輸入的數據進行驗證。
簡述Value-change Events、Action Events、Data Mooel Events、Phase Events。
值改變事件,動作事件,數據模型事件,階段事件
JSF Request Processing Lifecycle 的六個階段。
回復畫面(Restore View)
套用申請值(Apply Request Values)
執行驗證(Process Validations)
更新模型值(Update Model Values)
喚起應用程序(Invoke Application)
繪制回應(Render Response)
CommandButton 的immediate屬性起什么作用?
JSF視圖組件在取得請求中該取得的值之后,即立即處理指定的事件,而不再進行后續的轉換器處理、驗證器處理、更新模型值等流程。
的用途
將封裝在內的元件作為一個元件來看待
的用途
想要放入非JSF元件,例如簡單的模板(template)文字,那么就需要使用 標簽來處理。
Spring
簡述依賴注入(Dependency Injeciton,DI)和控制反轉(Inversion ofControl,IOC )的基本概念。
依賴注入DI是一個程序設計模式和架構模型,
一些時候也稱作控制反轉,盡管在技術上來講,依賴注入是一個IOC的特殊實現,依賴注入是指一個對象應用另外一個對象來提供一個特殊的能力,例如:把一個數據庫連接已參數的形式傳到一個對象的結構方法里面而不是在那個對象內部自行創建一個連接?刂品崔D和依賴注入的基本思想就是把類的依賴從類內部轉化到外部以減少依賴
應用控制反轉,對象在被創建的時候,由一個調控系統內所有對象的外界實體,將其所依賴的對象的引用,傳遞給它。也可以說,依賴被注入到對象中。所以,控制反轉是,關于一個對象如何獲取他所依賴的對象的引用,這個責任的反轉。
簡述AOP基本概念(Advice、Joinpoint、Polntcut、Aspect)以及在Spring AOP實現的特點和局限。
Advice:用于定義攔截行為
JoinPoint:提供訪問當前被通知方法的目標對象、代理對象、方法參數等數據
Polntcut:捕獲所有的連接點在指定的方法執行中,包括執行方法本身
Aspect:切入點指示符用來指示切入點表達式目的。
Spring Autorwiring by name 和Autowiring by type是什么意思?
byType是通過類型在“MyIdProviderManager”類里找屬性名字為“myIdProviderManager”的對象,然后為其注入
byName是通過名稱找的。
【上汽集團Java開發筆試題目】相關文章:
中興2013年Java開發筆試題目及答案02-10
java筆試題,筆試題目分享08-10
java筆試題目及答案02-16
仁寶集團筆試題目11-21
博惠思華Java開發工程師筆試題目及答案02-10
JAVA筆試題目之邏輯題02-25
JAVA經典筆試題目及答案(精選7套)08-03
JAVA筆試經驗08-01
星網銳捷硬件開發的筆試題目11-21
四大名企選才標準 上汽集團筆試要考智商02-04