面向過程:html
優勢:性能比面向對象高,由於類調用時須要實例化,開銷比較大,比較消耗資源;好比單片機、嵌入式開發、Linux/Unix等通常採用面向過程開發,性能是最重要的因素。java
缺點:沒有面向對象易維護、易複用、易擴展程序員
面向對象:web
優勢:易維護、易複用、易擴展,因爲面向對象有封裝、繼承、多態性的特性,能夠設計出低耦合的系統,使系統更加靈活、更加易於維護面試
缺點:性能比面向過程低算法
1,簡單易學;2,面向對象(封裝,繼承,多態);3,平臺無關性(Java虛擬機實現平臺無關性);4,可靠性;5,安全性;6,支持多線程(C++語言沒有內置的多線程機制,所以必須調用操做系統的多線程功能來進行多線程
程序設計,而Java語言卻提供了多線程支持);7,支持網絡編程而且很方便(Java語言誕生自己就是爲簡化網絡編程設計的,所以Java語言不只支持網絡編程並且很方便);8,編譯與解釋並存;數據庫
先看下java中的編譯器和解釋器:編程
Java中引入了虛擬機的概念,即在機器和編譯程序之間加入了一層抽象的虛擬的機器。這臺虛擬的機器在任何平臺上都提供給編譯程序一個的共同的接口。編譯程序只須要面向虛擬機,生成虛擬機可以理解的代碼,而後由解釋器來將虛擬機代碼轉換爲特定系統的機器碼執行。在Java中,這種供虛擬機理解的代碼叫作字節碼(即擴展名爲.class的文件),它不面向任何特定的處理器,只面向虛擬機。每一種平臺的解釋器是不一樣的,可是實現的虛擬機是相同的。Java源程序通過編譯器編譯後變成字節碼,字節碼由虛擬機解釋執行,虛擬機將每一條要執行的字節碼送給解釋器,解釋器將其翻譯成特定機器上的機器碼,而後在特定的機器上運行,這就是上面提到的Java的特色的編譯與解釋並存的解釋。小程序
Java源代碼---->編譯器---->jvm可執行的Java字節碼(即虛擬指令)---->jvm---->jvm中解釋器----->機器可執行的二進制機器碼---->程序運行。
採用字節碼的好處:數組
Java語言經過字節碼的方式,在必定程度上解決了傳統解釋型語言執行效率低的問題,同時又保留了解釋型語言可移植的特色。因此Java程序運行時比較高效,並且,因爲字節碼並不專對一種特定的機器,所以,Java程序無須從新編譯即可在多種不一樣的計算機上運行。
任何一種能夠運行Java字節碼的軟件都可當作是Java的虛擬機(JVM)
一個程序中能夠有多個類,但只能有一個類是主類。在Java應用程序中,這個主類是指包含main()方法的類。而在Java小程序中,這個主類是一個繼承自系統類JApplet或Applet的子類。應用程序的主類不必定要求是public類,但小程序的主類要求必須是public類。主類是Java程序執行的入口點。
JDK: 顧名思義它是給開發者提供的開發工具箱,是給程序開發者用的。它除了包括完整的JRE(Java Runtime Environment),Java運行環境,還包含了其餘供開發者使用的工具包。
JRE:普通用戶而只須要安裝JRE(Java Runtime Environment)來 來運行Java程序。而程序開發者必須安裝JDK來編譯、調試程序。
Java環境變量PATH和CLASSPATH - 簡書 http://www.jianshu.com/p/d63b099cf283
簡單說應用程序是從主線程啓動(也就是main()方法)。applet小程序沒有main方法,主要是嵌在瀏覽器頁面上運行(調用init()線程或者run()來啓動),嵌入瀏覽器這點跟flash的小遊戲相似。
1) 形式上:
字符常量是單引號引發的一個字符
字符串常量是雙引號引發的若干個字符
2) 含義上:
字符常量至關於一個整形值(ASCII值),能夠參加表達式運算
字符串常量表明一個地址值(該字符串在內存中存放位置)
3) 佔內存大小
字符常量只佔一個字節
字符串常量佔若干個字節(至少一個字符結束標誌)
Java語言採用Unicode編碼標準,Unicode(標準碼),它爲每一個字符制訂了一個惟一的數值,所以在任何的語言,平臺,程序均可以放心的使用。
在講繼承的時候咱們就知道父類的私有屬性和構造方法並不能被繼承,因此Constructor也就不能被override,可是能夠overload,因此你能夠看到一個類中有多個構造函數的狀況。
重載:發生在同一個類中,方法名必須相同,參數類型不一樣、個數不一樣、順序不一樣,方法返回值和訪問修飾符能夠不一樣,發生在編譯時。
重寫:發生在父子類中,方法名、參數列表必須相同,返回值小於等於父類,拋出的異常小於等於父類,訪問修飾符大於等於父類;若是父類方法訪問修飾符爲private則子類中就不是重寫。
http://www.javashuo.com/article/p-abefjthy-by.html
可變性
String類中使用字符數組保存字符串,private final char value[],因此string對象是不可變的。StringBuilder與StringBuffer都繼承自AbstractStringBuilder類,在AbstractStringBuilder中也是使用字符數組保存字符串,char[]value,這兩種對象都是可變的。
線程安全性
String中的對象是不可變的,也就能夠理解爲常量,線程安全。AbstractStringBuilder是StringBuilder與StringBuffer的公共父類,定義了一些字符串的基本操做,如expandCapacity、append、insert、indexOf等公共方法。StringBuffer對方法加了同步鎖或者對調用的方法加了同步鎖,因此是線程安全的。StringBuilder並無對方法進行加同步鎖,因此是非線程安全的。
性能
每次對String 類型進行改變的時候,都會生成一個新的String對象,而後將指針指向新的String 對象。StringBuffer每次都會對StringBuffer對象自己進行操做,而不是生成新的對象並改變對象引用。相同狀況下使用StirngBuilder 相比使用StringBuffer 僅能得到10%~15% 左右的性能提高,但卻要冒多線程不安全的風險。
對於三者使用的總結:
若是要操做少許的數據用 = String
單線程操做字符串緩衝區 下操做大量數據 = StringBuilder
多線程操做字符串緩衝區 下操做大量數據 = StringBuffer
裝箱:將基本類型用它們對應的引用類型包裝起來;
拆箱:將包裝類型轉換爲基本數據類型;
Java使用自動裝箱和拆箱機制,節省了經常使用數值的內存開銷和建立對象的開銷,提升了效率,由編譯器來完成,編譯器會在編譯期根據語法決定是否進行裝箱和拆箱動做。
http://blog.csdn.net/yttcjj/article/details/6939239
因爲靜態方法能夠不經過對象進行調用,所以在靜態方法裏,不能調用其餘非靜態變量,也不能夠訪問非靜態變量成員。
Java程序在執行子類的構造方法以前,若是沒有用super()來調用父類特定的構造方法,則會調用父類中「沒有參數的構造方法」。所以,若是父類中只定義了有參數的構造方法,而在子類的構造方法中又沒有用super()來調用父類中特定的構造方法,則編譯時將發生錯誤,由於Java程序在父類中找不到沒有參數的構造方法可供執行。解決辦法是在父類里加上一個不作事且沒有參數的構造方法。
http://www.cnblogs.com/EasonJim/p/6993139.html
1.接口的方法默認是public,全部方法在接口中不能有實現,抽象類能夠有非抽象的方法
2.接口中的實例變量默認是final類型的,而抽象類中則不必定
3.一個類能夠實現多個接口,但最多隻能實現一個抽象類
4.一個類實現接口的話要實現接口的全部方法,而抽象類不必定
5.接口不能用new實例化,但能夠聲明,可是必須引用一個實現該接口的對象
從設計層面來講,抽象是對類的抽象,是一種模板設計,接口是行爲的抽象,是一種行爲的規範。
從語法形式上,當作員變量是屬於類的,而局部變量是在方法中定義的變量或是方法的參數;成員變量能夠被public,private,static等修飾符所修飾,而局部變量不能被訪問控制修飾符及static所修飾;成員變量和局部變量都能被final所修飾;
從變量在內存中的存儲方式來看,成員變量是對象的一部分,而對象存在於堆內存,局部變量存在於棧內存
從變量在內存中的生存時間上看,成員變量是對象的一部分,它隨着對象的建立而存在,而局部變量隨着方法的調用而自動消失。
成員變量若是沒有被賦初值,則會自動以類型的默認值而賦值(一種狀況例外被final修飾但沒有被static修飾的成員變量必須顯示地賦值);而局部變量則不會自動賦值。
new運算符,new建立對象實例(對象實例在堆內存中),對象引用指向對象實例(對象引用存放在棧內存中)。一個對象引用能夠指向0個或1個對象(一根繩子能夠不繫氣球,也能夠系一個氣球);一個對象能夠有n個引用指向它(能夠用n條繩子繫住一個氣球)
方法的返回值是指咱們獲取到的某個方法體中的代碼執行後產生的結果!(前提是該方法可能產生結果)。返回值的做用:接收出結果,使得它能夠用於其餘的操做!
主要做用是完成對類對象的初始化工做。能夠執行。由於一個類即便沒有聲明構造方法也會有默認的不帶參數的構造方法。
1,名字與類名相同;2,沒有返回值,但不能用void聲明構造函數;3,生成類的對象時自動執行,無需調用。
靜態方法和實例方法的區別主要體如今兩個方面:
在外部調用靜態方法時,可使用"類名.方法名"的方式,也可使用"對象名.方法名"的方式。而實例方法只有後面這種方式。也就是說,調用靜態方法能夠無需建立對象。
靜態方法在訪問本類的成員時,只容許訪問靜態成員(即靜態成員變量和靜態方法),而不容許訪問實例成員變量和實例方法;實例方法則無此限制
對象的相等 比的是內存中存放的內容是否相等而 引用相等 比較的是他們指向的內存地址是否相等。
幫助子類作初始化工做。
http://blog.csdn.net/bornlili/article/details/55213563
通俗點講:==是看看左右是否是一個東西。equals是看看左右是否是長得同樣。如何記住嘛。若是單純是想記住,==:等於。equals:相同。兩個長得同樣的人,只能說長的相同(equals),可是不等於他們倆是一我的。你只要記住equals,==就不用記了。
術語來說的區別:1.==是判斷兩個變量或實例是否是指向同一個內存空間 equals是判斷兩個變量或實例所指向的內存空間的值是否是相同
2.==是指對內存地址進行比較 equals()是對字符串的內容進行比較3.==指引用是否相同 equals()指的是值是否相同
我更喜歡實現Runnable接口這種方法,固然這也是如今大多程序員會選用的方法。由於一個類只能繼承一個父類而能夠實現多個接口。同時,線程池也是很是高效的,很容易實現和使用。
線程與進程類似,但線程是一個比進程更小的執行單位。一個進程在其執行的過程當中能夠產生多個線程。與進程不一樣的是同類的多個線程共享同一塊內存空間和一組系統資源,因此係統在產生一個線程,或是在各個線程之間做切換工做時,負擔要比進程小得多,也正由於如此,線程也被稱爲輕量級進程。
程序是含有指令和數據的文件,被存儲在磁盤或其餘的數據存儲設備中,也就是說程序是靜態的代碼。
進程是程序的一次執行過程,是系統運行程序的基本單位,所以進程是動態的。系統運行一個程序便是一個進程從建立,運行到消亡的過程。簡單來講,一個進程就是一個執行中的程序,它在計算機中一個指令接着一個指令地執行着,同時,每一個進程還佔有某些系統資源如CPU時間,內存空間,文件,文件,輸入輸出設備的使用權等等。換句話說,當程序在執行時,將會被操做系統載入內存中。
線程是進程劃分紅的更小的運行單位。線程和進程最大的不一樣在於基本上各進程是獨立的,而各線程則不必定,由於同一進程中的線程極有可能會相互影響。從另外一角度來講,進程屬於操做系統的範疇,主要是同一段時間內,能夠同時執行一個以上的程序,而線程則是在同一程序內幾乎同時執行一個以上的程序段。
多線程就是幾乎同時執行多個線程(一個處理器在某一個時間點上永遠都只能是一個線程!即便這個處理器是多核的,除非有多個處理器才能實現多個線程同時運行。)。幾乎同時是由於實際上多線程程序中的多個線程其實是一個線程執行一會而後其餘的線程再執行,並非不少書籍所謂的同時執行。這樣能夠帶來如下的好處:
多任務與多線程是兩個不一樣的概念,
多任務是針對操做系統而言的,表示操做系統能夠同時運行多個應用程序。
而多線程是針對一個進程而言的,表示在一個進程內部能夠幾乎同時執行多個線程
備註:
能夠用早起坐地鐵來比喻這個過程:
還沒起牀:sleeping
起牀收拾好了,隨時能夠坐地鐵出發:Runnable
等地鐵來:Waiting
地鐵來了,但要排隊上地鐵:I/O阻塞
上了地鐵,發現暫時沒座位:synchronized阻塞
地鐵上找到座位:Running
到達目的地:Dead
當一個線程對共享的數據進行操做時,應使之成爲一個」原子操做「,即在沒有完成相關操做以前,不容許其餘線程打斷它,不然,就會破壞數據的完整性,必然會獲得錯誤的處理結果,這就是線程的同步。
在多線程應用中,考慮不一樣線程之間的數據同步和防止死鎖。當兩個或多個線程之間同時等待對方釋放資源的時候就會造成線程之間的死鎖。爲了防止死鎖的發生,須要經過同步來實現線程安全。
在 java 虛擬機中, 每一個對象( Object 和 class )經過某種邏輯關聯監視器,每一個監視器和一個對象引用相關聯, 爲了實現監視器的互斥功能, 每一個對象都關聯着一把鎖.
一旦方法或者代碼塊被 synchronized 修飾, 那麼這個部分就放入了監視器的監視區域, 確保一次只能有一個線程執行該部分的代碼, 線程在獲取鎖以前不容許執行該部分的代碼
另外 java 還提供了顯式監視器( Lock )和隱式監視器( synchronized )兩種鎖方案
死鎖 :是指兩個或兩個以上的進程在執行過程當中,因爭奪資源而形成的一種互相等待的現象,若無外力做用,它們都將沒法推動下去 。
產生緣由:
若是系統資源充足,進程的資源請求都可以獲得知足,死鎖出現的可能性就很低,不然就會因爭奪有限的資源而陷入死鎖。其次,進程運行推動順序與速度不一樣,也可能產生死鎖。
下面四個條件是死鎖的必要條件,只要系統發生死鎖,這些條件必然成立,而只要下列條件之一不知足,就不會發生死鎖。
理解了死鎖的緣由,尤爲是產生死鎖的四個必要條件,就能夠最大可能地避免、預防和 解除死鎖。因此,在系統設計、進程調度等方面注意如何不讓這四個必要條件成立,如何確 定資源的合理分配算法,避免進程永久佔據系統資源。此外,也要防止進程在處於等待狀態的狀況下佔用資源。所以,對資源的分配要給予合理的規劃。
上面一題咱們知道了發生死鎖的四個必要條件。咱們只要使其中一個不成立就好了。一種很是簡單的避免死鎖的方式就是:指定獲取鎖的順序,並強制線程按照指定的順序獲取鎖。所以,若是全部的線程都是以一樣的順序加鎖和釋放鎖,就不會出現死鎖了。這也就是破壞了第四個條件循環等待條件。
垃圾回收是在內存中存在沒有引用的對象或超過做用域的對象時進行。
垃圾回收的目的是識別而且丟棄應用再也不使用的對象來釋放和重用資源。
1)垃圾回收器(garbage colector)決定回收某對象時,就會運行該對象的finalize()方法;
finalize是Object類的一個方法,該方法在Object類中的聲明protected void finalize() throws Throwable { }
在垃圾回收器執行時會調用被回收對象的finalize()方法,能夠覆蓋此方法來實現對其資源的回收。注意:一旦垃圾回收器準備釋放對象佔用的內存,將首先調用該對象的finalize()方法,而且下一次垃圾回收動做發生時,才真正回收對象佔用的內存空間
2)GC原本就是內存回收了,應用還須要在finalization作什麼呢? 答案是大部分時候,什麼都不用作(也就是不須要重載)。只有在某些很特殊的狀況下,好比你調用了一些native的方法(通常是C寫的),能夠要在finaliztion裏去調用C的釋放函數。
不會,在下一個垃圾回收週期中,這個對象將是可被回收的。
在Java Web程序中,Servlet主要負責接收用戶請求HttpServletRequest,在doGet(),doPost()中作相應的處理,並將迴應HttpServletResponse反饋給用戶。Servlet能夠設置初始化參數,供Servlet內部使用。一個Servlet類只會有一個實例,在它初始化時調用init()方法,銷燬時調用destroy()方法。Servlet須要在web.xml中配置(MyEclipse中建立Servlet會自動配置),一個Servlet能夠設置多個URL訪問。Servlet不是線程安全,所以要謹慎使用類變量。
CGI的不足之處:
1,須要爲每一個請求啓動一個操做CGI程序的系統進程。若是請求頻繁,這將會帶來很大的開銷。
2,須要爲每一個請求加載和運行一個CGI程序,這將帶來很大的開銷
3,須要重複編寫處理網絡協議的代碼以及編碼,這些工做都是很是耗時的。
Servlet的優勢:
1,只須要啓動一個操做系統進程以及加載一個JVM,大大下降了系統的開銷
2,若是多個請求須要作一樣處理的時候,這時候只須要加載一個類,這也大大下降了開銷
3,全部動態加載的類能夠實現對網絡協議以及請求解碼的共享,大大下降了工做量。
4,Servlet能直接和Web服務器交互,而普通的CGI程序不能。Servlet還能在各個程序之間共享數據,使數據庫鏈接池之類的功能很容易實現。
補充:Sun Microsystems公司在1996年發佈Servlet技術就是爲了和CGI進行競爭,Servlet是一個特殊的Java程序,一個基於Java的Web應用一般包含一個或多個Servlet類。Servlet不可以自行建立並執行,它是在Servlet容器中運行的,容器將用戶的請求傳遞給Servlet程序,並將Servlet的響應回傳給用戶。一般一個Servlet會關聯一個或多個JSP頁面。之前CGI常常由於性能開銷上的問題被詬病,然而Fast CGI早就已經解決了CGI效率上的問題,因此面試的時候大可沒必要信口開河的詬病CGI,事實上有不少你熟悉的網站都使用了CGI技術。
參考:《javaweb整合開發王者歸來》P7
Servlet接口定義了5個方法,其中前三個方法與Servlet生命週期相關:
生命週期: Web容器加載Servlet並將其實例化後,Servlet生命週期開始,容器運行其init()方法進行Servlet的初始化;請求到達時調用Servlet的service()方法,service()方法會根據須要調用與請求對應的doGet或doPost等方法;當服務器關閉或項目被卸載時服務器會將Servlet實例銷燬,此時會調用Servlet的destroy()方法。init方法和destory方法只會執行一次,service方法客戶端每次請求Servlet都會執行。Servlet中有時會用到一些須要初始化與銷燬的資源,所以能夠把初始化資源的代碼放入init方法中,銷燬資源的代碼放入destroy方法中,這樣就不須要每次處理客戶端的請求都要初始化與銷燬資源。
參考:《javaweb整合開發王者歸來》P81
①get請求用來從服務器上得到資源,而post是用來向服務器提交數據;
②get將表單中數據按照name=value的形式,添加到action 所指向的URL 後面,而且二者使用"?"鏈接,而各個變量之間使用"&"鏈接;post是將表單中的數據放在HTTP協議的請求頭或消息體中,傳遞到action所指向URL;
③get傳輸的數據要受到URL長度限制(1024字節即256個字符);而post能夠傳輸大量的數據,上傳文件一般要使用post方式;
④使用get時參數會顯示在地址欄上,若是這些數據不是敏感數據,那麼可使用get;對於敏感數據仍是應用使用post;
⑤get使用MIME類型application/x-www-form-urlencoded的URL編碼(也叫百分號編碼)文本的格式傳遞參數,保證被傳送的參數由遵循規範的文本組成,例如一個空格的編碼是"%20"。
補充:GET方式提交表單的典型應用是搜索引擎。GET方式就是被設計爲查詢用的。
Form標籤裏的method的屬性爲get時調用doGet(),爲post時調用doPost()。
轉發是服務器行爲,重定向是客戶端行爲。
轉發(Forword)
經過RequestDispatcher對象的forward(HttpServletRequest request,HttpServletResponse response)方法實現的。RequestDispatcher能夠經過HttpServletRequest 的getRequestDispatcher()方法得到。例以下面的代碼就是跳轉到login_success.jsp頁面。
request.getRequestDispatcher("login_success.jsp").forward(request, response);
重定向(Redirect) 是利用服務器返回的狀態嗎來實現的。客戶端瀏覽器請求服務器的時候,服務器會返回一個狀態碼。服務器經過HttpServletRequestResponse的setStatus(int status)方法設置狀態碼。若是服務器返回301或者302,則瀏覽器會到新的網址從新請求該資源。
forward是服務器請求資源,服務器直接訪問目標地址的URL,把那個URL的響應內容讀取過來,而後把這些內容再發給瀏覽器.瀏覽器根本不知道服務器發送的內容從哪裏來的,因此它的地址欄仍是原來的地址.
redirect是服務端根據邏輯,發送一個狀態碼,告訴瀏覽器從新去請求那個地址.因此地址欄顯示的是新的URL.
forward:轉發頁面和轉發到的頁面能夠共享request裏面的數據.
redirect:不能共享數據.
forward:通常用於用戶登錄的時候,根據角色轉發到相應的模塊.
redirect:通常用於用戶註銷登錄時返回主頁面和跳轉到其它的網站等
forward:高.
redirect:低.
自動刷新不只能夠實現一段時間以後自動跳轉到另外一個頁面,還能夠實現一段時間以後自動刷新本頁面。Servlet中經過HttpServletResponse對象設置Header屬性實現自動刷新例如:
Response.setHeader("Refresh","1000;URL=http://localhost:8080/servlet/example.htm");
其中1000爲時間,單位爲毫秒。URL指定就是要跳轉的頁面(若是設置本身的路徑,就會實現沒過一秒自動刷新本頁面一次)
Servlet不是線程安全的,多線程併發的讀寫會致使數據不一樣步的問題。 解決的辦法是儘可能不要定義name屬性,而是要把name變量分別定義在doGet()和doPost()方法內。雖然使用synchronized(name){}語句塊能夠解決問題,可是會形成線程的等待,不是很科學的辦法。
注意:多線程的併發的讀寫Servlet類屬性會致使數據不一樣步。可是若是隻是併發地讀取屬性而不寫入,則不存在數據不一樣步的問題。所以Servlet裏的只讀屬性最好定義爲final類型的。
參考:《javaweb整合開發王者歸來》P92
其實這個問題在上面已經闡述過了,Servlet是一個特殊的Java程序,它運行於服務器的JVM中,可以依靠服務器的支持向瀏覽器提供顯示內容。JSP本質上是Servlet的一種簡易形式,JSP會被服務器處理成一個相似於Servlet的Java程序,能夠簡化頁面內容的生成。Servlet和JSP最主要的不一樣點在於,Servlet的應用邏輯是在Java文件中,而且徹底從表示層中的HTML分離開來。而JSP的狀況是Java和HTML能夠組合成一個擴展名爲.jsp的文件。有人說,Servlet就是在Java中寫HTML,而JSP就是在HTML中寫Java代碼,固然這個說法是很片面且不夠準確的。JSP側重於視圖,Servlet更側重於控制邏輯,在MVC架構模式中,JSP適合充當視圖(view)而Servlet適合充當控制器(controller)。
JSP是一種Servlet,可是與HttpServlet的工做方式不太同樣。HttpServlet是先由源代碼編譯爲class文件後部署到服務器下,爲先編譯後部署。而JSP則是先部署後編譯。JSP會在客戶端第一次請求JSP文件時被編譯爲HttpJspPage類(接口Servlet的一個子類)。該類會被服務器臨時存放在服務器工做目錄裏面。下面經過實例給你們介紹。
工程JspLoginDemo下有一個名爲login.jsp的Jsp文件,把工程第一次部署到服務器上後訪問這個Jsp文件,咱們發現這個目錄下多了下圖這兩個東東。
.class文件即是JSP對應的Servlet。編譯完畢後再運行class文件來響應客戶端請求。之後客戶端訪問login.jsp的時候,Tomcat將再也不從新編譯JSP文件,而是直接調用class文件來響應客戶端請求。
因爲JSP只會在客戶端第一次請求的時候被編譯 ,所以第一次請求JSP時會感受比較慢,以後就會感受快不少。若是把服務器保存的class文件刪除,服務器也會從新編譯JSP。
開發Web程序時常常須要修改JSP。Tomcat可以自動檢測到JSP程序的改動。若是檢測到JSP源代碼發生了改動。Tomcat會在下次客戶端請求JSP時從新編譯JSP,而不須要重啓Tomcat。這種自動檢測功能是默認開啓的,檢測改動會消耗少許的時間,在部署Web應用的時候能夠在web.xml中將它關掉。
參考:《javaweb整合開發王者歸來》P97
JSP有9個內置對象:
從獲取方向來看:
getParameter()是獲取 POST/GET 傳遞的參數值;
getAttribute()是獲取對象容器中的數據值;
從用途來看:
getParameter用於客戶端重定向時,即點擊了連接或提交按扭時傳值用,即用於在用表單或url重定向傳值時接收數據用。
getAttribute用於服務器端重定向時,即在 sevlet 中使用了 forward 函數,或 struts 中使用了
mapping.findForward。 getAttribute 只能收到程序用 setAttribute 傳過來的值。
另外,能夠用 setAttribute,getAttribute 發送接收對象.而 getParameter 顯然只能傳字符串。
setAttribute 是應用服務器把這個對象放在該頁面所對應的一塊內存中去,當你的頁面服務器重定向到另外一個頁面時,應用服務器會把這塊內存拷貝另外一個頁面所對應的內存中。這樣getAttribute就能取得你所設下的值,固然這種方法能夠傳對象。session也同樣,只是對象在內存中的生命週期不同而已。getParameter只是應用服務器在分析你送上來的 request頁面的文本時,取得你設在表單或 url 重定向時的值。
總結:
getParameter 返回的是String,用於讀取提交的表單中的值;(獲取以後會根據實際須要轉換爲本身須要的相應類型,好比整型,日期類型啊等等)
getAttribute 返回的是Object,需進行轉換,可用setAttribute 設置成任意對象,使用很靈活,可隨時用
include指令: JSP能夠經過include指令來包含其餘文件。被包含的文件能夠是JSP文件、HTML文件或文本文件。包含的文件就好像是該JSP文件的一部分,會被同時編譯執行。 語法格式以下:
<%@ include file="文件相對 url 地址" %>
include動做: 動做元素用來包含靜態和動態的文件。該動做把指定文件插入正在生成的頁面。語法格式以下:
JSP中的四種做用域包括page、request、session和application,具體來講:
對於JSP頁面,能夠經過page指令進行設置。
<%@page isThreadSafe=」false」%>
對於Servlet,可讓自定義的Servlet實現SingleThreadModel標識接口。
說明:若是將JSP或Servlet設置成單線程工做模式,會致使每一個請求建立一個Servlet實例,這種實踐將致使嚴重的性能問題(服務器的內存壓力很大,還會致使頻繁的垃圾回收),因此一般狀況下並不會這麼作。
向客戶端發送Cookie
從客戶端讀取Cookie
優勢: 數據能夠持久保存,不須要服務器資源,簡單,基於文本的Key-Value
缺點: 大小受到限制,用戶能夠禁用Cookie功能,因爲保存在本地,有必定的安全風險。
在URL中添加用戶會話的信息做爲請求的參數,或者將惟一的會話ID添加到URL結尾以標識一個會話。
優勢: 在Cookie被禁用的時候依然可使用
缺點: 必須對網站的URL進行編碼,全部頁面必須動態生成,不能用預先記錄下來的URL進行訪問。
3.隱藏的表單域
<input type="hidden" name ="session" value="..."/>
優勢: Cookie被禁時可使用
缺點: 全部頁面必須是表單提交以後的結果。
在全部會話跟蹤技術中,HttpSession對象是最強大也是功能最多的。當一個用戶第一次訪問某個網站時會自動建立 HttpSession,每一個用戶能夠訪問他本身的HttpSession。能夠經過HttpServletRequest對象的getSession方 法得到HttpSession,經過HttpSession的setAttribute方法能夠將一個值放在HttpSession中,經過調用 HttpSession對象的getAttribute方法,同時傳入屬性名就能夠獲取保存在HttpSession中的對象。與上面三種方式不一樣的 是,HttpSession放在服務器的內存中,所以不要將過大的對象放在裏面,即便目前的Servlet容器能夠在內存將滿時將HttpSession 中的對象移到其餘存儲設備中,可是這樣勢必影響性能。添加到HttpSession中的值能夠是任意Java對象,這個對象最好實現了 Serializable接口,這樣Servlet容器在必要的時候能夠將其序列化到文件中,不然在序列化時就會出現異常。
List:對付順序的好幫手
List接口存儲一組不惟一(能夠有多個元素引用相同的對象),有序的對象Set:注重獨一無二的性質
不容許重複的集合。不會有多個元素引用相同的對象。
Map:用Key來搜索的專家
使用鍵值對存儲。Map會維護與Key有關聯的值。兩個Key能夠引用相同的對象,但Key不能重複,典型的Key是String類型,但也能夠是任何對象。
Arraylist底層使用的是數組(存讀數據效率高,插入刪除特定位置效率低),LinkedList底層使用的是雙向循環鏈表數據結構(插入,刪除效率特別高)。學過數據結構這門課後咱們就知道採用鏈表存儲,插入,刪除元素時間複雜度不受元素位置的影響,都是近似O(1)而數組爲近似O(n),所以當數據特別多,並且常常須要插入刪除元素時建議選用LinkedList.通常程序只用Arraylist就夠用了,由於通常數據量都不會蠻大,Arraylist是使用最多的集合類。
Vector類的全部方法都是同步的。能夠由兩個線程安全地訪問一個Vector對象、可是一個線程訪問Vector
,代碼要在同步操做上耗費大量的時間。Arraylist不是同步的,因此在不須要同步時建議使用Arraylist。
HashMap是非線程安全的,HashTable是線程安全的;HashTable內部的方法基本都通過synchronized修飾。
HashMap容許有null值的存在,而在HashTable中put進的鍵值只要有一個null,直接拋出NullPointerException。
Hashtable和HashMap有幾個主要的不一樣:線程安全以及速度。僅在你須要徹底的線程安全的時候使用Hashtable,而若是你使用Java5或以上的話,請使用ConcurrentHashMap吧
當你把對象加入HashSet時,HashSet會先計算對象的hashcode值來判斷對象加入的位置,同時也會與其餘加入的對象的hashcode值做比較,若是沒有相符的hashcode,HashSet會假設對象沒有重複出現。可是若是發現有相同hashcode值的對象,這時會調用equals()方法來檢查hashcode相等的對象是否真的相同。若是二者相同,HashSet就不會讓加入操做成功。(摘自個人Java啓蒙書《Head fist java》第二版)
hashCode()與equals()的相關規定:
==與equals的區別
通常咱們須要對一個集合使用自定義排序時,咱們就要重寫compareTo方法或compare方法,當咱們須要對某一個集合實現兩種排序方式,好比一個song對象中的歌名和歌手名分別採用一種排序方法的話,咱們能夠重寫compareTo方法和使用自制的Comparator方法或者以兩個Comparator來實現歌名排序和歌星名排序,第二種表明咱們只能使用兩個參數版的Collections.sort().
List轉數組:toArray(arraylist.size()方法;數組轉List:Arrays的asList(a)方法
須要用到List接口中定義的幾個方法: