1.java語言有哪些特點。 物件導向 平台無關性,一次編譯,到處運行 java提供很多的內建類庫 java提過了對web應用開發的支援 具有較好的安全性和健壯性 比c++語言更簡潔,嚴謹
2.什麼是java的位元組序。
java位元組序指的是在java虛擬機器中多位元組類型資料的存放順序,java位元組序是Big-Endian(大端)。 3.java中的final關鍵字。 final關鍵字可以用於成員變數、本地變數、方法以及類。 final成員變數必須在聲明的時候初始化或者在構造器中初始化,否則就會報編譯錯誤。 你不能夠對final變數再次賦值。 本地變數必須在聲明時賦值。 在匿名類中所有變數都必須是final變數。 final方法不能被重寫。 final類不能被繼承。 final關鍵字不同於finally關鍵字,後者用於異常處理。 final關鍵字容易與finalize()方法搞混,後者是在Object類中定義的方法,是在記憶體回收之前被JVM調用的方法。 介面中聲明的所有變數本身是final的。 final和abstract這兩個關鍵字是反相關的,final類就不可能是abstract的。 final方法在編譯階段綁定,稱為靜態繫結(static binding)。 沒有在聲明時初始化final變數的稱為空白final變數(blank final
variable),它們必須在構造器中初始化,或者調用this()初始化。不這麼做的話,編譯器會報錯 “final變數(變數名)需要進行初始化”。 將類、方法、變數聲明為final能夠提高效能,這樣JVM就有機會進行估計,然後最佳化。 按照Java代碼慣例,final變數就是常量,而且通常常量名要大寫
finally:
介面可以多實現,繼承只能單繼承 形參和實參的區別。
形參:
全稱為“形式參數”,是定義方法名和方法發體的時候調用的參數,木的是用來接收該方法時傳遞的參數,它的作用範圍是整個方法體,實在方法調用時的一個臨時變數,實參出先在主調方法中,在方法調用的時候把是慘的值賦給對應的形參,在被調用的方法的內部只能使用形參,不能使用形參。
實參和形參的區別: 形參的作用範圍為方法內部,當方法調用結束後,形參的生命週期也就結束了,因此,在方法外不能使用形參。它只有在被調用是才分配記憶體單元,調用結束後會立即釋放記憶體空間,而實參不能在調用方法的內部使用。 在方法調用的時候,只能把實參的值傳遞給形參,而不能把形參的值反向的傳遞給實參,因此,在方法的調用過程中,對形參的值的改變不會影響實參的值。 &和&&的區別。
1.&是按位與操作符,a&b是把a和b都轉換成位元後,然後再進行按位與的運算。而&&是邏輯與的運算子,a&&b就是當二個數的值都為true時結果才為true,否則結果為false;
2.此外&&還有短路的作用,在參與運算的二個運算式中,只有當第一個運算式的結果為true時,才會繼續計算第二個運算式的值。 可變參數
樣本:
String… a,其中string是可變參數的類型,a是其名稱
特點:
1. 只能作為最後一個參數出現,
2. 只能位於變數的類型和變數名之間。String… a;
3. 編譯器為可變參數隱式的建立了一個數組,在調用的時候可以通過數組的形式來訪問可變參數 擷取Class(位元組碼對象)對象的三種方法 通過調用對象的.getClass()方法 通過Class.forName(“包名.類名”)來擷取 通過 類名.class文法來擷取。 存取修飾詞
在java語言中,類的許可權存取修飾詞有以下幾種:private default protected public。 private:private可以修飾資料成員、構造方法和方法成員,不可以修飾類,被private修飾的成員,只能在定義他們的類中使用,在其他類中不能被調用。(只能在本類中使用) 預設許可權(default):類、資料成員、構造方法和方法成員等都能夠使用預設許可權。預設許可權即同包許可權,同包許可權的元素只能在定義他們的類中以及同包的類中被調用(本類和同包類)。 受保護許可權(protected):可以修飾資料成員構造方法和方法成員,不可以修飾類,被protected修飾的類只能在定義它的類和子類中被訪問(本類和子類)。 公用許可權(public):public可以修飾類、資料成員、構造方法和方法成員。被public修飾的成員可以在任何一個類中被調用,不管同包或不同包。是許可權最大的修飾符(本包和不同包)。 存取修飾詞的許可權由大到小依次是:public protected default和private。 物件導向的三大特性。 繼承 封裝 多態 this和super。
關鍵字this指的是當前對象的引用 關鍵字
super指的是當前對象裡面的父類的應用
通果super可以調用父類的構造方法,父類的方法和屬性 執行個體方法和類方法。 執行個體方法:沒有用static修飾,也叫非靜態方法 類方法:用static修飾,也叫靜態方法
詳解:
執行個體方法:
當類的位元組碼檔案載入到記憶體中時,類的執行個體方法並沒有被分配入口地址,只有當該類的對象建立以後,執行個體方法才分配了入口地址。從而執行個體方法可以被類建立的所有對象調用,還有一點需要注意,當我們建立第一個類的對象時,執行個體方法的入口地址會完成分配,當後續在建立對象時,不會再分配新的入口地址,也可以說,該類的所有對象共用執行個體方法的入口地址,當該類的所有對象被銷毀,入口地址才會消失。
類方法:
當類的位元組碼檔案載入到記憶體,類方法的入口地址就會分配完成,所以類方法不僅可以被該類的對象調用,也可以直接通過類名完成調用。類方法的入口地址只有程式退出時消失。
遵循的規則:
1.在類方法中不能引用執行個體變數
執行個體變數的定義類似執行個體方法,沒有用static修飾的變數,執行個體變數的建立與執行個體方法的建立相同,也是在類的對象建立時完成,所以在類方法中是不能引用執行個體變數的,因為這個時候執行個體變數還沒有分配記憶體位址。
2.在類方法中不能使用super和this關鍵字
這是因為super和this都指向的是父類和本類的對象,而在類方法中調用的時候,這些指代的對象有可能都還沒有建立。
3. 類方法中不能調用執行個體方法
注意:
執行個體方法可以引用類變數和執行個體變數
執行個體方法可以使用super和this關鍵字
執行個體方法中可以調用類方法 String StringBuffer 和StringBuilder的區別。
1.可變和不可變
String類中提供了數值不可改變的字串。
StringBuffer和StringBuilder的字串是可以被改變的
2.有沒有重寫equals和hashcode方法
String重寫了equals和hashcode方法
3 三者的執行速度:
StringBuilder>StringBuffer>String
原因:
String是字串常量
StringBuilder和StringBuffer是字串變數
從上面的名字可以看到,String是“字元創常量”,也就是不可改變的對象。對於這句話的理解你可能會產生這樣一個疑問 ,比如這段代碼:
1 String s = "abcd";2 s = s+1;3 System.out.print(s);// result : abcd1
我們明明就是改變了String型的變數s的,為什麼說是沒有改變呢? 其實這是一種欺騙,JVM是這樣解析這段代碼的:首先建立對象s,賦予一個abcd,然後再建立一個新的對象s用來執行第二行代碼,也就是說我們之前對象s並沒有變化,所以我們說String類型是不可改變的對象了,由於這種機制,每當用String操作字串時,實際上是在不斷的建立新的對象,而原來的對象就會變為垃圾被GC回收掉,可想而知這樣執行效率會有多底。
而StringBuffer與StringBuilder就不一樣了,他們是字串變數,是可改變的對象,每當我們用它們對字串做操作時,實際上是在一個對象上操作的,這樣就不會像String一樣建立一些而外的對象進行操作了,當然速度就快了。
3.一個特殊的例子:
1 String str = “This is only a” + “ simple” + “test”;2 StringBuffer builder = new StringBuilder(“This is only a”).append(“ simple”).append(“ test”);
你會很驚訝的發現,產生str對象的速度簡直太快了,而這個時候StringBuffer居然速度上根本一點都不佔優勢。其實這是JVM的一個把戲,實際上:
String str = “This is only a” + “ simple” +“test”;
其實就是:
String str = “This is only a simple test”;
所以不需要太多的時間了。但大家這裡要注意的是,如果你的字串是來自另外的String對象的話,速度就沒那麼快了,譬如:
String str2 = “This is only a”; String str3 = “ simple”; String str4 = “ test”; String str1 = str2 +str3 + str4;
這時候JVM會規規矩矩的按照原來的方式去做。
4.StringBuilder與 StringBuffer
StringBuilder:線程非安全的
StringBuffer:安全執行緒的
當我們在字串緩衝去被多個線程使用是,JVM不能保證StringBuilder的操作是安全的,雖然他的速度最快,但是可以保證StringBuffer是可以正確操作的。當然大多數情況下就是我們是在單線程下進行的操作,所以大多數情況下是建議用StringBuilder而不用StringBuffer的,就是速度的原因。
對於三者使用的總結
1.如果要操作少量的資料用 = String
2.單線程操作字串緩衝區 下操作大量資料 = StringBuilder
3.多線程操作字串緩衝區 下操作大量資料 = StringBuffer 重載和重寫的區別。
重載:
指同一個類中的多個方法具有相同的名字,但是這些方法具有不同的參數列表,級參數的數量和類型不能完全相同,傳回值類型可以相容也可以不相同。
規則: 必須具有不同的參數列表 可以有不同的傳回型別,也可以相同 可以有不同的存取修飾詞 可以拋出不同的異常
重寫:
父類與子類之間的多態性,對父類的函數進行重新定義。如果在子類中定義某方法與其父類有相同的名稱和參數,我們說該方法被重寫。
規則: 參數列表必須完全與父類的相同 返回的類型必須和父類的方法的傳回值相同 存取修飾詞的限制一定要大於父類的修飾符 拋出的異常不能大於父類的
重載和重寫的區別。重載的方法能否根據傳回型別進行區分。
方法的重載和重寫都是實現多態的方式,區別在於前者實現的是編譯時間的多態性,而後者實現的是運行時的多態性。重載發生在一個類中,同名的方法如果有不同的參數列表(參數類型不同、參數個數不同或者二者都不同)則視為重載;重寫發生在子類與父類之間,重寫要求子類被重寫方法與父類被重寫方法有相同的參數列表,有相容的傳回型別,比父類被重寫方法更好訪問,不能比父類被重寫方法聲明更多的異常(裡氏代換原則)。重載對傳回型別沒有特殊的要求,不能根據傳回型別進行區分。 轉寄和重新導向的區別。 Throw和Throws的區別。
使用者程式自訂的異常和應用程式特定的異常,必須藉助Throws和Throw語句來拋出異常。
當需要顯示的拋出一個異常(通常情況下是使用者自訂的異常)時,需要使用關鍵字Throw來拋出異常,而關鍵字throws用來列出一個方法可能會拋出的異常類型。
樣本:
class MyException extends Exception{}public class Test{//告訴方法的調用者這個方法可能會拋出MyException異常public void f(int i) throws MyException{if(i==1)當滿足條件的時候拋出自訂的異常throw new MyException(); }}
二者其他的不同: Throws通常出現在函數頭,而Throw通常出現在函數體 Throws表示出現異常的一種可能,並不一定會發生這些異常;而Throw則是拋出了異常,即如果執行throw,則一定拋出了某種異常 二者都是消極處理異常的方式(這種消極並不是說著種方式不好),只是拋出或者可能拋出異常,但是不會有函數取處理異常,真正的處理異常有函數的上層調用處理。 java中final、finally和finalize的區別是什麼。 final用於聲明屬性、方法和類,分別表示屬性不可變、方法不能被重寫、類不能被繼承
final修飾屬性:被final修飾的變數不可變,由於不可變有二種含義:一是引用不可變,二是對象不可變,final指的到底是什麼呢。
舉例說明:
public class Test{ public static void main(String[] args) { final StringBuffer s=new StringBuffer("hello"); s.append("world"); System.out.println(s); }}運行結果為:hello world
public class Test{ public static void main(String[] args) { final StringBuffer s=new StringBuffer("hello"); s=new StringBuffer("hello world"); }}編譯期間錯誤
從以上的例子可以看出,final指的是引用的不可變性,即她只能指向初始時指向的對象,而不關心指向的對象的內容,所以,被final修飾的變數必須被初始化。
初始化的幾種方式:
在定義的時候初始化 final成員變數可以在初始化塊中進行初始化,但不可以在靜態初始化塊中進行初始化
3.在類的構造器中初始化,但靜態final成員變數不可以在構造方法中初始化
final方法:的當一個方法被聲明final時,該方法不允許任何子類重寫該方法,但子類仍然可以使用這個方法,
final參數:用來表示這個參數在方法的內部不允許被修改
fianl類:當一個類被生命為final時,此類不能被繼承,所有的方法都不能被重寫,但這並不是說final類的成員變數也是不可改變的,要想做到final類的成員變數也是不可改變的,必須給成員變數增加final修飾。
注意:一個類不能即被修飾為abstract又被修飾為final。 Tomact最佳化經驗 去掉對web.xml的監視,把jsp提前編輯成Servlet 在有富餘實體記憶體的情況下,加大tomact使用的jvm的記憶體 利用緩衝和壓縮 採用叢集 Http請求的get方式和post方式的區別。 get的參數通過url傳遞,而post參數通過request body傳遞 get請求在url中傳遞的參數的長度是有限制,而post沒有 get比post更不安全,因為get是直接暴露在url中的 get請求只能進行url編碼,而post可以進行多種編碼 get請求會讓瀏覽器主動cache,而post不會 get請求參數會被完整保留在瀏覽歷程記錄裡,而post中的參數不會被保留。 GET產生一個TCP資料包;POST產生兩個TCP資料包。 forward和redirect的區別
forward是伺服器請求資源,伺服器直接存取目標地址的url,把那個url的響應內容讀取過來,然後把這些內容再發給瀏覽器,瀏覽器根本不知道伺服器發送的內容來自哪裡,所以它的地址欄還是原來的地址。
redirect就是服務端根據邏輯,發送一個狀態代碼,告訴瀏覽器重新取請求那個地址,一般來說瀏覽器會用剛才請求的參數重新請求,所以,session和request參數都可以擷取。