java面試必背知識點

JAVA必背面試題和項目面試通關要點

 

一 數據庫 javascript

1.常問數據庫查詢、修改(SQL查詢包含篩選查詢、聚合查詢和連接查詢和優化問題,手寫SQL語句,例如四個球隊比賽,用SQL顯示全部比賽組合;舉例2:選擇重複項,而後去掉重複項;) 數據庫裏的密碼如何加密(md5);html

(1)數據庫的密碼加密:單向加密,insert into users (username,password) values (‘mike’,MD5(‘guessme’));前端

(2)雙向加密:insert into users (username ,password) values (‘mike’,ENCODE(‘guessme’,’abanaafn’));java

(3)SQL篩選查詢:select * from user where user_id in (select user_id from user group by user_id having count(user_id)>1) order by user_id desc;jquery

(4)SQL聚合查詢:select user_id from user group by user_id;linux

(5)SQL銜接查詢:內鏈接.select s.name,m.mess from student s inner join mark m on s.id=m.studentid;左外鏈接:select s.name, m.mess from student s left join mark m on s.id=m.studentid;右外鏈接:select s.name, m.mess from student s right join mark m on s.id=m.studentid;全外鏈接:select s.name ,m.mess from student s full join mark m on s.id=m.studentid;程序員

(6)球隊比賽組合:select count(*) from department as a ,department as b a.name<>b.name;web

(7)SQL選擇重複語句:select id ,name from user where id in (select id from user group by id having count(1)>2);去除重複語句:select id from user group by id having count(*)>1;面試

(8)數據庫優化:prepareStatement比Statement性能高,一個sql發給服務器去執行.涉及步驟:語法檢查,語義定義,編譯和緩存.有外檢約束會影響插入和刪除功能,若是程序能保證數據的完整性,那麼設計數據庫的時候就去掉外鍵.sql語句所有大寫,特別是列名和表名.ajax

2. 如何實現數據庫分頁功能? SQL語句複雜的關聯表查詢,累計求和。

在不使用框架狀況下,如何鏈接數據庫?

數據庫鏈接完以後,須要關閉的兩個接口是什麼?

關閉數據庫過程當中最容易拋出的異常是什麼?

(1)分頁:」select * from user limit 「+(pageNo-1)*pageSize+」,」+pageSize;

(2)求和:select * from user1 union select * from user2;

(3)手動鏈接數據庫:Connection cn=null;PreparedStatement pst=null;Result rs=null;try{Class.forname(driverClassName);cn=DriverManager.getConnection(url,username,password);pst=cn.prepareStatement(「sql」);pst.setString(1,studentName);Result rs=pst.executeQuery();while(rs.next()){system.out.println();}catch(Exception e){e.printStackTrace();}finally{if(rs!=null){rs.close();}if(pst!=null){pst.close()}if(cn!=null){cn.close();}}}

(4)Result prepareStatement 結果集和sql傳輸

(5)Exception

3. Oracle索引的優缺點、視圖和存儲過程、鏈接符是什麼?默認端口是什麼?MySQL什麼是左連接、右連接和內連接?數據庫中查詢左連接、右連接和內連接結果是什麼?

數據庫的存儲原理,講一講?

(1)端口:1521;

(2)內鏈接就是左表和右表相同的數據.

外鏈接分爲:左外鏈接、右外鏈接、全外鏈接

左外鏈接就是以左表爲準,去匹配右表,左表有多少條數據,結果就是多少條數據

右外鏈接就是與左外鏈接反之,以右表爲準,去匹配左表,右表有多少條數據,結果就是多少條數據。

全外鏈接數據條數不必定,至關與是左外鏈接 和右外鏈接 的綜合。

(3)oracle索引分爲:彙集索引,非彙集索引,惟一索引;優勢:方便查詢,在數據量大時排序更宜查詢;缺點:查詢時須要進行從新排序,減小了效率。物理索引缺點 創建索引效率低,只能建一個更有說服力的;

(4)鏈接符爲」||」或CONCAT();

(5)視圖:其實就是一條查詢sql語句,用於顯示一個或多個表或其餘視圖中的相關數據。視圖將一個查詢的結果做爲一個表來使用,所以視圖能夠被看做是存儲的查詢 或一個虛擬表。視圖來源於表,全部對視圖數據的修改最終都會被反映到視圖的基表中,這些修改必須服從基表的完整性約束,並一樣會觸發定義在基表上的觸發器

(6)存儲過程:oracle有系統存儲過程和自定義存儲過程,爲了完成特定功能的sql語句集,經編譯後存儲在數據庫中,用戶經過特定的存儲過程名來執行

(7)存儲原理:當用戶建立索引時,oracle會自動的在表空間裏建立索引段來存儲索引的數據;

4. Char裏面能夠存放漢字嗎?

(1)char型變量就是用來存儲Unicode編碼字符的,Unicode編碼字符集中包含了漢字,因此能夠存儲漢字,若是某個特殊的漢字沒有包含在Unicode編碼字符集中,那麼char型變量就不能存儲,Unicode佔用兩個字節,因此char型的變量也是佔用兩個字節.

二 Java基礎 

1. 說一下多態的表現形式?

(1)重載,重寫,重載Overload表示同一個類中能夠有多個名稱相同的方法,但這些方法的參數列表各不相同

(2)重寫Override表示子類中的方法能夠與父類中的某個方法的名稱和參數徹底相同,經過子類建立的實例對象調用這個方法時,將調用子類中的定義方法,這至關於把父類中定義的那個徹底相同的方法給覆蓋了,這也是面向對象編程的多態性的一種表現,只能比父類拋出更少的異常,或者是拋出父類拋出的異常的子異常,子類方法的訪問權限只能比父類的更大,不能更小。若是父類的方法是private類型,那麼,子類則不存在覆蓋的限制,至關於子類中增長了一個全新的方法

2. 數據的加密模式?加密模式的順序?

(1)對稱式和非對稱式,順序:傳輸加密,數據存儲加密,數據完整型的鑑別,密鑰管理;

3. 問到hasshmap底層數據結構,arraylist-linklist區別和爲何有這樣的區別;數組的比較方法;基本類型和引用數據類型的區別;問接口和抽象類的區別;

(1)HashMap是線程序不安全的,不是同步的

HashMap可讓你將空值做爲一個表的條目的key或value

Hashmap其實是一個數組和鏈表的結合體,在java編程語言中,最基本的結構就是兩種,一個是數組,另一個是模擬指針(引用),全部的數據結構均可以用這兩個基本結構來構造的,hashmap也不例外。Hashmap其實是一個數組和鏈表的結合體.

(2)區別:ArrayList是實現了基於動態數組的數據結構,LinkedList基於鏈表的數據結構,對於隨機訪問get和set,ArrayList以爲優於LinkedList,由於LinkedList要移動指針,.對於新增和刪除操做add和remove,LinedList比較佔優點,由於ArrayList要移動數據,若只對單條數據插入或刪除,ArrayList的速度反而優於LinkedList。但如果批 量隨機的插入刪除數據,LinkedList的速度大大優於ArrayList. 由於ArrayList每插入一條數據,要移動插入點及以後的全部數據。  這一點我作了實驗。在分別有200000條「記錄」的ArrayList和LinkedList的首位插入20000條數據,LinkedList耗時約 是ArrayList的20分之1。

4. 如何配置安裝jdk?如何判斷其配置成功?

(1)首先安裝JDK要看你電腦的位數,選擇32位或64位的jdk版本,建議使用1.6版本以上,1.7版本一下;

(2)從Oracle官網下載JDK安裝包。

(3)安裝包下載完成後,雙擊安裝包進行安裝,安裝路徑可使用默認路徑。

(4)安裝完成後,還須要進行環境變量的配置,在系統環境變量的用戶變量裏面添加一個變量名爲 JAVA_HOME環境變量,而後在變量值處填寫上JDK安裝目錄的bin文件夾的路徑,如:C:\ProgramFiles\Java \jdk1.7.0_79,而後再添加一個變量名爲Path的變量,變量值填寫爲%JAVA_HOME%\bin;便可。

(5)能夠寫一個簡單的java程序來測試JDK是否已安裝成功:public class Test{public static void main(String args[]){System.out.println("This is a test program.");}}將上面的這段程序保存爲文件名爲Test.java的文件。(注意Test是程序的公共類,必須和文件名一致,包括大小寫)而後打開命令提示符窗口,cd到你的Test.java所在目錄,而後鍵入下面的命令 :javac Test.java (回車)java Test 此時若是看到打印出來This is a test program.的話說明安裝成功了,若是沒有打印出這句話,你須要仔細檢查一下你的配置狀況。

5. 手寫單例模式(餓漢和飽漢模式)和工廠模式?

(1)單例餓漢模式://餓漢式單例類.在類初始化時,已經自行實例化 
 2 public class Singleton1 {
 3     //私有的默認構造子
 4     private Singleton1() {}
 5     //已經自行實例化 
 6     private static final Singleton1 single = new Singleton1();
 7     //靜態工廠方法 
 8     public static Singleton1 getInstance() {
 9         return single;
10     }
11 }

(2)懶漢模式://懶漢式單例類.在第一次調用的時候實例化 
 2 public class Singleton2 {
 3     //私有的默認構造子
 4     private Singleton2() {}
 5     //注意,這裏沒有final    
 6     private static Singleton2 single=null;
 7     //靜態工廠方法 
 8     public synchronized  static Singleton2 getInstance() {
 9          if (single == null) {  
10              single = new Singleton2();
11          }  
12         return single;
13     }
14 }

(3)工廠模式:

interface IFactory{

public IProduct createProduct();}

Class Factory implements IFactory{

public IProduct createProduct(){return new Product();}}

Public class client{

Public Static void main (String [] args){IFactory factory=new Factory();

IProduct product=factory.createProduct();

product.ProductMethod();}}

6. 手寫建立list,定義list,泛型?

(1)List list=new ArrayList();

(2)List<Student> list=new ArrayList<Student>();

(3)Student s=new Student();

(4)List.add(s);

7. 安全:hassmap和hasstable的區別?那個不安全?爲何?怎麼便利hashmap?線程方面:線程有幾種狀態?談談多線程的安全問題;問到線程和同步?寫一個生產者和消費者模式; 考慮高併發的問題。

(1):區別:一.歷史緣由:Hashtable是基於陳舊的Dictionary類的,HashMap是Java 1.2引進的Map接口的一個實現;

(2)二.同步性:Hashtable是線程安全的,也就是說是同步的,而HashMap是線程序不安全的,不是同步的

(3)三.值:只有HashMap可讓你將空值做爲一個表的條目的key或value

(4)爲何?最大的不一樣是,Hashtable的方法是Synchronize的,而HashMap不是,在多個線程訪問Hashtable時,不須要本身爲它的方法實現同步,而HashMap 就必須爲之提供外同步。 

Hashtable和HashMap採用的hash/rehash算法都大概同樣,因此性能不會有很大的差別

(5)遍歷hashmap:兩種方式,Map map=new HashMap();

Iterator iter=map.entrySet().iterator();s

Iterator iter=map.keySet().iterator();

(6)線程一般有五種狀態,建立,就緒,運行,阻塞,和死亡;

第一是建立狀態。在生成線程對象,並無調用該對象的start方法,這是線程處於建立狀態手寫字符串反轉和冒泡排序;

第二是就緒狀態。當調用了線程對象的start方法以後,該線程就進入了就緒狀態,可是此時線程調度程序尚未把該線程設置爲當前線程,此時處於就緒狀態。在線程運行以後,從等待或者睡眠中回來以後,也會處於就緒狀態。

第三是運行狀態。線程調度程序將處於就緒狀態的線程設置爲當前線程,此時線程就進入了運行狀態,開始運行run函數當中的代碼。

第四是阻塞狀態。線程正在運行的時候,被暫停,一般是爲了等待某個時間的發生(好比說某項資源就緒)以後再繼續運行。sleep,suspend,wait等方法均可以致使線程阻塞。

第五是死亡狀態。若是一個線程的run方法執行結束或者調用stop方法後,該線程就會死亡。對於已經死亡的線程,沒法再使用start方法令其進入就緒

(7)多線程的安全問題:總結來講,多個線程在執行同一段代碼的時候,每次的執行結果和單線程執行的結果都是同樣的,不存在執行結果的二義性,就能夠稱做是線程安全的。線程安全問 題可能是由全局變量和靜態變量引發的,當多個線程對共享數據只執行讀操做,不執行寫操做時,通常是線程安全的;當多個線程都執行寫操做時,須要考慮線程同步 來解決線程安全問題。

(8)線程和同步:說明Java線程的兩個特性,可見性和有序性。多個線程之間是不能直接傳遞數據交互的,它們之間的交互只能經過共享變量來實現.

java容許多線程併發控制,當多個線程同時操做一個可共享的資源變量時(如數據的增刪改查), 

    將會致使數據不許確,相互之間產生衝突,所以加入同步鎖以免在該線程沒有完成操做以前,被其餘線程的調用, 

從而保證了該變量的惟一性和準確性

(9)生產者和消費者模式:存儲空間已滿,而生產者佔用着它,消費者等着生產者讓出空間從而去除產品,生產者等着消費者消費產品,從而向空間中添加產品。互相等待,從而發生死鎖。

(10)模式:1.wait()和notify();2.await()和signal(),即線程鎖的方式;3.阻塞隊列的方式;

(11)高併發:手段無非是切割(縱向,橫向)和負載均衡。縱向分隔主要是按業務(功能)來分,也就是所謂面向服務架構,橫向分隔方式比較多,主要依賴於所處理的對象屬性負載均衡則能夠是鏡像(部署)分佈(一樣的功能部署幾份)和計算分佈(一個問題分幾個子問題在不一樣的機器上運行,而後合併結果)。固然,這些手段是能夠綜合利用的,最終能夠作成多流水線分佈式計算模式;

8. list、map和set什時候用?彼此間的區別和聯繫?

(1)list列表是順序存放對象的,能夠有相同的對象,經過索引存取;通常在能直接使用數組的時候,就有使用列表

(2)set集合:集合是無序存放對象的,其中不能有重複的對象(惟一的,回憶高中時候數學中學習的集合特性),集合沒有索引,只能遍歷次存取;通常用於存放無序的(指順序不重要)不能重複的對象

(3)Map映射:映射,存放的是鍵與值的映射,其中鍵是惟一的(不能有重複對象),而值能夠有重複的對象,存的時候,須要指定鍵和對應的值,取的時候能夠根據鍵名取到值,也能夠遍歷;通常在用於存放具備對應關係的鍵值對的時候用;

(4)三者的區別和聯繫:三者都是接口,List與Set具備類似性,它們都是單列元素的集合,list,set是繼承自collection,而map不是,list裏能夠有重複元素,有前後順手,Set裏面不容許有重複的元素,並且無序,Map 保存key-value值,value可多值。

9. java常見的數據類型是什麼和對應的包裝類是什麼?java的隱式類型?assert何時使用?

(1)int, double, float, long, short, boolean, byte, char

(2)Integer.Double,Float,Long,Short,Boolean,Byte,Characher.

(3)java的隱式類型是int,byte,short,char均可以隱含轉換爲int ,

(4)通常來講,assertion用於保證程序最基本、關鍵的正確性。assertion檢查一般在開發和測試時開啓。爲了提升性能,在軟件發佈後,assertion檢查一般是關閉的;

10. object類型中有哪些方法?

(1)equals()、hashCode()、wait()、toString(),finalize(),notify(),notifyAll(),wait(),

11. final、finallly和finalize的區別?

(1)final 用於聲明屬性,方法和類,分別表示屬性不可變,方法不可覆蓋,類不可繼承。 

內部類要訪問局部變量,局部變量必須定義成final類型,例如,一段代碼……

finally是異常處理語句結構的一部分,表示老是執行。

finalize是Object類的一個方法,在垃圾收集器執行的時候會調用被回收對象的此方法

12. LinkedList和ArrayList的區別?繼承的接口?

(1)ArrayList是使用數組方式存儲數據,此數組元素數大於實際存儲的數據以便增長和插入元素,它們都容許直接按序號索引元素,可是插入元素要涉及數組元素移動等內存操做,因此索引數據快而插入數據慢

LinkedList使用雙向鏈表實現存儲,按序號索引數據須要進行前向或後向遍歷,可是插入數據時只須要記錄本項的先後項便可,因此插入速度較快。

LinkedList也是線程不安全的,LinkedList提供了一些方法,使得LinkedList能夠被看成堆棧和隊列來使用

(2)list接口;ArrayList是最經常使用的List實現類,內部是經過數組實現的,它容許對元素進行快速隨機訪問; Vector與ArrayList同樣,也是經過數組實現的,不一樣的是它支持線程的同步,即某一時刻只有一個線程可以寫Vector,避免多線程同時寫而引發的不一致性,但實現同步須要很高的花費,所以,訪問它比訪問ArrayList慢。LinkedList是用鏈表結構存儲數據的,很適合數據的動態插入和刪除,隨機訪問和遍歷速度比較慢。另外,接口中沒有定義的方法 get,remove,insertList,專門用於操做表頭和表尾元素,能夠看成堆棧、隊列和雙向隊列使用。LinkedList沒有同步方法。若是 多個線程同時訪問一個List,則必須本身實現訪問同步。一種解決方法是在建立 List時構造一個同步的List:

13. int和string是如何轉化的?

(1)int i = Integer.parseInt([String]);i = Integer.parseInt([String],[int radix]);或者int i = Integer.valueOf(my_str).intValue();int轉StringString s = String.valueOf(i);String s = Integer.toString(i);String s = "" + i;

15. 談談你對面向對象編程的理解?

(1)Java語言是純粹的面向對象的程序設計語言,這主要表現爲Java徹底支持面向對象的三種基本特徵:繼承、封裝和多態。Java語言徹底以對象爲中心,Java程序的最小程序單位是類,整個Java程序由一個一個的類組成;Java徹底支持使用對象、類、繼承、封裝、消息等基本概念來進行程序設計,容許從現實世界中客觀存在的事物(即對象)出發來構造軟件系統,在系統構造中 儘量運用人類的天然思惟方式。實際上,這些優點是全部面向對象編程語言的共同特徵。而面向對象的方式實際上由OOA(面向對象分析)、OOD(面向對象 設計)和OOP(面向對象編程)三個部分有機組成,其中,OOA和OOD的結構須要使用一種方式來描述並記錄,目前業界統一採用UML(統一建模語言)來 描述並記錄OOA和OOD的結果。目前UML的最新版是2.0它一共包括13種類型的圖形,使用這13種圖形中的某些就能夠很好地描述並記錄軟件分析、設 計的結果

16. 重寫和重載的區別?

(1)重載Overload表示同一個類中能夠有多個名稱相同的方法,但這些方法的參數列表各不相同(即參數個數或類型不一樣);

(2)重寫Override表示子類中的方法能夠與父類中的某個方法的名稱和參數徹底相同,經過子類建立的實例對象調用這個方法時,將調用子類中的定義方法,這至關於把父類中定義的那個徹底相同的方法給覆蓋了,這也是面向對象編程的多態性的一種表現;只能比父類拋出更少的異常,或者是拋出父類拋出的異常的子異常;子類方法的訪問權限只能比父類的更大,不能更小。若是父類的方法是private類型,那麼,子類則不存在覆蓋的限制,至關於子類中增長了一個全新的方法;

17. sleep&wait區別和聯繫?

(1)這兩個方法來自不一樣的類分別是,sleep來自Thread類,和wait來自Object類;sleep是Thread的靜態類方法,誰調用的誰去睡覺,即便在a線程裏調用了b的sleep方法,實際上仍是a去睡覺,要讓b線程睡覺要在b的代碼中調用sleep。

(2)最主要是sleep方法沒有釋放鎖,而wait方法釋放了鎖,使得其餘線程可使用同步控制塊或者方法。sleep不出讓系統資源;wait是進入線程等待池等待,出讓系統資源,其餘線程能夠佔用CPU。通常wait不會加時間限制,由於若是wait線程的 運行資源不夠,再出來也沒用,要等待其餘線程調用notify/notifyAll喚醒等待池中的全部線程,纔會進入就緒隊列等待OS分配系統資源。 sleep(milliseconds)能夠用時間指定使它自動喚醒過來,若是時間不到只能調用interrupt()強行打斷;

18. string、stringbuffer和stringbuilder的區別?哪一個更安全?爲何?hashmap爲何查詢的比較快?

(1)JAVA平臺提供了兩個類:String和StringBuffer,它們能夠儲存和操做字符串,即包含多個字符的字符數據。這個String類提供了數值不可改變的字符串。而這個StringBuffer類提供的字符串進行修改。當你知道字符數據要改變的時候你就可使用StringBuffer。典型地,你可使用StringBuffers來動態構造字符數據。另外,String實現了equals方法;而StringBuffer沒有實現equals方法,因此,new StringBuffer(「abc」).equals(new StringBuffer(「abc」)的結果爲false。

(2)StringBuffer線程安全的可變字符序列。一個相似於 String 的字符串緩衝區,但不能修改;經過某些方法調用能夠改變該序列的長度和內容,可將字符串緩衝區安全地用於多個線程。能夠在必要時對這些方法進行同步,所以任意特定實例上的全部操做就好像是以串行順序發生的,該順序與所涉及的每一個線程進行的方法調用順序一致;

(3)StringBuilder一個可變的字符序列。此類提供一個與 StringBuffer 兼容的 API,但不保證同步。該類被設計用做 StringBuffer 的一個簡易替換,用在字符串緩衝區被單個線程使用的時候(這種狀況很廣泛)。(若是可能,建議優先採用該類,由於在大多數實現中,它比 StringBuffer 要快。但將 StringBuilder 的實例用於多個線程是不安全的。若是須要這樣的同步,則建議使用 StringBuffer。);

(4)HashMap是Hashtable的輕量級實現(非同步非線程安全的實現),他們都完成了Map接口,主要區別在於HashMap容許空(null)鍵值(key),因爲非線程安全,在只有一個線程訪問的狀況下,效率要高於Hashtable。

19. hashmap的數組是hashcode定位的,有不少key獲得的hashcode是相同的,這時候如何定位?

(1)Java採用了哈希表的原理。哈希算法也稱爲散列算法,就是集合首先會調用該對象的hashcode方法;是將數據依特定算法直接指定到一個地址上。關於哈希算法,這裏就不詳細介紹。能夠這樣簡單理解,hashCode方法實際上返回的就是對象存儲位置的映像;hashcode相同可是對象並不一樣,全部存儲位置也不一樣;對於List集合、數組而言,他就是一個累贅,不重要;可是對於HashMap、HashSet、HashTable而言,它變得異常重要。

20. string是不是基本數據類型?int和string是如何轉化的?

(1)基本數據類型包括byte、int、char、long、float、double、boolean和short;java.lang.String類是final類型的,所以不能夠繼承這個類、不能修改這個類。爲了提升效率節省空間,咱們應該用StringBuffer類;

(2)int i = Integer.parseInt([String]);i = Integer.parseInt([String],[int radix]);或者int i = Integer.valueOf(my_str).intValue();int轉StringString s = String.valueOf(i);String s = Integer.toString(i);String s = "" + i;

三 Java Web

1. Jsp頁面便利集合?

(1)List<String> names = new LinkedList<String>();

(2)Set<String> set = new TreeSet<String>();

(3)Map<String, String> map = new HashMap<String, String>();

2. tomcat核心項目:tomacate出現亂碼如何解決?如何增長tomcat和jdk的內存?jdk的版本?

(1)Java的內核和class文件是基於unicode的,這使Java程序具備良好的跨平臺性,但也帶來了一些中文亂碼問題的麻煩。緣由主要有兩方面,Java和JSP文件自己編譯時產生的亂碼問題和Java程序於其餘媒介交互產生的亂碼問題。

(2)更改 D:\Tomcat\conf\server.xml,指定瀏覽器的編碼格式爲「簡體中文;方法是找到 server.xml 中的:<Connector port="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
    enableLookups="false" redirectPort="8443" acceptCount="100"
    connectionTimeout="20000" disableUploadTimeout="true" URIEncoding='GBK' />

(3)另外一種方法:更該 Java 程序,個人程序是這樣的:public class ThreeParams extends HttpServlet {
  public void doGet(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
      response.setContentType("text/html; charset=GBK");

(4)增長tomcat內存的方法:linux下,在文件{tomcat_home}/bin/catalina.sh的前面,增長以下設置:SET JAVA_OPTS=-Xms512m -Xmx1024m;表示初始化內存爲512MB,可使用的最大內存爲1024MB;windows下,在tomcat_home}/bin/catalina.bat的前面,增長以下設置:SET JAVA_OPTS=-Xms512m -Xmx1024m;

(5)Jdk的版本:JDK分爲三種不一樣的版本 JAVA SE(標準版)Java EE(企業版)Java ME(微型版)。

Java SE 之前稱爲J2SE。它容許開發和部署在桌面、服務器、嵌入式環境和實時環境中使用的 Java 應用程序。Java SE是基礎包,可是也包含了支持 Java Web 服務開發的類,併爲 Java Platform,Enterprise Edition(Java EE)提供基礎。

JavaEE:這個版本之前稱爲 J2EE。企業版本幫助開發和部署可移植、健壯、可伸縮且安全的服務器端 Java 應用程序。Java EE 是在 Java SE 的基礎上構建的,它提供 Web 服務、組件模型、管理和通訊 API,能夠用來實現企業級的面向服務體系結構(service-oriented architecture,SOA)和 Web 2.0 應用程序。

JavaME:這個版本之前稱爲 J2ME。Java ME 爲在移動設備和嵌入式設備(好比手機、PDA、電視機頂盒和打印機)上運行的應用程序提供一個健壯且靈活的環境。Java ME 包括靈活的用戶界面、健壯的安全模型、許多內置的網絡協議以及對能夠動態下載的連網和離線應用程序的豐富支持。基於 Java ME 規範的應用程序只需編寫一次,就能夠用於許多設備,並且能夠利用每一個設備的本機功能。

3. 談談對MVC的理解以及它的工做流程;

(1)MVC是一個設計模式,它強制性的使應用程序的輸入、處理和輸出分開。使用MVC應用程序被分紅三個核心部件:模型、視圖、控制器。它們各自處理本身的任務;

jsp+Servlet+JavaBean 就是一種基礎的基於mvc的開發模式;在MVC結構中,模型(Model)表明應用程序的數據(data)和用於控制訪問和修改這些數據的業務規則(business rule)。一般模型被用來做爲對現實世界中一個處理過程的軟件近似,當定義一個模型時,能夠採用通常的簡單的建模技術。

當模型發生改變時,它會通知視(View),而且爲視提供查詢模型相關狀態的能力。同時,它也爲控制器(Controller)提供訪問封裝在模型內部的應用程序功能的能力。

一個視(View)用來組織模型的內容。它從模型那裏得到數據並指定這些數據如何表現。當模型變化時,視負責維持數據表現的一致性。視同時將用戶要求告知控制器(Controller)。

控制器(Controller)定義了應用程序的行爲;它負責對來自視的用戶要求進行解釋,並把這些要求映射成相應的行爲,這些行爲由模型負責實現。在獨立運行的GUI客戶端,用戶要求多是一些鼠標單擊或是菜單選擇操做。在一個Web應用程序中,它們的表現形式多是一些來自客戶端的GET或POST的HTTP請求。模型所實現的行爲包括處理業務和修改模型的狀態。根據用戶要求和模型行爲的結果,控制器選擇一個視做爲對用戶請求的應答。一般一組相關功能集對應一個控制器。

工做流程:一個請求發送到action(做用:MVC中的C),action控制它發送到哪一個biz處理,若是用到數據庫,那麼biz在鏈接dao,而後返回要的數據,最後action在返回響應的頁面(好比jsp),由於是面向對象,因此實體domain在中間傳遞數據。

4. post和get以及get和load的區別?使用get應注意什麼?

(1)Get 方法經過 URL 請求來傳遞用戶的數據,將表單內各字段名稱與其內容,以成對的字符串鏈接,以URL字串自己傳遞數據參數,在服務器端能夠從'QUERY_STRING'這個變量中直接讀取,效率較高,但缺少安全性,也沒法來處理複雜的數據(只能是字符串,好比在servlet/jsp中就沒法處理髮揮java的好比vector之類的功能,輸的數據量很是小,通常限制在 2 KB 左右);

Post 方法經過 HTTP post 機制,將表單內各字段名稱與其內容放置在 HTML 表頭(header)內一塊兒傳送給服務器端交由 action 屬性能所指的程序處理,該程序會經過標準輸入(stdin)方式,將表單的數據讀出並加以處理post方式:就傳輸方式講參數會被打包在數據報中傳輸,從CONTENT_LENGTH這個環境變量中讀取,便於傳送較大一些的數據,同時由於不暴露數據在瀏覽器的地址欄中,安全性相對較高,但這樣的處理效率會受到影響。接收的最大數據有限制,IIS 4 中爲 80 KB 字節,IIS 5 中爲 100 KB 字節

(1)建議:除非你確定你提交的數據能夠一次性提交,不然請儘可能用 Post 方法;Get 方式提交數據,會帶來安全問題;經過 Get 方式提交數據時,用戶名和密碼將出如今 URL 上;因此表單提交建議使用 Post 方法;Post 方法提交的表單頁面常見的問題是,該頁面若是刷新的時候,會彈出一個對話框;

(2)Get與load的區別:總之對於get和load的根本區別,一句話,hibernate對於load方法認爲該數據在數據庫中必定存在,能夠放心的使用代理來延遲加載,若是在使用過程當中發現了問題,只能拋異常;而對於get方法,hibernate必定要獲取到真實的數據,不然返回null;

5. java的九大內置對象和四大做用域;

(1)request 用戶端請求,一次請求.此請求會包含來自GET/POST請求的參數

    response 網頁傳回用戶端的迴應

    pageContext 網頁的屬性是在這裏管理

session 與請求有關的會話期 

application servlet 正在執行的內容

out 用來傳送回應的輸出 

config servlet的構架部件

page JSP網頁自己 

exception 針對錯誤網頁,未捕捉的例外

四大做用域:page對象表示當前一個JSP頁面,能夠理解爲一個對象自己,是表明與一個頁面相關的對象和屬性;一個頁面由一個編譯好的 Java servlet 類表示,

request是表明與 Web 客戶機發出的一個請求相關的對象和屬性。一個請求可能跨越多個頁面,涉及多個 Web 組件(因爲 forward 指令和 include 動做的關係);用戶端請求

session是表明與用於某個 Web 客戶機的一個用戶體驗相關的對象和屬性。一個 Web 會話能夠也常常會跨越多個客戶機請求 與請求有關的會話期 

application是表明與整個 Web 應用程序相關的對象和屬性。這實質上是跨越整個 Web 應用程序,包括多個頁面、請求和會話的一個全局做用域 正在執行的內容

四 Ajax

1. js裏面的button方法,提交的時候,如何將數據傳遞到數據庫?

(1)單擊button的時候,先執行客戶端的javascript代碼,將JavaScript裏面的值賦值到form表單裏,而後經過表單提交的方式將數據提交到後臺,交給java方法處理,而後調用業務層和數據庫交互;

2. Ajax與jquery區別?ajax和servelet生命週期?

(1)區別:Ajax是一門技術,它提供了異步更新的機制,使用客戶端與服務器間交換數據而非整個頁面文檔,實現頁面的局部更新。jQuery是一個框架,它對JS(JS是一門前端語言。)進行了封裝,使其更方便使用。jQuery使得JS與Ajax的使用更方便

jsp負責客戶端顯示

servlet負責控制,轉向等

(2)生命週期:Servlet 生命週期:Servlet 加載--->實例化--->服務--->銷燬;

init():在Servlet的生命週期中,僅執行一次init()方法。它是在服務器裝入Servlet時執行的,負責初始化Servlet對象。能夠配置服務器,以在啓動服務器或客戶機首次訪問Servlet時裝入Servlet。

service():它是Servlet的核心,負責響應客戶的請求。每當一個客戶請求一個HttpServlet對象,該對象的Service()方法 就要調用,並且傳遞給這個方法一個「請求」(ServletRequest)對象和一個「響應」(ServletResponse)對象做爲參數。在 HttpServlet中已存在Service()方法。默認的服務功能是調用與HTTP請求的方法相應的do功能。

destroy(): 僅執行一次,在服務器端中止且卸載Servlet時執行該方法。當Servlet對象退出生命週期時,負責釋放佔用的資源。一個 Servlet在運行service()方法時可能會產生其餘的線程,所以須要確認在調用destroy()方法時,這些線程已經終止或完成。

Ajax:ajax負責客戶端與服務器直接聯繫,而不用jsp提交表單。通常ajax與servlet聯繫,也可直接與javabean聯繫

3. Jquery的經常使用標籤,經常使用選擇器。

(1)標籤: jquery經常使用標籤 (document)//;(document)//選擇整個文檔對象;('#myId') //選擇ID爲myId的網頁元素; (div.myClass)//classmyClassdiv;(′div.myClass′)//選擇class爲myClass的div元素;('input[name=first]') // 選擇name屬性等於first的input元素;

(2)經常使用函數:val() 用來得到value屬性的值;html() 得到元素標籤內的全部信息;包裹標籤和文本,至關於DOM中的innerHTML;size()得到集合/數組的長度;

(2)經常使用選擇器: 基本選擇器; 層次選擇器; 過濾選擇器; 表單選擇器;

(2)#id : 根據給定的id匹配一個元素,返回單個匹配的元素:

(3).class:根據給定的類名匹配元素,返回集合元素

(4)*:匹配全部的元素,返回集合元素

(5)elements:根據給定的元素名匹配元素,返回集合元素

(6)Selector1選擇器匹配:將每個選擇器匹配到的元素合併後一塊兒返回

4. JQ(封裝ajax;異步通信;從前臺傳過去jason,後臺如何解析?

(1)method:請求方式(GET/POST)

*  url:目標URL

*  content:用POST方式發出請求時想傳給服務器的數據,

*         數據以查詢字串的方式列出,如:name=value&anothername=othervalue。

*      若用GET方式:請傳null

*  responseType:響應內容的格式(text/xml)

*  callback:要回調的函數

(2)異步通信:  

I:初始化對象併發送XMLHttpRequest請求(針對IE7.0、8.0、firefox、mozillar、opera、safari瀏覽器;var xmlhr=new XMLHttpRequest;針對IE5.0、5.五、6.0,var xmlhr=new ActiveXObject( );)

II:指定響應處理函數(onreadystatechange)

III:發出HTTP請求(send)

IIII:處理服務器返回的數據(responseXML)

(3)解析:首先,咱們要在前臺引入json的腳本,以便於把js對象序列化

<script type="text/javascript" src="/js/jquery.json-2.4.min.js"></script>

而後咱們在前臺聲明一個類,將你要保存的值放到類裏面,最後序列化

而後咱們在後臺,進行反序列化,並使用值.由於咱們使用ajax因此要在後臺的方法上加上[Ajax.AjaxMethod]特性,而且在你前臺所在頁面的cs裏面也要加上Ajax的註冊;

五 框架

1. 三大框架使用的版本?三大框架各核心組件及做用;若是不用三大框架,jdbc能不能下出來?

(1)三大框架的版本:struts 2; spring 3; hibernate 3.3;

(2)組件及做用:Java三大框架主要用來作WEb應用; Struts主要負責表示層的顯示;Spring利用它的IOC和AOP來處理控制業務(負責對數據庫的操做);Hibernate主要是數據持久化到數據庫;

(3)Struts的組件:Struts對Model,View和Controller都提供了對應的組件;

Model部分:由JavaBean組成,ActionForm用於封裝用戶的請求參數,封裝成ActionForm對象,該對象被ActionServlet轉發給Action,Action根據ActionFrom裏面的請求參數處理用戶的請求。JavaBean則封裝了底層的業務邏輯,包括數據庫訪問等。

View部分:該部分採用JSP實現。Struts提供了豐富的標籤庫,經過標籤庫能夠減小腳本的使用,自定義的標籤庫能夠實現與Model的有效交互,並增長了現實功能。對應上圖的JSP部分。

Controller組件:Controller組件有兩個部分組成——系統核心控制器,業務邏輯控制器。   系統核心控制器,對應上圖的ActionServlet。該控制器由Struts框架提供,繼承HttpServlet類,所以能夠配置成標註的Servlet。該控制器負責攔截全部的HTTP請求,而後根據用戶請求決定是否要轉給業務邏輯控制器。業務邏輯控制器,負責處理用戶請求,自己不具有處理能力,而是調用Model來完成處理。對應Action部分。

(4)Spring的組件:工廠類BeanFactory;反轉控制IOC;面向切面編程AOP

Spring實現了工廠模式的工廠類BeanFactory,在程序中一般BeanFactory的子類ApplicationContext。Spring至關於一個大的工廠類,在其配置文件中經過<bean>元素配置用於建立實例對象的類名和實例對象的屬性。

Spring提供了對IOC良好支持,IOC是一種編程思想,是一種架構藝術,利用這種思想能夠很好地實現模塊之間的解耦

Spring提供了對AOP技術的良好封裝, AOP稱爲面向切面編程,就是系統中有不少各不相干的類的方法,在這些衆多方法中要加入某種系統功能的代碼;例如,加入日誌,加入權限判斷,加入異常處理,這種應用稱爲AOP;

(5)Hibernate的組件:五個核心接口:session接口,sessionFactory接口,configuration接口,transaction接口,query和criteria接口;

Session接口:負責執行被持久化對象的CRUD操做(CRUD的任務是完成與數據庫的交流,包含了不少常見的SQL語句。)。但須要注意的是Session對象是非線程安全的。同時,Hibernate的session不一樣於JSP應用中的HttpSession。這裏當使用session這個術語時,其實指的是Hibernate中的session,而之後會將HttpSession對象稱爲用戶session。

SessionFactory接口:負責初始化Hibernate。它充當數據存儲源的代理,並負責建立Session對象。這裏用到了工廠模式。

Configuration接口:負責配置並啓動Hibernate,建立SessionFactory對象。在Hibernate的啓動的過程當中,Configuration類的實例首先定位映射文檔位置、讀取配置,而後建立SessionFactory對象。

Transaction接口:負責事務相關的操做。它是可選的,開發人員也能夠設計編寫本身的底層事務處理代碼。

Query和Criteria接口:負責執行各類數據庫查詢。它可使用HQL語言或SQL語句兩種表達方式.

JDBC:

Connection cn=null;

PreparedStatement pst=null;

ResultSet rs=null;

Try{Class.forname(driverClassName);

cn=DriverManager.getStatement(「sql」);

pst.setString(1,statementName);

rs=pst.executeQuery();

While(rs.next()){

System.out.println();}

}catch(Exception e){

e.printStackTrace();

}finally{

If(rs!=null){rs.close()};

If(pst!=null){pst.close()};

If(cn!=null){cn.close()};

}

2. hql語句是如何查詢的?hql語句中內切和外切的區別?

(1):hql是面向對象的類名,屬性區分大小寫;from+你的實體類;

(2)內切:利用內鏈接可獲取兩表的公共部分的記錄;採用左外鏈接查詢返回的結果集中包含的是對象數組,對象數組中的每一個元素存放了一對相互關聯的Customer對象和Order對象,而迫切左外鏈接會返 回Customer對象,與Customer對象相關聯的Order對象存放在Customer對象的集合元素對象中,這就是迫切左外鏈接和左外鏈接查詢 的其中一個區別;另外一個區別是當使用左外鏈接時,對關聯對象的檢索會依照實體映射配置文件所指定的策略,而不會像迫切左外鏈接那樣忽略它,好比此時對Customer對象關聯的Order對象採用延遲加載,那麼左外鏈接檢索也會使用延遲加載機制檢索 Order對象。

(3)採用迫切內鏈接檢索,對集合元素的檢索策略以及返回結果集中的對象類型都採用與迫切左外鏈接同樣的方式,QBC查詢不支持迫切內鏈接檢索.

3. 多表關聯什麼狀況下用hashmap?

(1)Map用於保存具備映射關係的數據,Map裏保存着兩組數據:key和value,它們均可以使任何引用類型的數據(class,interface,array ),但key不能重複。因此經過指定的key就能夠取出對應的value。HashMap可讓你將空值做爲一個表的條目的key或value,HashMap最多隻有一個key值爲null,但能夠有無數多個value值爲null。

spring mvc工做機制?MVC裏面視圖的好處?

工做機制:客戶端請求提交到DispatcherServlet

由DispatcherServlet控制器查詢一個或多個HandlerMapping,找處處理請求的Controller

DispatcherServlet將請求提交到Controller

Controller調用業務邏輯處理後,返回ModelAndView

DispatcherServlet查詢一個或多個ViewResoler視圖解析器,找到ModelAndView指定的視圖

視圖負責將結果顯示到客戶端

視圖的好處:視圖對象的定義比實體定義還要簡單,不須要註解,不須要映射,可是惟一不一樣的是咱們須要額外構造一個帶有字段初始化的構造函數

4. hibernat和mybaitis的優點和區別?haibernate的緩存機制有沒有了解過?如何使用hibernate將數據永久保存到數據庫中?mybaitates是如何實現查詢的?hibernate有不少數據操做時候如何優化?

   (1)hibernate的優點:·  MyBatis能夠進行更爲細緻的SQL優化,能夠減小查詢字段。·  MyBatis容易掌握,而Hibernate門檻較高。

   (2)mybaitis 的優點:·  Hibernate的DAO層開發比MyBatis簡單,Mybatis須要維護SQL和結果映射;·  Hibernate對對象的維護和緩存要比MyBatis好,對增刪改查的對象的維護要方便;·  Hibernate數據庫移植性很好,MyBatis的數據庫移植性很差,不一樣的數據庫須要寫不一樣SQL。·  Hibernate有更好的二級緩存機制,可使用第三方緩存。MyBatis自己提供的緩存機制不佳。

   (3)區別:Hibernate功能強大,數據庫無關性好,O/R映射能力強,若是你對Hibernate至關精通,並且對Hibernate進行了適當的封裝,那麼你的項目整個持久層代碼會至關簡單,須要寫的代碼不多,開發速度很快,很是爽。·  iBATIS入門簡單,即學即用,提供了數據庫查詢的自動對象綁定功能,並且延續了很好的SQL使用經驗,對於沒有那麼高的對象模型要求的項目來講,至關完美。

  (4)Hibernate一級緩存是Session緩存,利用好一級緩存就須要對Session的生命週期進行管理好。建議在一個Action操做中使用一個Session。一級緩存須要對Session進行嚴格管理。Hibernate二級緩存是SessionFactory級的緩存。 SessionFactory的緩存分爲內置緩存和外置緩存。內置緩存中存放的是SessionFactory對象的一些集合屬性包含的數據(映射元素據及預約SQL語句等),對於應用程序來講,它是隻讀的。外置緩存中存放的是數據庫數據的副本,其做用和一級緩存相似.二級緩存除了之內存做爲存儲介質外,還能夠選用硬盤等外部存儲設備。二級緩存稱爲進程級緩存或SessionFactory級緩存,它能夠被全部session共享,它的生命週期伴隨着SessionFactory的生命週期存在和消亡。

  (5)mybatitis的查詢:Mybatis的SQL是手動編寫的,因此能夠按需求指定查詢的字段。mybatis是數據映射器(數據映射器層:用於在對象和數據庫之間搬運數據,同時保證對象、數據庫和數據映射器層自己相對獨立。Martin Fowler 《企業應用架構模式》)把sql語句的參數與結果(即輸入與輸出)映射爲類。爲如何在類和數據庫間創建映射帶來了更大的靈活性。同時也更好的隔離了數據庫設計和應用程序中使用的對象模型。

  (6)hibernate 的持久化:Hibernate採用了更天然的面向對象的視角來持久化 Java 應用中的數據。使用 Hibernate 的開發者應該老是關注對象的狀態(state),沒必要考慮 SQL 語句的執行。這部分細節已經由 Hibernate 掌管穩當,只有開發者在進行系統性能調優的時候才須要進行了解。

   (6)mybatis的調優:MyBatis在Session方面和Hibernate的Session生命週期是一致的,一樣須要合理的Session管理機制。MyBatis一樣具備二級緩存機制。 MyBatis能夠進行詳細的SQL優化設計。

  (7)hibernate如何實現優化:·  制定合理的緩存策略;

·  儘可能使用延遲加載特性;·  採用合理的Session管理機制;·  使用批量抓取,設定合理的批處理參數(batch_size);·  進行合理的O/R映射設計

5. spring、hibernate、Struts的工做原理,爲何使用這些框架?簡單說下struts2中數據傳遞狀況? hibernate的三種狀態和彼此的區別?使用hibernate如何分頁?spring的事務隔離級別?ssh如何整合(spring核心流程)?

(1)spring的工做原理:

ISpring內部最核心的就是IOC了,動態注入,讓一個對象的建立不用new了,能夠自動的生產,這其實就是利用java裏的反射,反射其實就是在運行 時動態的區建立、調用對象,Spring就是在運行時,跟xmlSpring的配置文件來動態的建立對象,和調用對象裏的方法。

II.Spring工做原理還有一個核心就是Aop這個就是面向切面的編程,能夠爲某一類對象進行監督和控制(也就是在調用這類對象的具體方法的先後去調用你指定的模塊)從而達到對一個模塊擴充的功能這些都是經過配置類達到的。

III.Spring目的:就是讓對象與對象(模塊與模塊)之間的關係沒有經過代碼來關聯,都是經過配置類說明管理的(主要是經過反射機制)。

(2)hibernate的工做原理:

I.讀取並解析hibernate.cfg.xml配置文件

II.讀取並解析映射信息

III.建立SessionFactory

IV.負責被持久化對象CRUD操做,打開Sesssion

V.建立並啓動事務Transation

VI.操做數據,持久化操做

VII.提交事務,關閉Session,關閉SesstionFactory;

(3)struts的工做原理同下:

I.客戶端瀏覽器發出HTTP請求。II.根據web.xml配置,該請求被FilterDispatcher接收。III.根據struts.xml配置,找到須要調用的Action類和方法, 並經過IoC方式,將值注入給Aciton。IV.Action調用業務邏輯組件處理業務邏輯,這一步包含表單驗證。V.Action執行完畢,根據struts.xml中的配置找到對應的返回結果result,並跳轉到相應頁面。VI.返回HTTP響應到客戶端瀏覽器。

(4)使用緣由:

struts是開源軟件。使用Struts的目的是爲了幫助咱們減小在運用MVC設計模型來開發Web應用的時間。若是咱們想混合使用Servlets和JSP的優勢來創建可擴展的應用,struts是一個不錯的選擇。

Hibernate是一個開放源代碼的對象關係映射框架,它對JDBC進行了很是輕量級的對象封裝,使得Java程序員能夠爲所欲爲的使用對象編程思惟來操縱數據庫。 Hibernate能夠應用在任何使用JDBC的場合,既能夠在Java的客戶端程序使用,也能夠在Servlet/JSP的Web應用中使用,最具革命意義的是,Hibernate能夠在應用EJB的J2EE架構中取代CMP,完成數據持久化的重任;

Spring:Spring是一個開源框架,它是爲了解決企業應用開發的複雜性而建立的。Spring使用基本的JavaBean來完成之前只可能由EJB完成的事情。然而,Spring的用途不只限於服務器端的開發。從簡單性、可測試性和鬆耦合的角度而言,任何Java應用均可以從Spring中受益.

(5)struts數據傳遞:能夠直接基於應用程序域對象轉移,驗證數據,數據綁定,動做把從請求接收到的全部數據放在簡單的JavaBean上。除了單獨接受每一個數 據,struts2最優雅的地方時能夠建立一個對象來放置這些瑣碎的數據,咱們能夠把複雜對象自己提供給平臺的數據轉移機制。這不但節省時間,並且也能節 省工做量。

(6)hibernate的三種狀態和區別:

瞬時(transient):也叫自由狀態.數據庫中沒有數據與之對應,超過做用域會被JVM垃圾回收器回收,通常是new出來且與session沒有關聯的對象。

持久(persistent):數據庫中可能有數據與之對應(save),當前與session有關聯,而且相關聯的session沒有關閉,事務沒有提交;持久對象狀態發生改變,在事務提交時會影響到數據庫(hibernate能檢測到)。

脫管(detached):也叫遊離狀態.數據庫中可能有數據與之對應,但當前沒有session與之關聯,可是有oid;託管對象狀態發生改變,hibernate不能檢測到。

區別:Transient狀態的實體缺少與數據庫表記錄之間的聯繫,而Detached狀態的實體偏偏相反.只不過是脫離了session這個數據庫操做平臺而已.

(7)hibernate分頁:1.HQL查詢:Query query=session.createQuery(from 實體類);2.從第幾條開始:query.setFirstResult(mini);3.每次最多提取多少條數據:query.setMaxResults(max);接收返回的結果集:List<實體類> HousesList=query.list();

代碼以下(Query query = session.createQuery(hql);  

query.setParameter(0, userId);  

query.setMaxResults(maxCount);  

query.setFirstResult(firstResult);  

return query.list();

)

(8)ssh整合步驟:

1.導入struts2的jar包以及struts2-spring-plugin-2.0.11.2.jar; 

2.在web.xml中分別配置struts2與spring相關信息;

3.struts中原有的Action須要繼承ActionSupport;

4.在Spring配置Action Bean;

5.在Struts2的配置文件中,調用Spring中配置的Bean;

6.Spring與Hibernate整合,只須要在Spring配置文件配置SessionFactory便可

(9)Spring的隔離級別:Default默認的事務隔離級別

READ_UNCOMMITTED讀未提交,一個事務能夠操做另一個未提交的事務,不能避免髒讀,不可重複讀,幻讀,隔離級別最低,併發性 能最高

READ_COMMITTED讀已提交,一個事務不能夠操做另一個未提交的事務, 能防止髒讀,不能避免不可重複讀,幻讀。

repeatable_read可以避免髒讀,不可重複讀,不能避免幻讀

SERIALIZABLE隔離級別最高,消耗資源最低,代價最高,可以防止髒讀, 不可重複讀,幻讀。

6. Struts的工做流程;

工做流程:

(1)客戶端提交一個HttpServletRequest請求(action或JSP頁面)。

   (2)請求被提交到一系列Filter過濾器,如ActionCleanUp和FilterDispatcher等。

   (3)FilterDispatcher是Struts2控制器的核心,它一般是過濾器鏈中的最後一個過濾器.

   (4)請求被髮送到FilterDispatcher後,FilterDispatcher詢問ActionMapper時候須要調用某個action來處理這個Request。

   (5)若是ActionMapper決定須要調用某個action,FilterDispatcher則把請求交給ActionProxy進行處理.

   (6)ActionProxy經過Configuration Manager詢問框架的配置文件struts.xml,找到調用的action類。

   (7)ActionProxy建立一個ActionInvocation實例,經過代理模式調用Action。

   (8)action執行完畢後,返回一個result字符串,此時再按相反的順序經過Intercepter攔截器。

   (9)最後ActionInvocation實例,負責根據struts.xml中配置result元素,找到與之相對應的result,決定進一步輸出。

基本簡要流程:

I.客戶端瀏覽器發出HTTP請求。

II.根據web.xml配置,該請求被FilterDispatcher接收。

III.根據struts.xml配置,找到須要調用的Action類和方法, 並經過IoC方式,將值注入給Aciton。

IV.Action調用業務邏輯組件處理業務邏輯,這一步包含表單驗證。  

    VI.Action執行完畢,根據struts.xml中的配置找到對應的返回結果result,並跳轉到相應頁面。VI.返回HTTP響應到客戶端瀏覽器。 

7. 簡述SSH工做流程;

(1)JSP頁面發出請求,Struts接收頁面請求,Struts的action調用業務邏輯,業務邏輯調用業務組件(其中使用到Spring的依賴注入 IOC,或者AOP等);業務組件根據Hibernate的對象/關係數據庫的映射關係查詢數據庫。Struts根據結果返回頁面。

8. 談談Spring和Spring MVC的流程和事務;spring配置文件都寫什麼?

(1)spring提供兩種管理事務的方式:一種是聲明式事務,一種是編程式事務。

Spring的聲明式事務管理,基於Spring的AOP,基於Spring AOP實現,幾乎就是xml文件的配置,再也不須要不停地寫commit,rollback,(但Spring仍然沒有放棄編程式的事務管理策略)。

Spring的編程式事務管理,統一的事務編碼風格,幾乎是一個模板化的。

爲咱們提供了一個TransactionTemplate,使用回調機制,將應用代碼從樣板式的資源獲取和釋放代碼中解放出來,再也不有大量的try/catch/finally/try/catch代碼塊。

(2)springMVC的流程和事務:動態注入,讓一個對象的建立不用new了,能夠自動的生產,這其實就是利用java裏的反射 ,反射其實就是在運行時動態的去建立、調用對象,Spring就是在運行時,跟xml Spring的配置 
文件來動態的建立對象,和調用對象裏的方法的 。

Spring還有一個核心就是AOP這個就是面向切面編程,能夠爲某一類對象 進行監督和控制(也就是在調用這類對象的具體方法的先後去調用你指定的 模塊)從而達到對一個模塊擴充的功能。這些都是經過 配置類達到的。Spring目的:就是讓對象與對象(模塊與模塊)之間的關係沒有經過代碼來關聯,都是經過配置類說明管理的(Spring根據這些配置 內部經過反射去動態的組裝對象) 
要記住:Spring是一個容器,凡是在容器裏的對象纔會有Spring所提供的這些服務和功能。

(3)spring的配置文件:1、引用外部屬性文件;2、經常使用數據源的配置;3、配置事務管理器;4、context:component-scan<!-- 對包中的全部類進行掃描,以完成Bean建立和自動依賴注入的功能 -->;5、aop註解支持;6、緩存配置;7、<!-- Spring、MyBatis的整合,須要在 Spring 應用上下文中定義至少兩樣東西:一個SqlSessionFactory和至少一個數據映射器類(UserMapper->iocContext.xml)。 -->;

9. ssm和ssh的區別?

(1)基於MVC三層架構,使用ssh框架 or ssm框架 or ssi框架,採用面向接口的方式編程。
共同點是struts、spring,不一樣點是nibernate和mybatis、ibatis。

(2)相對Hibernate「O/R」而言,iBATIS 是一種「Sql Mapping」的ORM實現。

(3)因爲hibernate是徹底面向對象的編程,在實現dao中就很是的方便,並且不重複;當mybatis在.java代碼中也是能夠作到不重複,麻煩一點的是,每一個映射文件都必須編寫幾乎相同的配置,除了resultType不同。

(4)hibernate在實際編程中能夠把基礎的CRUD封裝,好比BaseDao類。其它類只要去繼承BaseDao就能執行全部的基礎的CRUD。這樣就很是方便。這個帶來的好處還有,能夠創建BaseService和BaseAction。 

因爲mybatis的映射文件中,雖然SQL語句中的表名能夠經過parameterType指定,可是resultType必須定死,不能以參數 的形式給予指定。致使的結果就是全部的DAO類的每一個CRUD都必須和指定的映射文件綁定在一塊兒,以致於不可能存在BaseDao類。固然也就不能創建 BaseService和BaseAction。

10. spring核心:aop和ioc的解釋?隔離範圍? 3種注入方法?

(1)aop:Spring提供了對AOP技術的良好封裝, AOP稱爲面向切面編程,就是系統中有不少各不相干的類的方法,在這些衆多方法中要加入某種系統功能的代碼;例如,加入日誌,加入權限判斷,加入異常處理,這種應用稱爲AOP。實現AOP功能採用的是代理技術,客戶端程序再也不調用目標,而調用代理類,代理類與目標類對外具備相同的方法聲明,有兩種方式能夠實現相同的方法聲明,一是實現相同的接口,二是做爲目標的子類在,JDK中採用Proxy類產生動態代理的方式爲某個接口生成實現類,spring提供了這種支持,只須要在spring配置文件中配置這兩個元素便可實現代理和aop功能;

(2)Ioc:Spring提供了對IOC良好支持,IOC是一種編程思想,是一種架構藝術,利用這種思想能夠很好地實現模塊之間的解耦。IOC也稱爲DI(Depency Injection);IOC能夠理解爲‘面向接口編程思想’的一種實現方法,經過IOC實現了強制的‘面向接口編程’。

(3)隔離範圍: Spring支持JDBC規範定義的四種隔離級別

Default默認的事務隔離級別

READ_UNCOMMITTED讀未提交,一個事務能夠操做另一個未提交的事務,不能避免髒讀,不可重複讀,幻讀,隔離級別最低,併發性 能最高

READ_COMMITTED讀已提交,一個事務不能夠操做另一個未提交的事務, 能防止髒讀,不能避免不可重複讀,幻讀。

repeatable_read可以避免髒讀,不可重複讀,不能避免幻讀

SERIALIZABLE隔離級別最高,消耗資源最低,代價最高,可以防止髒讀, 不可重複讀,幻讀。

(4)Spring的注入和IoC反轉控制是一回事;關於getter和setter方式的注入;

Autowire=」defualt」;autowire=」byName」;autowire=」byType」;

11. 兩億條數據如何同時刪除

(1)·  public boolean delUsers(String[] userIds){  

·          boolean flag = false;  

·          Connection conn = null;  

·          PreparedStatement pstmt = null;    

·          String sql = "delete from t_user where user_id=?";  

·          try {  

·              conn = DbUtil.getConnection();  

·              conn.setAutoCommit(false);  

·              pstmt = conn.prepareStatement(sql);  

·              for(int i =0 ;i<userIds.length;i++){   

·                  pstmt.setString(1,userIds[i].trim());  

·                  pstmt.addBatch();                 

·              }   

·              pstmt.executeBatch(); //批量執行   

·              conn.commit();//提交事務  

·              flag = true;  

·          } catch (SQLException e) {  

·              try {  

·                  conn.rollback(); //進行事務回滾  

·              } catch (SQLException ex) {   

·              }   

·          }finally {  

·              DbUtil.close(pstmt);  

·              DbUtil.close(conn);  

·          }   

·          return flag;  

·      }  

12. 如何將1個g的數據最快速度放進C盤中?

(1)public class Test01 {

     

    public static void main(String[] args) throws Exception{

        getInputStream("C:\\setup.log","D:\\a.txt");

    }

    private static void getInputStream(String pathName,String copyName)throws Exception{

        File file = new File(pathName);

        if(!file.exists())

            throw new RuntimeException("文件不存在呀,你Copy個屁!");

        else{

            getCopy(copyName,new BufferedInputStream(new FileInputStream(file)));

        }

    }

    private static void getCopy(String copyName,BufferedInputStream bis)throws Exception{

        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(copyName));

        BufferedInputStream biss = bis;

        byte[] b = new byte[biss.available()];

        int len = 0;

        while((len = biss.read(b))!=-1){

            bos.write(b, 0, len);

        }

        bos.close();

        biss.close();

        System.out.println(copyName+"複製成功!");

    }

冒泡排序:

public static void bubbleSort(int[] numbers) {   
    int temp; // 記錄臨時中間值   
    int size = numbers.length; // 數組大小   
    for (int i = 0; i < size - 1; i++) {   
        for (int j = i + 1; j < size; j++) {   
            if (numbers[i] < numbers[j]) { // 交換兩數的位置   
                temp = numbers[i];   
                numbers[i] = numbers[j];   
                numbers[j] = temp;   
            }   
        }   
    }   
}  

選擇排序:

public static void selectSort(int[] numbers) {   
    int size = numbers.length, temp;   
    for (int i = 0; i < size; i++) {   
        int k = i;   
        for (int j = size - 1; j >i; j--)  {   
            if (numbers[j] < numbers[k])  k = j;   
        }   
        temp = numbers[i];   
        numbers[i] = numbers[k];   
        numbers[k] = temp;   
    }   
}  

項目面試通關必懂

項目通用問題:

1.介紹下整個項目流程,談談你本身負責的模塊?別人的模塊是否瞭解?

2.講解下本身負責的模塊,這個模塊如何實現的?作這個項目時候遇到怎樣的問題?

3.你在項目組中的角色和優點?

4.作項目的時間,項目組幾我的,多長時間完成?

5. 介紹下算法和項目的思路?

6. 問session和cooie的區別?

    (1)具體來講cookie機制採用的是在客戶端保持狀態的方案,而session 機制採用的是在服務器端保持狀態的方案。因爲才服務器端保持狀態的方案在客戶端也須要保存一個標識,因此session機制可能須要藉助於cookie機制來達到保存標識的目的,但實際上還有其餘選擇。

7. 問登錄頁;

8. Spring事務;

9. 同步鎖;

10.往關聯兩個表中添加數據,若是沒有添加成功,會怎樣?如何處理?

11.說下使用的項目ssm框架和使用的技術Json和ajax。

12.大數據如何處理?數據庫如何批量刪除和批量插入?

具體項目還要清楚

一:好買網商城項目

1:商城項目的需求,介紹整個項目流程;

二:你我貸金融P2P項目

1.項目利息問題;

2.身份如何驗證的問題?

3.項目的邏輯關係?

4.第三方接口怎麼寫?

5.違約如何提醒的問題?

6.金額除不盡的問題?

三 進銷存項目:

1.介紹下進銷存項目?

介紹項目時先說項目需求,而後從開始的進銷存進貨說到最後,進銷存的模塊:進貨、銷售、庫存、財務報表、用戶管理、信用凍結、全局資源,而後按照銷售流程把項目貫穿一下。

2.進銷存項目負責的模塊是什麼?

3.權限:權限分配;作權限控制,數據庫關係映射介紹下?

4.數據庫資金類型設置成bigdecimal仍是double?

5.報表用的是什麼?

6.一個項目數據庫牽扯幾個表?

7.進銷存多少個表?用戶管理方面多少個模塊?用戶管理模塊多少個表?

9. 如何判斷是本身的採購、給哪家公司作的、好多人買東西發生了錯誤如何解決(事物&多線程)

大家都是有經驗的開發人員
 
分類:  5.理.理論學習
相關文章
相關標籤/搜索