yiche科技java面試題

1. System.out.println("str".getClass().getName())輸出什麼?

 答:輸出java.lang.String  ,因爲str是字符串

2.以下哪個HTTP頭信息與瀏覽器緩存無關

 A. Etag    B.Upgrade   C. Explire  D Last-Modified

答:B

常見的響應頭:
Location: http://www.lks.cn/index.html                          控制瀏覽器顯示哪個頁面 
Server:apache nginx                                                   服務器的類型 
Content-Encoding: gzip                                               服務器發送的壓縮編碼方式 
Content-Length: 80                                                     服務器發送顯示的字節碼長度 
Content-Language: zh-cn                                           服務器發送內容的語言和國家名 
Content-Type: image/jpeg; charset=UTF-8                 服務器發送內容的類型和編碼類型 
Last-Modified: Tue, 11 Jul 2000 18:23:51GMT           服務器最後一次修改的時間 
Refresh: 1;url=http://www.lks.cn                                  控制瀏覽器1秒鐘後轉發URL所指向的頁面 
Content-Disposition: attachment; filename=lks.jpg      服務器控制瀏覽器發下載方式打開文件 
Transfer-Encoding: chunked                                      服務器分塊傳遞數據到客戶端  
Set-Cookie:SS=Q0=5Lb_nQ; path=/search                服務器發送Cookie相關的信息 
Expires: -1                                                                  資源的過期時間,提供給瀏覽器緩存數據,-1永遠過期 
Cache-Control: no-cache                                           告訴瀏覽器,一定要回服務器校驗,不管有沒有緩存數據。 
Pragma: no-cache                                                      服務器控制瀏覽器不要緩存網頁   
Connection: close/Keep-AliveHTTP                           請求的版本的特點   
Date: Tue, 11 Jul 2000 18:23:51 GMT                       響應網站的時間 
ETag:“ihfdgkdgnp98hdfg”                                       資源實體的標識(唯一標識,類似md5值,文件有修改md5就不一樣)
關於緩存相關頭的解釋:
 Expires 
            一個GMT時間,試圖告知瀏覽器,在此日期內,可以信任並使用對應緩存中的副本,缺點是,一但客戶端日期不準確.則可能導致失效.
 Pragma : no-cache   
        這個是http1.0中的常規頭,作用同http1.1的 Cache-Control : no-cache
 Last-Modified 
         一個GMT時間,告知被請求實體的最後修改時間.用於瀏覽器校驗其緩存副本是否仍然可以信任.與其相關的兩個條件請求標頭:
      1)If-Modified-Since 
         僅在get方法中意義,這個也是比較常見的。 如果實體在指定時間後,沒有修改則返回一個304,否則返回一個常規的Get請求的響應(比如200),靜態文件沒有修改返回304是好的,因爲它只是回服務器校驗一下是否有修改,而並沒有像200那樣重新請求數據。
      2)If-Unmodified-Since: 
         如果實體沒有任何修改,那麼就可以直接執行該請求, 而如果有修改,則返回一個412 Precondition Failed狀態碼,並且拋棄該方法對應的行爲操作(GET方法除外). 
 Cache-Control (http1.1的常見頭)
      1)public   
         僅體現在響應頭,通知瀏覽器可以無條件的緩存該響應。
      2)private  
         僅體現在響應頭,通知瀏覽器只針對單個用戶緩存響應. 且可以具體指定某個字段.如private –“username”
      3)no-cache
          a) 請求頭中:告訴瀏覽器回去服務器取數據,並驗證你的緩存(如果有的話)。
          b) 響應頭中:告訴瀏覽器,一定要回服務器校驗,不管有沒有緩存數據。 如果確定沒有被改,可以使用緩存中               的數據
      4)no-store 
          告訴瀏覽器任何情況下都不要被緩存。
      5)max-age
          a) 請求頭中:強制響應瀏覽器,根據該值,校驗緩存.即與自身的Age值,與請求時間做比較.如果超出max-    age值,則強制去服務器端驗證.以確保返回一個新鮮的響應.其功能本質上與傳統的Expires類似,但區別在於Ex    pires是根據某個特定日期值做比較.一但緩存者自身的時間不準確.則結果可能就是錯誤的.而max-age,顯然無    此問題. Max-age的優先級也是高於Expires的.
          b) 響應頭中:同上
3.多線程中使用sleep和wait的區別
4.JDBC操作數據庫有哪些步驟,Statement和PrepareStatement的區別?
答:1、加載JDBC驅動程序
        在連接數據庫之前,首先要加載想要連接的數據庫的驅動到JVM(Java虛擬機),這通過java.lang.Class類的靜態方法
        forName(String className)實現。 
例如: 
try{ 
//加載MySql的驅動類 
Class.forName("com.mysql.jdbc.Driver") ; 
}catch(ClassNotFoundException e){ 
System.out.println("找不到驅動程序類 ,加載驅動失敗!"); 
e.printStackTrace() ; 
成功加載後,會將Driver類的實例註冊到DriverManager類中。
2、提供JDBC連接的URL 
例如:(MySql的連接URL) 
jdbc:mysql: 
//localhost:3306/test?useUnicode=true&characterEncoding=gbk ; 
3、創建數據庫的連接
要連接數據庫,需要向java.sql.DriverManager請求並獲得Connection對象, 
該對象就代表一個數據庫的連接。 
•使用DriverManager的getConnectin(String url , String username , 
String password )方法傳入指定的欲連接的數據庫的路徑、數據庫的用戶名和 
密碼來獲得。 
例如: 
//連接MySql數據庫,用戶名和密碼都是root 
String url = "jdbc:mysql://localhost:3306/test" ; 
String username = "root" ; 
String password = "root" ; 
try{ 
Connection con = 
DriverManager.getConnection(url , username , password ) ; 
}catch(SQLException se){ 
System.out.println("數據庫連接失敗!"); 
se.printStackTrace() ; 

4、創建一個Statement 
•要執行SQL語句,必須獲得java.sql.Statement實例,Statement實例分爲以下3 
種類型: 
1、執行靜態SQL語句。通常通過Statement實例實現。 
2、執行動態SQL語句。通常通過PreparedStatement實例實現。 
3、執行數據庫存儲過程。通常通過CallableStatement實例實現。 
具體的實現方式: 
Statement stmt = con.createStatement() ; 
PreparedStatement pstmt = con.prepareStatement(sql) ; 
CallableStatement cstmt = 
con.prepareCall("{CALL demoSp(? , ?)}") ; 
5、執行SQL語句 
Statement接口提供了三種執行SQL語句的方法:executeQuery 、executeUpdate 
和execute 
1、ResultSet executeQuery(String sqlString):執行查詢數據庫的SQL語句 
,返回一個結果集(ResultSet)對象。 
2、int executeUpdate(String sqlString):用於執行INSERT、UPDATE或 
DELETE語句以及SQL DDL語句,如:CREATE TABLE和DROP TABLE等 
3、execute(sqlString):用於執行返回多個結果集、多個更新計數或二者組合的 
語句。 
具體實現的代碼: 
ResultSet rs = stmt.executeQuery("SELECT * FROM ...") ; 
int rows = stmt.executeUpdate("INSERT INTO ...") ; 
boolean flag = stmt.execute(String sql) ; 
6、處理結果 
兩種情況: 
1、執行更新返回的是本次操作影響到的記錄數。 
2、執行查詢返回的結果是一個ResultSet對象。 
• ResultSet包含符合SQL語句中條件的所有行,並且它通過一套get方法提供了對這些 
行中數據的訪問。 
• 使用結果集(ResultSet)對象的訪問方法獲取數據: 
while(rs.next()){ 
String name = rs.getString("name") ; 
String pass = rs.getString(1) ; // 此方法比較高效 

(列是從左到右編號的,並且從列1開始) 
7、關閉JDBC對象 
操作完成以後要把所有使用的JDBC對象全都關閉,以釋放JDBC資源,關閉順序和聲 
明順序相反: 
1、關閉記錄集 
2、關閉聲明 
3、關閉連接對象 
if(rs != null){ // 關閉記錄集 
try{ 
rs.close() ; 
}catch(SQLException e){ 
e.printStackTrace() ; 


if(stmt != null){ // 關閉聲明 
try{ 
stmt.close() ; 
}catch(SQLException e){ 
e.printStackTrace() ; 


if(conn != null){ // 關閉連接對象 
try{ 
conn.close() ; 
}catch(SQLException e){ 
e.printStackTrace() ; 

}
Statement和PrepareStatement都是接口類,後面一個是預編譯,至於預編譯語句,比如 select * from emp where id=?  對於後面的問號是可以靈活賦值的,不是死的,它們是屬於不同的兩個類,Statement用於執行拼接的SQL語句,PrepareStatement可以預加載語句,把變量的值設爲問號,然後再對應問號順序賦值,這樣能防止一個安全漏洞。PreparedStatement對象不僅包含了SQL語句,而且大多數情況下這個語句已經被預編譯過,因而當其執行時,只需DBMS運行SQL語句,而不必先編譯。當你需要執行Statement對象多次的時候,PreparedStatement對象將會大大降低運行時間,當然也加快了訪問數據庫的速度
5.分別簡述以下java類之間的異同
  a)ArrayList和數組
  b)ArrayList和LinkedList
  c)HashMap和HashTable
6.以下問題2選1
  a)列出你知道的加密算法名稱,簡述其特徵
  b)列出你知道的排序算法名稱,指出其中那個平均複雜度最小
7.tomcat啓動時從哪些位置查找web應用,不同位置的優先級?
8.用java實現一個數組的二分查找
public class BinarySearchDemo {
public static void main(String[] args) {
int[] a = new int[]{1,5,7,9,11,18,23,48,69};
int point = new BinarySearchDemo().binarySearch(a, 23);
if(point == -1)
System.out.println("在數組中未查找到數23");
else 
System.out.println("數字23是數組中第 " + (point + 1) + " 位數");
}
/**
* 二分法查找一個整數在整型數組中的位置
* 算法思路:首先得到數組a的最小值和最大值的下標,分別是:low和high,接着求出值位於數組中間那個數的下標middle
* 然後再將這個middle對應的數組中的數和待查找的數num進行比較,如果相等,則表示已查找到,如果num < a[middle]
* 則說明num位於a[low]和a[middle]之間,於是將a[middle - 1]設爲較大值,繼續求出此時對應的a[middle],
* 再進行比較,其他情況可依次類推。一直到low=high,如果此時還沒有在數組a中查找到,則說明該數組a中沒有值num,返回-1
* @param a 給定的整型數組
* @param num 待查找的數 num
* @return 返回整數num在數組a中的位置下標,如果未查找到則返回-1
* */
public int binarySearch(int[] a,int num){
int low = 0;
int high = a.length - 1;
while(low <= high){
int middle = (low + high) / 2;
if(num == a[middle])
return middle;
else if(num < a[middle])
high = middle - 1;
else
low = middle + 1;
}
return -1;
}

}
9.較小寬帶下載大文件,多線程分塊下載能提高速度嗎?爲什麼?
10.在什麼場景下,家裏數據庫索引的壞處大於好處?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章