1 、a.hashCode() 有什麼用?與 a.equals(b) 有什麼關係?java
hashCode() 方法對應對象整型的 hash 值。它經常使用於基於 hash 的集合類,如 Hashtable、HashMap、LinkedHashMap等等。它與 equals() 方法關係特別緊密。根據 Java 規範,兩個使用 equal() 方法來判斷相等的對象,必須具備相同的 hash code。c++
2 、字節流與字符流的區別程序員
要把一段二進制數據數據逐一輸出到某個設備中,或者從某個設備中逐一讀取一段二進制數據,無論輸入輸出設備是什麼,咱們要用統一的方式來完成這些操做,用一種抽象的方式進行描述,這個抽象描述方式起名爲IO流,對應的抽象類爲OutputStream和InputStream,不一樣的實現類就表明不一樣的輸入和輸出設備,它們都是針對字節進行操做的。web
計算機中的一切最終都是二進制的字節形式存在。對於常常用到的中文字符,首先要獲得其對應的字節,而後將字節寫入到輸出流。讀取時,首先讀到的是字節,但是咱們要把它顯示爲字符,咱們須要將字節轉換成字符。因爲這樣的需求很普遍,Java專門提供了字符流包裝類。sql
底層設備永遠只接受字節數據,有時候要寫字符串到底層設備,須要將字符串轉成字節再進行寫入。字符流是字節流的包裝,字符流則是直接接受字符串,它內部將串轉成字節,再寫入底層設備,這爲咱們向IO設備寫入或讀取字符串提供了一點點方便。數據庫
字符向字節轉換時,要注意編碼的問題,由於字符串轉成字節數組,實際上是轉成該字符的某種編碼的字節形式,讀取也是反之的道理。編程
3 、什麼是java序列化,如何實現java序列化?或者請解釋Serializable接口的做用。設計模式
咱們有時候將一個java對象變成字節流的形式傳出去或者從一個字節流中恢復成一個java對象,例如,要將java對象存儲到硬盤或者傳送給網絡上的其餘計算機,這個過程咱們能夠本身寫代碼去把一個java對象變成某個格式的字節流再傳輸。數組
可是,jre自己就提供了這種支持,咱們能夠調用OutputStream的writeObject方法來作,若是要讓java幫咱們作,要被傳輸的對象必須實現serializable接口,這樣,javac編譯時就會進行特殊處理,編譯的類才能夠被writeObject方法操做,這就是所謂的序列化。須要被序列化的類必須實現Serializable接口,該接口是一個mini接口,其中沒有須要實現方法,implements Serializable只是爲了標註該對象是可被序列化的。瀏覽器
例如,在web開發中,若是對象被保存在了Session中,tomcat在重啓時要把Session對象序列化到硬盤,這個對象就必須實現Serializable接口。若是對象要通過分佈式系統進行網絡傳輸,被傳輸的對象就必須實現Serializable接口。
4 、描述一下JVM加載class文件的原理機制?
JVM中類的裝載是由ClassLoader和它的子類來實現的,Java ClassLoader是一個重要的Java運行時系統組件。它負責在運行時查找和裝入類文件的類。
5 、heap和stack有什麼區別。
java的內存分爲兩類,一類是棧內存,一類是堆內存。棧內存是指程序進入一個方法時,會爲這個方法單獨分配一塊私屬存儲空間,用於存儲這個方法內部的局部變量,當這個方法結束時,分配給這個方法的棧會釋放,這個棧中的變量也將隨之釋放。
堆是與棧做用不一樣的內存,通常用於存放不在當前方法棧中的那些數據,例如,使用new建立的對象都放在堆裏,因此,它不會隨方法的結束而消失。方法中的局部變量使用final修飾後,放在堆中,而不是棧中。
6 、GC是什麼?爲何要有GC?
GC是垃圾收集的意思(Gabage Collection),內存處理是編程人員容易出現問題的地方,忘記或者錯誤的內存回收會致使程序或系統的不穩定甚至崩潰,Java提供的GC功能能夠自動監測對象是否超過做用域從而達到自動回收內存的目的,Java語言沒有提供釋放已分配內存的顯示操做方法。
7 、垃圾回收的優勢和原理。並考慮2種回收機制。
Java語言中一個顯著的特色就是引入了垃圾回收機制,使c++程序員最頭疼的內存管理的問題迎刃而解,它使得Java程序員在編寫程序的時候再也不須要考慮內存管理。因爲垃圾回收機制,Java中的對象再也不有"做用域"的概念,只有對象的引用纔有"做用域"。
垃圾回收能夠有效的防止內存泄露,有效的使用可使用的內存。垃圾回收器一般是做爲一個單獨的低級別的線程運行,不可預知的狀況下對內存堆中已經死亡的或者長時間沒有使用的對象進行清除和回收,程序員不能實時的調用垃圾回收器對某個對象或全部對象進行垃圾回收。
回收機制有分代複製垃圾回收和標記垃圾回收,增量垃圾回收。
8 、垃圾回收器的基本原理是什麼?垃圾回收器能夠立刻回收內存嗎?有什麼辦法主動通知虛擬機進行垃圾回收?
對於GC來講,當程序員建立對象時,GC就開始監控這個對象的地址、大小以及使用狀況。一般,GC採用有向圖的方式記錄和管理堆(heap)中的全部對象。經過這種方式肯定哪些對象是"可達的",哪些對象是"不可達的"。當GC肯定一些對象爲"不可達"時,GC就有責任回收這些內存空間。
程序員能夠手動執行System.gc(),通知GC運行,可是Java語言規範並不保證GC必定會執行。
9 、Java 中,throw 和 throws 有什麼區別
throw 用於拋出 java.lang.Throwable 類的一個實例化對象,意思是說你能夠經過關鍵字 throw 拋出一個Exception,如:
throw new IllegalArgumentException(「XXXXXXXXX″)
而throws 的做用是做爲方法聲明和簽名的一部分,方法被拋出相應的異常以便調用者能處理。Java 中,任何未處理的受檢查異常強制在 throws 子句中聲明。
10 ,java中會存在內存泄漏嗎,請簡單描述。
先解釋什麼是內存泄漏:所謂內存泄露就是指一個再也不被程序使用的對象或變量一直被佔據在內存中。java中有垃圾回收機制,它能夠保證當對象再也不被引用的時候,對象將自動被垃圾回收器從內存中清除掉。
因爲Java使用有向圖的方式進行垃圾回收管理,能夠消除引用循環的問題,例若有兩個對象,相互引用,只要它們和根進程不可達,那麼GC也是能夠回收它們的。
java中的內存泄露的狀況:長生命週期的對象持有短生命週期對象的引用就極可能發生內存泄露,儘管短生命週期對象已經再也不須要,可是由於長生命週期對象持有它的引用而致使不能被回收,這就是java中內存泄露的發生場景,通俗地說,就是程序員可能建立了一個對象,之後一直再也不使用這個對象,這個對象卻一直被引用,即這個對象無用可是卻沒法被垃圾回收器回收的,這就是java中可能出現內存泄露的狀況,例如,緩存系統,咱們加載了一個對象放在緩存中(例如放在一個全局map對象中),而後一直再也不使用它,這個對象一直被緩存引用,但卻再也不被使用。
11 、說一說Servlet的生命週期?
Servlet有良好的生存期的定義,包括加載和實例化、初始化、處理請求以及服務結束。這個生存期由javax.servlet.Servlet接口的init(),service()和destroy方法表達。
Servlet被服務器實例化後,容器運行其init方法,請求到達時運行其service方法,service方法自動派遣運行與請求對應的doXXX方法(doGet,doPost)等,當服務器決定將實例銷燬的時候調用其destroy方法。
web容器加載servlet,生命週期開始。經過調用servlet的init()方法進行servlet的初始化。經過調用service()方法實現,根據請求的不一樣調用不一樣的do***()方法。結束服務,web容器調用servlet的destroy()方法。
12 、Servlet API中forward()與redirect()的區別?
(1).從地址欄顯示來講
forward是服務器請求資源,服務器直接訪問目標地址的URL,把那個URL的響應內容讀取過來,而後把這些內容再發給瀏覽器.瀏覽器根本不知道服務器發送的內容從哪裏來的,因此它的地址欄仍是原來的地址.
redirect是服務端根據邏輯,發送一個狀態碼,告訴瀏覽器從新去請求那個地址.因此地址欄顯示的是新的URL.因此redirect等於客戶端向服務器端發出兩次request,同時也接受兩次response。
(2).從數據共享來講
forward:轉發頁面和轉發到的頁面能夠共享request裏面的數據.
redirect:不能共享數據.
redirect不只能夠重定向到當前應用程序的其餘資源,還能夠重定向到同一個站點上的其餘應用程序中的資源,甚至是使用絕對URL重定向到其餘站點的資源.
forward方法只能在同一個Web應用程序內的資源之間轉發請求.forward 是服務器內部的一種操做.
redirect 是服務器通知客戶端,讓客戶端從新發起請求.
因此,你能夠說 redirect 是一種間接的請求, 可是你不能說"一個請求是屬於forward仍是redirect "
(3).從運用地方來講
forward:通常用於用戶登錄的時候,根據角色轉發到相應的模塊.
redirect:通常用於用戶註銷登錄時返回主頁面和跳轉到其它的網站等.
(4).從效率來講
forward:高.
redirect:低.
13 、request.getAttribute()和 request.getParameter()有何區別?
(1),request.getParameter()取得是經過容器的實現來取得經過相似post,get等方式傳入的數據。
request.setAttribute()和getAttribute()只是在web容器內部流轉,僅僅是請求處理階段。
(2),getAttribute是返回對象,getParameter返回字符串
(3),getAttribute()一貫是和setAttribute()一塊兒使用的,只有先用setAttribute()設置以後,纔可以經過getAttribute()來得到值,它們傳遞的是Object類型的數據。並且必須在同一個request對象中使用纔有效。,而getParameter()是接收表單的get或者post提交過來的參數
14 ,jsp靜態包含和動態包含的區別
(1)、<%@include file="xxx.jsp"%>爲jsp中的編譯指令,其文件的包含是發生在jsp向servlet轉換的時期,而<jsp:include page="xxx.jsp">是jsp中的動做指令,其文件的包含是發生在編譯時期,也就是將java文件編譯爲class文件的時期
(2)、使用靜態包含只會產生一個class文件,而使用動態包含會產生多個class文件
(3)、使用靜態包含,包含頁面和被包含頁面的request對象爲同一對象,由於靜態包含只是將被包含的頁面的內容複製到包含的頁面中去;而動態包含包含頁面和被包含頁面不是同一個頁面,被包含的頁面的request對象能夠取到的參數範圍要相對大些,不只能夠取到傳遞到包含頁面的參數,一樣也能取得在包含頁面向下傳遞的參數
15 ,MVC的各個部分都有那些技術來實現?如何實現?
MVC是Model-View-Controller的簡寫。Model表明的是應用的業務邏輯(經過JavaBean,EJB組件實現),View是應用的表示面(由JSP頁面產生),Controller是提供應用的處理過程控制(通常是一個Servlet),經過這種設計模型把應用邏輯,處理過程和顯示邏輯分紅不一樣的組件實現。這些組件能夠進行交互和重用。
16,jsp有哪些內置對象?做用分別是什麼?
JSP共有如下9個內置的對象:
(1),request 用戶端請求,此請求會包含來自GET/POST請求的參數
(2),response 網頁傳回用戶端的迴應
(3),pageContext 網頁的屬性是在這裏管理
(4),session 與請求有關的會話期
(5),application servlet 正在執行的內容
(6),out 用來傳送回應的輸出
(7),config servlet的構架部件
(8),page JSP網頁自己
(9),exception 針對錯誤網頁,未捕捉的例外
17 ,Http中,get和post方法的區別
(1),Get是向服務器發索取數據的一種請求,而Post是向服務器提交數據的一種請求
(2),Get是獲取信息,而不是修改信息,相似數據庫查詢功能同樣,數據不會被修改
(3),Get請求的參數會跟在url後進行傳遞,請求的數據會附在URL以後,以?分割URL和傳輸數據,參數之間以&相連,%XX中的XX爲該符號以16進製表示的ASCII,若是數據是英文字母/數字,原樣發送,若是是空格,轉換爲+,若是是中文/其餘字符,則直接把字符串用BASE64加密。
(4),Get傳輸的數據有大小限制,由於GET是經過URL提交數據,那麼GET可提交的數據量就跟URL的長度有直接關係了,不一樣的瀏覽器對URL的長度的限制是不一樣的。
(5),GET請求的數據會被瀏覽器緩存起來,用戶名和密碼將明文出如今URL上,其餘人能夠查到歷史瀏覽記錄,數據不太安全。
在服務器端,用Request.QueryString來獲取Get方式提交來的數據
Post請求則做爲http消息的實際內容發送給web服務器,數據放置在HTML Header內提交,Post沒有限制提交的數據。Post比Get安全,當數據是中文或者不敏感的數據,則用get,由於使用get,參數會顯示在地址,對於敏感數據和不是中文字符的數據,則用post。
(6),POST表示可能修改變服務器上的資源的請求,在服務器端,用Post方式提交的數據只能用Request.Form來獲取。
(僅供參考,若是有更好的回答,歡迎探討)
18 ,什麼是cookie?Session和cookie有什麼區別?
Cookie是會話技術,將用戶的信息保存到瀏覽器的對象.
區別:
(1)cookie數據存放在客戶的瀏覽器上,session數據放在服務器上
(2)cookie不是很安全,別人能夠分析存放在本地的COOKIE並進行COOKIE欺騙,若是主要考慮到安全應當使用session
(3)session會在必定時間內保存在服務器上。當訪問增多,會比較佔用你服務器的性能,若是主要考慮到減輕服務器性能方面,應當使用COOKIE
(4)單個cookie在客戶端的限制是3K,就是說一個站點在客戶端存放的COOKIE不能3K。
結論:
將登錄信息等重要信息存放爲SESSION;其餘信息若是須要保留,能夠放在COOKIE中。
19 ,jsp和servlet的區別、共同點、各自應用的範圍?
JSP是Servlet技術的擴展,本質上就是Servlet的簡易方式。JSP編譯後是「類servlet」。
Servlet和JSP最主要的不一樣點在於:Servlet的應用邏輯是在Java文件中,而且徹底從表示層中的HTML裏分離開來。而JSP的狀況是Java和HTML能夠組合成一個擴展名爲.jsp的文件。
JSP側重於視圖,Servlet主要用於控制邏輯。在struts框架中,JSP位於MVC設計模式的視圖層,而Servlet位於控制層.
20 ,tomcat容器是如何建立servlet類實例?用到了什麼原理?
當容器啓動時,會讀取在webapps目錄下全部的web應用中的web.xml文件,而後對xml文件進行解析,並讀取servlet註冊信息。而後,將每一個應用中註冊的servlet類都進行加載,並經過反射的方式實例化。(有時候也是在第一次請求時實例化)
在servlet註冊時加上<load-on-startup>1</load-on-startup>若是爲正數,則在一開始就實例化,若是不寫或爲負數,則第一次請求實例化。
21,JDBC訪問數據庫的基本步驟是什麼?
(1),加載驅動
(2),經過DriverManager對象獲取鏈接對象Connection
(3),經過鏈接對象獲取會話
(4),經過會話進行數據的增刪改查,封裝對象
(5),關閉資源
22 ,說說preparedStatement和Statement的區別
(1),效率:預編譯會話比普通會話對象,數據庫系統不會對相同的sql語句不會再次編譯
(2),安全性:能夠有效的避免sql注入攻擊!sql注入攻擊就是從客戶端輸入一些非法的特殊字符,而使服務器端在構造sql語句的時候仍然可以正確構造,從而收集程序和服務器的信息和數據。
好比:「select * from t_user where userName = ‘」 + userName + 「 ’ and password =’」 + password + 「’」
若是用戶名和密碼輸入的是’1’ or ‘1’=’1’ ; 則生產的sql語句是:
「select * from t_user where userName = ‘1’ or ‘1’ =’1’ and password =’1’ or ‘1’=’1’ 這個語句中的where 部分沒有起到對數據篩選的做用。
23 ,說說事務的概念,在JDBC編程中處理事務的步驟。
(1) 事務是做爲單個邏輯工做單元執行的一系列操做。
(2),一個邏輯工做單元必須有四個屬性,稱爲原子性、一致性、隔離性和持久性 (ACID) 屬性,只有這樣才能成爲一個事務
事務處理步驟:
(3),conn.setAutoComit(false);設置提交方式爲手工提交
(4),conn.commit()提交事務
(5),出現異常,回滾 conn.rollback();
24 ,數據庫鏈接池的原理。爲何要使用鏈接池。
(1),數據庫鏈接是一件費時的操做,鏈接池可使多個操做共享一個鏈接。
(2),數據庫鏈接池的基本思想就是爲數據庫鏈接創建一個「緩衝池」。預先在緩衝池中放入必定數量的鏈接,當須要創建數據庫鏈接時,只需從「緩衝池」中取出一個,使用完畢以後再放回去。咱們能夠經過設定鏈接池最大鏈接數來防止系統無盡的與數據庫鏈接。更爲重要的是咱們能夠經過鏈接池的管理機制監視數據庫的鏈接的數量、使用狀況,爲系統開發,測試及性能調整提供依據。
(3),使用鏈接池是爲了提升對數據庫鏈接資源的管理
25 ,JDBC的髒讀是什麼?哪一種數據庫隔離級別能防止髒讀?
當咱們使用事務時,有可能會出現這樣的狀況,有一行數據剛更新,與此同時另外一個查詢讀到了這個剛更新的值。這樣就致使了髒讀,由於更新的數據尚未進行持久化,更新這行數據的業務可能會進行回滾,這樣這個數據就是無效的。數據庫的TRANSACTIONREADCOMMITTED,TRANSACTIONREPEATABLEREAD,和TRANSACTION_SERIALIZABLE隔離級別能夠防止髒讀。
26 ,什麼是幻讀,哪一種隔離級別能夠防止幻讀?
幻讀是指一個事務屢次執行一條查詢返回的倒是不一樣的值。假設一個事務正根據某個條件進行數據查詢,而後另外一個事務插入了一行知足這個查詢條件的數據。以後這個事務再次執行了這條查詢,返回的結果集中會包含剛插入的那條新數據。這行新數據被稱爲幻行,而這種現象就叫作幻讀。
只有TRANSACTION_SERIALIZABLE隔離級別才能防止產生幻讀。
27 ,JDBC的DriverManager是用來作什麼的?
JDBC的DriverManager是一個工廠類,咱們經過它來建立數據庫鏈接。當JDBC的Driver類被加載進來時,它會本身註冊到DriverManager類裏面
而後咱們會把數據庫配置信息傳成DriverManager.getConnection()方法,DriverManager會使用註冊到它裏面的驅動來獲取數據庫鏈接,並返回給調用的程序。
28,execute,executeQuery,executeUpdate的區別是什麼?
(1),Statement的execute(String query)方法用來執行任意的SQL查詢,若是查詢的結果是一個ResultSet,這個方法就返回true。若是結果不是ResultSet,好比insert或者update查詢,它就會返回false。咱們能夠經過它的getResultSet方法來獲取ResultSet,或者經過getUpdateCount()方法來獲取更新的記錄條數。
(2),Statement的executeQuery(String query)接口用來執行select查詢,而且返回ResultSet。即便查詢不到記錄返回的ResultSet也不會爲null。咱們一般使用executeQuery來執行查詢語句,這樣的話若是傳進來的是insert或者update語句的話,它會拋出錯誤信息爲 「executeQuery method can not be used for update」的java.util.SQLException。
(3),Statement的executeUpdate(String query)方法用來執行insert或者update/delete(DML)語句,或者 什麼也不返回,對於DDL語句,返回值是int類型,若是是DML語句的話,它就是更新的條數,若是是DDL的話,就返回0。
只有當你不肯定是什麼語句的時候才應該使用execute()方法,不然應該使用executeQuery或者executeUpdate方法。
29 ,SQL查詢出來的結果分頁展現通常怎麼作?
Oracle:
select * from
(select *,rownum as tempid from student ) t
where t.tempid between 」 + pageSize*(pageNumber-1) + 」 and 」 + pageSize*pageNumber
複製代碼
MySQL:
select * from students limit 」 + pageSize*(pageNumber-1) + 「,」 + pageSize;
複製代碼
sql server:
select top 」 + pageSize + 」 * from students where id not in +
(select top 」 + pageSize * (pageNumber-1) + id from students order by id) +
「order by id;
複製代碼
30 ,JDBC的ResultSet是什麼?
在查詢數據庫後會返回一個ResultSet,它就像是查詢結果集的一張數據表。
ResultSet對象維護了一個遊標,指向當前的數據行。開始的時候這個遊標指向的是第一行。若是調用了ResultSet的next()方法遊標會下移一行,若是沒有更多的數據了,next()方法會返回false。能夠在for循環中用它來遍歷數據集。
默認的ResultSet是不能更新的,遊標也只能往下移。也就是說你只能從第一行到最後一行遍歷一遍。不過也能夠建立能夠回滾或者可更新的ResultSet
當生成ResultSet的Statement對象要關閉或者從新執行或是獲取下一個ResultSet的時候,ResultSet對象也會自動關閉。能夠經過ResultSet的getter方法,傳入列名或者從1開始的序號來獲取列數據