BAT面試題&&答案——JAVA篇(1)
前言
今早看到首頁蹦出來的一篇標題是一篇文章,內容還沒仔細看,這個表我嚇了一大跳。回想當年拿著4000塊實習的苦日子,現在的大學畢業生實在幸福了。BAT爸爸們不是一般的土豪啊。但要進BAT也不是那麼容易的,少不了過五關斬六將的各種面試。
想起大學時當家教的經歷,突然又教一下學生,過過當老師的癮了。於是找了一份BAT等大公司的面試題彙總,逐一加上答案和參考資料,跟同學們分享交流。希望各位應屆的同學看了都能當上大廠的碼農,不用當小廠的碼畜。
ps:
- 面試題的量很大,我會分批持續更新,做成一個系列
- 每題下面除了答案之外,我還會附上參考資料,想更深入瞭解與答案相關的知識,可以查閱這些資料
- 答案加上了我自身的理解,如有錯漏或者看不懂的地方,可以通過qq跟我交流,我的企鵝號是244095135
- 如果要轉載的請先與我聯絡並註明出處,尊重別人的勞動成果是一個人的基本素質
JAVA面試題(1)
1.java中==和equals和hashCode的區別
== | 對兩個變數進行值的比較 |
equals | 對兩個變數進行記憶體地址的比較 |
hashcode | 獲取變數在集合中所儲存的區域 |
參考資料
https://blog.csdn.net/tiantiandjava/article/details/46988461
http://wiki.jikexueyuan.com/project/java-enhancement/java-twentysix.html
2.int、char、long各佔多少位元組數
型別 | 儲存需求 | bit 數 | 取值範圍 | 備註 |
---|---|---|---|---|
int | 4位元組 | 4*8 | -2147483648~2147483647 | 即 (-2)的31次方 ~ (2的31次方) - 1 |
short | 2位元組 | 2*8 | -32768~32767 | 即 (-2)的15次方 ~ (2的15次方) - 1 |
long | 8位元組 | 8*8 | 即 (-2)的63次方 ~ (2的63次方) - 1 | |
byte | 1位元組 | 1*8 | -128~127 | 即 (-2)的7次方 ~ (2的7次方) - 1 |
float | 4位元組 | 4*8 | float 型別的數值有一個字尾 F(例如:3.14F) | |
double | 8位元組 | 8*8 | 沒有後綴 F 的浮點數值(例如:3.14)預設為 double | |
boolean | 1位元組 | 1*8 | true、false | |
char | 2位元組 | 2*8 | Java中,只要是字元,不管是數字還是英文還是漢字,都佔兩個位元組。(因為java使用的是unicode編碼) |
參考資料
https://www.jianshu.com/p/fd560bc39adb
3.int與integer的區別
- Integer是int的包裝類;int是基本資料型別;
- Integer變數必須例項化後才能使用;int變數不需要;
- Integer實際是物件的引用,指向此new的Integer物件;int是直接儲存資料值 ;
- Integer的預設值是null;int的預設值是0。
參考資料
https://blog.csdn.net/chenliguan/article/details/53888018
4.談談你對java多型的理解
- 多型的定義:相同類項的變數執行同一個方法時,呈現出不同的行為特徵這就是多型。
- 多型的實現方法:
- 子類繼承父類
- 子類重寫父類的方法
- 父類引用指向子類物件
- 通過父類引用呼叫子類重寫後的方法,執行具有子類特徵的行為
參考資料
https://blog.csdn.net/woshiermingerming/article/details/52324861?utm_source=blogxgwz6
5.String、StringBuffer、StringBuilder區別
String | 字串常量,實際是一個不可變的物件,每個對其內容進行變更都相當於重新生成這個物件。在字串需要頻繁更改時,很耗效能,不推薦使用 |
StringBuffer | 字串變數,執行緒安全。推薦在需要頻繁更改字串的場景中使用,可通過toString()轉換成String物件 |
StringBuilder | 字串變數,非執行緒安全。效能比StringBuffer高出10%-15%,但由於其執行緒不安全的特性,多數場景下不推薦使用 |
參考資料
https://blog.csdn.net/kingzone_2008/article/details/9220691
6.什麼是內部類?內部類的作用
- 內部類的定義:定義在一個類內部的類
- 內部類的作用:
- 可通過private和protected限制類的訪問許可權
- 內部類擁有外圍類的所有元素的訪問許可權
- 可實現多重繼承
- 可以避免修改介面而實現同一個類中兩種同名方法的呼叫。
參考資料
https://blog.csdn.net/mid120/article/details/53644539
7.抽象類和介面區別
抽象類(abstract class):不能例項化的類,內部可包含抽象方法,可通過extend被其他類繼承
介面的定義(interface):抽象方法的集合,可通過implements被其他類實現
區別:
抽象類 | 介面 |
抽象類可包含一般方法,抽象方法 | 介面只包含抽象方法 |
繼承抽象類的子類如果是抽象類可以不實現父類的抽象方法,否則必須實現所有的抽象方法 | 實現介面的類需要實現介面中的所有方法 |
抽象類可以有構造器 |
介面不能有構造器 |
抽象方法可以有public、protected和default等修飾符 |
介面方法預設修飾符是public。不可以使用其它修飾符 |
一個子類只能存在一個父類,所以不能繼承多於一個抽象類 |
一個類可以實現多個介面 |
抽象類新增新方法時,可以提供預設的實現,不需要改動先有的程式碼 | 介面新增新方法時,所有實現了該介面的類都要新增對新方法的實現 |
參考資料
https://www.jianshu.com/p/038f0b356e9a
8.抽象類的意義
- 為子類提供一個公共的型別;
- 封裝子類中重複內容(成員變數和方法);
- 定義有抽象方法,子類雖然有不同的實現,但該方法的定義是一致的。
參考資料:
https://www.jianshu.com/p/4ed470d0cf38
9.介面的意義
- 功能性:一個類可以實現多個介面,介面作為抽象類不能被多繼承這一缺陷的補充,完善了java的面向物件能力
- 規範性:在多人協作的專案中,可以由架構師先行編寫主要的介面,確定要實現的主要功能,同時也規範了這些功能的方法命名
- 擴充套件性:用介面來引用實現了該介面的類,如果介面對應的功能需要大面積改動,只需要替換實現它的類就可以了,原理類似C++中父類指標指向子類物件的多型呼叫
- 安全性:系統提供對外服務時,只提供介面,這樣可以防止洩露方法實現細節
參考資料
https://blog.csdn.net/Caide3/article/details/68490883
10.抽象類與介面的應用場景
- 需要一些有預設實現的方法時,用抽象類
- 基礎功能會平凡增刪的情況,用抽象類
- Java不支援多繼承,可以用實現多個介面的形式來解決
- 沒有特殊需要時,推薦使用介面,保留擴充套件性
參考資料
https://www.jianshu.com/p/b7ddefc7588c