java 常見問題

约翰發表於2020-12-29

1.介面和抽象類區別;
https://testerhome.com/topics/27323

2.string 和 stringbuffer 的區別?
String 是隻讀字串,意味著字串內容無法被修改;
StringBuffer 是可以直接進行修改的;
其中 StringBuffer 比 StringBuilder 的效率低,因為 StringBuffer 被 synchronized 修飾;

3.String,StringBuffer,StringBuilder 區別
String 宣告的是不可變的物件,每次操作必然產生一個新的物件;
StringBuffer 和 StringBuilder 都繼承抽象類:AbstractStringBuilder;
StringBuffer 具備執行緒安全性;
在使用場景上,併發使用 StringBuffer,迭代使用 StringBuilder,普通場景選 String,避免途中不必要的型別轉換開銷;

3.String 是最基本的資料型別嗎?
不是,java 最基本的資料型別一共 8 種,包含:int byte char float double boolean short long
String 是引用型別
另外還有列舉型別 enumeration type

1 位元組:byte(位元組型),boolean(布林型)
2 位元組:short(短整型),char(字元型)
4 位元組:int(整型) float(單精度浮點型)
8 位元組:long(長整型)double(雙精度浮點型)

補充:
long 是長整型。
byte: 八位整數 -128——127,可用來節省記憶體的使用。
short: 16 位整數 -32768——32,767,也比較省記憶體。
int: 32 位整數 -2,147,483,648——2,147,483,647,一般來說整數都夠用了
long: 64 位整數 -9,223,372,036,854,775,808—— 9,223,372,036,854,775,807,一般不需要用
float: 32 位浮點,如果浮點需要節省記憶體用這個。
Double: 64 位浮點,一般非整數浮點可用這個。

但是必須要記住 float 和 double 都不是精確的,如果要儲存錢一類的必須精確的,用 java.math.BigDecimal

4.int 和 Integer 的區別?
https://www.cnblogs.com/guodongdidi/p/6953217.html

5.解釋記憶體中的棧、堆和靜態區的用法?
棧空間很小,一般儲存的是:變數,一個物件的引用,以及函式呼叫現場
堆:儲存的是物件;堆的空間很大,理論上整個記憶體沒有被其他程序使用的空間甚至硬碟上的虛擬記憶體都可以被當作堆空間使用。
常量儲存在靜態區;

6.陣列有沒有 length() 方法?String 有沒有 length() 方法?
陣列沒有 length() 方法,有 length 屬性;
String 有 length()方法。

7.過載和重寫的區別?
過載是同一個類中同名函式,引數型別或是引數個數不同或是兩者都不同,返回值無要求;(編譯時多型)
重寫是子類繼承父類,需要對父類方法進行重寫,引數型別或是引數個數以及返回值要求是一樣的。(執行時多型)

8.建立執行緒的方法:
1)繼承 Thread 類;
2)implements Runnable 介面;
3)透過執行緒池建立執行緒;
4)使用 Callable 和 Future 建立

9.克隆如何實現?
1)實現 Cloneable 介面並重寫 Object 類中的 clone() 方法;
2)實現 Serializable 介面,透過物件的序列化和反序列化實現克隆,可以實現真正的深度克隆;

10.靜態變數和例項變數的區別
靜態變數是被 static 修飾的,也叫類變數,它屬於一個類,不屬於任何一個物件,一個類無論建立多少個物件,靜態變數在記憶體中有且僅有一個複製;
例項變數必須依賴於一個例項,需要先建立物件然後透過物件才能訪問到它。
靜態變數可以實現讓多個物件共享記憶體;

11.介面是否可以繼承 extends 介面?抽象類是否可以實現 implements 介面?抽象類是否可以繼承具體類?
介面可以繼承介面,而且支援多重繼承;
抽象類可以實現介面;
抽象類可以繼承具體類也可以繼承抽象類;

12.java 中 final 關鍵字有那些用法?
1)修飾類:表示該類不能被繼承;
2)修飾方法:表示該方法不能被重寫;
3)修飾變數:表示變數只能一次賦值,之後不允許修改,即定義常量;

13.float f = 3.4 正確嗎?
不正確

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

14.Math.round(11.5)=12 Math.round(-11.5)=-11
四捨五入原理是在引數上加 0.5 向下取整

15.構造器不能被繼承,因此不能被重寫,但可以被過載
16.抽象的方法是否可同時是靜態的?是否可同時是本地方法?是否可同時被 synchronized 修飾?
抽象的方法需要子類重寫,而靜態的方法是無法被重寫的,故二者矛盾。
本地方法是由原生代碼實現的,而抽象方法是沒有實現的,故也是矛盾的。
synchronized 和方法的實現細節有關,抽象方法不涉及細節,故矛盾

17.是否可以從一個靜態方法內部呼叫非靜態方法?
NO,靜態方法只能訪問靜態成員,非靜態方法的呼叫需要先建立物件,在呼叫靜態方式可能物件並沒有被初始化。

18.資料型別轉換:
呼叫基本資料型別對應的包裝類中的方法 parseXXX(String) 或 valueOf(String) 即可返回相應基本型別;
基本資料型別轉換為字串:一種是將基本資料型別與空字串 + 即可獲得對應字串;另一種是:呼叫 String 類中的 valueOf() 方法返回相應字串。

19.如何實現字串反轉和替換?
20.Error 和 Exception 區別:
Error 表示系統級別的錯誤和程式不必處理的異常;
Exception 表示需要捕捉或者需要程式進行處理的異常,是一種設計或實現問題,換句話而言:表示如果程式執行正常,從不會發生的情況。

21.執行時異常和受檢異常有何異同?
22.闡述:final finally finalize 的區別
23.Collection 和 Collections 區別
Collection 是一個介面,是 Set、list 等容器的父介面;
Collections 是一個工具類,提供了一系列的靜態方法來輔助容器操作,這些方法包括對容器的搜尋、排序、執行緒安全化等等。

24.Thread 類的 sleep() 方法和物件的 wait() 方法都可以讓執行緒暫停執行,有何區別?
sleep 是執行緒類的靜態方法,呼叫此方法會讓當前執行緒暫停執行指定的時間,將執行機會 CPU 讓給其他執行緒,但是物件的鎖依然保持,因此休眠時間結束後會自動恢復。
wait() 是 object 類的方法,呼叫物件的 wait() 方法導致當前執行緒放棄物件的鎖,進入物件的等待池,只有呼叫物件的 notify() 方法時才能喚醒等待池中的執行緒進入到等鎖池,如果執行緒重新獲得物件的鎖即進入到就緒狀態。

25.執行緒同步以及執行緒呼叫相關的方法
26.編寫多執行緒的方法;
27.什麼是執行緒池?
28.Java 中有幾種型別的流?
位元組流和字元流;
位元組流繼承於 InputStream OutputStream
字元流繼承於 Reader Writer

29.獲取一個目錄下所有檔案?
30.資料庫連線池的作用?
建立和釋放連線都有很大開銷,若伺服器不在本地時,每次建立連線需要 TCP 三次握手,釋放連線需要進行 TCP 四次握手,開銷相當大。
資料庫連線池典型的空間換取時間的策略,池化技術。

31.事務 ACID
32.如何透過反射建立物件?
1)呼叫 newInstance() 方法;
2)透過類物件的 getConstructor() 或 getDeclareConstructor() 方法獲得構造器物件並呼叫其 newInstance() 方法建立物件;

33.設計模式
34.synchronized 官方解釋
https://www.cnblogs.com/songgj/p/14403523.html

35.序列化和反序列化
https://www.zhihu.com/question/47794528/answer/672095170

36.深複製&淺複製
淺複製是對基本資料型別進行值傳遞,對引用資料型別進行引用傳遞般的複製;而深複製是對基本資料型別進行值傳遞,對引用資料型別,建立一個新的物件,並複製其內容

https://www.html.cn/qa/other/22850.html

37.