java笔试题(题目+解析)
測試一
- 選擇題(不定項,每題2分,共20分)
1.不能用來修飾interface的有( ACD )
A.private
B.public
C.protected
D.static
解答:ACD
修飾接口可以是public和默認
2.在關系數據庫系統中,為了簡化用戶的查詢操作,而又不增加數據的存儲空間,常用的方法是創建( C?)
A.表(table)
B.游標(cursor)
C.視圖(view)
D.索引(index)
解析:數據庫試圖具有以下幾個作用:簡化用戶操作;使用戶能以多種角度看待同一數據;支持重構數據庫的邏輯獨立性;視圖能夠提供安全保護同時不增加數據的儲存空間
3.下面有關SPRING的事務傳播特性,說法錯誤的是?(?B?)
A.PROPAGATION_SUPPORTS:支持當前事務,如果當前沒有事務,就以非事務方式執行
B.PROPAGATION_REQUIRED:支持當前事務,如果當前沒有事務,就拋出異常
C.PROPAGATION_REQUIRES_NEW:新建事務,如果當前存在事務,把當前事務掛起
D.PROPAGATION_NESTED:支持當前事務,新增Savepoint點,與當前事務同步提交或回滾
解析:Spring的API設計很不錯,基本上根據英文翻譯就能知道作用:Required:必須的。說明必須要有事物,沒有就新建事物。supports:支持。說明僅僅是支持事務,沒有事務就非事務方式執行。mandatory:強制的。說明一定要有事務,沒有事務就拋出異常。required_new:必須新建事物。如果當前存在事物就掛起。not_supported:不支持事物,如果存在事物就掛起。never:絕不有事務。如果存在事物就拋出異常
4.下面有關struts1和struts2的區別,描述錯誤的是?(? B? )
A.Struts1要求Action類繼承一個抽象基類。Struts 2 Action類可以實現一個Action接口
B.Struts1 Action對象為每一個請求產生一個實例。Struts2 Action是單例模式并且必須是線程安全的
C.Struts1 Action 依賴于Servlet API,Struts 2 Action不依賴于容器,允許Action脫離容器單獨被測試
D.Struts1 整合了JSTL,Struts2可以使用JSTL,但是也支持OGNL
解析:從action類上分析:
1. ?Struts1要求Action類繼承一個抽象基類。Struts1的一個普遍問題是使用抽象類編程而不是接口。?
???2. Struts 2 Action類可以實現一個Action接口,也可實現其他接口,使可選和定制的服務成為可能。Struts2提供一個ActionSupport基類去實現常用的接口。Action接口不是必須的,任何有execute標識的POJO對象都可以用作Struts2的Action對象。
從Servlet 依賴分析:?
???3. Struts1 Action 依賴于Servlet API ,因為當一個Action被調用時HttpServletRequest 和 HttpServletResponse 被傳遞給execute方法。?
???4. Struts 2 Action不依賴于容器,允許Action脫離容器單獨被測試。如果需要,Struts2 Action仍然可以訪問初始的request和response。但是,其他的元素減少或者消除了直接訪問HttpServetRequest 和 HttpServletResponse的必要性。
從action線程模式分析:?
???5. Struts1 Action是單例模式并且必須是線程安全的,因為僅有Action的一個實例來處理所有的請求。單例策略限制了Struts1 Action能作的事,并且要在開發時特別小心。Action資源必須是線程安全的或同步的。?
???6. Struts2 Action對象為每一個請求產生一個實例,因此沒有線程安全問題。(實際上,servlet容器給每個請求產生許多可丟棄的對象,并且不會導致性能和垃圾回收問題)
5.以下關于子查詢和Group?By的描述正確的有(? ?A B C D ??)
A.沒有出現在Group?By子句后面的列名不能出現在Select字句非合計函數表達式中
B.在Select子句的后面,只能有兩種類型的表達式,一種是合計函數,一種是出現在Group?By子句后面的列名
C.不能在子查詢中包含Order?By?子句
D.如果子查詢的結果為空,那么外查詢條件始終不會成立
解析:group by:在select子句中只能有兩種類型表達式,一種是合計函數,一種是出現在group by子句后面的列名,沒有出現在group by子句后面的列名不可以出現在select 子句的非合計函數表達式中。如果在select語句中沒有出現group by子句,則不能在select子句中同時出現單個列名和合計函數的混合現象。如果要限制分組中的數據,則可以使用having子句而不能使用where子句
6.以下選項屬于進程間通信的是( ??ABD ??)
A.管道
B.套接字
C.內存
D.消息隊列
解析:進程中的幾種通信方式:
1)管道:管道是一種半雙工的通信方式,數據只能單向流動。而且只能在具有血緣關系(父子進程之間)的的進程間使用。
2)信號量:信號量是一個計數器,可以用來控制多個進程對共享資源的訪問
3)消息隊列:消息隊列是由消息組成的鏈表,存放在內核中,并由消息隊列標識符標識
4)信號:信號是有一種比較復雜的通信方式,用于通知接收進程某一事件已經發生
5)共享內存:共享內存就是映射一段能被其他進程所訪問的內存,這段共享內存由一個進程創建,但多個進程都可以訪問
6)套接字:即Socket,是一種通信機制,憑借這種機制,客戶/服務器系統的開發工作既可以在本地單機上進行,也可以跨網絡進行
7.下面程序運行之后,x的值是(?A? )
void swap(int a, int b)
{
??? int t = a;
??? a = b;
??? b = t;
}
??? …
int x = 2;
int y = 3;
swap(x, y);
A. 2 ??????????B.3 ?????????C.5 ?????????D.6
解析:值參數傳遞不能實現交換兩個整數,所以X最后還是2,想要實現兩個值交換可以已數組的形式實現
8.看以下代碼:
文件名稱:forward.jsp
??<html> ?
?? ??<head><title> 跳轉 ?</title> </head>?
?? ??<body> ?
?? ? ? ??<jsp:forward?page="index.htm"/> ? ??
?? ??</body>
?</html>?
如果運行以上jsp文件,地址欄的內容為( ?A ?)
A.http://127.0.0.1:8080/myjsp/forward.jsp
B.http://127.0.0.1:8080/myjsp/index.jsp
C.http://127.0.0.1:8080/myjsp/index.htm
D.http://127.0.0.1:8080/myjsp/forward.htm
解析:
forward和redirect是最常問的兩個問題:
forward,服務器獲取跳轉頁面內容傳給用戶,用戶地址欄不變
redirect,是服務器向用戶發送轉向的地址,redirect后地址欄變成新的地址
因此這個題是A
redirect:請求重定向:客戶端行為,本質上為2次請求,地址欄改變,前一次請求對象消失。舉例:你去銀行辦事(forward.jsp),結果告訴你少帶了東西,你得先去警察局辦(index.html)臨時身份證,這時你就會走出銀行,自己前往警察局,地址欄變為index.html.
forward:請求轉發:服務器行為,地址欄不變。舉例:你把錢包落在出租車上,你去警察局(forward.jsp)報案,警察局說錢包落在某某公司的出租車上(index.html),這時你不用親自去找某某公司的出租車,警察局讓出租車自己給你送來,你只要在警察局等就行。所以地址欄不變,依然為forward.jsp
9.下列說法錯誤的有( ?ACD ?)
A. 在類方法中可用this來調用本類的類方法
B. 在類方法中調用本類的類方法時可直接調用
C. 在類方法中只能調用本類中的類方法
D. 在類方法中絕對不能調用實例方法
解答:ACD
A.在類方法中不能使用this關鍵字
C.在類方法中可以調用其它類中的類方法
D.在類方法中可以通過實例化對象調用實例方法
10.下面能讓線程停止執行的有(多選)( ?ABDEF ?)
A. sleep();
B. stop();
C. notify();
D. synchronized();
E. yield();
F. wait();
G. notifyAll();
解答:ABDEF
sleep:導致此線程暫停執行指定時間
stop: 這個方法將終止所有未結束的方法,包括run方法。
synchronized():對象鎖
yield:當前正在被服務的線程可能覺得cpu的服務質量不夠好,于是提前退出,這就是yield。
wait:當前正在被服務的線程需要睡一會,醒來后繼續被服務
- 填空題(每題2分,共20分)
1 Java語言的各種數據類型之間提供兩種轉換,自動轉換和????強制轉換????
2 Java 中使用關鍵字?定義抽象類??????abstract?????????????
3 java方法中參數傳遞的原則有2種,一種是????按值傳遞??,另一種是???按引用傳遞???
4 用static修飾的方法,稱為靜態方法。它們不是對象的方法,而是整個類的方法。靜態方法只能處理用關鍵字????static????修飾的數據。
5 在Java中有一種叫作??構造函數??特殊方法,我們在程序中用它來對類的對象成員進行初始化。
6 被關鍵字___final_______修飾的方法是不能被當前類的子類重新定義的方法
7 Java程序中整數常量默認是????int????類型,浮點數默認的是????double???類型?
8 main方法的聲明格式?????public static?void main(String[] args)????
9 Java中所有類都是????java.lang.object????的子類。
10 定義接口的關鍵字是??????interface?????
- 簡答題(每題5分,30分)
1.什么叫死鎖,怎么解決死鎖
??死鎖:有兩個進程A和B,A持有資源a等待b資源,B持有資源b等待a資源,兩個進程都在等待另一個資源的同時不釋放資源,就形成死鎖。
形成死鎖的四個必要條件:
(1) 互斥條件:一個資源每次只能被一個進程使用。
(2) 請求與保持條件:一個進程因請求資源而阻塞時,對已獲得的資源保持不放。
(3) 不剝奪條件:進程已獲得的資源,在末使用完之前,不能強行剝奪。
(4) 循環等待條件:若干進程之間形成一種頭尾相接的循環等待資源關系。
?解決:
1.首先一個可行的做法是釋放所有鎖,回退,并且等待一段隨機的時間后重試。這個和簡單的加鎖超時類似,不一樣的是只有死鎖已經發生了才回退,而不會是因為加鎖的請求超時了。
2.回退和等待,但是如果有大量的線程競爭同一批鎖,它們還是會重復地死鎖(注:原因同超時類似,不能從根本上減輕競爭)。
3.一個更好的方案是給這些線程設置優先級,讓一個(或幾個)線程回退,剩下的線程就像沒發生死鎖一樣繼續保持著它們需要的鎖。如果賦予這些線程的優先級是固定不變的,同一批線程總是會擁有更高的優先級。為避免這個問題,可以在死鎖發生的時候設置隨機的優先級。
2.什么是事務,事務的特性,什么叫ACID。
??事務:邏輯單元內的一系列操作,要么全部完成執行,要么全部不執行。
事務的結果有兩種:當事務中的所有步驟全部成功執行完成時,事務提交。如果其中一個步驟失敗,將發生回滾操作,撤消之前到事務開始時的所有操作。
事務管理是應用系統開發中必不可少的一部分。Spring 為事務管理提供了豐富的功能支持。事務分為數據庫級別的事務和應用程序級別的事務,數據庫管理員處理的是數據庫級別的事務,Java程序員處理的是應用程序級別的事務。Spring 事務管理分為 編程式事務管理 和 聲明式事務管理 的兩種方式。
????事務的四大特性(ACID):原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability)
- 原子性(A-Atomicity)??事務開始后所有操作,要么全部做完,要么全部不做,不可能停滯在中間環節。
- 一致性(C-Consistency)???事務開始前和結束后,數據庫的完整性約束沒有被破壞 。
- 持久性(I-Isolation)??事務完成后,事務對數據庫的所有更新將被保存到數據庫,不能回滾。
- 隔離性(D-Durability)???同一時間,只允許一個事務請求同一數據,不同的事務之間彼此沒有任何干擾
3.Activiti和Shiro的作用
Shiro:?
??????用戶認證 ?登錄 ??攔截器
?資源授權 ???資源表示系統中所有的可訪問的菜單
Activiti:
??????解決多個任務人共同完成復雜的業務流。 他是一個業務框架
4.TCP和UDP協議的區別,什么是三次握手。
1.基于連接與無連接;
2.對系統資源的要求(TCP較多,UDP少);
3.UDP程序結構較簡單;
4.流模式與數據報模式 ;
5.TCP保證數據正確性,UDP可能丟包,TCP保證數據順序,UDP不保證。
?所謂的“三次握手”:為了對每次發送的數據量進行跟蹤與協商,確保數據段的發送和接收同步,根據所接收到的數據量而確認數據發送、接收完畢后何時撤消聯系,并建立虛連接。
為了提供可靠的傳送,TCP在發送新的數據之前,以特定的順序將數據包的序號,并需要這些包傳送給目標機之后的確認消息。TCP總是用來發送大批量的數據。當應用程序在收到數據后要做出確認時也要用到TCP。
5.多線程同步有幾種方法。
???多線程的實現方法有繼承Thread類,實現Runnable接口,實現Callable接口。
同步可以使用Synchronized關鍵字,也可以使用可重入鎖ReentrantLock,ThreadLocal同步機制也可以實現同步。
6.RPC服務和restful服務的區別(建議加深對rpc和restful的了解)
1、從本質區別上看,RPC是基于TCP實現的,RESTFUL是基于HTTP來實現的。
2、從傳輸速度上來看,因為HTTP封裝的數據量更多所以數據傳輸量更大,所以RPC的傳輸速度是比RESTFUL更快的。
3、因為HTTP協議是各個框架都普遍支持的。在toC情況下,因為不知道情況來源的框架、數據形勢是什么樣的,所以在網關可以使用Restful利用http來接受。而在微服務內部的各模塊之間因為各協議方案是公司內部自己定的,所以知道各種數據方式,可以使用TCP傳輸以使各模塊之間的數據傳輸更快。所以可以網關和外界的數據傳輸使用RESTFUL,微服務內部的各模塊之間使用RPC。
4、RESTFUL的API的設計上是面向資源的,對于同一資源的獲取、傳輸、修改可以使用GET、POST、PUT來對同一個URL進行區別,而RPC通常把動詞直接體現在URL上
- 編程題(每題10分,共30)
1.題目描述
查找最晚入職員工的所有信息,為了減輕入門難度,目前所有的數據里員工入職的日期都不是同一天(sqlite里面的注釋為--,mysql為comment)
| emp_no | birth_date | name | gender | hire_date |
| 10008 | 1958-02-19 | Kalloufi | M | 1994-09-15 |
求:
(1).創建如上employee表,設置emp_no為主鍵(2分)
?????CREATE TABLE `employee` ?(`emp_no` int(11) NOT NULL,`birth_date` date NULL DEFAULT NULL,`name` varchar(16) NOT NULL,`gender` varchar(16) NOT NULL,`hire_date` date NULL DEFAULT NULL,PRIMARY KEY (`emp_no`))(2)寫SQL語句插入5條數據(2分)
INSERT INTO employee VALUES (1008,'1958-02-19','Kalloufi','M','1994-09-15');INSERT INTO employee VALUES (VALUE,'VALUE','VALUE','VALUE','VALUE');INSERT INTO employee VALUES (VALUE,'VALUE','VALUE','VALUE','VALUE');INSERT INTO employee VALUES (VALUE,'VALUE','VALUE','VALUE','VALUE');INSERT INTO employee VALUES (VALUE,'VALUE','VALUE','VALUE','VALUE');(3)查找最晚入職員工的所有信息(3分)
SELECT *FROM employeeWHERE hire_date = (SELECT MAX(hire_date) FROM employee)(4)?將編號為1008的員工改名為Mally(3分)
UPDATE employee SET NAME='Mally' WHERE emp_no=10082.輸入某年某月某日,判斷這一天是這一年的第幾天?(10分)
??程序分析:以3月5日為例,應該先把前兩個月的加起來,然后再加上5天即本年的第幾天,特殊情況,閏年且輸入月份大于3時需考慮多加一天。
??參考代碼:
??
import java.util.*;public class test {public static void main (String[]args){int day=0;int month=0;int year=0;int sum=0;int leap; ??System.out.print("請輸入年,月,日\n"); ??Scanner input = new Scanner(System.in);year=input.nextInt();month=input.nextInt();day=input.nextInt();switch(month) /*先計算某月以前月份的總天數*/ ?{ ??case 1:sum=0;break; ??case 2:sum=31;break; ??case 3:sum=59;break; ??case 4:sum=90;break; ??case 5:sum=120;break; ??case 6:sum=151;break; ??case 7:sum=181;break; ??case 8:sum=212;break; ??case 9:sum=243;break; ??case 10:sum=273;break; ??case 11:sum=304;break; ??case 12:sum=334;break; ??default:System.out.println("data error");break;} ??sum=sum+day; /*再加上某天的天數*/ ?if(year%400==0||(year%4==0&&year%100!=0))/*判斷是不是閏年*/ ?leap=1; ??else ?leap=0; ??if(leap==1 && month>2)/*如果是閏年且月份大于2,總天數應該加一天*/ ?sum++; ??System.out.println("It is the the day:"+sum);}}3.題目描述(本題知識點:二分法,10分)
牛牛從小就有收集魔法卡的習慣,他最大的愿望就是能夠集齊 k 種不同種類的魔法卡,現在有 n 張魔法卡,這 n 張魔法卡存在于一維坐標點上,
每張魔法卡可能屬于某一種類。牛牛如果想收集魔法卡就需要從當前坐標點跳躍到另外一個魔法卡所在的坐標點,花費的代價是兩個跳躍坐標點之間的距離差。
牛??梢詮娜我獾淖鴺它c出發,牛牛想知道他集齊 k 種魔法卡所花費的最小代價是多少,如果集不齊 k 種魔法卡,輸出-1。
第一行輸入兩個整數 n,k, 分別表示魔法卡的個數和種類個數。
接下來有n行,每行兩個數x,y 分別表示屬于哪一種魔法卡和魔法卡所在的坐標
示例1
輸入
7,3,[[0,1],[0,2],[1,5],[1,1],[0,7],[2,8],[1,3]]
輸出
3
說明
樣例一:牛牛從坐標點5出發,經過7、8兩個點就收集了3張不同種類的魔法卡,達成成就。
所需代價 (7-5)+(8-7) = 3
備注:
其中 1<=n<=10^6, 1<=k<=50
0<=x<k, 0<=y<=1e9
參考代碼:??
import java.util.*;public class Solution {/*** @param n int整型* @param k int整型* @param card int整型二維數組* @return int整型*/public static int solve (int n, int k, int[][] card) {if (card == null || n < k) return -1;int minDistance = -1;Arrays.sort(card,(o1, o2) -> o1[1] == o2[1] ? o1[0] - o2[0] : o1[1] - o2[1]);//Utils.print2DArray(card);HashMap<Integer,Integer> map = new HashMap<>();int right = -1,left = 0;while (right < card.length - 1) {right++;map.put(card[right][0],map.getOrDefault(card[right][0],0) + 1);//left去重while (map.get(card[left][0]) > 1) {map.put(card[left][0],map.get(card[left][0]) - 1);if (map.get(card[left][0]) == 0) {map.remove(card[left][0]);}left++;}if (map.size() == k) {//已經湊齊int end = card[right][1],start = card[left][1];minDistance = minDistance == -1 ? end - start : Math.min(minDistance,end - start);}}return minDistance;}}總結
以上是生活随笔為你收集整理的java笔试题(题目+解析)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android 换肤demo,轻量快捷接
- 下一篇: docker容器配置加速器