Java基礎面試題(17道)

2020-08-11 16:32:11

1. JDK 和 JRE 有什麼區別?

⒈JDK:java development kit:java開發工具包,是開發人員所需安裝的環境。
⒉JRE:java runtime environment:java執行環境,java程式執行所需要安裝的環境。

2. == 和 equals 的區別是什麼?

==:

== 比較的是變數(棧)記憶體中存放的物件的(堆)記憶體地址,用來判斷兩個物件的地址是否相同,即是否是指相同一個物件。比較的是真正意義上的指針操作。
⒈ 比較的是操作符兩端的運算元是否是同一個物件。
⒉ 兩邊的運算元必須是同一個型別的(可以是父子類之間)才能 纔能編譯通過。
⒊ 比較的是地址,吐過是具體的阿拉伯數位的比較,值相等則爲true,如:
int a=10 與 long b=10L 與 double c=10.0 都是相同的(爲true),因爲他們都是指向地址爲10的堆。

equals:

equals用來比較的是兩個物件的內容是否相等,由於所有的類都是繼承自java.lang.Object類的,所以適用於所有物件,如果沒有對該方法進行覆蓋的話,呼叫的仍然是Objece類中的放阿飛,而Object中的equals方法返回的卻是==的判斷。

總結:

所有比較是否相等時,都是用equals並且在對常數相比較時,把常數寫在前面,因爲使用object的equals object可能爲null,則空指針
在阿裡的程式碼規範中只是用equals,阿裡建立預設會識別,並可以快速修改,推薦安裝阿裡外掛來排查老程式碼使用「==」,替換成equals。

3.兩個物件的 hashCode() 相同,則 equals() 也一定爲 true ,對嗎?

不對,在產生 hash 衝突時,兩個不相等的隊形就會有相同的 hashCode 值。
hashCode 方法可以這樣理解:它返回的就是根據物件的記憶體地址換算出的一個值。這樣一來,當集合要新增新的元素師,先呼叫這個元素的 hashCode 方法,就一下子能定位到它應該防止的物理位置上。如果這個位置上沒有元素,它就可以直接儲存在這個位置上,不用在進行任何比較了;如果這個位置上已經有元素了,就呼叫它的 equals 方法與心得元素進行比較,相同的話就不存了,不相同就雜湊到其他的地址。這樣一來時間呼叫 equals 方法的次數就大大降低了,幾乎只需要一兩次。
當hash衝突時,一般有以下幾種方式來處理:
1.拉鍊法:每個雜湊表節點都有一個next指針,多個雜湊表節點可以用next指針構成一個單向鏈表,被分配到同一個索引上的多個節點可以用這個單向鏈表進行儲存。
2.開放定址法:一旦發生了衝突,就去尋找下一個空的雜湊地址,只要雜湊表足夠大,空的雜湊地址總能找到,並將記錄存入。
3.再雜湊:幼教雙雜湊法,有多個不同的 Hash 函數,當發生衝突時,使用第二個,第三個…等雜湊函數計算地址,直到無衝突。

4. final 在 java 中有什麼作用?

⒈修飾類:表示該類不能被繼承;
⒉修飾方法:表示方法不能被重寫;
⒊修飾變數:表示變數只能一次賦值以後值不能被修改(常數)。

5. java 中的 Math.round(-1.5) 等於多少?

-1;
round()是四捨五入,-1.5 四捨五入後是 -1 。

6. String 屬於基礎的數據型別麼?

不是。
java 中的基本數據型別只有8個:byte、short、int、long、float、double、char、boolean;
除基本型別,剩下的都是參照型別,java 5 以後引入的列舉型別也算是一種比較特殊的參照型別。

7. java 中的操作字串都有哪些類?他們之間有什麼區別?

String、StringBuffer、StringBuilder

String : final修飾,String類的方法都是返回new String。即對String物件的任何改變都不影響到原物件,對字串的修改操作都會生成新的物件。
StringBuffer : 對字串的操作的方法都加了synchronized,保證執行緒安全。
StringBuilder : 不保證執行緒安全,在方法體內需要進行字串的修改操作,可以new StringBuilder物件,呼叫StringBuilder物件的append、replace、delete等方法修改字串。

8. String str = 「i」 與 String str = new String(「i」) 一樣嗎?

不一樣,因爲記憶體的分配方式不一樣。
String str=「i」 的方式,Java 虛擬機器會將其分配到常數池中;
而 String str=new String(「i」) 則會被分到堆記憶體中。

9.如何將字串反轉?

具體程式碼這個貼文有

10.String 類的常用方法都有哪些?

charAt:返回制定索引處字元 indexOf():返回制定字元的索引 replace():字串替換
trim():去除字串兩端空白 split():分割字串,返回一個分割後的字串陣列 equals():字串比較
getBytes():返回字串的byte型別陣列 length():返回字串長度 toLowerCase():將字串轉成小寫字母
toUpperCase():將字串轉成大寫字元 substring():擷取字串 format():格式化字串

11.抽象類必須要有抽象方法嗎?

不是,有抽象方法的一定是抽象類,但抽象類不必須要有抽象方法。

12.普通類必須要有抽象方法嗎?

普通類不能包含抽象方法。

13.抽象類能使用 final 修飾嗎?

不能,抽象類是被用於繼承的,final 修飾代表不可修改、不可繼承的。

14.介面和抽象類有什麼區別?

抽象類:
1.抽象方法,只有行爲的概念,沒有具體的行爲實現。使用abstract關鍵字修飾,沒有方法體。子類必須重寫這些抽象方法。
2.包含抽象方法的類,一定是抽象類。
3.抽象類只能被繼承,一個類只能繼承一個抽象類。

介面:
1.全部的方法都是抽象方法,屬性都是常數。
2.不嫩範例化,可以定義變數。
3.介面變數可以參照具體實現類的範例。
4.介面只能被實現,一個具體類實現介面,必須實現全部的抽象方法。
5.介面之間可以多實現,
6.一個具體類可以實現多個介面,實現多繼承現象。

15. java 中的 IO 流分爲幾種?

1.按照流的流向分,可以分爲輸入流和輸出流;
2.按照操作單元劃分,可以劃分爲位元組流和字元流;
3.按照流的角色劃分,可以劃分爲節點流和處理流。
Java IO 流共涉及40多個類,這些類看上去很雜亂,但實際上很有規則,而且彼此之間存在非常緊密的聯繫,Java IO 流的40多個類都是從如下4個抽象類基礎類別中派生出來的。
1.InputStream/Reader:所有輸入流的基礎類別,前者是位元組輸入流,後者是字元輸入流。
2.OutputStream/Writer:所有輸出流的基礎類別,前者是位元組輸出流,後者是字元輸出流。

16. BIO、NIO、AIO 有什麼區別?

詳解見這個貼文

17. Files 的常用方法都有哪些?

Files. exists():檢測檔案路徑是否存在。

Files. createFile():建立檔案。

Files. createDirectory():建立資料夾。

Files. delete():刪除一個檔案或目錄。

Files. copy():複製檔案。

Files. move():移動檔案。

Files. size():檢視檔案個數。

Files. read():讀取檔案。

Files. write():寫入檔案。