?
目前市面上的面試題存在兩大問題:第一撒顿,題目太舊好久沒有更新了扯再,還都停留在 2010 年之前的狀態(tài)离熏;第二佳谦,近幾年 JDK 更新和發(fā)布都很快,Java 的用法也變了不少滋戳,加上 Java 技術(shù)棧也加入了很多新的框架钻蔑,比如 Spring Boot、Spring Cloud 等奸鸯,但類似的面試題卻極少咪笑。
相比與這些問題,我的這 208 道面試題具備以下優(yōu)點:
披沙揀金提煉出每個 Java 模塊中最經(jīng)典的面試題娄涩;
答案準(zhǔn)確窗怒,每個題目都是我仔細校對過的;
接近最真實的企業(yè)面試蓄拣,題目實用有效果扬虚;
難懂的題目,我加入了代碼解析和原理分析球恤。
本篇是這 208 道題中辜昵,第一部分“Java 基礎(chǔ)”模塊的題和答案。
Java 基礎(chǔ)
1. JDK 和 JRE 有什么區(qū)別咽斧?
JDK:Java Development Kit 的簡稱堪置,java 開發(fā)工具包,提供了 java 的開發(fā)環(huán)境和運行環(huán)境收厨。
JRE:Java Runtime Environment 的簡稱晋柱,java 運行環(huán)境,為 java 的運行提供了所需環(huán)境诵叁。
具體來說 JDK 其實包含了 JRE,同時還包含了編譯 java 源碼的編譯器 javac钦椭,還包含了很多 java 程序調(diào)試和分析的工具拧额。簡單來說:如果你需要運行 java 程序,只需安裝 JRE 就可以了彪腔,如果你需要編寫 java 程序侥锦,需要安裝 JDK。
2. == 和 equals 的區(qū)別是什么德挣?
== 解讀
對于基本類型和引用類型 == 的作用效果是不同的恭垦,如下所示:
基本類型:比較的是值是否相同;
引用類型:比較的是引用是否相同;
代碼示例:??????
String x = "string";String y = "string";String z = new String("string");System.out.println(x==y); // trueSystem.out.println(x==z); // falseSystem.out.println(x.equals(y)); // trueSystem.out.println(x.equals(z)); // true
代碼解讀:因為 x 和 y 指向的是同一個引用番挺,所以 == 也是 true唠帝,而 new String()方法則重寫開辟了內(nèi)存空間,所以 == 結(jié)果為 false玄柏,而 equals 比較的一直是值襟衰,所以結(jié)果都為 true。
equals 解讀
equals 本質(zhì)上就是 ==粪摘,只不過 String 和 Integer 等重寫了 equals 方法瀑晒,把它變成了值比較∨且猓看下面的代碼就明白了苔悦。
首先來看默認(rèn)情況下 equals 比較一個有相同值的對象,代碼如下:
class Cat { ? ?public Cat(String name) { ? ? ? ?this.name = name; ? ?} ? ?private String name; ? ?public String getName() { ? ? ? ?return name; ? ?} ? ?public void setName(String name) { ? ? ? ?this.name = name; ? ?}}Cat c1 = new Cat("王磊");Cat c2 = new Cat("王磊");System.out.println(c1.equals(c2)); // false
輸出結(jié)果出乎我們的意料椎咧,竟然是 false间坐?這是怎么回事,看了 equals 源碼就知道了邑退,源碼如下:
???????
public boolean equals(Object obj) { ? ?return (this == obj);}
原來 equals 本質(zhì)上就是 ==竹宋。
那問題來了,兩個相同值的 String 對象地技,為什么返回的是 true蜈七?代碼如下:
???????
String s1 = new String("老王");String s2 = new String("老王");System.out.println(s1.equals(s2)); // true
同樣的,當(dāng)我們進入 String 的 equals 方法莫矗,找到了答案飒硅,代碼如下:
public boolean equals(Object anObject) { ? ?if (this == anObject) { ? ? ? ?return true; ? ?} ? ?if (anObject instanceof String) { ? ? ? ?String anotherString = (String)anObject; ? ? ? ?int n = value.length; ? ? ? ?if (n == anotherString.value.length) { ? ? ? ? ? ?char v1[] = value; ? ? ? ? ? ?char v2[] = anotherString.value; ? ? ? ? ? ?int i = 0; ? ? ? ? ? ?while (n-- != 0) { ? ? ? ? ? ? ? ?if (v1[i] != v2[i]) ? ? ? ? ? ? ? ? ? ?return false; ? ? ? ? ? ? ? ?i++; ? ? ? ? ? ?} ? ? ? ? ? ?return true; ? ? ? ?} ? ?} ? ?return false;}
原來是 String 重寫了 Object 的 equals 方法,把引用比較改成了值比較作谚。
總結(jié):== 對于基本類型來說是值比較三娩,對于引用類型來說是比較的是引用;而 equals 默認(rèn)情況下是引用比較妹懒,只是很多類重新了 equals 方法雀监,比如 String、Integer 等把它變成了值比較眨唬,所以一般情況下 equals 比較的是值是否相等会前。
3. 兩個對象的 hashCode()相同,則 equals()也一定為 true匾竿,對嗎瓦宜?
不對,兩個對象的 hashCode()相同岭妖,equals()不一定 true临庇。
代碼示例:
???????
String str1 = "通話";String str2 = "重地";System.out.println(String.format("str1:%d | str2:%d", ?str1.hashCode(),str2.hashCode()));System.out.println(str1.equals(str2));
執(zhí)行的結(jié)果:
str1:1179395 | str2:1179395
false
代碼解讀:很顯然“通話”和“重地”的 hashCode() 相同反璃,然而 equals() 則為 false,因為在散列表中假夺,hashCode()相等即兩個鍵值對的哈希值相等淮蜈,然而哈希值相等,并不一定能得出鍵值對相等侄泽。
小編分類整理了許多java進階學(xué)習(xí)材料和BAT面試題礁芦,需要資料的請加JAVA高階學(xué)習(xí)Q群:8515318105;就能領(lǐng)取2019年java架構(gòu)師進階學(xué)習(xí)資料和BAT面試題悼尾。
4. final 在 java 中有什么作用柿扣?
final 修飾的類叫最終類,該類不能被繼承闺魏。
final 修飾的方法不能被重寫未状。
final 修飾的變量叫常量,常量必須初始化析桥,初始化之后值就不能被修改司草。
5. java 中的 Math.round(-1.5) 等于多少?
等于 -1泡仗,因為在數(shù)軸上取值時埋虹,中間值(0.5)向右取整,所以正 0.5 是往上取整娩怎,負 0.5 是直接舍棄搔课。
6. String 屬于基礎(chǔ)的數(shù)據(jù)類型嗎?
String 不屬于基礎(chǔ)類型截亦,基礎(chǔ)類型有 8 種:byte爬泥、boolean、char崩瓤、short袍啡、int、float却桶、long境输、double,而 String 屬于對象肾扰。
7. java 中操作字符串都有哪些類畴嘶?它們之間有什么區(qū)別?
操作字符串的類有:String集晚、StringBuffer、StringBuilder区匣。
String 和 StringBuffer偷拔、StringBuilder 的區(qū)別在于 String 聲明的是不可變的對象蒋院,每次操作都會生成新的 String 對象,然后將指針指向新的 String 對象莲绰,而 StringBuffer欺旧、StringBuilder 可以在原有對象的基礎(chǔ)上進行操作,所以在經(jīng)常改變字符串內(nèi)容的情況下最好不要使用 String蛤签。
StringBuffer 和 StringBuilder 最大的區(qū)別在于辞友,StringBuffer 是線程安全的,而 StringBuilder 是非線程安全的震肮,但 StringBuilder 的性能卻高于 StringBuffer称龙,所以在單線程環(huán)境下推薦使用 StringBuilder,多線程環(huán)境下推薦使用 StringBuffer戳晌。
8. String str="i"與 String str=new String("i")一樣嗎鲫尊?
不一樣,因為內(nèi)存的分配方式不一樣沦偎。String str="i"的方式疫向,java 虛擬機會將其分配到常量池中;而 String str=new String("i") 則會被分到堆內(nèi)存中豪嚎。
9. 如何將字符串反轉(zhuǎn)搔驼?
使用 StringBuilder 或者 stringBuffer 的 reverse() 方法。
示例代碼:????
// StringBuffer reverseStringBuffer stringBuffer = new StringBuffer();stringBuffer.append("abcdefg");System.out.println(stringBuffer.reverse()); // gfedcba// StringBuilder reverseStringBuilder stringBuilder = new StringBuilder();stringBuilder.append("abcdefg");System.out.println(stringBuilder.reverse()); // gfedcba
10. String 類的常用方法都有那些侈询?
indexOf():返回指定字符的索引舌涨。
charAt():返回指定索引處的字符。
replace():字符串替換妄荔。
trim():去除字符串兩端空白泼菌。
split():分割字符串,返回一個分割后的字符串?dāng)?shù)組啦租。
getBytes():返回字符串的 byte 類型數(shù)組哗伯。
length():返回字符串長度。
toLowerCase():將字符串轉(zhuǎn)成小寫字母篷角。
toUpperCase():將字符串轉(zhuǎn)成大寫字符焊刹。
substring():截取字符串。
equals():字符串比較恳蹲。
11. 抽象類必須要有抽象方法嗎虐块?
不需要,抽象類不一定非要有抽象方法嘉蕾。
示例代碼:
???????
abstract class Cat { ? ?public static void sayHi() { ? ? ? ?System.out.println("hi~"); ? ?}}
上面代碼贺奠,抽象類并沒有抽象方法但完全可以正常運行。
12. 普通類和抽象類有哪些區(qū)別错忱?
普通類不能包含抽象方法儡率,抽象類可以包含抽象方法挂据。
抽象類不能直接實例化,普通類可以直接實例化儿普。
小編分類整理了許多java進階學(xué)習(xí)材料和BAT面試題崎逃,需要資料的請加JAVA高階學(xué)習(xí)Q群:8515318105;就能領(lǐng)取2019年java架構(gòu)師進階學(xué)習(xí)資料和BAT面試題眉孩。
13. 抽象類能使用 final 修飾嗎个绍?
不能,定義抽象類就是讓其他類繼承的浪汪,如果定義為 final 該類就不能被繼承巴柿,這樣彼此就會產(chǎn)生矛盾,所以 final 不能修飾抽象類吟宦,如下圖所示篮洁,編輯器也會提示錯誤信息:
?
14. 接口和抽象類有什么區(qū)別?
實現(xiàn):抽象類的子類使用 extends 來繼承殃姓;接口必須使用 implements 來實現(xiàn)接口袁波。
構(gòu)造函數(shù):抽象類可以有構(gòu)造函數(shù);接口不能有蜗侈。
main 方法:抽象類可以有 main 方法篷牌,并且我們能運行它;接口不能有 main 方法踏幻。
實現(xiàn)數(shù)量:類可以實現(xiàn)很多個接口枷颊;但是只能繼承一個抽象類。
訪問修飾符:接口中的方法默認(rèn)使用 public 修飾该面;抽象類中的方法可以是任意訪問修飾符夭苗。
15. java 中 IO 流分為幾種?
按功能來分:輸入流(input)隔缀、輸出流(output)题造。
按類型來分:字節(jié)流和字符流。
字節(jié)流和字符流的區(qū)別是:字節(jié)流按 8 位傳輸以字節(jié)為單位輸入輸出數(shù)據(jù)猾瘸,字符流按 16 位傳輸以字符為單位輸入輸出數(shù)據(jù)界赔。
16. BIO、NIO牵触、AIO 有什么區(qū)別淮悼?
BIO:Block IO 同步阻塞式 IO,就是我們平常使用的傳統(tǒng) IO揽思,它的特點是模式簡單使用方便袜腥,并發(fā)處理能力低。
NIO:New IO 同步非阻塞 IO钉汗,是傳統(tǒng) IO 的升級瞧挤,客戶端和服務(wù)器端通過 Channel(通道)通訊锡宋,實現(xiàn)了多路復(fù)用儡湾。
AIO:Asynchronous IO 是 NIO 的升級特恬,也叫 NIO2,實現(xiàn)了異步非堵塞 IO 徐钠,異步 IO 的操作基于事件和回調(diào)機制癌刽。
17. Files的常用方法都有哪些?
Files.exists():檢測文件路徑是否存在尝丐。
Files.createFile():創(chuàng)建文件显拜。
Files.createDirectory():創(chuàng)建文件夾。
Files.delete():刪除一個文件或目錄爹袁。
Files.copy():復(fù)制文件远荠。
Files.move():移動文件。
Files.size():查看文件個數(shù)失息。
Files.read():讀取文件譬淳。
Files.write():寫入文件。
(完)
小編分類整理了許多java進階學(xué)習(xí)材料和BAT面試題盹兢,需要資料的請加JAVA高階學(xué)習(xí)Q群:8515318105邻梆;就能領(lǐng)取2019年java架構(gòu)師進階學(xué)習(xí)資料和BAT面試題。