java面試題彙總(一)基礎篇

什麼是java?

Java是一種面嚮對象語言,不僅吸收了C++語言的各種優點,還擯棄了C++裏難以理解的多繼承、指針、等概念。具有功能強大簡單易用的特徵,是一種面向對象的語言,允許程序員以優雅的思維方式進行編程。

JVM、JRE、JDK三者的聯繫

  • JVM- - - -Java Virtual Machine 是Java虛擬機,Java程序需要運行在虛擬機上,不同平臺有自己的虛擬機,因此Java語言可以實現跨平臺。
  • JRE- - - -Java Runtime Environment包括Java虛擬機和Java程序所需的核心類庫等。核心類庫主要是java.lang包:包含了Java程序必不可少的系統類,比如基本數據類型,基本數學函數,字符串,線程,異常等
  • JDK- - - -Java Development Kit是提供給Java開發人員使用的。其中包含java的開發工具,也包括了JRE,所以安裝了JDK就無需單獨安裝JRE了。其中的開發工具:javac.exe(編譯工具)、jar.exe(打包工具)

在這裏插入圖片描述

怎樣理解java的跨平臺性?

所謂跨平臺指一次編譯,到處運行(可以在多個系統平臺運行),實現原理:Java程序通過java虛擬機在系統平臺上運行,只要該平臺安裝對應的java虛擬機,就可以運行java程序

Java語言的特點

面向對象(繼承、封裝、多態)、 平臺無關性 健壯性(強類型語言,異常處理,垃圾自動回收)、 支持多線程

面向對象和麪向過程的區別

面向過程:
優點:性能比面向對象高,因爲類調用時需要實例化,開銷比較大,比較消耗資源;比如單片機、嵌入式開發、Linux/Unix等一般採用面向過程開發,性能是最重要的因素。
缺點:沒有面向對象易維護、易複用、易擴展

面向對象:
優點:易維護、易複用、易擴展,由於面向對象有封裝、繼承、多態性的特性,可以設計出低耦合的系統,使系統更加靈活、更加易於維護

缺點:性能比面向過程低

面向過程是具體化的,流程化的,解決一個問題,你需要一步一步的分析,一步一步的實現。
面向對象是模型化的,你只需抽象出一個類,這是一個封閉的盒子,在這裏你擁有數據也擁有解決問題的方法。需要什麼功能直接使用就可以了,不必去一步一步的實現,至於這個功能是如何實現的,管我們什麼事?我們會用就可以了。
面向對象的底層其實還是面向過程,把面向過程抽象成類,然後封裝,方便我們使用的就是面向對象了。

Java和C++的區別

都是面向對象,都支持繼承、封裝、多態
Java沒有指針,使程序更加安全
Java支持單繼承(類)、接口可以實現多繼承,而C++支持多繼承
Java有自動內存管理機制,不需要程序員手動釋放無用內存

Oracle JDK和Open JDK的區別

1、Oracle JDK版本將每三年發佈一次,而OpenJDK版本每三個月發佈一次;
2、OpenJDK 是一個參考模型並且是完全開源的,而Oracle JDK是OpenJDK的一個實現,並不是完全開源的;
3、Oracle JDK 比 OpenJDK 更穩定。OpenJDK和Oracle JDK的代碼幾乎相同,但Oracle JDK有更多的類和一些錯誤修復。因此,如果您想開發企業/商業軟件,我建議您選擇Oracle JDK,因爲它經過了徹底的測試和穩定。某些情況下,有些人提到在使用OpenJDK 可能會遇到了許多應用程序崩潰的問題,但是,只需切換到Oracle JDK就可以解決問題;
4、在響應性和JVM性能方面,Oracle JDK與OpenJDK相比提供了更好的性能
5、Oracle JDK不會爲即將發佈的版本提供長期支持,用戶每次都必須通過更新到最新版本獲得支持來獲取最新版本

如何理解java的三(四)大特性繼承、封裝、多態、抽象?

  • 繼承:繼承是指從已有類中得到繼承信息(繼承了除構造方法外的所有東西)創建新類的過程。提供繼承信息的類被稱爲父類(超類、基類);得到繼承信息的類被稱爲子類(派生類)。
  • 封裝:通常認爲封裝是把數據和操作數據的方法綁定起來,對數據的訪問只能通過已定義的接口。也就是說封裝就是隱藏一切可以隱藏的東西,只對外界提供簡單的編程接口。
  • 多態:指允許不同字類型的對象對同一消息做出不同的響應。簡單來說就是同樣的對象引用調用同樣的方法卻做了不同的事情。分爲編譯時多態(方法重載)和運行時多態(方法重寫)。運行時的多態是面向對象最精髓的東西,實現多態需要:子類繼承父類並重寫父類已有或抽象的方法,對象造型(父類引用引用子類對象,這樣引用調用同樣的方法就會根據子類對象的不同表現出不同的行爲)
  • 抽象:抽象是將一類對象的共同特徵總結出來構造類的過程,包括數據抽象和行爲抽象兩方面。抽象只關注對象有哪些屬性和行爲,並不關注這些行爲的細節是什麼。

Java有哪些數據類型?

Java是一種強類型語言,對於每一種數據都定義了明確的數據類型,在內存中分配了不同大小的內存空間。
在這裏插入圖片描述
在這裏插入圖片描述

switch(expt)中expt的類型?

Jdk1.5以前expt只能是byte、short、char、int、
Jdk1.5開始引入了枚舉(enum) ,
jdk1.7開始引入字符串(String)

移位運算

從效率上看,使用移位指令有更高的效率,因爲移位指令佔2個機器週期,而乘除法指令佔4個機器週期。從硬件上看,移位對硬件更容易實現,所以會用移位,移一位就乘2,這種乘法當然考慮移位了。

左移 N 位, 相當於原數字 * 2 的N次方.,右移相當於除以2 的N次方

Math.round(11.5) 等於多少,Math.round(-11.5)等於多少?

Math.round(11.5)的返回值是 12,Math.round(-11.5)的返回值是-11。四捨五入的原理是在參數上加 0.5,然後進行下取整。

float f=3.4;是否正確?

不正確。3.4 是雙精度數,將雙精度型(double)賦值給浮點型(float)屬於下轉型(down-casting,也稱爲窄化)會造成精度損失,因此需要強制類型轉換float f =(float)3.4; 或者寫成 float f =3.4F;。

short s1 = 1; s1 = s1 + 1;有錯嗎?short s1 = 1; s1 += 1;有錯嗎?

對於 short s1 = 1; s1 = s1 + 1;由於 1 是 int 類型,因此 s1+1 運算結果也是int型,需要強制轉換類型才能賦值給 short 型。

而 short s1 = 1; s1 += 1;可以正確編譯,因爲 s1+= 1;相當於 s1 = (short(s1 + 1);其中有隱含的強制類型轉換。

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

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

訪問修飾符

private:同一類可見,可修飾變量,方法,不可修飾外部類
default:包訪問權限,同一包內可見,修飾類,接口,變量,方法
protected:同一包的類和所有子類可見,修飾變量,方法,不可修飾外部類
public:對所有類可見,修飾類,接口,變量,方法

在這裏插入圖片描述

&與&&的區別

&:按位與和邏輯與,但是他不具備短路與運算

&&:邏輯與,支持短路運算(如果&&左邊的表達式的值是 false,右邊的表達式會被直接短路掉,不會進行運算)

Java在聲明一個數組的過程中是如何分配內存的?初始化方式有幾種?

Java有兩種初始化數組的方式,靜態初始化和動態初始化

int []arr={1,2,3,4,5};//靜態初始化
int []arr3=new int[5]    //new 產生一個對象,動態初始化

區別是由程序員指定長度還是由系統指定長度

數組初始化完成後系統根據指定長度在堆內存中尋找大小符合的連續的內存塊分配給數組,並根據數組類型初始化每個元素的值,初始化完成後數組長度不可變.

Java 有沒有 goto?

Java目前沒有goto語句,goto作爲java的保留字

break ,continue ,return 的區別及作用

break 跳出總上一層循環,不再執行循環(結束當前的循環體)

continue 跳出本次循環,繼續執行下次循環(結束正在執行的循環
進入下一個循環條件)

return 程序返回,不再執行下面的代碼(結束當前的方法 直接返回)

說下equals和==的區別,a.equals(“1”)和"1".equals(a)區別?

1.= =既可以比較基本類型也可以比較引用類型,對於基本類型比較的是值,對於引用類型比較的是內存地址。
2.equals()方法是屬於java.lang包下Object的方法,如果該方法沒有被重寫默認是= =,而我們看到的String的equals方法是被重寫過的。
3. 具體要看自定義類裏有沒有重寫Object的equals方法來判斷。
4.通常情況下,重寫equals方法,會比較類中的相應屬性是否都相等。

String a=null;
System.out.println(a.equals("1"));//如果a爲空,會出現空指針異常
System.out.println("1".equals(a));//false,也就是說可以防止空指針異常

final有什麼用?

1.final修飾的變量不可變,不可變是指引用不可變而不是引用指向的內容不可變

String a="10";
a="20";
System.out.println(a);//a=20

int b=10;
b=20//報錯

2.修飾類表示該類不能被繼承

3.修飾方法表示該方法不能被重寫

final finally finalize區別

final修飾的變量不可變,修飾的類不能被繼承,修飾方法不能被重寫

finally一般作用在try-catch代碼塊中,在處理異常的時候,通常我們將一定要執行的代碼方法finally代碼塊中,表示不管是否出現異常,該代碼塊都會執行,一般用來存放一些關閉資源的代碼

finalize是一個方法,屬於Object類的一個方法,而Object類是所有類的父類,該方法一般由垃圾回收器來調用,當我們調用System.gc()
方法的時候,由垃圾回收器調用finalize(),回收垃圾,一個對象是否可回收的最後判斷。

基礎篇(二)

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