JAVA SE 面試題 —— JAVA 基礎知識面試題

Java 語言的優點?‌

(1)簡單、高效
Java 語言與 C++ 類似,如果用戶瞭解 C++ 和麪向對象的概念,就可以很快編寫出 Java 程序;此外,Java 又不同於諸如 C++ 語言提供的各種各樣的方法,它只提供了基本的方法,這樣就減少了編程的複雜性,例如去掉了頭文件、指針變量、結構、運算符重載、多重繼承等複雜特性。Java 語言雖然簡單,卻很高效,它可以用面向對象的方法來描述用戶的每一個動作。

(2)面向對象
Java 語言是一種新的面向對象的程序設計語言,它除了幾種基本的數據類型外,大都是類似 C++ 中的對象和方法,程序代碼大多體現了類機制,以類的形式組織,由類來定義對象的各種行爲。Java 同樣支持類繼承,這樣也減少了程序設計的複雜性。

(3)平臺無關性
所謂一處編譯處處運行。Java 語言經編譯後生成與計算機硬件結構無關的字節代碼( Bytecode ),這些字節代碼被定義爲不依賴任何硬件平臺和操作系統。當 Java 程序在運行時,需要由一個解釋程序對生成的字節代碼解釋執行。這體現了Java語言的與平臺無關性,使得 Java 程序可以在任何平臺上運行,如 MS-DOS, Windows,Unix 等,因此具有很強的移植性。

(4)交互式特性
Java 是面向對象的網絡編程語言,由於它支持 TCP/IP 協議,使得用戶可以通過瀏覽器訪問到 Internet 上的各種動態對象。並且在網絡上用戶可以交互式地進行各種動作,而多線程技術的引入使得這種交互式操作更爲容易。

(5)多線程機制
Java 語言支持多線程機制,多線程機制使得 Java 程序能夠並行處理多項任務。Java 程序可以設計成具有多個線程,例如讓一個線程負責數據的檢索、查尋,另一個線程與用戶進行交互,這樣,兩個線程得以並行執行。多線程機制可以很容易地實現網絡上的交互式操作。

(6)動態的內存管理機制
Java語言採用了自動垃圾回收機制進行內存的管理。在C++語言中,程序員在編寫程序時要仔細地處理內存的使用,例如當某個內存快使用完畢時,要及時釋放,以供其它程序使用,一旦內存管理不當,就有可能造成內存空間浪費或程序運行故障。在Java 系統中包括了一個自動垃圾回收程序,它可以自動、安全地回收不再使用的內存塊,這樣,程序員在編程時就無需擔心內存的管理問題,從而使 Java 程序的編寫變得簡單,同時也減少了內存管理方面出錯的可能性。

(7)安全性
在類似 Internet 的這種分佈式網絡環境中,安全性是個不容忽視的問題。Java 語言在安全性方面引入了實時內存分配及佈局來防止程序員直接修改物理內存佈局;通過字節代碼驗證器對字節代碼的檢驗,以防止網絡病毒及其它非法代碼侵入。此外,Java 語言還採用了許多面向對象的異常處理機制,負責對一些異常事件進行處理,如內存空間不夠,程序異常中止等的處理
Java 是解釋型的運行 Java 程序需要一個解釋器。Java 程序編譯成 Java 虛擬機編碼,這種編碼稱爲字節碼。字節碼是獨立於計算機的,他能在所有具有 Java 解釋器的機器上運行,Java 解釋器也是 JVM 的一部分。

(8)Java 的效率
早期 Sun 發現 JVM 的用戶注意到了 Java 運行很慢,但是新的 Java 虛擬機顯著加快。新的虛擬機使用了一種稱爲實時編譯的技術,他把字節碼編譯並儲存成本機的機器碼。當執行字節碼時,重調本地碼。

什麼是 Java 虛擬機?爲什麼 Java 被稱作是“平臺無關的編程語言”?‌

Java 虛擬機是一個可以執行 Java 字節碼的虛擬機進程,Java 源文件被編譯成能被 Java 虛擬機執行的字節碼文件。

Java 被設計成允許應用程序可以運行在任意的平臺,而不需要程序員爲每一個平臺單獨重寫或者是重新編譯。Java 虛擬機讓這個變爲可能,因爲它知道底層硬件平臺的指令長度和其他特性。

Java 和 C++ 有何區別?‌

Java 和 C++ 都是面嚮對象語言。也就是說,它們都能夠實現面向對象思想(封裝,繼乘,多態)。而由於 C++ 爲了照顧大量的 C 語言使用者,而兼容了 C ,使得自身僅僅成爲了帶類的 C 語言,多多少少影響了其面向對象的徹底性!Java 則是完全的面嚮對象語言,它句法更清晰,規模更小,更易學。它是在對多種程序設計語言進行了深入細緻研究的基礎上,據棄了其他語言的不足之處,從根本上解決了 C++ 的固有缺陷。

Java 和 C++ 的相似之處多於不同之處,但兩種語言問幾處主要的不同使得Java更容易學習,並且編程環境更爲 簡單。我在這裏不能完全列出不同之處,僅列出比較顯著的區別:
(1)指針
Java 語言讓編程者無法找到指針來直接訪問內存無指針,並且增添了自動的內存管理功能,從而有效地防止了 C/C++ 語言中指針操作失誤,如野指針所造成的系統崩潰。但也不是說 Java 沒有指針,虛擬機內部還是使用了指針,只是外人不得使用而已。這有利於 Java 程序的安全。

(2)多重繼承
C++ 支持多重繼承,這是 C++ 的一個特徵,它允許多父類派生一個類。儘管多重繼承功能很強,但使用複雜,而且會引起許多麻煩,編譯程序實現它也很不容易。Java 不支持多重繼承,但允許一個類繼承多個接口(extends+implement),實現了 C++ 多重繼承的功能,又避免了 C++ 中的多重繼承實現方式帶來的諸多不便。

(3)數據類型及類
Java 是完全面向對象的語言,所有函數和變量部必須是類的一部分。除了基本數據類型之外,其餘的都作爲類對象,包括數組。對象將數據和方法結合起來,把它們封裝在類中,這樣每個對象都可實現自己的特點和行爲。而 C++ 允許將函數和變量定義爲全局的。此外,Java 中取消了 C/C++ 中的結構和聯合,消除了不必要的麻煩。

(4)自動內存管理
Java 程序中所有的對象都是用 new 操作符建立在內存堆棧上,這個操作符類似於 C++ 的 new 操作符。下面的語句由一個建立了一個類Read的對象,然後調用該對象的 work 方法:

Read r = new Read();
r.work();
Read r = new Read();

語句 ;在堆棧結構上建立了一個 Read 的實例。Java 自動進行無用內存回收操作,不需要程序員進行刪除。而 C++ 中必須由程序員釋放內存資源,增加了程序設計者的負擔。Java 中當一個對象不被再用到時,無用內存回收器將給它加上標籤以示刪除。Java 裏無用內存回收程序是以線程方式在後臺運行的,利用空閒時間工作。

(5)操作符重載
Java 不支持操作符重載。操作符重載被認爲是 C++ 的突出特徵,在Java 中雖然類大體上可以實現這樣的功能,但操作符重載的方便性仍然丟失了不少。Java 語言不支持操作符重載是爲了保持 Java 語言儘可能簡單。

(6)預處理功能
Java 不支持預處理功能。C/C++ 在編譯過程中都有一個預編澤階段,即衆所周知的預處理器。預處理器爲開發人員提供了方便,但增加了編譯的複雜性。Java 虛擬機沒有預處理器,但它提供的引入語句 (import) 與 C++ 預 處理器的功能類似。

(7)Java不支持缺省函數參數,而C++支持
在 C 中,代碼組織在函數中,函數可以訪問程序的全局變量。C++ 增加了類,提供了類算法,該算法是與類相連的函數,C++ 類方法與 Java 類方法十分相似,然而,由於 C++ 仍然支持 C ,所以不能阻止 C++ 開發人員使用函數,結果函數和方法混合使用使得程序比較混亂。
Java 沒有函數,作爲一個比 C++ 更純的面向對象的語言,Java 強迫開發人員把所有例行程序包括在類中,事實上,用方法實現例行程序可激勵開發人員更好地組織編碼。

(8)字符串
C 和 C++ 不支持字符串變量,在 C 和 C++ 程序中使用 Null 終止符代表字符串的結束,在 Java 中字符串是用類對象 (string 和stringBuffer )來實現的,這些類對象是 Java 語言的核心,用類對象實現字符串有以下幾個優 點:
(1)在整個系統中建立字符串和訪問字符串元素的方法是一致的; (2)Java 字符串類是作爲 Java 語言的一部分定 義的,而不是作爲外加的延伸部分; (3)Java 字符串執行運行時檢查,可幫助排除一些運行時發生的錯誤; (4)可對字符串用“+”進行連接操作。

(9)goto 語句
“可怕”的 goto 語句是 C 和 C++ 的“遺物”,它是該語言技術上的合法部分,引用 goto 語句引起了程序結構 的混亂,不易理解,goto 語句子要用於無條件轉移子程序和多結構分支技術。鑑於以廣理由,Java 不提供 goto 語句,它雖然指定 goto 作爲關鍵字,但不支持它的使用,使程序簡潔易讀。

(10)類型轉換
在 C 和 C++ 中有時出現數據類型的隱含轉換,這就涉及了自動強制類型轉換問題。例如,在 C++ 中可將一浮點 值賦予整型變量,並去掉其尾數。Java 不支持 C++ 中的自動強制類型轉換,如果需要,必須由程序顯式進行強 制類型轉換。

(11)異常
Java 中的異常機制用於捕獲例外事件,增強系統容錯能力

try{
	//可能產生意外的代碼
}catch(exceptionType name){
	//處理
}

其中 exceptionType 表示異常類型,而 C++ 則沒有如此方便的機制。

JDK 和 JRE 的區別是什麼?‌

Java 運行時環境( JRE )是將要執行 Java 程序的 Java 虛擬機。它同時也包含了執行 Applet 需要的瀏覽器插 件。Java 開發工具包( JDK )是完整的 Java 軟件開發包,包含了 JRE ,編譯器和其他的工具(比如: JavaDo c,Java 調試器),可以讓開發者開發、編譯、執行 Java 應用程序。

Java 基本數據類型?

Java 是一個近乎純潔的面向對象編程語言,但是爲了編程的方便還是引入不是對象的基本數據類型,但是爲了能夠將這些基本數據類型當成對象操作,Java 爲每一個基本數據類型都引入了對應的包裝類型(wrapper class),int 的包裝類就是 Integer,從 JDK 1.5 開始引入了自動裝箱/拆箱機制,使得二者可以相互轉換。‌

Java 語言支持的 8 中基本數據類型是:‌
原始類型: boolean,char,byte,short,int,long,float,double
包裝類型:Boolean,Character,Byte,Short,Integer,Long,Float,Double

自動裝箱是 Java 編譯器在基本數據類型和對應的對象包裝類型之間做的一個轉化。比如:把 int 轉化成 Integer
,double 轉化成 Double,等等。反之就是自動拆箱。

class AutoUnboxingTest {
    public static void main(String[] args) {
        Integer a = new Integer(3);
        Integer b = 3;                  // 將3自動裝箱成Integer類型
        int c = 3;
        System.out.println(a == b);     // false 兩個引用沒有引用同一對象
        System.out.println(a == c);     // true a自動拆箱成int類型再和c比較
    }
}

什麼是值傳遞和引用傳遞?

對象被值傳遞,意味着傳遞了對象的一個副本。因此,就算是改變了對象副本,也不會影響源對象的值。‌

對象被引用傳遞,意味着傳遞的並不是實際的對象,而是對象的引用。因此,外部對引用對象所做的改變會反映 到所有的對象上。

靜態變量和實例變量的區別?‌

靜態變量是被 static 修飾符修飾的變量,也稱爲類變量,它屬於類,不屬於類的任何一個對象,一個類不管 創建多少個對象,靜態變量在內存中有且僅有一個拷貝;

實例變量必須依存於某一實例,需要先創建對象然後通 過對象才能訪問到它。靜態變量可以實現讓多個對象共享內存。在 Java 開發中,上下文類和工具類中通常會有大量的靜態成員。

靜態方法內部能否調用對非靜態方法?‌

不可以,靜態方法只能訪問靜態成員,因爲非靜態方法的調用要先創建對象,因此在調用靜態方法時可能對 象並沒有被初始化。

如何實現對象克隆?‌

有兩種方式:

(1)實現 Cloneable 接口並重寫 Object 類中的 clone() 方法;

(2)實現 Serializable 接口,通過對象的序列化和反序列化實現克隆,可以實現真正的深度克隆。

一個“.java”源文件中是否可以包含多個類(不是內部類)?有什麼限制?‌

可以,但一個源文件中最多只能有一個公開類(public class)而且文件名必須和公開類的類名完全保持一 致。

匿名內部類是否可以繼承其它類?是否可以實現接口?‌

匿名內部類(Anonymous Inner Class),可以繼承其他類或實現其他接口,在Swing編程中常用此方式來實現事件監聽和回調。

內部類可以引用它的包含類(外部類)的成員嗎?有沒有什麼限制?‌

一個內部類對象可以訪問創建它的外部類對象的成員,包括私有成員

JDK 常用的 package‌?

(1)java.lang:這個是系統的基礎類,比如 String 等都是這裏面的,這個 package 是唯一一個可以不用 import 就 可以使用的 Package。

(2)java.io:這裏面是所有輸入輸出有關的類,比如文件操作等。

(3)java.net:這裏面是與網絡有關的類,比如 URL,URLConnection 等。 java.util: 這個是系統輔助類,特別是集合類 Collection、List、Map 等。

(4)java.sql: 這個是數據庫操作的類,Connection, Statememt,ResultSet 等。

什麼是Java 開發工具包 (JDK)?

Java 開發工具包是 Java 環境的核心組件,並提供編譯、調試和運行一個 Java 程序所需的所有工具,可執行文件和二進制文件。JDK 是一個平臺特定的軟件,有針對 Windows,Mac 和 Unix 系統的不同的安裝包。可以說 JDK 是 JRE 的超集,它包含了 JRE 的 Java 編譯器,調試器和核心類。比如 JDK 的版本號是 1.8,也被稱爲 Java 8。

什麼是Java 虛擬機(JVM)?

JVM 是 Java 編程語言的核心。當我們運行一個程序時,JVM 負責將字節碼轉換爲特定機器代碼。JVM 也是平臺特定的,並提供核心的 Java 方法,例如內存管理、垃圾回收和安全機制等。

JVM 是可定製化的,我們可以通 過 Java 選項(java options)定製它,比如配置 JVM 內存的上下界。JVM 之所以被稱爲虛擬的是因爲它提供了 一個不依賴於底層操作系統和機器硬件的接口。這種獨立於硬件和操作系統的特性正是 Java 程序可以一次編寫 多處執行的原因。

什麼是 Java 運行時環境(JRE)

JRE 是 JVM 的實施實現,它提供了運行 Java 程序的平臺。JRE 包含了 JVM、Java 二進制文件和其它成功執 行程序的類文件。JRE 不包含任何像 Java 編譯器、調試器之類的開發工具。如果你只是想要執行 Java 程序,你只需安裝 JRE 即可,沒有安裝 JDK 的必要。

JDK、JRE 和 JVM 的區別?

JDK 是用於開發的而 JRE 是用於運行 Java 程序的。
JDK 和 JRE 都包含了 JVM,從而使得我們可以運行 Java 程序, JVM 是 Java 編程語言的核心並且具有平臺獨立性。

即時編譯器(JIT)?

JIT 是 JVM 的一部分,它可以在同一時間編譯類似的字節碼來優化將字節碼轉換爲機器特定語言的過程相似的字節碼,從而將優化字節碼轉換爲機器特定語言的過程,這樣減少轉換過程所需要花費的時間。

& 和 && 的區別?

& 和 && 都可以用作邏輯與的運算符,表示邏輯與(and),當運算符兩邊的表達式的結果都爲 true 時,整個運算結果才爲 true,否則,只要有一方爲 false,則結果爲 false。‌

&& 還具有短路的功能,即如果第一個表達式爲 false,則不再計算第二個表達式。

& 還可以用作位運算符,當 & 操作符兩邊的表達式不是 boolean 類型時,& 表示按位與操作,我們通常使用 0x 0f 來與一個整數進行 & 運算,來獲取該整數的最低 4 個 bit 位,例如,0x31 & 0x0f 的結果爲 0x01。

Java 是如何支持正則表達式操作的?

Java中的String類提供了支持正則表達式操作的方法,包括:matches()、replaceAll()、replaceFirst()、split()。此外,Java中可以用Pattern類表示正則表達式對象,它提供了豐富的API進行各種正則表達式操作,如:

import java.util.regex.Matcher;
import java.util.regex.Pattern;
class RegExpTest {
    public static void main(String[] args) {
        String str = "成都市(成華區)(武侯區)(高新區)";
        Pattern p = Pattern.compile(".*?(?=\\()");
        Matcher m = p.matcher(str);
        if(m.find()) {
            System.out.println(m.group());
        }
    }
}

正則表達式及其用途?

在編寫處理字符串的程序時,經常會有查找符合某些複雜規則的字符串的需要。正則表達式就是用於描述這些規則的工具。換句話說,正則表達式就是記錄文本規則的代碼。計算機處理的信息更多的時候不是數值而是字符串,正則表達式就是在進行字符串匹配和處理的時候最爲強大的工具,絕大多數語言都提供了對正則表達式的支持。

比較一下Java和JavaSciprt?

JavaScript 與Java是兩個公司開發的不同的兩個產品。Java 是原Sun Microsystems公司推出的面向對象的程序設計語言,特別適合於互聯網應用程序開發;而JavaScript是Netscape公司的產品,爲了擴展Netscape瀏覽器的功能而開發的一種可以嵌入Web頁面中運行的基於對象和事件驅動的解釋性語言。JavaScript的前身是LiveScript;而Java的前身是Oak語言。

下面對兩種語言間的異同作如下比較:
(1)基於對象和麪向對象:
Java是一種真正的面向對象的語言,即使是開發簡單的程序,必須設計對象;JavaScript是種腳本語言,它可以用來製作與網絡無關的,與用戶交互作用的複雜軟件。它是一種基於對象(Object-Based)和事件驅動(Event-Driven)的編程語言,因而它本身提供了非常豐富的內部對象供設計人員使用。

(2)解釋和編譯
Java的源代碼在執行之前,必須經過編譯。JavaScript是一種解釋性編程語言,其源代碼不需經過編譯,由瀏覽器解釋執行。(目前的瀏覽器幾乎都使用了JIT(即時編譯)技術來提升JavaScript的運行效率)

(3)強類型變量和類型弱變量
Java採用強類型變量檢查,即所有變量在編譯之前必須作聲明;JavaScript中變量是弱類型的,甚至在使用變量前可以不作聲明,JavaScript的解釋器在運行時檢查推斷其數據類型。

(4)代碼格式不一樣。

在Java中如何跳出當前的多重嵌套循環?

在最外層循環前加一個標記如A,然後用break A;可以跳出多重循環。(Java中支持帶標籤的break和continue語句,作用有點類似於C和C++中的goto語句,但是就像要避免使用goto一樣,應該避免使用帶標籤的break和continue,因爲它不會讓你的程序變得更優雅,很多時候甚至有相反的作用,所以這種語法其實不知道更好),根本不能進行字符串的equals比較,否則會產生NullPointerException異常。

String 和StringBuffer的區別

JAVA 平臺提供了兩個類:String和StringBuffer,它們可以儲存和操作字符串,即包含多個字符的字符數據。這個String類提供了數值不可改變的字符串。而這個StringBuffer類提供的字符串進行修改。當你知道字符數據要改變的時候你就可以使用StringBuffer。典型地,你可以使用StringBuffers來動態構造字符數據。

爲什麼會出現4.0-3.6=0.40000001這種現象?

2進制的小數無法精確的表達10進制小數,計算機在計算10進制小數的過程中要先轉換爲2進制進行計算,這個過程中出現了誤差。

Lamda表達式的優缺點?

優點:

  1. 簡潔。
  2. 非常容易並行計算。
  3. 可能代表未來的編程趨勢。

缺點:

  1. 若不用並行計算,很多時候計算速度沒有比傳統的 for 循環快。(並行計算有時需要預熱才顯示出效率優勢)

  2. 不容易調試。

  3. 若其他程序員沒有學過 lambda 表達式,代碼不容易讓其他語言的程序員看懂。

符號“==”比較的是什麼?

==”對比兩個對象基於內存引用,如果兩個對象的引用完全相同(指向同一個對象)時,“==”操作將返回true,否則返回false。“==”如果兩邊是基本類型,就是比較數值是否相等。

爲什麼重寫equals還要重寫hashcode?

HashMap中,如果要比較key是否相等,要同時使用這兩個函數!因爲自定義的類的hashcode()方法繼承於Object類,其hashcode碼爲默認的內存地址,這樣即便有相同含義的兩個對象,比較也是不相等的。

HashMap中的比較key是這樣的,先求出key的hashcode(),比較其值是否相等,若相等再比較equals(),若相等則認爲他們是相等的。若equals()不相等則認爲他們不相等。

如果只重寫hashcode()不重寫equals()方法,當比較equals()時只是看他們是否爲同一對象(即進行內存地址的比較),所以必定要兩個方法一起重寫。HashMap用來判斷key是否相等的方法,其實是調用了HashSet判斷加入元素是否相等。

重載hashCode()是爲了對同一個key,能得到相同的Hash Code,這樣HashMap就可以定位到我們指定的key上。重載equals()是爲了向HashMap表明當前對象和key上所保存的對象是相等的,這樣我們才真正地獲得了這個key所對應的這個鍵值對。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章