Java面試題目

1、JDK是什麼?有什麼用?

JDK(Java Development Kit)顧名思義是java開發工具包,是程序員使用java語言編寫java程序所需的開發工具包,是提供給程序員使用的。JDK包含了JRE,同時還包含了編譯java源碼的編譯器javac,還包含了
很多java程序調試和分析的工具:jconsole,jvisualvm等工具軟件,還包含了java程序編寫所需的文檔和demo例子程序。

2、JRE是什麼?有什麼用?

JRE(Java Runtime Environment)顧名思義是java運行時環境,包含了java虛擬機,java基礎類庫。是使用java語言編寫的程序運行所需要的軟件環境,是提供給想運行java程序的用戶使用的。

3、jstack指令

jstack用於打印出給定的java進程ID或core file或遠程調試服務的Java堆棧信息,如果是在64位機器上,需要指定選項”-J-d64”,Windows的jstack使用方式只支持以下的這種方式:jstack [-l] pid。詳見
http://blog.csdn.net/zhaozheng7758/article/details/8623535

4、Java指令有哪些

C:>java -help 用法: java [-options] class [args…]
(執行類) 或 java [-options] -jar jarfile [args…]
(執行 jar 文件) 其中選項包括:
-d32 使用 32 位數據模型 (如果可用)
-d64 使用 64 位數據模型 (如果可用)
-server 選擇 “server” VM
-hotspot 是 “server” VM 的同義詞 [已過時]
默認 VM 是 server.

-cp <目錄和 zip/jar 文件的類搜索路徑>
-classpath <目錄和 zip/jar 文件的類搜索路徑>
用 ; 分隔的目錄, JAR 檔案
和 ZIP 檔案列表, 用於搜索類文件。
-D<名稱>=<值>
設置系統屬性
-verbose:[class|gc|jni]
啓用詳細輸出
-version 輸出產品版本並退出
-version:<值>
需要指定的版本才能運行
-showversion 輸出產品版本並繼續
-jre-restrict-search | -no-jre-restrict-search
在版本搜索中包括/排除用戶專用 JRE

5、java單元測試

使用JUnit,http://www.cnblogs.com/feiweiwei/archive/2009/06/16/1024623.html

6、JDBC的基本過程

(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
•連接URL定義了連接數據庫時的協議、子協議、數據源標識。
•書寫形式:協議:子協議:數據源標識
協議:在JDBC中總是以jdbc開始 子協議:是橋連接的驅動程序或是數據庫管理系統名稱。
數據源標識:標記找到數據庫來源的地址與連接端口。
例如:
(MySql的連接URL)

 jdbc:mysql:           //localhost:3306/test?useUnicode=true&characterEncoding=gbk ;    
  useUnicode=true

表示使用Unicode字符集。如果characterEncoding設置爲 gb2312或GBK,本參數必須設置爲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() ;  
          }           
  }

7、Java線程安全的類有哪些

vector:就比arraylist多了個同步化機制(線程安全),因爲效率較低,現在已經不太建議使用。在

web應用中,特別是前臺頁面,往往效率(頁面響應速度)是優先考慮的。

statck:堆棧類,先進後出

hashtable:就比hashmap多了個線程安全

enumeration:枚舉,相當於迭代器

除了這些之外,其他的非線程安全的類和接口。
線程安全的類其方法是同步的,每次只能一個訪問。是重量級對象,效率較低。

8、計算機有什麼數據結構

常用的結構:數組(Array)、棧(Stack)、隊列(Queue)、鏈表(Linked List)、樹(Tree)、圖(Graph)、堆(Heap)、散列表(Hash)

9、排序算法

穩定算法:
冒泡排序(bubble sort)
雞尾酒排序 (Cocktail sort, 雙向的冒泡排序)
插入排序 (insertion sort)
桶排序 (bucket sort)
計數排序 (counting sort)
合併排序 (merge sort)
原地合併排序
二叉排序樹排序 (Binary tree sort)
鴿巢排序 (Pigeonhole sort)
基數排序 (radix sort)
Gnome 排序
圖書館排序

不穩定算法:
選擇排序(selection sort)
希爾排序(shell sort)
組合排序
堆排序 (heapsort)
平滑排序
快速排序(quicksort)
內省排序 (Introsort)
Patience sorting

不實用算法:
Bogo排序
Stupid sort
珠排序(Bead sort)

10、除了Hibernate外,還有什麼ORM的框架

(1)Hibernate 全自動 需要些hql語句
(2)iBATIS 半自動 自己寫sql語句,可操作性強,小巧
(3)EclipseLink
ORM(Object-Relation Mapping,對象-關係映射),是一種爲了解決面向對象與關係數據庫存在的互一匹配的現象的技術。 就是model類與表中的列對應起來,將程序中的對象自動持久化到關係數據庫中。

11、如何面向接口編程

首先面向接口編程和麪向對象編程並不是平級的,它並不是比面向對象編程更先進的一種獨立的編程思想,而是附屬於面向對象思想體系,屬於其一部分。或者說,它是面向對象編程體系中的思想精髓之一。
在系統分析和架構中,分清層次和依賴關係,每個層次不是直接向其上層提供服務(即不是直接實例化在上層中),而是通過定義一組接口,僅向上層暴露其接口功能,上層對於下層僅僅是接口依賴,而不依賴具體類。
好處:
首先對系統靈活性大有好處。當下層需要改變時,只要接口及接口功能不變,則上層不用做任何修改。甚至可以在不改動上層代碼時將下層整個替換掉接口體現的是一種規範和實現分離的設計哲學,充分利用接口可以極好地降低程序各模塊之間的耦合,從而提高系統的可擴展性和可維護性。基於這種原則,通常推薦“面向接口”編程,而不是面向實現類編程,希望通過面向接口編程來降低程序的耦合。降低程序耦合度,提高系統的可擴展性和維護性。

12、MySQL如何優化百萬級數據

http://www.2cto.com/database/201306/222839.html

13、登錄流程怎麼實現?怎樣保證安全?

HTTPS是讓請求,截獲不了~~(敘述不準確,其實也是截獲了沒有用)。客戶端混淆是截獲了沒有用。
從截獲了沒有用的思路上說,簡單的單向Hash確實意義不大,攻擊者僞造一模一樣的POST(重放攻擊)就能成功登陸。所以要使用加鹽(SALT)Hash。服務器發送給客戶端的登陸頁面裏嵌上一個一次性且有時效性的字符串Salt,客戶端在傳回密碼時將Salt和密碼連接在一起進行Hash再提交。這樣客戶端每次登錄,由於獲取到的Salt不同,產生的Hash值也不同,且登錄後本次使用的Salt/Hash值立刻作廢,攻擊者無法通過重放截獲的信息登錄。
但是仍然並不是真正的安全:攻擊者可以攔截客戶端的登錄請求使之不能到達服務器,然後自己提交攔截的登錄

請求,從而以用戶的身份登錄。(也算是中間人攻擊了吧)

14、如何防止SQL注入

普通用戶與系統管理員用戶的權限要有嚴格的區分;
強迫使用參數化語句;
加強對用戶輸入的驗證;
多多使用數據庫自帶的安全參數;
必要的情況下使用專業的漏洞掃描工具來尋找可能被攻擊的點;
拒絕Cookie驗證方式。

15、爲什麼要用PrepareStatement,原理

一、代碼的可讀性和可維護性
雖然用PreparedStatement來代替Statement會使代碼多出幾行,但這樣的代碼無論從可讀性還是可維護性上來說.都比直接用Statement的代碼高很多檔次;
二、PreparedStatement盡最大可能提高性能
三、最重要的一點是極大地提高了安全性

16、MySQL、Oracle如何查詢前幾條記錄

SQL Server 的語法:SQL Server中使用topSELECT TOP number|percent column_name(s) FROM table_name QL 語法:MySQL使用limit關鍵字

SELECT column_name(s) FROM table_name LIMIT number  

例子

SELECT * FROM Persons LIMIT 5 

Oracle 語法:Oracle中使用 ROWNUM關鍵字

SELECT column_name(s) FROM table_name WHERE ROWNUM <= number   

例子1:查詢Persons表中的前5條記錄

SELECT * FROM Persons WHERE ROWNUM <= 5  

例子2:查詢procedure_no的最大值

SELECT  procedure_no  FROM (SELECT  *  FROM process_card_procedure where process_card_id=421 order 
by cast(procedure_no as int) desc) where rownum<=1

17、servlet要覆蓋哪些方法

(1) init() 方法在 Servlet 的生命期中,僅執行一次 init() 方法。
(2) service() 方法service() 方法是 Servlet 的核心
(3) destroy() 方法destroy() 方法僅執行一次,即在服務器停止且卸裝 Servlet 時執行該方法
(4) GetServletConfig()方法GetServletConfig ()方法返回一個 ServletConfig 對象,該對象用來返回初始化參數和 ServletContext 。
(5) GetServletInfo()方法GetServletInfo ()方法是一個可選的方法,它提供有關 servlet 的信息,如作者、版本、版權。當服務器調用 sevlet 的 Service ()、 doGet ()和 doPost ()這三個方法時,均需要 “請求”和“響應”對象作爲參數。

18、JSP有哪些內置對象

JSP共有以下9種基本內置組件(可與ASP的6種內部組件相對應):
  1.request對象
  客戶端的請求信息被封裝在request對象中,通過它才能瞭解到客戶的需求,然後做出響應。它是HttpServletRequest類的實例。
  序號 方 法 說 明

  1 object getAttribute(String name) 返回指定屬性的屬性值
  2 Enumeration getAttributeNames() 返回所有可用屬性名的枚舉
  3 String getCharacterEncoding() 返回字符編碼方式
  4 int getContentLength() 返回請求體的長度(以字節數)
  5 String getContentType() 得到請求體的MIME類型
  6 ServletInputStream getInputStream() 得到請求體中一行的二進制流
  7 String getParameter(String name) 返回name指定參數的參數值
  8 Enumeration getParameterNames() 返回可用參數名的枚舉
  9 String[] getParameterValues(String name) 返回包含參數name的所有值的數組
  10 String getProtocol() 返回請求用的協議類型及版本號
  11 String getScheme() 返回請求用的計劃名,如:http.https及ftp等
  12 String getServerName() 返回接受請求的服務器主機名
  13 int getServerPort() 返回服務器接受此請求所用的端口號
  14 BufferedReader getReader() 返回解碼過了的請求體
  15 String getRemoteAddr() 返回發送此請求的客戶端IP地址
  16 String getRemoteHost() 返回發送此請求的客戶端主機名
  17 void setAttribute(String key,Object obj) 設置屬性的屬性值
  18 String getRealPath(String path) 返回一虛擬路徑的真實路徑

  2.response對象
  response對象包含了響應客戶請求的有關信息,但在JSP中很少直接用到它。它是HttpServletResponse類的實例。
  序號 方 法 說 明
  

1 String getCharacterEncoding() 返回響應用的是何種字符編碼
2 ServletOutputStream getOutputStream() 返回響應的一個二進制輸出流
3 PrintWriter getWriter() 返回可以向客戶端輸出字符的一個對象
4 void setContentLength(int len) 設置響應頭長度
5 void setContentType(String type) 設置響應的MIME類型
6 sendRedirect(java.lang.String location) 重新定向客戶端的請求

  3.session對象
  session對象指的是客戶端與服務器的一次會話,從客戶端連到服務器的一個WebApplication開始,直到客戶端與服務器斷開連接爲止。它是HttpSession類的實例.
  序號 方 法 說 明
  

1 long getCreationTime() 返回SESSION創建時間
2 public String getId() 返回SESSION創建時JSP引擎爲它設的惟一ID號
3 long getLastAccessedTime() 返回此SESSION裏客戶端最近一次請求時間
4 int getMaxInactiveInterval() 返回兩次請求間隔多長時間此SESSION被取消(ms)
5 String[] getValueNames() 返回一個包含此SESSION中所有可用屬性的數組
6 void invalidate() 取消SESSION,使SESSION不可用
7 boolean isNew() 返回服務器創建的一個SESSION,客戶端是否已經加入
8 void removeValue(String name) 刪除SESSION中指定的屬性
9 void setMaxInactiveInterval() 設置兩次請求間隔多長時間此SESSION被取消(ms)

  4.out對象
  out對象是JspWriter類的實例,是向客戶端輸出內容常用的對象
  序號 方 法 說 明

1 void clear() 清除緩衝區的內容
2 void clearBuffer() 清除緩衝區的當前內容
3 void flush() 清空流
4 int getBufferSize() 返回緩衝區以字節數的大小,如不設緩衝區則爲0
5 int getRemaining() 返回緩衝區還剩餘多少可用
6 boolean isAutoFlush() 返回緩衝區滿時,是自動清空還是拋出異常
7 void close() 關閉輸出流

  5.page對象
  page對象就是指向當前JSP頁面本身,有點象類中的this指針,它是java.lang.Object類的實例
  序號 方 法 說 明
  

1 class getClass 返回此Object的類
2 int hashCode() 返回此Object的hash碼
3 boolean equals(Object obj) 判斷此Object是否與指定的Object對象相等
4 void copy(Object obj) 把此Object拷貝到指定的Object對象中
5 Object clone() 克隆此Object對象
6 String toString() 把此Object對象轉換成String類的對象
7 void notify() 喚醒一個等待的線程
8 void notifyAll() 喚醒所有等待的線程
9 void wait(int timeout) 使一個線程處於等待直到timeout結束或被喚醒
10 void wait() 使一個線程處於等待直到被喚醒
11 void enterMonitor() 對Object加鎖
12 void exitMonitor() 對Object開鎖

  6.application對象
  application對象實現了用戶間數據的共享,可存放全局變量。它開始於服務器的啓動,直到服務器的關閉,在此期間,此對象將一直存在;這樣在用戶的前後連接或不同用戶之間的連接中,可以對此對象的同一屬性進行操作;在任何地方對此對象屬性的操作,都將影響到其他用戶對此的訪問。服務器的啓動和關閉決定了application對象的生命。它是ServletContext類的實例。
  序號 方 法 說 明
  

1 Object getAttribute(String name) 返回給定名的屬性值
2 Enumeration getAttributeNames() 返回所有可用屬性名的枚舉
3 void setAttribute(String name,Object obj) 設定屬性的屬性值
4 void removeAttribute(String name) 刪除一屬性及其屬性值
5 String getServerInfo() 返回JSP(SERVLET)引擎名及版本號
6 String getRealPath(String path) 返回一虛擬路徑的真實路徑
7 ServletContext getContext(String uripath) 返回指定WebApplication的application對象
8 int getMajorVersion() 返回服務器支持的Servlet API的最大版本號
9 int getMinorVersion() 返回服務器支持的Servlet API的最大版本號
10 String getMimeType(String file) 返回指定文件的MIME類型
11 URL getResource(String path) 返回指定資源(文件及目錄)的URL路徑
12 InputStream getResourceAsStream(String path) 返回指定資源的輸入流
13 RequestDispatcher getRequestDispatcher(String uripath) 返回指定資源的RequestDispatcher對象
14 Servlet getServlet(String name) 返回指定名的Servlet
15 Enumeration getServlets() 返回所有Servlet的枚舉
16 Enumeration getServletNames() 返回所有Servlet名的枚舉
17 void log(String msg) 把指定消息寫入Servlet的日誌文件
18 void log(Exception exception,String msg) 把指定異常的棧軌跡及錯誤消息寫入Servlet的日誌文件
19 void log(String msg,Throwable throwable) 把棧軌跡及給出的Throwable異常的說明信息 寫入Servlet的日誌文件

  7.exception對象
  exception對象是一個例外對象,當一個頁面在運行過程中發生了例外,就產生這個對象。如果一個JSP頁面要應用此對象,就必須把isErrorPage設爲true,否則無法編譯。他實際上是java.lang.Throwable的對象
  序號 方 法 說 明
  

1 String getMessage() 返回描述異常的消息
2 String toString() 返回關於異常的簡短描述消息
3 void printStackTrace() 顯示異常及其棧軌跡
4 Throwable FillInStackTrace() 重寫異常的執行棧軌跡

  8.pageContext對象
  pageContext對象提供了對JSP頁面內所有的對象及名字空間的訪問,也就是說他可以訪問到本頁所在的

SESSION,也可以取本頁面所在的application的某一屬性值,他相當於頁面中所有功能的集大成者,它的本類名也叫pageContext。
  序號 方 法 說 明
  

1 JspWriter getOut() 返回當前客戶端響應被使用的JspWriter流(out)
2 HttpSession getSession() 返回當前頁中的HttpSession對象(session)
3 Object getPage() 返回當前頁的Object對象(page)
4 ServletRequest getRequest() 返回當前頁的ServletRequest對象(request)
5 ServletResponse getResponse() 返回當前頁的ServletResponse對象(response)
6 Exception getException() 返回當前頁的Exception對象(exception)
7 ServletConfig getServletConfig() 返回當前頁的ServletConfig對象(config)
8 ServletContext getServletContext() 返回當前頁的ServletContext對象(application)
9 void setAttribute(String name,Object attribute) 設置屬性及屬性值
10 void setAttribute(String name,Object obj,int scope) 在指定範圍內設置屬性及屬性值
11 public Object getAttribute(String name) 取屬性的值
12 Object getAttribute(String name,int scope) 在指定範圍內取屬性的值
13 public Object findAttribute(String name) 尋找一屬性,返回起屬性值或NULL
14 void removeAttribute(String name) 刪除某屬性
15 void removeAttribute(String name,int scope) 在指定範圍刪除某屬性
16 int getAttributeScope(String name) 返回某屬性的作用範圍
17 Enumeration getAttributeNamesInScope(int scope) 返回指定範圍內可用的屬性名枚舉
18 void release() 釋放pageContext所佔用的資源
19 void forward(String relativeUrlPath) 使當前頁面重導到另一頁面
20 void include(String relativeUrlPath) 在當前位置包含另一文件

  9.config對象
  config對象是在一個Servlet初始化時,JSP引擎向它傳遞信息用的,此信息包括Servlet初始化時所要用到的參數(通過屬性名和屬性值構成)以及服務器的有關信息(通過傳遞一個ServletContext對象)
  序號 方 法 說 明

1 ServletContext getServletContext() 返回含有服務器相關信息的ServletContext對象
2 String getInitParameter(String name) 返回初始化參數的值
3 Enumeration getInitParameterNames() 返回Servlet初始化所需所有參數的枚舉
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章