繼承:經過子類能夠實現繼承,子類繼承父類的全部狀態和行爲,同時添加自身的狀態和行爲。php
封裝:將代碼及處理數據綁定在一塊兒的一種編程機制,該機制保證程序和數據不受外部干擾。java
多態:包括重載和重寫。重載爲編譯時多態,重寫是運行時多態。重載必須是同類中名稱相同參數不一樣(包括個數不一樣和類型不一樣),但返回類型不一樣不構成重載;重寫發生於子類對父類的覆蓋,子類繼承父類方法名相同、參數列表相同、返回類型相同才構成重寫。mysql
類:具備共同屬性和行爲的對象的抽象。類是建立對象的模板。c++
對象:現實世界中的實體。在計算機中,是指可標識的存儲區域。web
類是對象的抽象、對象是類的實例。算法
抽象:是從特定的實例中抽取共同性質造成通常化概念的過程。sql
接口和抽象類都用於抽象,接口是抽象類的抽象。數據庫
接口中只有方法聲明,沒有實現(無方法體);在接口中聲明的方法具備public和abstract屬性,一個類能夠實現多個接口(即多繼承),接口以‘,’分隔;接口中的方法必須所有實現。編程
抽象類能夠有部分方法實現,抽象類必須經過繼承才能使用。設計模式
內部類是嵌套在另外一個類中的類。
內部類用於名稱隱藏和程序代碼的組織,另外內部類擁有直接訪問其外部類全部成員(包括private的)的權限(無需任何關鍵字修飾)。
內部類不能夠在其餘類或main方法裏實例化,必須使用以下方法(非靜態內部類)
外部類.內部類 對象名=new 外部類().new 內部類();
靜態內部類調用方式:
外部類.內部類 對象名=new 外部類.內部類();
非靜態內部類不能夠聲明靜態成員;靜態內部類的非靜態成員能夠訪問其外部類的靜態成員,聲明爲靜態的成員不能夠訪問外部的非靜態成員。
Private protected friendly(default) public
同類 Y Y Y Y
同包不一樣類 N Y Y Y
同包子類 N Y Y Y
不一樣包不一樣類 N N N Y
不一樣包子類 N Y N Y
類成員,直接使用 類名.成員 調用。
靜態方法只能訪問靜態成員。
靜態方法不能使用this、super關鍵字。
靜態方法不能被非靜態方法重寫或重載。
被final修飾的變量爲常量不能改變。
被final修飾的方法不能夠重寫。
被final修飾的類不能被繼承。
被abstract修飾的類不能實例化。
被abstract修飾的方法只能在子類中實現。
非Java語言的編寫,例如JNI技術。
多線程的同步訪問控制。
當一個類是「一種」另外一個類時:is-a關係
當兩個類之間有關聯時:
一個類「包含」另外一個類:has-a關係
一個類「使用」另外一個類
還能夠細分有聚合和組合(UML寶典)或彙集和組成(包括國內某些知名學術團體都這麼說)。
彙集(aggregation)表示總體與各部分之間的關係。例如汽車與輪胎,沒有了汽車輪胎依然是一個總體。(用空心菱形表示)
組成是一種總體和部分所屬更強的彙集關係,每一個部分只能屬於一個總體,沒有總體部分也就沒有存在的價值。好比桌子和桌腿,沒有桌子也就沒有桌腿的價值了。(用實心菱形表示)
一個設計模式描述了一個被證明可行的方案。這些方案很是廣泛,是具備完整定義的最經常使用的模式。通常模式有4個基本要素:模式名稱(pattern name)、問題(problem)、解決方案(solution)、效果(consequences)。常見23種模式概述:
抽象工廠模式(Abstract Factory):提供一個建立一系列相關或相互依賴對象的接口,而無需指定它們具體的類。
適配器模式(Adapter):將一個類的接口轉換成客戶但願的另一個接口。適配器模式使得本來因爲接口不兼容而不能一塊兒工做的類能夠一塊兒工做。
橋樑模式(Bridge):將抽象部分與它的實現部分分離,使它們均可以獨立地變化。
建造模式(Builder):將一個複雜對象的構建與它的表示分離,使一樣的構建過程能夠建立不一樣的表示。
責任鏈模式(Chain of Responsibility):爲解除請求的發送者和接收者之間耦合,而使多個對象都有機會處理這個請求。將這些對象連成一條鏈,並沿着這條鏈傳遞該請求,直到有一個對象處理它。
命令模式(Command):將一個請求封裝爲一個對象,從而可用不一樣的請求對客戶進行參數化;對請求排隊或記錄請求日誌,以及支持可取消的操做。
合成模式(Composite):將對象組合成樹形結構以表示「部分-總體」的層次結構。它使得客戶對單個對象和複合對象的使用具備一致性。
裝飾模式(Decorator):動態地給一個對象添加一些額外的職責。就擴展功能而言,它能生成子類的方式更爲靈活。
門面模式(Facade):爲子系統中的一組接口提供一個一致的界面,門面模式定義了一個高層接口,這個接口使得這一子系統更加容易使用。
工廠方法(Factory Method):定義一個用於建立對象的接口,讓子類決定將哪個類實例化。Factory Method 使一個類的實例化延遲到其子類。
享元模式(Flyweight):運用共享技術以有效地支持大量細粒度的對象。
解釋器模式(Interpreter):給定一個語言,定義它的語法的一種表示,並定義一個解釋器,該解釋器使用該表示解釋語言中的句子。
迭代子模式(Iterator):提供一種方法順序訪問一個聚合對象中的各個元素,而又不需暴露該對象的內部表示。
調停者模式(Mediator):用一箇中介對象來封裝一系列的對象交互。中介者使各對象不須要顯式的內部表示。
備忘錄模式(Memento):在不破壞封裝性的前提下,捕獲一個對象的內部狀態,並在該對象以外保存這個狀態。這樣之後就可將該對象恢復到保存的狀態。
觀察者模式(Observer):定義對象間的一種一對多的依賴關係,以便當一個對象的狀態發生改變時,全部依賴於它的對象都獲得通知並自動刷新。
原始模型模式(Prototype):用原型實例指定建立對象的種類,而且經過拷貝這個原型建立新的對象。
代理模式(Proxy):爲其餘對象提供一個代理以控制對這個對象的訪問。
單例模式(Singleton):保證一個類僅有一個實例,並提供一個訪問它的全局訪問點。
狀態模式(State):容許一個對象在其內部狀態改變時改變它的行爲。對象看起來彷佛修改了它所屬的類。
策略模式(Strategy):定義一系列的算法,把它們一個個封裝起來,而且使它們可相互替換。本模式使得算法的變化可獨立於使用它的客戶。
模板模式(Template Method):定義一個操做中的算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類能夠不改變一個算法的結構便可重定義該算法的某些特定步驟。
訪問者模式(Visitor):表示一個做用於某對象結構中的各元素的操做。該模式能夠實如今不改變各元素的類的前提下定義做用於這些元素的新操做。
J2EE是Sun公司提出的多層(multi-diered),分佈式(distributed),基於組件(component-base)的企業級應用模型(enterpriese application model).在這樣的一個應用系統中,可按照功能劃分爲不一樣的組件,這些組件又可在不一樣計算機上,而且處於相應的層次(tier)中。所屬層次包括客戶層(clietn tier)組件,web層和組件,Business層和組件,企業信息系統(EIS)層。
服務器端技術:Jsp、Servlet;
組件技術:JavaBean、EJB。
匿名的內部類是沒有名字的內部類。不能繼承其它類,但可做爲一個接口,由另外一個內部類實現。
Nested Class (通常是C++的說法),Inner Class (通常是JAVA的說法)。Java內部類與C++嵌套類最大的不一樣就在因而否有指向外部的引用上。
注:靜態內部類(Inner Class)意味着:
l 建立一個static內部類的對象
l 不能從一個static內部類的一個對象訪問一個外部類對象
Https即多了安全的Http,s(Security Socket Layer)指加密套接字協議層(簡寫SSL)。
由國際標準化組織(ISO)提出。
將互聯網分爲七層,從下至上分別爲:物理層(physical)、數據鏈路層(data link)、網絡層(network)、傳送層(transport)、會話層(session)、表示層(presentation)、應用層(application)。底層經過提供接口支持上層功能。各層詳解:
物理層:LAN/ATM,爲硬件層。
數據鏈路層:LAN/ATM
網絡層:IP協議,IOS
傳輸層:TCP/UDP協議,支持Java Socket。
會話層:
表示層:HTML、XML
應用層:HTTP協議,使用Java Servlet/JSP
<第八層(Web服務層):SOAP/UDDI>
容器負責EJB組件中生命週期的控制;
服務器包含在容器外,提供系統級操做底層服務,包括事務、事件、多線程……。
父類對象不能夠賦給子類對象,由於子類可能具備更多的成員,反之能夠。
List、Set、Map。由這三個接口實現出ArrayList、LinkedList、HashSet、TreeSet、HashMap、TreeMap等經常使用集合框架。
Vector屬於重量級組件不推薦使用。
Map類型維護鍵/值對,Hashtable與HashMap相近但效率略低於HashMap、高於TreeMap,TreeMap優勢是能夠排序。
Set類型可裝入惟一值,HashSet效率高於TreeSet但TreeSet能夠維護內部元素的排序狀態。
List類型可按某種特定順序維護元素。ArrayList容許快速隨機訪問,但若是添加或刪除位於中間的元素時效率很低;LikedList提供最佳循序訪問及快速的中間位置添加刪除元素,並有addFirst、addLast、getFirst、getLast、removeFirst、 removeLast方法。
同步性:Vector是線程安全的,也就是說是同步的,而ArrayList是線程序不安全的,不是同步的
數據增加:當須要增加時,Vector默認增加爲原來一培,而ArrayList倒是原來的一半
都屬於Map接口的類,實現了將唯一鍵映射到特定的值上。
歷史緣由:Hashtable是基於陳舊的Dictionary類的,HashMap是Java 1.2引進的Map接口的一個實現。
同步性:Hashtable是線程安全的,也就是說是同步的,它也比 HashMap 慢,而HashMap是線程序不安全的,不是同步的。
HashMap 類容許一個 null 鍵和多個 null 值。
Hashtable 類不容許 null 鍵和 null 值。
String類型和StringBuffer、StringBuilder類型的主要性能區別其實在於 String是不可變的對象,然後倆者都是可變的。
StringBuffer和StringBuilder的Append實現都是調用父類實現的。惟一不一樣的是 StringBuffer是線程安全的,方法中多了synchronized,而StringBuilder 是非線程安全的。
Collections是個java.util下的類,它包含有各類有關集合操做的靜態方法。
Collection是個java.util下的接口,它是各類集合結構的父接口。
能,由於java中以unicode編碼,一個char佔16個字節,所以,存放一箇中文是沒有問題的。
兩個對象,一個是String類型的「xyx」,一個是指向「xyx」的引用對象s。
String類是final類故不能夠繼承。
不能,一個對象的一個synchronized方法只能由一個線程訪問。
Math.round(11.5)返回(long)12
Math.round(-11.5)返回(long)-11;
都不能
接口能夠繼承接口。抽象類能夠實現(implements)接口,抽象類能夠繼承實體類,但前提是實體類必須有明確的構造函數。
&是位運算符。
&&是布爾邏輯運算符。
文件緩存,是指把數據存儲在磁盤上,能夠XML格式,也能夠序列化文件DAT格式仍是其它文件格式。
內存緩存,也就是實現一個類中靜態Map,對這個Map進行常規的增刪查。
在JDK 1.2之前的版本中,若一個對象不被任何變量引用,那麼程序就沒法再使用這個對象。也就是說,只有對象處於可觸及(reachable)狀態,程序才能使用它。從JDK 1.2版本開始,把對象的引用分爲4種級別,從而使程序能更加靈活地控制對象的生命週期。這4種級別由高到低依次爲:強引用、軟引用、弱引用和虛引用。
強引用(StrongReference):是使用最廣泛的引用。若是一個對象具備強引用,那垃圾回收器毫不會回收它。當內存空間不足,Java虛擬機寧願拋出OutOfMemoryError錯誤,使程序異常終止,也不會靠隨意回收具備強引用的對象來解決內存不足的問題。
軟引用(SoftReference):若是一個對象只具備軟引用,則內存空間足夠,垃圾回收器就不會回收它;若是內存空間不足了,就會回收這些對象的內存。只要垃圾回收器沒有回收它,該對象就能夠被程序使用。軟引用可用來實現內存敏感的高速緩存。軟引用能夠和一個引用隊列(ReferenceQueue)聯合使用,若是軟引用所引用的對象被垃圾回收器回收,Java虛擬機就會把這個軟引用加入到與之關聯的引用隊列中。
弱引用(WeakReference):弱引用與軟引用的區別在於:只具備弱引用的對象擁有更短暫的生命週期。在垃圾回收器線程掃描它所管轄的內存區域的過程當中,一旦發現了只具備弱引用的對象,無論當前內存空間足夠與否,都會回收它的內存。不過,因爲垃圾回收器是一個優先級很低的線程,所以不必定會很快發現那些只具備弱引用的對象。弱引用能夠和一個引用隊列(ReferenceQueue)聯合使用,若是弱引用所引用的對象被垃圾回收,Java虛擬機就會把這個弱引用加入到與之關聯的引用隊列中。
虛引用(PhantomReference):顧名思義,就是形同虛設,與其餘幾種引用都不一樣,虛引用並不會決定對象的生命週期。若是一個對象僅持有虛引用,那麼它就和沒有任何引用同樣,在任什麼時候候均可能被垃圾回收器回收。虛引用主要用來跟蹤對象被垃圾回收器回收的活動。虛引用與軟引用和弱引用的一個區別在於:虛引用必須和引用隊列(ReferenceQueue)聯合使用。當垃圾回收器準備回收一個對象時,若是發現它還有虛引用,就會在回收對象的內存以前,把這個虛引用加入到與之 關聯的引用隊列中。程序能夠經過判斷引用隊列中是否已經加入了虛引用,來了解被引用的對象是否將要被垃圾回收。若是程序發現某個虛引用已經被加入到引用隊列,那麼就能夠在所引用的對象的內存被回收以前採起必要的行動。
斷言是一個包含布爾表達式的語句,在執行這個語句時假定該表達式爲 true。若是表達式計算爲 false,那麼系統會報告一個 AssertionError。示例:
assert(a > 0); // throws an AssertionError if a <= 0
斷言能夠有兩種形式:
assert Expression1 ;
assert Expression1 : Expression2 ;
Expression1 應該老是產生一個布爾值。
Expression2 能夠是得出一個值的任意表達式。這個值用於生成顯示更多調試信息的 String 消息。
斷言在默認狀況下是禁用的。要在編譯時啓用斷言,須要使用 source 1.4 標記:
javac -source 1.4 Test.java
要在運行時啓用斷言,可以使用 -enableassertions 或者 -ea 標記。
要在運行時選擇禁用斷言,可以使用 -da 或者 -disableassertions 標記。
要系統類中啓用斷言,可以使用 -esa 或者 -dsa 標記。還能夠在包的基礎上啓用或者禁用斷言。
能夠在預計正常狀況下不會到達的任何位置上放置斷言。斷言能夠用於驗證傳遞給私有方法的參數。不過,斷言不該該用於驗證傳遞給公有方法的參數,由於無論是否啓用了斷言,公有方法都必須檢查其參數。不過,既能夠在公有方法中,也能夠在非公有方法中利用斷言測試後置條件。另外,斷言不該該以任何方式改變程序的狀態。
多線程有兩種實現方法,分別是繼承Thread類與實現Runnable接口
同步的實現方面有兩種,分別是synchronized,wait與notify
Java的垃圾回收機制是Java虛擬機提供的能力,用於在空閒時間以不定時的方式動態回收無任何引用的對象佔據的內存空間。
須要注意的是:垃圾回收的是無任何引用的對象佔據的內存空間而不是對象自己。
顯示通知JVM進行垃圾回收:
System.gc()
Runtime.getRuntime().gc()
上面的方法調用時用於顯式通知JVM能夠進行一次垃圾回收,但真正垃圾回收機制具體在什麼時間點開始發生動做這一樣是不可預料的,這和搶佔式的線程在發生做用時的原理同樣。
int:a == b;
float:a – b < 0.000001f;
位運算符計算:2《3 = 8
Java 編程語言只有值傳遞。當一個對象實例做爲一個參數被傳遞到方法中時,參數的值就是對該對象的引用。對象的內容能夠在被調用的方法中改變,但對象的引用是永遠不會改變的。
這裏的內存模型涉及到兩種類型的內存:棧內存(stack)和堆內存(heap)。傳遞的是棧內存中的數據。
switch(expr1)中,expr1是一個整數表達式,所以傳遞給 switch 和 case 語句的參數應該是 int、 short、 char 或者byte。
long,string 都不能做用於swtich。
final 用於聲明屬性,方法和類,分別表示屬性不可變,方法不可覆蓋,類不可繼承。若是一個類被聲明爲final,意味着它不能再派生出新的子類,所以一個類不能既被聲明爲 abstract的,又被聲明爲final的。將變量或方法聲明爲final,能夠保證它們在使用中不被改變。被聲明爲final的變量必須在聲明時給定初值,而在之後的引用中只能讀取,不可修改。被聲明爲final的方法也一樣只能使用,不能重載。內部類要訪問局部變量,局部變量必須定義成final類型,例如,一段代碼……
finally是異常處理語句結構的一部分,表示老是執行。
finalize是Object類的一個方法,所以全部的類都繼承了它,在垃圾收集器執行的時候會調用被回收對象的此方法,能夠覆蓋此方法提供垃圾收集時的其餘資源回收,例如關閉文件等。JVM不保證此方法總被調用
運行異常表示程序運行過程當中可能出現的非正常狀態,運行時異常表示虛擬機的一般操做中可能遇到的異常,是一種常見運行錯誤。
java編譯器要求方法必須聲明拋出可能發生的非運行時異常,可是並不要求必須聲明拋出未被捕獲的運行時異常。
error 表示恢復不是不可能但很困難的狀況下的一種嚴重問題。好比說內存溢出。不可能期望程序能處理這樣的狀況。
exception 表示一種設計或實現問題。也就是說,它表示若是程序運行正常,從不會發生的狀況。
異常是指java程序運行時(非編譯)所發生的非正常狀況或錯誤,與現實生活中的事件很類似,現實生活中的事件能夠包含事件發生的時間、地點、人物、情節等信息,能夠用一個對象來表示,Java使用面向對象的方式來處理異常,它把程序中發生的每一個異常也都分別封裝到一個對象來表示的,該對象中包含有異常的信息。
Java對異常進行了分類,不一樣類型的異常分別用不一樣的Java類表示,全部異常的根類爲java.lang.Throwable,Throwable下面又派生了兩個子類:Error和Exception,Error 表示應用程序自己沒法克服和恢復的一種嚴重問題,程序只有死的份了,例如,說內存溢出和線程死鎖等系統問題。Exception表示程序還可以克服和恢復的問題,其中又分爲系統異常和普通異常,系統異常是軟件自己缺陷所致使的問題,也就是軟件開發人員考慮不周所致使的問題,軟件使用者沒法克服和恢復這種問題,但在這種問題下還可讓軟件系統繼續運行或者讓軟件死掉,例如,數組腳本越界(ArrayIndexOutOfBoundsException),空指針異常(NullPointerException)、類轉換異常(ClassCastException);普通異常是運行環境的變化或異常所致使的問題,是用戶可以克服的問題,例如,網絡斷線,硬盤空間不夠,發生這樣的異常後,程序不該該死掉。
java爲系統異常和普通異常提供了不一樣的解決方案,編譯器強制普通異常必須try..catch處理或用throws聲明繼續拋給上層調用方法處理,因此普通異常也稱爲checked異常,而系統異常能夠處理也能夠不處理,因此,編譯器不強制用try..catch處理或用throws聲明,因此係統異常也稱爲unchecked異常。
提示答題者:就按照三個級別去思考:虛擬機必須宕機的錯誤,程序能夠死掉也能夠不死掉的錯誤,程序不該該死掉的錯誤;
這道題主要考你的代碼量到底多大,若是你長期寫代碼的,應該常常都看到過一些系統方面的異常,你不必定真要回答出5個具體的系統異常,但你要可以說出什麼是系統異常,以及幾個系統異常就能夠了,固然,這些異常徹底用其英文名稱來寫是最好的,若是實在寫不出,那就用中文吧,有總比沒有強!
所謂系統異常,就是…..,它們都是RuntimeException的子類,在jdk doc中查RuntimeException類,就能夠看到其全部的子類列表,也就是看到了全部的系統異常。我比較有印象的系統異常有:NullPointerException、ArrayIndexOutOfBoundsException、ClassCastException。
Java 經過面向對象的方法進行異常處理,把各類不一樣的異常進行分類,並提供了良好的接口。在 Java 中,每一個異常都是一個對象,它是 Throwable 類或其它子類的實例。當一個方法出現異常後便拋出一個異常對象,該對象中包含有異常信息,調用這個對象的方法能夠捕獲到這個異常並進行處理。Java 的異常處理是經過 5 個關鍵詞來實現的:try、catch、throw、throws 和 finally。一
般狀況下是用 try 來執行一段程序,若是出現異常,系統會拋出(throws)一個異常,這時候你能夠經過它的類型來捕捉(catch)它,或最後(finally)由缺省處理器來處理;
try 用來指定一塊預防全部「異常」的程序;
catch 子句緊跟在 try 塊後面,用來指定你想要捕捉的「異常」的類型;
throw 語句用來明確地拋出一個「異常」;
throws 用來標明一個成員函數可能拋出的各類「異常」;
Finally 爲確保一段代碼無論發生什麼「異常」都被執行一段代碼;
能夠在一個成員函數調用的外面寫一個 try 語句, 在這個成員函數內部寫另外一個 try 語句保護其餘代碼。每當遇到一個 try 語句,「異常」的框架就放到堆棧上面,直到全部的 try 語句都完成。若是下一級的 try 語句沒有對某種「異常」進行處理,堆棧就會展開,直到遇到有處理這種「異常」的 try 語句。
Web Service描述語言WSDL SOAP即簡單對象訪問協議(Simple Object Access Protocol),它是用於交換XML編碼信息的輕量級協議。
UDDI 的目的是爲電子商務創建標準;UDDI是一套基於Web的、分佈式的、爲Web Service提供的、信息註冊中心的實現標準規範,同時也包含一組使企業能將自身提供的Web Service註冊,以使別的企業可以發現的訪問協議的實現標準。
必須以英文字母、下劃線(’_’)或’$’開始,其他能夠有數字但不容許 包含空格,且組合後的名稱不能是Java關鍵字或保留字。
匈牙利命名法:以m開始爲類成員變量,以g開始爲全局變量,以v開始爲本地局部變量,常量命名通常不如下劃線、美圓符開始。
駝峯命名:通常稱由多個單詞或縮寫組成的變量名,而且該變量名每一個單詞首字母均爲大寫(通常類名所有首字母大寫,方法或屬性名第一個字母小寫)的稱爲駝峯命名。
用start方法來啓動線程,真正實現了多線程運行,這時無需等待run方法體代碼執行完畢而直接繼續執行下面的代碼。經過調用Thread類的start()方法來啓動一個線程,這時此線程處於就緒(可運行)狀態,並無運行,一旦獲得spu時間片,就開始執行run()方法,這裏方法run()稱爲線程體,它包含了要執行的這個線程的內容,Run方法運行結束,此線程隨即終止。
run()方法只是類的一個普通方法而已,若是直接調用Run方法,程序中依然只有主線程這一個線程,其程序執行路徑仍是隻有一條,仍是要順序執行,仍是要等待run方法體執行完畢後纔可繼續執行下面的代碼,這樣就沒有達到寫線程的目的。
經過建立Thread類的子類來實現
l 設計Thread的子類
l 根據工做須要從新設計線程的run方法
l 線程類Thread中提供的run是一個空方法。爲此,咱們能夠繼承Thread,而後覆蓋(override)其中的run,使得該線程可以完成特定的工做。
l 使用start方法啓動線程,將執行權轉交到run。
經過實現Runable接口的類來實現(推薦)
l 建立某個類實現Runnable接口,實現run()方法。
l 建立Thread對象,用實現Runnable接口的對象做爲參數實例化該Thread對象。
l 調用Thread的start方法。
會執行,在return前執行。
1 public class Test {
2
3 public static void main(String[] args) {
4
5 System.out.println(new Test().test());
6
7 }
8
9 static int test(){
10
11 int x = 1;
12
13 Try{
14
15 return x;
16
17 }Finally{
18
19 ++x;
20
21 }
22
23 }
24
25 }
輸出結果 1
1 public class smallT{
2
3 public static void main(String args[]){
4
5 smallT t = new smallT();
6
7 int b = t.get();
8
9 System.out.println(b);
10
11 }
12
13 Public int get(){
14
15 Try{
16
17 return 1 ;
18
19 }Finally{
20
21 return 2 ;
22
23 }
24
25 }
26
27 }
輸出結果 2
SessionFactory (net.sf.hibernate.SessionFactory):對編譯過的映射文件的一個線程安全的,不可變的緩存快照。它是Session的工廠。是ConnectionProvider的客戶。
可能持有事務之間重用的數據的緩存。
l 會話,Session (net.sf.hibernate.Session) 單線程,生命期短促的對象,表明應用程序和持久化層之間的一次對話。封裝了一個JDBC鏈接。也是Transaction的工廠。
持有持久化對象的緩存。
l 持久化對象(Persistent Object)及其集合(Collection):生命期短促的單線程的對象,包含了持久化狀態和商業功能。它們多是普通的JavaBeans,惟一特別的是他們如今從屬於且僅從屬於一個Session。
l 臨時對象(Transient Object)及其集合(Collection) :目前沒有從屬於一個Session的持久化類的實例。他們多是剛剛被程序實例化,尚未來得及被持久化,或者是被一個已經關閉的Session所實例化的。
l 事務,Transaction (net.sf.hibernate.Transaction):(可選) 單線程,生命期短促的對象,應用程序用它來表示一批工做的原子操做。是底層的JDBC,JTA或者CORBA事務的抽象。一個Session可能跨越多個Transaction 事務。
l ConnectionProvider (net.sf.hibernate.connection.ConnectionProvider):(可選)JDBC鏈接的工廠和池。從底層的Datasource或者 DriverManager抽象而來。對應用程序不可見。
l TransactionFactory (net.sf.hibernate.TransactionFactory):(可選)事務實例的工廠。對應用程序不可見。
在上面的輕型結構中,程序沒有使用Transaction / TransactionFactory 或者ConnectionProvider API,直接和JTA/JDBC對話了。
應用程序可能同時在兩個不一樣的session中存取同一個持久化對象。然而,兩個Session實例是不可能共享一個持久化類的實例的。有兩種不一樣的用來辨別對象是否相同的方法。
Persistent Identity,持久化辨別
foo.getId().equals( bar.getId() )
JVM Identity, JVM辨別
foo==bar
對於同一個特定的Session返回的對象來講,這兩者是等價的。然而,當程序並行在兩個不一樣的session中訪問含義上「相同」(持久化辨別)的商業對象時,兩個對象實例從JVM的角度上來看倒是「不一樣」的(JVM辨別)
這種方式把並行訪問(應用程序不須要對任何商業對象進行同步,只要求遵循每一個Session一個線程的原則)和對象辨別(在應用程序的一個session之中,能夠安全的用==來比較對象)的難題留給了Hibernate和數據庫。
讀取並解析配置文件
讀取並解析映射信息,建立SessionFactory
打開Session
建立事務Transation
持久化操做
提交事務
關閉Session
關閉SesstionFactory
對JDBC訪問數據庫的代碼作了封裝,大大簡化了數據訪問層繁瑣的重複性代碼。
Hibernate是一個基於JDBC的主流持久化框架,是一個優秀的ORM實現。他很大程度的簡化DAO層的編碼工做。
大多數 EJB CMP CMR 解決方案使用代碼生成實現持久性代碼,而 JDO 使用字節碼修飾。與之相反,Hibernate 使用反射和運行時字節碼生成,使它對於最終用戶幾乎是透明的 hibernate使用Java反射機制,而不是字節碼加強程序來實現透明性。
Hibernate的性能很是好,由於它是個輕量級框架。映射的靈活性很出色。它支持各類關係數據庫,從一對一到多對多的各類複雜關係。
Hibernate2延遲加載實現:a)實體對象 b)集合(Collection)
Hibernate3 提供了屬性的延遲加載功能 當Hibernate在查詢數據的時候,數據並無存在與內存中,當程序真正對數據的操做時,對象才存在與內存中,就實現了延遲加載,他節省了服務器的內存開銷,從而提升了服務器的性能。
類與類之間的關係主要體如今表與表之間的關係進行操做,它們都市對對象進行操做,咱們程序中把全部的表與類都映射在一塊兒,它們經過配置文件中的many-to-one、one-to-many、many-to-many
Core包是框架的最基礎部分, 並提供依賴注入(Dependency Injection)特性來使你可管理Bean容器功能。 這裏的基礎概念是BeanFactory,它提供Factory模式來消除對程序性單例的須要, 並容許你從程序邏輯中分離出依賴關係的配置和描述。
構建於Beans包上Context包,提供了一種框架式的Bean訪問方式, 有些象JNDI註冊。Context包的特性得自Beans包,並添加了文本消息的發送,經過好比資源串, 事件傳播,資源裝載的方式和Context的透明建立,如經過Servlet容器。
DAO包提供了JDBC的抽象層,它可消除冗長的JDBC編碼和解析數據庫廠商特有的錯誤代碼。 該包也提供了一種方法實現編程性和聲明性事務管理,不只僅是針對實現特定接口的類, 並且對全部的POJO。
ORM包爲流行的關係-對象映射APIs提供了集成層,包括JDO,Hibernate和iBatis。 經過ORM包,你可與全部Spring提供的其餘特性相結合來使用這些對象/關係映射, 如前邊提到的簡單聲明性事務管理。
Spring的AOP包提供與AOP聯盟兼容的面向方面編程實現,容許你定義, 如方法攔截器和切點,來乾淨地給從邏輯上說應該被分離的功能實現代碼解耦。 使用源碼級的元數據
功能,你可將各類行爲信息合併到你的代碼中,有點象.Net的attribute。
Spring的Web包提供了基本的面向Web的綜合特性,如Multipart功能, 使用Servlet監聽器的Context的初始化和麪向Web的Applicatin Context。 當與WebWork或Struts一塊兒使用Spring時,這個包使Spring可與其餘框架結合。
Spring的Web MVC包提供了面向Web應用的Model-View-Controller實現。 Spring的MVC實現不只僅是一種實現,它提供了一種domain model代碼和web form的清晰分離, 這使你可以使用Spring框架的全部其餘特性,如校驗.
Spring是一個集成了許多第三方框架的大雜燴,其核心技術是IOC(控制反轉,也稱依賴注入)和AOP(面向切面編程)。
簡單地說,AOP 讓開發人員能夠建立非行爲性的關注點,稱爲橫切關注點,並將它們插入到應用程序代碼中。使用 AOP 後,公共服務(好比日誌、持久性、事務等)就能夠分解成方面並應用到域對象上,同時不會增長域對象的對象模型的複雜性。
IOC 容許建立一個能夠構造對象的應用環境,而後向這些對象傳遞它們的協做對象。正如單詞「倒置」所代表的,IOC 就像反過來的JNDI。沒有使用一堆抽象工廠、服務定位器、單元素(singleton)和直接構造(straight construction),每個對象都是用其協做對象構造的。所以是由容器管理協做對象(collaborator)。
Spring既是一個AOP框架,也是一個IOC容器。 Spring 最好的地方是它有助於您替換對象。有了Spring,只要用 JavaBean 屬性和配置文件加入依賴性(協做對象)。而後能夠很容易地在須要時替換具備相似接口的協做對象。
Spring中I0C的三種實現機制:經過setter方法注入、經過構造方法注入和接口注入。
JSP共有如下9種基本內置組件(可與ASP的6種內部組件相對應):
request 用戶端請求,此請求會包含來自GET/POST請求的參數
response 網頁傳回用戶端的迴應
pageContext 網頁的屬性是在這裏管理
session 與請求有關的會話期
application servlet 正在執行的內容
out 用來傳送回應的輸出
config servlet的構架部件
page JSP網頁自己
exception 針對錯誤網頁,未捕捉的例外
JSP共有如下6種基本動做
jsp:include:在頁面被請求的時候引入一個文件。
jsp:useBean:尋找或者實例化一個JavaBean。
jsp:setProperty:設置JavaBean的屬性。
jsp:getProperty:輸出某個JavaBean的屬性。
jsp:forward:把請求轉到一個新的頁面。
jsp:plugin:根據瀏覽器類型爲Java插件生成OBJECT或EMBED標記
動態INCLUDE用jsp:include動做實現
<jsp:include page="included.jsp" flush="true" />它老是會檢查所含文件中的變化,適合用於包含動態頁面,而且能夠帶參數
靜態INCLUDE用include僞碼實現,定不會檢查所含文件的變化,適用於包含靜態頁面
<%@ include file="included.htm" %>
有兩種,分別爲:
<jsp:include page="included.jsp" flush="true">
<jsp:forward page= "nextpage.jsp"/>
前者頁面不會轉向include所指的頁面,只是顯示該頁的結果,主頁面仍是原來的頁面。執行完後還會回來,至關於函數調用。而且能夠帶參數.後者徹底轉向新頁面,不會再回來。至關於go to 語句。
servlet有良好的生存期的定義,包括加載和實例化、初始化、處理請求以及服務結束。
這個生存期由javax.servlet.Servlet接口的init,service和destroy方法表達。
前者僅是容器中控制權的轉向,在客戶端瀏覽器地址欄中不會顯示出轉向後的地址;
後者則是徹底的跳轉,瀏覽器將會獲得跳轉的地址,並從新發送請求連接。
這樣,從瀏覽器的地址欄中能夠看到跳轉後的連接地址。因此,前者更加高效,在前者能夠知足須要時,儘可能使用forward()方法,而且,這樣也有助於隱藏實際的連接。在有些狀況下,好比,須要跳轉到一個其它服務器上的資源,則必須使用sendRedirect()方法。
1 public class ServletName extends HttpServlet { 2
3 public void doPost(HttpServletRequest request, HttpServletResponse response) throws
4
5 ServletException, IOException { 6
7 } 8
9 public void doGet(HttpServletRequest request, HttpServletResponse response) throws
10
11 ServletException, IOException { 12
13 } 14
15 }
在缺省模式下,MYSQL是autocommit模式的,全部的數據庫更新操做都會即時提交,因此在缺省狀況下,mysql是不支持事務的。
可是若是你的MYSQL表類型是使用InnoDB Tables 或 BDB tables的話,你的MYSQL就可使用事務處理,使用SET AUTOCOMMIT=0就可使MYSQL容許在非autocommit模式, 在非autocommit模式下,你必須使用COMMIT來提交你的更改,或者用ROLLBACK來回滾你的更改。 示例以下:
START TRANSACTION;
SELECT @A:=SUM(salary) FROM table1 WHERE type=1;
UPDATE table2 SET summmary=@A WHERE type=1;
COMMIT;
MySQL是一個小型關係型數據庫管理系統,開發者爲瑞典MySQL AB公司,如今已經 被Sun公司收購,支持FreeBSD、Linux、MAC、Windows等多種操做系統 與其餘的大型數據庫例如Oracle、DB二、SQL Server等相比功能稍弱一些
l 能夠處理擁有上千萬條記錄的大型數據
l 支持常見的SQL語句規範
l 可移植行高,安裝簡單小巧
l 良好的運行效率,有豐富信息的網絡支持
l 調試、管理,優化簡單(相對其餘大型數據庫)
若是MYSQL客戶端和服務器端的鏈接須要跨越並經過不可信任的網絡,那麼須要使用ssh隧道來加密該鏈接的通訊。
使用set password語句來修改用戶的密碼,先「mysql -u root」登錄數據庫系統,而後「mysql> update mysql.user set password=password(’newpwd’)」,最後執行「flush privileges」就能夠了。
Mysql須要提防的攻擊有,防偷聽、篡改、回放、拒絕服務等,不涉及可用性和容錯方面。對全部的鏈接、查詢、其餘操做使用基於acl即訪問控制列表的安全措施來完成。也有一些對ssl鏈接的支持。
設置除了root用戶外的其餘任何用戶不容許訪問mysql主數據庫中的user表; 加密後存放在user表中的加密後的用戶密碼一旦泄露,其餘人能夠隨意用該用戶名/密碼相應的數據庫;
使用grant和revoke語句來進行用戶訪問控制的工做;
不要使用明文密碼,而是使用md5()和sha1()等單向的哈系函數來設置密碼;
不要選用字典中的字來作密碼;
採用防火牆能夠去掉50%的外部危險,讓數據庫系統躲在防火牆後面工做,或放置在dmz區域中;
從因特網上用nmap來掃描3306端口,也可用telnet server_host 3306的方法測試,不容許從非信任網絡中訪問數據庫服務器的3306號tcp端口,須要在防火牆或路由器上作設定; 10.爲了防止被惡意傳入非法參數,例如where id=234,別人卻輸入where id=234 or 1=1致使所有顯示,因此在web的表單中使用」或」"來用字符串,在動態url中加入%22表明雙引號、%23表明井號、%27表明單引號;傳遞未檢查過的值給mysql數據庫是很是危險的; 11.在傳遞數據給mysql時檢查一下大小;
應用程序須要鏈接到數據庫應該使用通常的用戶賬號,開放少數必要的權限給該用戶; $page_devide$
在各編程接口(c c++ php perl java jdbc等)中使用特定‘逃脫字符’函數;
在因特網上使用mysql數據庫時必定少用傳輸明文的數據,而用ssl和ssh的加密方式數據來傳輸;
學會使用tcpdump和strings工具來查看傳輸數據的安全性,例如tcpdump -l -i eth0 -w -src or dst port 3306 strings。以普通用戶來啓動mysql數據庫服務; 15.不使用到表的聯結符號,選用的參數 –skip-symbolic-links;
確信在mysql目錄中只有啓動數據庫服務的用戶才能夠對文件有讀和寫的權限;
不準將process或super權限付給非管理用戶,該mysqladmin processlist能夠列舉出當前執行的查詢文本;super權限可用於切斷客戶端鏈接、改變服務器運行參數狀態、控制拷貝複製數據庫的服務器;
file權限不付給管理員之外的用戶,防止出現load data ‘/etc/passwd’到表中再用select 顯示出來的問題;
若是不相信dns服務公司的服務,能夠在主機名稱容許表中只設置ip數字地址; 20.使用max_user_connections變量來使mysqld服務進程,對一個指定賬戶限定鏈接數; 21.grant語句也支持資源控制選項;
啓動mysqld服務進程的安全選項開關,–local-infile=0或1 如果0則客戶端程序就沒法使用local load data了,賦權的一個例子grant insert(user) on mysql.user to ‘user_name’@'host_name’;若使用–skip-grant-tables系統將對任何用戶的訪問不作任何訪問控制,但能夠用 mysqladmin flush-privileges或mysqladmin reload來開啓訪問控制;默認狀況是show databases語句對全部用戶開放,能夠用–skip-show-databases來關閉掉。
碰到error 1045(28000) access denied for user ‘root’@'localhost’ (using password:no)錯誤時,你須要從新設置密碼,具體方法是:先用–skip-grant-tables參數啓動mysqld,而後執行 mysql -u root mysql,mysql>update user set password=password(’newpassword’) where user=’root’;mysql>flush privileges;,最後從新啓動mysql就能夠了。
NoSQL(NoSQL = Not Only SQL ),意即「不只僅是SQL」,是一項全新的數據庫革命性運動,早期就有人提出,發展至2009年趨勢愈加高漲。NoSQL的擁護者們提倡運用非關係型的數據存儲,相對於鋪天蓋地的關係型數據庫運用,這一律念無疑是一種全新的思惟的注入。
它們能夠處理超大量的數據。
它們運行在便宜的PC服務器集羣上。
PC集羣擴充起來很是方便而且成本很低,避免了「sharding」操做的複雜性和成本。
它們擊碎了性能瓶頸。
NoSQL的支持者稱,經過NoSQL架構能夠省去將Web或Java應用和數據轉換成SQL友好格式的時間,執行速度變得更快。
「SQL並不是適用於全部的程序代碼,」 對於那些繁重的重複操做的數據,SQL值得花錢。可是當數據庫結構很是簡單時,SQL可能沒有太大用處。
沒有過多的操做。
雖然NoSQL的支持者也認可關係數據庫提供了無可比擬的功能集合,並且在數據完整性上也發揮絕對穩定,他們同時也表示,企業的具體需求可能沒有那麼多。
Bootstrap支持
由於NoSQL項目都是開源的,所以它們缺少供應商提供的正式支持。這一點它們與大多數開源項目同樣,不得不從社區中尋求支持。
易擴展:NoSQL數據庫種類繁多,可是一個共同的特色都是去掉關係數據庫的關係型特性。數據之間無關係,這樣就很是容易擴展。也無形之間,在架構的層面上帶來了可擴展的能力。
大數據量,高性能:NoSQL數據庫都具備很是高的讀寫性能,尤爲在大數據量下,一樣表現優秀。這得益於它的無關係性,數據庫的結構簡單。通常MySQL使用 Query Cache,每次表的更新Cache就失效,是一種大粒度的Cache,在針對web2.0的交互頻繁的應用,Cache性能不高。而NoSQL的 Cache是記錄級的,是一種細粒度的Cache,因此NoSQL在這個層面上來講就要性能高不少了。
靈活的數據模型:NoSQL無需事先爲要存儲的數據創建字段,隨時能夠存儲自定義的數據格式。而在關係數據庫裏,增刪字段是一件很是麻煩的事情。若是是很是大數據量的表,增長字段簡直就是一個噩夢。這點在大數據量的web2.0時代尤爲明顯。
高可用:NoSQL在不太影響性能的狀況,就能夠方便的實現高可用的架構。好比Cassandra,HBase模型,經過複製模型也能實現高可用。
MongoDB
l MongoDB更像一個關係型數據庫。它的數據模型頂層是一個數據庫(database),之下一個相似於MySql表結構的集合 (collection),而後collection內包含的是文檔(document)就像MySql裏的數據行。每一個文檔有一個域(field)和一 個值(value)相似於MySql裏的列和值。field能夠是簡單的鍵/值(例如 { 'name': 'David Mytton' })也能夠包含別的document(例如 { 'name': { 'first' : David, 'last' : 'Mytton' } })。
l MongoDB是一個基於分佈式文件存儲的數據庫。由C++語言編寫。旨在爲WEB應用提供可擴展的高性能數據存儲解決方案。它的特色是高性能、易部署、易使用,存儲數據很是方便。主要功能特性有:
*面向集合存儲,易存儲對象類型的數據。
*模式自由。
*支持動態查詢。
*支持徹底索引,包含內部對象。
*支持查詢。
*支持複製和故障恢復。
*使用高效的二進制數據存儲,包括大型對象(如視頻等)。
*自動處理碎片,以支持雲計算層次的擴展性
*支持RUBY,PYTHON,JAVA,C++,PHP等多種語言。
*文件存儲格式爲BSON(一種JSON的擴展)
*可經過網絡訪問
Cassandra
l 在Cassandra裏,document對應的是「column」,即一個鍵值對(例如{ 'key': 'name', 'value': 'David Mytton' }),還包括一個時間戳字段用於內部的複製和一致性。值能夠是一個值也能夠包含其它的「column」,這些column按照某個指定值的順序保存在column family裏,頂層是一個鍵空間(keyspace)相似於MongoDB的database。
提示:二分法查找
提示:三個數組
提示:先整個反序,而後局部反序
提示:x &(x-1),結果爲0則是
小明一家過一座橋,過橋時是黑夜,因此必須有燈。如今小明過橋要1秒,小明的弟弟要3秒,小明的爸爸要6秒,小明的媽媽要8秒,小明的爺爺要12秒。每次此橋最多可過兩人,而過橋的速度依過橋最慢者而定,並且燈在點燃後30秒就會熄滅。問:小明一家如何過橋?
答案:
小明與弟弟過去,小明回來,用4s;
媽媽與爺爺過去,弟弟回來,用15s;
小明與弟弟過去,小明回來,用4s;
小明與爸爸過去,用6s;
總共用29s。
在三角形的三個頂點上各有一隻螞蟻,它們向另外一個頂點運動,目標隨機(可能爲另外兩個頂點的任意一個)。問三隻螞蟻不相撞的機率是多少?
答案:若是螞蟻順時針爬行記爲0,逆時針爬行記爲1。那麼三隻螞蟻的狀態可能爲000,001,...,110,111中的任意一個,且爲每種狀態的機率相等。在這8種狀態中,只有000和111能夠避免相撞,因此螞蟻不相撞的機率是1/4。