超詳細的Java面試題總結(一)之Java基礎知識篇

SnailClimb發表於2017-11-09

  最近在備戰面試的過程中,整理一下面試題。大多數題目都是自己手敲的,網上也有很多這樣的總結。自己感覺總是很亂,所以花了很久把自己覺得重要的東西總結了一下。

物件導向和麵向過程的區別

程式導向:   優點:效能比物件導向高,因為類呼叫時需要例項化,開銷比較大,比較消耗資源;比如微控制器、嵌入式開發、Linux/Unix等一般採用程式導向開發,效能是最重要的因素。 缺點:沒有物件導向易維護、易複用、易擴充套件 物件導向:   優點:易維護、易複用、易擴充套件,由於物件導向有封裝、繼承、多型性的特性,可以設計出低耦合的系統,使系統更加靈活、更加易於維護 缺點:效能比程式導向低

Java語言有哪些特點?

  1,簡單易學;2,物件導向(封裝,繼承,多型);3,平臺無關性(Java虛擬機器實現平臺無關性);4,可靠性;5,安全性;6,支援多執行緒(C++語言沒有內建的多執行緒機制,因此必須呼叫作業系統的多執行緒功能來進行多執行緒程式設計,而Java語言卻提供了多執行緒支援);7,支援網路程式設計並且很方便(Java語言誕生本身就是為簡化網路程式設計設計的,因此Java語言不僅支援網路程式設計而且很方便);8,編譯與解釋並存;

什麼是位元組碼?採用位元組碼的最大好處是什麼?什麼Java是虛擬機器?

先看下java中的編譯器和直譯器:   Java中引入了虛擬機器的概念,即在機器和編譯程式之間加入了一層抽象的虛擬的機器。這臺虛擬的機器在任何平臺上都提供給編譯程式一個的共同的介面。編譯程式只需要面向虛擬機器,生成虛擬機器能夠理解的程式碼,然後由直譯器來將虛擬機器程式碼轉換為特定系統的機器碼執行。在Java中,這種供虛擬機器理解的程式碼叫做位元組碼(即副檔名為.class的檔案),它不面向任何特定的處理器,只面向虛擬機器。每一種平臺的直譯器是不同的,但是實現的虛擬機器是相同的。Java源程式經過編譯器編譯後變成位元組碼,位元組碼由虛擬機器解釋執行,虛擬機器將每一條要執行的位元組碼送給直譯器,直譯器將其翻譯成特定機器上的機器碼,然後在特定的機器上執行,這就是上面提到的Java的特點的編譯與解釋並存的解釋。 Java原始碼---->編譯器---->jvm可執行的Java位元組碼(即虛擬指令)---->jvm---->jvm中直譯器----->機器可執行的二進位制機器碼---->程式執行。 採用位元組碼的好處:   Java語言通過位元組碼的方式,在一定程度上解決了傳統解釋型語言執行效率低的問題,同時又保留了解釋型語言可移植的特點。所以Java程式執行時比較高效,而且,由於位元組碼並不專對一種特定的機器,因此,Java程式無須重新編譯便可在多種不同的計算機上執行。

什麼是Java虛擬機器

  任何一種可以執行Java位元組碼的軟體均可看成是Java的虛擬機器(JVM)

什麼是Java程式的主類?應用程式和小程式的主類有何不同?

  一個程式中可以有多個類,但只能有一個類是主類。在Java應用程式中,這個主類是指包含main()方法的類。而在Java小程式中,這個主類是一個繼承自系統類JApplet或Applet的子類。應用程式的主類不一定要求是public類,但小程式的主類要求必須是public類。主類是Java程式執行的入口點。

什麼是JDK?什麼是JRE?

  JDK: 顧名思義它是給開發者提供的開發工具箱,是給程式開發者用的。它除了包括完整的JRE(Java Runtime Environment),Java執行環境,還包含了其他供開發者使用的工具包。

JDK
  JRE:普通使用者而只需要安裝JRE(Java Runtime Environment)來 來執行Java程式。而程式開發者必須安裝JDK來編譯、除錯程式。

環境變數Path和ClassPath的作用是什麼?如何設定這兩個環境變數?

Java環境變數PATH和CLASSPATH - 簡書 http://www.jianshu.com/p/d63b099cf283

Java應用程式與小程式之間有那些差別?

簡單說應用程式是從主執行緒啟動(也就是main()方法)。applet小程式沒有main方法,主要是嵌在瀏覽器頁面上執行(呼叫init()執行緒或者run()來啟動),嵌入瀏覽器這點跟flash的小遊戲類似。

字元型常量和字串常量的區別

  1. 形式上: 字元常量是單引號引起的一個字元 字串常量是雙引號引起的若干個字元
  2. 含義上: 字元常量相當於一個整形值(ASCII值),可以參加表示式運算 字串常量代表一個地址值(該字串在記憶體中存放位置)
  3. 佔記憶體大小 字元常量只佔一個位元組 字串常量佔若干個位元組(至少一個字元結束標誌)

Java語言採用何種編碼方案?有何特點?

  Java語言採用Unicode編碼標準,Unicode(標準碼),它為每個字元制訂了一個唯一的數值,因此在任何的語言,平臺,程式都可以放心的使用。

構造器Constructor是否可被override

  在講繼承的時候我們就知道父類的私有屬性和構造方法並不能被繼承,所以Constructor也就不能被override,但是可以overload,所以你可以看到一個類中有多個建構函式的情況。

過載和重寫的區別

  過載:發生在同一個類中,方法名必須相同,引數型別不同、個數不同、順序不同,方法返回值和訪問修飾符可以不同,發生在編譯時。   重寫:發生在父子類中,方法名、引數列表必須相同,返回值小於等於父類,丟擲的異常小於等於父類,訪問修飾符大於等於父類;如果父類方法訪問修飾符為private則子類中就不是重寫。

java 物件導向程式設計三大特性------封裝、繼承、多型

blog.csdn.net/jianyuerens…

java中equals方法的用法以及==的用法

www.cnblogs.com/bluestorm/a…

String和StringBuffer、StringBuilder的區別是什麼?String為什麼是不可變的?

可變性

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使用自動裝箱和拆箱機制,節省了常用數值的記憶體開銷和建立物件的開銷,提高了效率,由編譯器來完成,編譯器會在編譯期根據語法決定是否進行裝箱和拆箱動作。

類、方法、成員變數和區域性變數的可用修飾符 -

blog.csdn.net/yttcjj/arti…

在一個靜態方法內呼叫一個非靜態成員為什麼是非法的?

  由於靜態方法可以不通過物件進行呼叫,因此在靜態方法裡,不能呼叫其他非靜態變數,也不可以訪問非靜態變數成員。

在Java中定義一個不做事且沒有引數的構造方法的作用

  Java程式在執行子類的構造方法之前,如果沒有用super()來呼叫父類特定的構造方法,則會呼叫父類中“沒有引數的構造方法”。因此,如果父類中只定義了有引數的構造方法,而在子類的構造方法中又沒有用super()來呼叫父類中特定的構造方法,則編譯時將發生錯誤,因為Java程式在父類中找不到沒有引數的構造方法可供執行。解決辦法是在父類里加上一個不做事且沒有引數的構造方法。

import java和javax有什麼區別

www.cnblogs.com/EasonJim/p/…

介面和抽象類的區別是什麼?

1.介面的方法預設是public,所有方法在介面中不能有實現,抽象類可以有非抽象的方法 2.介面中的例項變數預設是final型別的,而抽象類中則不一定 3.一個類可以實現多個介面,但最多隻能實現一個抽象類 4.一個類實現介面的話要實現介面的所有方法,而抽象類不一定 5.介面不能用new例項化,但可以宣告,但是必須引用一個實現該介面的物件 從設計層面來說,抽象是對類的抽象,是一種模板設計,介面是行為的抽象,是一種行為的規範。

成員變數與區域性變數的區別有那些?

  1. 從語法形式上,看成員變數是屬於類的,而區域性變數是在方法中定義的變數或是方法的引數;成員變數可以被public,private,static等修飾符所修飾,而區域性變數不能被訪問控制修飾符及static所修飾;成員變數和區域性變數都能被final所修飾;
  2. 從變數在記憶體中的儲存方式來看,成員變數是物件的一部分,而物件存在於堆記憶體,區域性變數存在於棧記憶體
  3. 從變數在記憶體中的生存時間上看,成員變數是物件的一部分,它隨著物件的建立而存在,而區域性變數隨著方法的呼叫而自動消失。
  4. 成員變數如果沒有被賦初值,則會自動以型別的預設值而賦值(一種情況例外被final修飾但沒有被static修飾的成員變數必須顯示地賦值);而區域性變數則不會自動賦值。

建立一個物件用什麼運算子?物件實體與物件引用有何不同?

  new運算子,new建立物件例項(物件例項在堆記憶體中),物件引用指向物件例項(物件引用存放在棧記憶體中)。一個物件引用可以指向0個或1個物件(一根繩子可以不繫氣球,也可以系一個氣球);一個物件可以有n個引用指向它(可以用n條繩子繫住一個氣球)

什麼是方法的返回值?返回值在類的方法裡的作用是什麼?

  方法的返回值是指我們獲取到的某個方法體中的程式碼執行後產生的結果!(前提是該方法可能產生結果)。返回值的作用:接收出結果,使得它可以用於其他的操作!

一個類的構造方法的作用是什麼?若一個類沒有宣告構造方法,改程式能正確執行嗎?為什麼?

  主要作用是完成對類物件的初始化工作。可以執行。因為一個類即使沒有宣告構造方法也會有預設的不帶引數的構造方法。

構造方法有哪些特性?

  1,名字與類名相同;2,沒有返回值,但不能用void宣告建構函式;3,生成類的物件時自動執行,無需呼叫。

靜態方法和例項方法有何不同?

靜態方法和例項方法的區別主要體現在兩個方面:

  1. 在外部呼叫靜態方法時,可以使用"類名.方法名"的方式,也可以使用"物件名.方法名"的方式。而例項方法只有後面這種方式。也就是說,呼叫靜態方法可以無需建立物件。

  2. 靜態方法在訪問本類的成員時,只允許訪問靜態成員(即靜態成員變數和靜態方法),而不允許訪問例項成員變數和例項方法;例項方法則無此限制

物件的相等與指向他們的引用相等,兩者有什麼不同?

  物件的相等 比的是記憶體中存放的內容是否相等而 引用相等 比較的是他們指向的記憶體地址是否相等。

在呼叫子類構造方法之前會先呼叫父類沒有引數的構造方法,其目的是?

  幫助子類做初始化工作。

什麼是多型機制?Java語言是如何實現多型的?

blog.csdn.net/bornlili/ar…

equals 和 == 的區別?

通俗點講:==是看看左右是不是一個東西。equals是看看左右是不是長得一樣。如何記住嘛。如果單純是想記住,==:等於。equals:相同。兩個長得一樣的人,只能說長的相同(equals),但是不等於他們倆是一個人。你只要記住equals,==就不用記了。

術語來講的區別:1.==是判斷兩個變數或例項是不是指向同一個記憶體空間 equals是判斷兩個變數或例項所指向的記憶體空間的值是不是相同 2.==是指對記憶體地址進行比較 equals()是對字串的內容進行比較3.==指引用是否相同 equals()指的是值是否相同

歡迎關注我的微信公眾號(分享各種Java學習資源,面試題,以及企業級Java實戰專案回覆關鍵字免費領取):

微信公眾號

相關文章