不積跬步無以至千里,這裡會不斷收集和更新Java基礎相關的面試題,目前已收集100題。
1.什麼是B/S架構?什麼是C/S架構
- B/S(Browser/Server),瀏覽器/伺服器程式
C/S(Client/Server),客戶端/服務端,桌面應用程式
2.你所知道網路協議有那些?
HTTP:超文字傳輸協議
FTP:檔案傳輸協議
SMPT:簡單郵件協議
TELNET:遠端終端協議
POP3:郵件讀取協議
3.Java都有那些開發平臺?
JAVA SE:主要用在客戶端開發
JAVA EE:主要用在web應用程式開發
JAVA ME:主要用在嵌入式應用程式開發複製程式碼
4.什麼是JVM?java虛擬機器包括什麼?
JVM:java虛擬機器,運用硬體或軟體手段實現的虛擬的計算機,Java虛擬機器包括:暫存器,堆疊,處理器
5.Java是否需要開發人員回收記憶體垃圾嗎?
大多情況下是不需要的。Java提供了一個系統級的執行緒來跟蹤記憶體分配,不再使用的記憶體區將會自動回收
6.什麼是JDK?什麼是JRE?
JDK:java development kit:java開發工具包,是開發人員所需要安裝的環境
JRE:java runtime environment:java執行環境,java程式執行所需要安裝的環境
7.什麼是資料結構?
計算機儲存,組織資料的方式
8.Java的資料結構有那些?
線性表(ArrayList)
連結串列(LinkedList)
棧(Stack)
佇列(Queue)
圖(Map)
樹(Tree)複製程式碼
9.什麼是OOP?
物件導向程式設計
10.什麼是物件導向?
世間萬物都可以看成一個物件。每個物體包括動態的行為和靜態的屬性,這些就構成了一個物件。
11.類與物件的關係?
類是物件的抽象,物件是類的具體,類是物件的模板,物件是類的例項
12.Java中有幾種資料型別
整形:byte,short,int,long
浮點型:float,double
字元型:char
布林型:boolean複製程式碼
13.什麼是隱式轉換,什麼是顯式轉換
顯示轉換就是型別強轉,把一個大型別的資料強制賦值給小型別的資料;隱式轉換就是大範圍的變數能夠接受小範圍的資料;隱式轉換和顯式轉換其實就是自動型別轉換和強制型別轉換。
14.Char型別能不能轉成int型別?能不能轉化成string型別,能不能轉成double型別
Char在java中也是比較特殊的型別,它的int值從1開始,一共有2的16次方個資料;Char<int<long<float<double;Char型別可以隱式轉成int,double型別,但是不能隱式轉換成string;如果char型別轉成byte,short型別的時候,需要強轉。
15.什麼是拆裝箱?
拆箱:把包裝型別轉成基本資料型別
裝箱:把基本資料型別轉成包裝型別複製程式碼
16.Java中的包裝類都是那些?
byte:Byte
short:Short
int:Integer
long:Long
float:Float
double:Double
char:Character
boolean:Boolean複製程式碼
17.一個java類中包含那些內容?
屬性、方法、內部類、構造方法、程式碼塊。
18.例如: if(a+1.0=4.0),這樣做好嗎?
不好,因為計算機在浮點型資料運算的時候,會有誤差,儘量在布林表示式中不使用浮點型資料(if,while,switch中判斷條件不使用浮點型)
19.那針對浮點型資料運算出現的誤差的問題,你怎麼解決?
使用Bigdecimal類進行浮點型資料的運算
20.++i與i++的區別
++i:先賦值,後計算
i++:先計算,後賦值複製程式碼
21.程式的結構有那些?
順序結構
選擇結構
迴圈結構複製程式碼
22.陣列例項化有幾種方式?
靜態例項化:建立陣列的時候已經指定陣列中的元素,
int[] a=new int[]{1,3,3}複製程式碼
動態例項化:例項化陣列的時候,只指定了陣列程度,陣列中所有元素都是陣列型別的預設值
23.Java中各種資料預設值
Byte,short,int,long預設是都是0
Boolean預設值是false
Char型別的預設值是’’
Float與double型別的預設是0.0
物件型別的預設值是null複製程式碼
24.Java常用包有那些?
Java.lang
Java.io
Java.sql
Java.util
Java.awt
Java.net
Java.math複製程式碼
25.Java最頂級的父類是哪個?
Object
26.Object類常用方法有那些?
Equals
Hashcode
toString
wait
notify
clone
getClass複製程式碼
27.java中有沒有指標?
有指標,但是隱藏了,開發人員無法直接操作指標,由jvm來操作指標
28.java中是值傳遞引用傳遞?
理論上說,java都是引用傳遞,對於基本資料型別,傳遞是值的副本,而不是值本身。對於物件型別,傳遞是物件的引用,當在一個方法操作操作引數的時候,其實操作的是引用所指向的物件。
29.假設把例項化的陣列的變數當成方法引數,當方法執行的時候改變了陣列內的元素,那麼在方法外,陣列元素有發生改變嗎?
改變了,因為傳遞是物件的引用,操作的是引用所指向的物件
30.例項化陣列後,能不能改變陣列長度呢?
不能,陣列一旦例項化,它的長度就是固定的
31.假設陣列內有5個元素,如果對陣列進行反序,該如何做?
建立一個新陣列,從後到前迴圈遍歷每個元素,將取出的元素依次順序放入新陣列中
32.形參與實參
形參:全稱為“形式引數”,是在定義方法名和方法體的時候使用的引數,用於接收呼叫該方法時傳入的實際值;實參:全稱為“實際引數”,是在呼叫方法時傳遞給該方法的實際值。
33.構造方法能不能顯式呼叫?
不能構造方法當成普通方法呼叫,只有在建立物件的時候它才會被系統呼叫
34.構造方法能不能重寫?能不能過載?
可以重寫,也可以過載
35.什麼是方法過載?
方法的過載就是在同一個類中允許同時存在一個以上的同名方法,只要它們的引數個數或者型別不同即可。在這種情況下,該方法就叫被過載了,這個過程稱為方法的過載(override)
36.內部類與靜態內部類的區別?
靜態內部類相對與外部類是獨立存在的,在靜態內部類中無法直接訪問外部類中變數、方法。如果要訪問的話,必須要new一個外部類的物件,使用new出來的物件來訪問。但是可以直接訪問靜態的變數、呼叫靜態的方法;
普通內部類作為外部類一個成員而存在,在普通內部類中可以直接訪問外部類屬性,呼叫外部類的方法。
如果外部類要訪問內部類的屬性或者呼叫內部類的方法,必須要建立一個內部類的物件,使用該物件訪問屬性或者呼叫方法。
如果其他的類要訪問普通內部類的屬性或者呼叫普通內部類的方法,必須要在外部類中建立一個普通內部類的物件作為一個屬性,外同類可以通過該屬性呼叫普通內部類的方法或者訪問普通內部類的屬性
如果其他的類要訪問靜態內部類的屬性或者呼叫靜態內部類的方法,直接建立一個靜態內部類物件即可。
37.Static關鍵字有什麼作用?
Static可以修飾內部類、方法、變數、程式碼塊
Static修飾的類是靜態內部類
Static修飾的方法是靜態方法,表示該方法屬於當前類的,而不屬於某個物件的,靜態方法也不能被重寫,可以直接使用類名來呼叫。在static方法中不能使用this或者super關鍵字。
Static修飾變數是靜態變數或者叫類變數,靜態變數被所有例項所共享,不會依賴於物件。靜態變數在記憶體中只有一份拷貝,在JVM載入類的時候,只為靜態分配一次記憶體。
Static修飾的程式碼塊叫靜態程式碼塊,通常用來做程式優化的。靜態程式碼塊中的程式碼在整個類載入的時候只會執行一次。靜態程式碼塊可以有多個,如果有多個,按照先後順序依次執行。
38.Final在java中的作用
Final可以修飾類,修飾方法,修飾變數。
修飾的類叫最終類。該類不能被繼承。
修飾的方法不能被重寫。
修飾的變數叫常量,常量必須初始化,一旦初始化後,常量的值不能發生改變。複製程式碼
39.Java中操作字串使用哪個類?
String,StringBuffer,StringBuilder
40.StringBuffer,Stringbuilder有什麼區別?
StringBuffer與StringBuilder都繼承了AbstractStringBulder類,而AbtractStringBuilder又實現了CharSequence介面,兩個類都是用來進行字串操作的。
在做字串拼接修改刪除替換時,效率比string更高。
StringBuffer是執行緒安全的,Stringbuilder是非執行緒安全的。所以Stringbuilder比stringbuffer效率更高,StringBuffer的方法大多都加了synchronized關鍵字
41.String str=”aaa”,與String str=new String(“aaa”)一樣嗎?
不一樣的。因為記憶體分配的方式不一樣。
第一種,建立的”aaa”是常量,jvm都將其分配在常量池中。
第二種建立的是一個物件,jvm將其值分配在堆記憶體中。複製程式碼
42.String str=”aa”,String s=”bb”,String aa=aa+s;一種建立了幾個物件?
一共有兩個引用,三個物件。因為”aa”與”bb”都是常量,常量的值不能改變,當執行字串拼接時候,會建立一個新的常量是” aabbb”,有將其存到常量池中。
43.將下java中的math類有那些常用方法?
Pow():冪運算
Sqrt():平方根
Round():四捨五入
Abs():求絕對值
Random():生成一個0-1的隨機數,包括0不包括1複製程式碼
44.String類的常用方法有那些?
charAt:返回指定索引處的字元
indexOf():返回指定字元的索引
replace():字串替換
trim():去除字串兩端空白
split():分割字串,返回一個分割後的字串陣列
getBytes():返回字串的byte型別陣列
length():返回字串長度
toLowerCase():將字串轉成小寫字母
toUpperCase():將字串轉成大寫字元
substring():擷取字串
format():格式化字串
equals():字串比較複製程式碼
45.判斷兩個物件是否相同,能使用equlas比較嗎?
不能。Equlas大多用來做字串比較,要判斷基本資料型別或者物件型別,需要使用==
46.==與equlas有什麼區別?
==可以判斷基本資料型別值是否相等,也可以判斷兩個物件指向的記憶體地址是否相同,也就是說判斷兩個物件是否是同一個物件,Equlas通常用來做字串比較。
47.如何將字串反轉?
Stringbuilder或者stringbuffer的reverse方法
48.物件導向的語言有那些特徵?
封裝、繼承、多型
49.Java中的繼承是單繼承還是多繼承
Java中既有單繼承,又有多繼承。對於java類來說只能有一個父類,對於介面來說可以同時繼承多個介面
50.什麼是重寫?什麼是過載?
過載和重寫都是java多型的表現。
過載叫override,在同一個類中多型的表現。當一個類中出現了多個相同名稱的方法,但引數個數和引數型別不同,方法過載與返回值無關
重寫叫overwrite,是字元類中多型的表現。當子類出現與父類相同的方法,那麼這就是方法重寫。方法重寫時,子類的返回值必須與父類的一致。如果父類方法丟擲一個異常,子類重寫的方法丟擲的異常型別不能小於父類丟擲的異常型別。
51.構造方法能不能過載?能不能重寫?
可以過載,必須重寫
52.如果父類只有有參構造方法,那麼子類必須要重寫父類的構造方法嗎?
必須重寫
53.建立一個子類物件的時候,那麼父類的構造方法會執行嗎?
會執行。當建立一個子類物件,呼叫子類構造方法的時候,子類構造方法會預設呼叫父類的構造方法。
54.什麼是父類引用指向子類物件?
是java多型一種特殊的表現形式。建立父類引用,讓該引用指向一個子類的物件
55.當父類引用指向子類物件的時候,子類重寫了父類方法和屬性,那麼當訪問屬性的時候,訪問是誰的屬性?呼叫方法時,呼叫的是誰的方法?
子類重寫了父類方法和屬性,訪問的是父類的屬性,呼叫的是子類的方法
56.Super與this表示什麼?
Super表示當前類的父類物件
This表示當前類的物件複製程式碼
57.抽象的關鍵字是什麼?
Abstract
58.抽象類必須要有抽象方法嗎
不是必須。抽象類可以沒有抽象方法。
59.如果一個類中有抽象方法,那麼這個一定是抽象類?
包含抽象方法的類一定是抽象類
60.抽象類可以使用final修飾嗎?
不可以。定義抽象類就是讓其他繼承的,而final修飾類表示該類不能被繼承,與抽象類的理念違背了
61.普通類與抽象類有什麼區別?
普通類不能包含抽象方法,抽象類可以包含抽象方法
抽象類不能直接例項化,普通類可以直接例項化複製程式碼
62.什麼是介面?
介面就是某個事物對外提供的一些功能的宣告,是一種特殊的java類
63.JAVA為什麼需要介面?
介面彌補了java單繼承的缺點
64.介面有什麼特點?
介面中宣告全是public static final修飾的常量
介面中所有方法都是抽象方法
介面是沒有構造方法的
介面也不能直接例項化
介面可以多繼承複製程式碼
65.介面與抽象類有什麼區別?
抽象類有構造方法,介面沒有構造方法
抽象類只能單繼承,介面可以多繼承
抽象類可以有普通方法,介面中的所有方法都是抽象方法
介面的屬性都是public static final修飾的,而抽象的不是複製程式碼
66.Java中異常分為哪兩種?
編譯時異常
執行時異常複製程式碼
67.說幾個常見的編譯時異常類?
NullPointerException:空指標異常
ArrayIndexOutOfBoundsException:陣列下標越界
NumberFormatException:數字轉換異常
IllegalArgumentException:引數不匹配異常
InstantiationException:物件初始化異常
ArithmeticException:算術異常複製程式碼
68.異常的處理機制有幾種?
異常捕捉:try…catch…finally,異常丟擲:throws。
69.如何自定義一個異常
繼承一個異常類,通常是RumtimeException或者Exception
70.在異常捕捉時,如果發生異常,那麼try.catch.finally塊外的return語句會執行嗎?
會執行,如果有finally,在finally之後被執行,如果沒有finally,在catch之後被執行
71.Try.catch.finally是必須要存在的嗎?
Try塊必須存在,catch和finally可以不存在,但不能同時不存在
72.Thow與thorws區別
Throw寫在程式碼塊內,throw後面跟的是一個具體的異常例項
Throw寫在方法前面後面,throws後面跟的是異常類,異常類可以出現多個複製程式碼
73.Error與Exception區別?
Error和Exception都是java錯誤處理機制的一部分,都繼承了Throwable類。
Exception表示的異常,異常可以通過程式來捕捉,或者優化程式來避免。
Error表示的是系統錯誤,不能通過程式來進行錯誤處理。
74.使用Log4j對程式有影響嗎?
有,log4j是用來日誌記錄的,記錄一些關鍵敏感的資訊,通常會將日誌記錄到本地檔案或者資料庫中。記錄在本地檔案中,會有頻繁的io操作,會耗費一些系統資源。記錄在資料庫中,會頻繁地運算元據庫表,對系統效能也有一定的影響。但是為了程式安全以及資料的恢復或者bug的跟蹤,這點資源消耗是可以承受的。
75.Log4j日誌有幾個級別?
由低到高:debug、info、wran、error
76.除了使用new建立物件之外,還可以用什麼方法建立物件?
Java反射
77.Java反射建立物件效率高還是通過new建立物件的效率高?
通過new建立物件的效率比較高。通過反射時,先找查詢類資源,使用類載入器建立,過程比較繁瑣,所以效率較低
78.Java中集合框架的有幾個?
Coillection、Map。
79.Collection介面下有那些集合框架?
List:線性表、Set:無序集合。
80.List介面有什麼特點?
順序儲存、可以有重複值。
81.Set介面有什麼特點
無須儲存、不能有重複值。
82.ArrayList與LinkedList有什麼區別?
ArrayList與LinkedList都實現了List介面。
ArrayList是線性表,底層是使用陣列實現的,它在尾端插入和訪問資料時效率較高,
Linked是雙向連結串列,他在中間插入或者頭部插入時效率較高,在訪問資料時效率較低複製程式碼
83.Array與ArrayList有什麼不一樣?
Array與ArrayList都是用來儲存資料的集合。ArrayList底層是使用陣列實現的,但是arrayList對陣列進行了封裝和功能擴充套件,擁有許多原生陣列沒有的一些功能。我們可以理解成ArrayList是Array的一個升級版。
84.Map有什麼特點
以鍵值對儲存資料
元素儲存循序是無須的
不允許出現重複鍵複製程式碼
85.JDBC操作的步驟
載入資料庫驅動類
開啟資料庫連線
執行sql語句
處理返回結果
關閉資源複製程式碼
86.在使用jdbc的時候,如何防止出現sql注入的問題。
使用PreparedStatement類,而不是使用Statement類
87.怎麼在JDBC內呼叫一個儲存過程
使用CallableStatement
88.是否瞭解連線池,使用連線池有什麼好處?
資料庫連線是非常消耗資源的,影響到程式的效能指標。連線池是用來分配、管理、釋放資料庫連線的,可以使應用程式重複使用同一個資料庫連線,而不是每次都建立一個新的資料庫連線。通過釋放空閒時間較長的資料庫連線避免資料庫因為建立太多的連線而造成的連線遺漏問題,提高了程式效能。
89.你所瞭解的資料來源技術有那些?使用資料來源有什麼好處?
Dbcp,c3p0等,用的最多還是c3p0,因為c3p0比dbcp更加穩定,安全;通過配置檔案的形式來維護資料庫資訊,而不是通過硬編碼。當連線的資料庫資訊發生改變時,不需要再更改程式程式碼就實現了資料庫資訊的更新。
90.Java的io流分為哪兩種?
按功能來分
輸入流(input),輸出流(output)複製程式碼
按型別來分
位元組流,字元流複製程式碼
91.常用io類有那些?
File
FileInputSteam,FileOutputStream
BufferInputStream,BufferedOutputSream
PrintWrite
FileReader,FileWriter
BufferReader,BufferedWriter
ObjectInputStream,ObjectOutputSream複製程式碼
92.位元組流與字元流的區別
以位元組為單位輸入輸出資料,位元組流按照8位傳輸
以字元為單位輸入輸出資料,字元流按照16位傳輸複製程式碼
93.final、finalize()、finally
性質不同
- final為關鍵字;
- finalize()為方法;
- finally為區塊標誌,用於try語句中;
作用
- final為用於標識常量的關鍵字,final標識的關鍵字儲存在常量池中(在這裡final常量的具體用法將在下面進行介紹);
- finalize()方法在Object中進行了定義,用於在物件“消失”時,由JVM進行呼叫用於對物件進行垃圾回收,類似於C++中的解構函式;使用者自定義時,用於釋放物件佔用的資源(比如進行I/0操作);
- finally{}用於標識程式碼塊,與try{}進行配合,不論try中的程式碼執行完或沒有執行完(這裡指有異常),該程式碼塊之中的程式必定會進行;
94.抽象類和介面的區別?
抽象類:
- 抽象方法,只有行為的概念,沒有具體的行為實現。使用abstract關鍵字修飾,沒有方法體。子類必須重寫這些抽象方法。
- 包含抽象方法的類,一定是抽象類。
- 抽象類只能被繼承,一個類只能繼承一個抽象類。
介面:
- 全部的方法都是抽象方法,屬型都是常量
- 不能例項化,可以定義變數。
- 介面變數可以引用具體實現類的例項
- 介面只能被實現,一個具體類實現介面,必須實現全部的抽象方法
- 介面之間可以多實現
- 一個具體類可以實現多個介面,實現多繼承現象
95.執行緒同步的方法
- wait():讓執行緒等待。將執行緒儲存到一個執行緒池中。
- notify():喚醒被等待的執行緒。通常都喚醒執行緒池中的第一個。讓被喚醒的執行緒處於臨時阻塞狀態。
- notifyAll(): 喚醒所有的等待執行緒。將執行緒池中的所有執行緒都喚醒。
96.執行緒與程式的區別
程式是系統進行資源分配和排程的一個獨立單位,執行緒是CPU排程和分派的基本單位
程式和執行緒的關係:
- 一個執行緒只能屬於一個程式,而一個程式可以有多個執行緒,但至少有一個執行緒。
- 資源分配給程式,同一程式的所有執行緒共享該程式的所有資源。
- 執行緒在執行過程中,需要協作同步。不同程式的執行緒間要利用訊息通訊的辦法實現同步。
- 執行緒是指程式內的一個執行單元,也是程式內的可排程實體。
執行緒與程式的區別:
- 排程:執行緒作為排程和分配的基本單位,程式作為擁有資源的基本單位。
- 併發性:不僅程式之間可以併發執行,同一個程式的多個執行緒之間也可以併發執行。
- 擁有資源:程式是擁有資源的一個獨立單位,執行緒不擁有系統資源,但可以訪問隸屬於程式的資源。
- 系統開銷:在建立或撤銷程式的時候,由於系統都要為之分配和回收資源,導致系統的明顯大於建立或撤銷執行緒時的開銷。但程式有獨立的地址空間,程式崩潰後,在保護模式下不會對其他的程式產生影響,而執行緒只是一個程式中的不同的執行路徑。執行緒有自己的堆疊和區域性變數,但執行緒之間沒有單獨的地址空間,一個執行緒死掉就等於整個程式死掉,所以多程式的程式要比多執行緒的程式健壯,但是在程式切換時,耗費的資源較大,效率要差些。
97.&和&&的區別
&是位運算子。&&是布林邏輯運算子,在進行邏輯判斷時用&處理的前面為false後面的內容仍需處理,用&&處理的前面為false不再處理後面的內容。
98.過載與重寫
- Overload為過載,Override為重寫方法的重寫和過載是Java多型性的不同表現。重寫是父類與子類之間多型性的一種表現,過載是一個類中多型性的一種表現。
- 如果在子類中定義某方法與其父類有相同的名稱和引數,我們說該方法被重寫 (Override)。子類的物件使用這個方法時,將呼叫子類中的定義,對它而言,父類中的定義如同被"遮蔽"了。
- 如果在一個類中定義了多個同名的方法,它們或有不同的引數個數或有不同的引數型別,則稱為方法的過載(Overload)。
過載的方法是可以改變返回值的型別。
99.如果物件的引用被置為null,垃圾收集器是否會立即釋放物件佔用的記憶體?
不會,在下一個垃圾回收週期中,這個物件將是可被回收的。
100.序列(serial)收集器和吞吐量(throughput)收集器的區別是什麼?
吞吐量收集器使用並行版本的新生代垃圾收集器,它用於中等規模和大規模資料的應用程式。而序列收集器對大多數的小應用(在現代處理器上需要大概100M左右的記憶體)就足夠了。