知識點java
java.lang java.util java.math java.io java.regex:包,包中的類java.lang.Math java.math程序員
Math(abs pow sqrt max min)web
異常定義,拋出異常的方法須要聲明,而後在調用該方法時使用try-catch捕獲異常。ajax
在程序運行時違反java語義規則時的錯誤表示爲異常,一類是java類庫內置的語義檢查(NPE)二類是java容許程序員擴展這種語義檢查數據庫
異常,將可能出錯的代碼從正常代碼中分離出來,便於維護和修改。編程
免檢異常:數組訪問,除法等沒有放在try-catch語句中數組
必檢異常:代碼必須放到try-catch語句中,或再次拋出該異常瀏覽器
(免檢或必檢異常由引用部分決定,或程序員決定)安全
異常:定義,拋出,聲明,捕獲服務器
定義:將上面的Exception改成Exception1
public void Exception1 extends Exception{
數據;
方法;
}
異常執行邏輯:
method3可能拋出Exception三、Exception二、Exception1
獲取異常信息:
異常鏈:在catch中拋出異常
集合(Set、List、Map)、棧、隊列使用線性表(數組、鏈表)來實現的
java集合框架
LinkedHashSet可以維護被插入元素的順序,即輸出元素的順序和輸入元素的順序相同。HashSet,不維護插入元素的順序,但比LinkedHashSet高效。
向量類Vector,棧類Stack,堆棧隊列推薦LinkedList
LinkedList也可作隊列
映射:
class OuterClass {
...
static class StaticNestedClass {
...
}
class InnerClass {
...
}
}
StaticNestedClass是嵌套類
InnerClass是內部類
/////////////
nested-class和inner-class都是外層類的成員變量。只不過一個是靜態的,一個是非靜態的。
所以,nested-class和inner-class均可以被聲明private,public,protested或package
可是由靜態和非靜態的不一樣可知:nested-class是和類相關的,而inner-class是和實例相關的。所以能夠不實例化對象,就直接訪問nested-class,而必須實例化類才能訪問inner-class。而nested-class不能訪問外層類的其餘成員變量或方法,而inner-class則能夠。
由於inner-class是非靜態成員變量,所以inner-class中不能再定義靜態變量或方法了。
:匿名內部類是否能夠繼承其它類?是否能夠實現接口?
匿名內部類能夠繼承自其餘類或接口。但在new Class(){}或new Interface(){}後不能再extends或implements
forward:URL->後臺-> URL(瀏覽器中URL不變)
redirect:URL->後臺->瀏覽器->URL(瀏覽器中URL要變)
:進程和線程的區別——線程是指進程內的一個執行單元,也是進程內的可調度實體。
(2)併發性:不只進程之間能夠併發執行,同一個進程的多個線程之間也可併發執行。
(1)調度:線程做爲調度和分配的基本單位,進程做爲擁有資源的基本單位。
(3)擁有資源:進程是擁有資源的一個獨立單位,線程不擁有系統資源,但能夠訪問隸屬於進程的資源.
(4)系統開銷:在建立或銷燬進程時,因爲系統都要爲之分配和回收資源,致使系統的開銷明顯大於建立或銷燬線程時的開銷。
:進程間的通信方式及優缺點——
1)管道:數據只能單向流動,並且只能在具備親緣關係的進程之間使用。進程的親緣關係一般是指父子進程關係。在同一臺電腦中。
2)命名(有名)管道(FIFO,隊列管道):命名管道不只可在同一臺計算機的不一樣進程之間傳輸數據,甚至能在跨越一個網絡的不一樣計算機的不一樣進程之間,支持可靠的、單向或雙向的數據通訊
6)共享內存( shared memory ) :共享內存就是分配一塊能被其餘進程訪問的內存。共享內存能夠說是最有用的進程間通訊方式,也是最快的IPC形式。首先說下在使用共享內存區前,必須經過系統函數將其附加到進程的地址空間或說爲映射到進程空間。兩個不一樣進程A、B共享內存的意思是,同一塊物理內存被映射到 進程A、B各自的進程地址空間。進程A能夠即時看到進程B對共享內存中數據的更新,反之亦然。因爲多個進程共享同一塊內存區域,必然須要某種同步機制,互 斥鎖和信號量均可以。採用共享內存通訊的一個顯而易 見的好處是效率高,由於進程能夠直接讀寫內存,而不須要任何數據的拷貝。對於像管道和消息隊列等通訊方式,則須要在內核和用戶空間進行四次的數據拷貝,而 共享內存則只拷貝兩次數據[1]:一次從輸入文件到共享內存區,另外一次從共享內存區到輸出文件。實際上,進程之間在共享內存時,並不老是讀寫少許數據後就 解除映射,有新的通訊時,再從新創建共享內存區域。而是保持共享區域,直到通訊完畢爲止,這樣,數據內容一直保存在共享內存中,並無寫回文件。共享內存 中的內容每每是在解除映射時才寫回文件的。所以,採用共享內存的通訊方式效率是很是高的。
3)信號量:信號量是一個計數器,能夠用來控制多個進程對共享資源的訪問。它常做爲一種鎖機制,防止某進程正在訪問共享資源時,其餘進程也訪問該資源。所以,主要做爲進程間以及同一進程內不一樣線程之間的同步手段。臨界資源:爲某一時刻只能由一個進程或線程操做的資源,當信號量的值大於或等於0時,表示能夠供併發進程訪問的臨界資源數,當小於0時,表示正在等待使用臨界資源的進程數。更重要的是,信號量的值僅能由PV操做來改變。
4)消息隊列:消息隊列是有消息的鏈表,存放在內核中並由消息隊列標識符標識。消息隊列克服了信號傳遞信息少、管道只能承載無格式字節流以及緩衝區大小受限等缺點。
5)信號 ( sinal ) :信號是在軟件層次上對中斷機制的一種模擬,在原理上,一個進程收到一個信號與處理器收到一箇中斷請求能夠說是同樣的。信號是異步的,一個進程沒必要經過任何操做來等待信號的到達,事實上,進程也不知道信號到底何時到達。信號是進程間通訊機制中惟一的異步通訊機制,能夠看做是異步通知,通知接收信號的進程有哪些事情發生了。信號機制通過POSIX實時擴展後,功能更增強大,除了基本通知功能外,還能夠傳遞附加信息。信號事件的發生有兩個來源:硬件來源(好比咱們按下了鍵盤或者其它硬件故障);軟件來源。
信號分爲可靠信號和不可靠信號,實時信號和非實時信號。
進程有三種方式響應信號:
忽略信號
捕捉信號
執行缺省操做
7)套接字( socket ) :套接字也是一種進程間通訊機制,與其餘通訊機制不一樣的是,它可用於不一樣主機間的進程通訊。
:共享內存可實現不一樣進程訪問相同資源,並經過信號量等實現線程間的同步
進程同步、ajax請求異步:
A,B作同一件事,A不等B去作另外一件事。當B通知來時再一塊兒去作
線程安全的類,synchronized類:多線程對共享資源的訪問
線程啓動,運行後,由虛擬機調動run()方法
join使某線程優先執行完。
線程任務內再啓動一個線程任務,兩個線程並行執行。
在並行輸出中,當數值輸出到50時,就讓thread1執行,其餘線程等待它執行完再執行。
i==2的結果:
線程池
新建線程池實例,而後啓動多個線程對共享資源進行訪問:線程池
100線程,執行後應該是100(每一個任務很快執行,下個任務讀到的是上個任務的結果)
Thread.sleep(5),每一個線程任務讀到的不是前面任務的結果,可能多個任務讀到同一個值,而後再將結果寫回,所以結果不肯定。(本機運行結果爲2)
線程,共享資源(方法)
1、多線程訪問共享資源
2、對共享資源進行顯示加鎖
3、訪問共享資源的線程數
進程間通訊、java內置監視器
線程狀態
同步集合
面向對象:三大特性、六大原則(單一職責,迪米特(最少知道-高內聚低耦合),依賴置換(面向接口編程),接口隔離原則(接口應儘可能小和簡潔),里氏替換,開放封閉)、3大目標(易維護,易擴展,易複用)
什麼是多態
面向對象的三大特性:封裝、繼承、多態。從必定角度來看,封裝和繼承幾乎都是爲多態而準備的。
多態的定義:指容許不一樣類的對象對同一消息作出對應響應。即同一消息能夠根據「發送對象」的不一樣而採用多種不一樣的行爲方式。(發送消息就是方法調用)
實現多態的技術稱爲:動態綁定(dynamic binding),是指在執行期間判斷所引用對象的實際類型,根據其實際的類型調用其相應的方法。
多態存在的三個必要條件
1、要有繼承;
2、要有重寫;
3、父類引用指向子類對象。
多態的做用:消除類型之間的耦合關係。
現實中,關於多態的例子不勝枚舉。比方說按下 F1 鍵這個動做,若是當前在 Flash 界面下彈出的就是 AS 3 的幫助文檔;若是當前在 Word 下彈出的就是 Word 幫助;在 Windows 下彈出的就是 Windows 幫助和支持。同一個事件發生在不一樣的對象上會產生不一樣的結果。
多態的好處:
1.可替換性(substitutability)。多態對已存在代碼具備可替換性。例如,多態對圓Circle類工做,對其餘任何圓形幾何體,如圓環,也一樣工做。
2.可擴充性(extensibility)。多態對代碼具備可擴充性。增長新的子類不影響已存在類的多態性、繼承性,以及其餘特性的運行和操做。實際上新加子類更容易得到多態功能。例如,在實現了圓錐、半圓錐以及半球體的多態基礎上,很容易增添球體類的多態性。
3.接口性(interface-ability)。多態是超類經過方法簽名,向子類提供了一個共同接口,由子類來完善或者覆蓋它而實現的。
4.靈活性(flexibility)。它在應用中體現了靈活多樣的操做,提升了使用效率。
5.簡化性(simplicity)。多態簡化對應用軟件的代碼編寫和修改過程,尤爲在處理大量對象的運算和操做時,這個特色尤其突出和重要。
Java中多態的實現方式:接口實現,繼承父類進行方法重寫,同一個類中進行方法重載。
例子:你叫我去吃飯,我聽到了就馬上和你去吃飯。若是我沒有聽到,你就會一直叫我,直到我聽見和你一塊兒去吃飯。若是我有事,你會等待,這個過程叫同步;異步過程指你叫我去吃飯,而後你就去吃飯了,而無論我是否和你一塊兒去吃飯。而我獲得消息後可能當即就走,也可能過段時間再走。
內容:在計算機領域,同步就是指一個進程在執行某個請求的時候,若該請求須要一段時間才能返回信息,那麼這個進程將會一直等待下去,直到收到返回信息才繼續執行下去;異步是指進程不須要一直等下去,而是繼續執行下面的操做,無論其餘進程的狀態。當有消息返回時系統會通知進程進行處理,這樣能夠提升執行的效率。
同步問題多發生在多線程環境中的數據共享問題。即當多個線程須要訪問同一個資源時,它們須要以某種順序來確保該資源在某一特定時刻只能被一個線程所訪問,而其餘線程等待。若是使用異步,A在使用共享資源a,B請求使用a,若是是同步:B會等待知道A迴應。若是是異步:B直接就使用a。
:實現同步的機制主要有臨界區、互斥、信號量和事件
臨界區:經過對多線程的串行化來訪問公共資源或一段代碼,速度快,適合控制數據訪問。在任意時刻只容許一個線程對共享資源進行訪問,若是有多個線程試圖訪問公共資源,那麼在有一個線程進入後,其餘試圖訪問公共資源的線程將被掛起,並一直等到進入臨界區的線程離開,臨界區在被釋放後,其餘線程才能夠搶佔。
互斥量:採用互斥對象機制。 只有擁有互斥對象的線程纔有訪問公共資源的權限,由於互斥對象只有一個,因此能保證公共資源不會同時被多個線程訪問。互斥不只能實現同一應用程序的公共資源安全共享,還能實現不一樣應用程序的公共資源安全共享 .互斥量比臨界區複雜。由於使用互斥不只僅可以在同一應用程序不一樣線程中實現資源的安全共享,並且能夠在不一樣應用程序的線程之間實現對資源的安全共享。
信號量:它容許多個線程在同一時刻訪問同一資源,可是須要限制在同一時刻訪問此資源的最大線程數目 。信號量對象對線程的同步方式與前面幾種方法不一樣,信號容許多個線程同時使用共享資源,這與操做系統中的PV操做相同。它指出了同時訪問共享資源的線程最大數目。它容許多個線程在同一時刻訪問同一資源,可是須要限制在同一時刻訪問此資源的最大線程數目。
事件:經過通知操做的方式來保持線程的同步,還能夠方便實現對多個線程的優先級比較的操做 。
補充:
PV操做及信號量的概念都是由荷蘭科學家E.W.Dijkstra提出的。信號量S是一個整數,S大於等於零時表明可供併發進程使用的資源實體數,但S小於零時則表示正在等待使用共享資源的進程數。
信號量:S。0爲分界區,大於等於0,則信號量的隊列中無等待進程,小於0,則信號量的隊列中有等待進程。
P操做申請資源:
(1)S減1;
(2)若S減1後仍大於等於零,則進程繼續執行;
(3)若S減1後小於零,則該進程被阻塞後進入與該信號相對應的隊列中,而後轉入進程調度。
V操做 釋放資源:
(1)S加1;
(2)若相加結果大於零,則進程繼續執行;
(3)若相加結果小於等於零,則從該信號的等待隊列中喚醒一個被阻塞的等待進程,而後再返回原進程繼續執行或轉入進程調度。
總結:
1) 互斥量與臨界區的做用很是類似,但互斥量是能夠命名的,也就是說它能夠跨越進程使用。因此建立互斥量須要的資源更多,因此若是隻爲了在進程內部是用的話使用臨界區會帶來速度上的優點並可以減小資源佔用量。由於互斥量是跨進程的互斥量一旦被建立,就能夠經過名字打開它。
2) 互斥量(Mutex),信號燈(Semaphore),事件(Event)均可以被跨越進程使用來進行同步數據操做,而其餘的對象與數據同步操做無關,但對於進程和線程來說,若是進程和線程在運行狀態則爲無信號狀態,在退出後爲有信號狀態。因此可使用WaitForSingleObject來等待進程和線程退出。
3) 經過互斥量能夠指定資源被獨佔的方式使用,但若是有下面一種狀況經過互斥量就沒法處理,好比如今一位用戶購買了一份三個併發訪問許可的數據庫系統,能夠根據用戶購買的訪問許可數量來決定有多少個線程/進程能同時進行數據庫操做,這時候若是利用互斥量就沒有辦法完成這個要求,信號燈對象能夠說是一種資源計數器。
EJB是sun的JavaEE服務器端組件模型,設計目標與核心應用是部署分佈式應用程序。簡單來講就是把已經編寫好的程序(即:類)打包放在服務器上執行。憑藉java跨平臺的優點,用EJB技術部署的分佈式系統能夠不限於特定的平臺。EJB (Enterprise JavaBean)是J2EE(javaEE)的一部分,定義了一個用於開發基於組件的企業多重應用程序的標準。其特色包括網絡服務支持和核心開發工具(SDK)。 在J2EE裏,Enterprise Java Beans(EJB)稱爲Java 企業Bean,是Java的核心代碼,分別是會話Bean(Session Bean),實體Bean(Entity Bean)和消息驅動Bean(MessageDriven Bean)。在EJB3.0推出之後,實體Bean被單獨分了出來,造成了新的規範JPA。
J2EE(Java2Platform,EnterpriseEdition)是一個爲大企業主機級的計算類型而設計的Java平臺。Sun微系統(與其工業夥伴一塊兒,例如IBM)設計了J2EE,以此來簡化在瘦客戶級環境下的應用開發。因爲創造了標準的可重用模塊組件以及因爲構建出能自動處理編程中多方面問題的等級結構,J2EE簡化了應用程序的開發,也下降了對編程和對受訓的程序員的要求。
J2EE組件和「標準的」Java類的不一樣點在於:它被裝配在一個J2EE應用中,具備固定的格式並遵照J2EE規範,由J2EE服務器對其進行管理。J2EE規範是這樣定義J2EE組件的:客戶端應用程序和applet是運行在客戶端的組件;Java Servlet和Java Server Pages (JSP) 是運行在服務器端的Web組件;Enterprise Java Bean (EJB )組件是運行在服務器端的業務組件。
J2EE典型的四層結構:
運行在客戶端機器上的客戶層組件
運行在J2EE服務器上的Web層組件
運行在J2EE服務器上的業務邏輯層組件
運行在EIS服務器上的企業信息系統(Enterprise information system)層軟件
J2EE是Java 2 enterprise edition是Java的一種企業版用於企業級的應用服務開發
J2SE是Java 2 standard edition是Java的標準版,用於標準的應用開發
J2ME是Java 2 Micro Edition是Java的微型版,經常使用於手機上的開發
J2EE,J2SE,J2ME是java針對不一樣的的使用來提供不一樣的服務,也就是提供不一樣類型的類庫。
short i=1;
i+=1;
//i=(short)i+1;//short會被轉化成int
Object i1 = i;//基本類型自動轉換成包裝類
if(i1 instanceof Short){
System.out.println("yes");
}
class A{
String s = new String("test");
}
建立該對象,生成了幾個對象?
抽象類能夠有構造函數,但不該該有公共的構造函數(FxCop.設計規則)。FxCop.設計規則中說,若是抽象類須要構造函數,那麼應該聲明爲「protected」。
(1)初始化抽象類的成員;
(2)爲繼承自它的子類使用。
抽象類能夠繼承實體類,可是和實體類的繼承同樣,也要求父類可繼承(不是final),而且擁有子類可訪問到的構造器(不是private)
一個byte由八個位組成,如00000000,其中,前7位表示數值,第8位是符號位(0爲正,1爲負)。最大的正數就是01111111;最小的負數是11111111。
但負數會到-128。這不得不崇拜偉大的印度阿三們。
上述的描述會出現一個問題,就是0,會出現一個+0和一個-0。印度人他們規定-0爲-128,這樣就與計算機的補碼(程序都是按補碼運行的)完美的結合在一塊兒。
爲知文件模塊。
Properties-->Java Compiler-->compiler compliance level
1.5重寫接口會報錯,需1.6及以上
訪問權限不能比父類中被重寫的方法的訪問權限更低。
父類的成員方法只能被它的子類重寫。
聲明爲final的方法不能被重寫。
聲明爲static的方法不能被重寫,可是可以被再次聲明,即靜態方法屬於類。
若是不能繼承一個方法,則不能重寫這個方法。
/////////////////////
A,B類中能夠有同名的靜態方法:
靜態方法:A.c,B.c B繼承A,A=B,調用A.c,依然是調用A中的方法c,而不是B中的方法c
垃圾回收機制有:
分代複製垃圾回收
標記垃圾回收
增量垃圾回收。
:class加載機制?
:java 序列化,如何實現 java 序列化?
序列化就是一種用來處理對象流的機制,所謂對象流也就是將對象的內容進行流化。能夠對流化後的對象進行讀寫操做,也可將流化後的對象傳輸於網絡之間。序列化是爲了解決在對對象進行讀寫操做時所引起的問題。
序列化的實現:將須要被序列化的類實現 Serializable 接口,該接口沒有須要實現的方法,
implements Serializable 只是爲了標註該對象是可被序列化的,而後可使用一個輸出流來輸出對象。
查看String類源碼
private final char value[];
public String() {
this.value = new char[0];
//this.value[0] = 'a';//申請了內存,沒有賦初值
}
底層是如何處理的?
:jsp是一個servlet,它如何得到request,session,application等對象?
:瀏覽器請求URL1,URL2,在服務器如何判斷URL1,URL2是同一個session?
:瀏覽器請求URL1,服務器中頁面jsp1,在頁面中有URL2,直接在服務器內進行請求,服務器中頁面jsp2或servlet2,此時,jsp2或servlet2中的request是由jsp1中的request而來嗎?
:Servlet 執行時通常實現哪幾個方法?
public ServletConfig getServletConfig()
public void init(ServletConfig config)
public void service(ServletRequest request,ServletResponse response)
public void destroy()
public String getServletInfo()
a: 兩種形式 dtd schema
b: 本質區別:schema自己是xml的能夠被XML解析器解析(這也是從DTD上發展 schema的根本目的)
c:DOM,SAX,STAX 等
DOM:處理大型文件時其性能降低的很是厲害。這個問題是由DOM的樹結構所形成的,這種結構佔用的內存較多,並且DOM必須在解析文件以前把整個文檔裝入內存,適合對 XML 的隨機訪問
SAX:不現於DOM,SAX是事件驅動型的XML解析方式。它順序讀取XML文件,不須要一次所有裝載整個文件。當遇到像文件開頭,文檔結束,或者標籤開頭與標籤結束時,它會觸發一個事件,用戶經過在其回調事件中寫入處理代碼來處理 XML 文件,適合對 XML 的順序訪問
STAX:Streaming API for XML (StAX)
web容器:給處於其中的應用程序組件( JSP, SERVLET)提供一個環境,使 JSP,SERVLET 能直接在容器
中進行接口交互,沒必要關注其它系統問題。主要有WEB服務器來實現。例如:TOMCAT,WEBLOGIC,WEBSPHERE等。該容器提供的接口嚴格遵照J2EE規範中的WEBAPPLICATION標準。咱們把遵照J2EE標準的WEB服務器就叫作J2EE中的WEB容器。
EJB 容器:Enterprise java bean容器。更具備行業領域特點。他提供給運行在其中的EJB組件各類管理功能。只要知足J2EE規範的EJB放入該容器,立刻就會被容器進行高效率的管理。而且能夠經過現成的接口來得到系統級別的服務。例如郵件服務、事務管理。
JNDI:(JavaNamingDirectoryInterface)JAVA命名目錄服務。主要提供的功能是:提供一個目錄系統,讓其它各地的應用程序在其上面留下本身的索引,從而知足快速查找和定位分佈式應用程序的功能。
JMS:( Java Message Service) JAVA消息服務。主要實現各個應用程序之間的通信。包括點對點和廣播。
JTA:( Java Transaction API) JAVA事務服務。提供各類分佈式事務服務。應用程序只需調用其提供的接口便可。
JAF:( Java Action FrameWork) JAVA 安全認證框架。提供一些安全控制方面的框架。讓開發者經過各類部署和自定義實現本身的個性安全控制策略。
RMI/IIOP:(RemoteMethodInvocation)對象請求中介協議,他們主要用於經過遠程調用服務。例如,遠程有一臺計算機上運行一個程序,它提供股票分析服務,咱們能夠在本地計算機上實現對其直接調用。固然這是要經過必定的規範才能在異構的系統之間進行通訊。 RMI是JAVA特有的。
:clone()
實現了Cloneable接口,表示Object.clone()方法能夠合法地對該類實例進行按字段複製。
在重寫clone()方法時,有缺省行爲,super.clone(),負責產生正確大小的空間,並逐位複製。