最近在備戰面試的過程當中,整理一下面試題。大多數題目都是本身手敲的,網上也有不少這樣的總結。本身感受老是很亂,因此花了好久把本身以爲重要的東西總結了一下。html
面向過程: java
優勢:性能比面向對象高,由於類調用時須要實例化,開銷比較大,比較消耗資源;好比單片機、嵌入式開發、Linux/Unix等通常採用面向過程開發,性能是最重要的因素。面試
缺點:沒有面向對象易維護、易複用、易擴展編程
面向對象: 小程序
優勢:易維護、易複用、易擴展,因爲面向對象有封裝、繼承、多態性的特性,能夠設計出低耦合的系統,使系統更加靈活、更加易於維護數組
缺點:性能比面向過程低瀏覽器
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字節碼的軟件都可當作是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的小遊戲相似。
Java語言採用Unicode編碼標準,Unicode(標準碼),它爲每一個字符制訂了一個惟一的數值,所以在任何的語言,平臺,程序均可以放心的使用。
在講繼承的時候咱們就知道父類的私有屬性和構造方法並不能被繼承,因此Constructor也就不能被override,可是能夠overload,因此你能夠看到一個類中有多個構造函數的狀況。
重載:發生在同一個類中,方法名必須相同,參數類型不一樣、個數不一樣、順序不一樣,方法返回值和訪問修飾符能夠不一樣,發生在編譯時。
重寫:發生在父子類中,方法名、參數列表必須相同,返回值小於等於父類,拋出的異常小於等於父類,訪問修飾符大於等於父類;若是父類方法訪問修飾符爲private則子類中就不是重寫。
可變性
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使用自動裝箱和拆箱機制,節省了經常使用數值的內存開銷和建立對象的開銷,提升了效率,由編譯器來完成,編譯器會在編譯期根據語法決定是否進行裝箱和拆箱動做。
因爲靜態方法能夠不經過對象進行調用,所以在靜態方法裏,不能調用其餘非靜態變量,也不能夠訪問非靜態變量成員。
Java程序在執行子類的構造方法以前,若是沒有用super()來調用父類特定的構造方法,則會調用父類中「沒有參數的構造方法」。所以,若是父類中只定義了有參數的構造方法,而在子類的構造方法中又沒有用super()來調用父類中特定的構造方法,則編譯時將發生錯誤,由於Java程序在父類中找不到沒有參數的構造方法可供執行。解決辦法是在父類里加上一個不作事且沒有參數的構造方法。
1.接口的方法默認是public,全部方法在接口中不能有實現,抽象類能夠有非抽象的方法 2.接口中的實例變量默認是final類型的,而抽象類中則不必定 3.一個類能夠實現多個接口,但最多隻能實現一個抽象類 4.一個類實現接口的話要實現接口的全部方法,而抽象類不必定 5.接口不能用new實例化,但能夠聲明,可是必須引用一個實現該接口的對象 從設計層面來講,抽象是對類的抽象,是一種模板設計,接口是行爲的抽象,是一種行爲的規範。
new運算符,new建立對象實例(對象實例在堆內存中),對象引用指向對象實例(對象引用存放在棧內存中)。一個對象引用能夠指向0個或1個對象(一根繩子能夠不繫氣球,也能夠系一個氣球);一個對象能夠有n個引用指向它(能夠用n條繩子繫住一個氣球)
方法的返回值是指咱們獲取到的某個方法體中的代碼執行後產生的結果!(前提是該方法可能產生結果)。返回值的做用:接收出結果,使得它能夠用於其餘的操做!
主要做用是完成對類對象的初始化工做。能夠執行。由於一個類即便沒有聲明構造方法也會有默認的不帶參數的構造方法。
1. 名字與類名相同;
2. 沒有返回值,但不能用void聲明構造函數;
3. 生成類的對象時自動執行,無需調用。
靜態方法和實例方法的區別主要體如今兩個方面:
對象的相等 比的是內存中存放的內容是否相等而 引用相等 比較的是他們指向的內存地址是否相等。
幫助子類作初始化工做。
通俗點講:==是看看左右是否是一個東西。equals是看看左右是否是長得同樣。如何記住嘛。若是單純是想記住,==:等於。equals:相同。兩個長得同樣的人,只能說長的相同(equals),可是不等於他們倆是一我的。你只要記住equals,==就不用記了。
術語來說的區別:
1. ==是判斷兩個變量或實例是否是指向同一個內存空間 equals是判斷兩個變量或實例所指向的內存空間的值是否是相同
2. ==是指對內存地址進行比較 equals()是對字符串的內容進行比較
3. ==指引用是否相同 equals()指的是值是否相同。
我有一個微信公衆號,常常會分享一些Java技術相關的乾貨;
若是你喜歡個人分享,能夠用微信搜索「Java團長」或者「javatuanzhang」關注。