10萬字208道Java經(jīng)典面試題總結(附答案)
前言?
最近有很多粉絲問我,有什么方法能夠快速提升自己,通過阿里、騰訊、字節(jié)跳動、京東等互聯(lián)網(wǎng)大廠的面試,我覺得短時間提升自己最快的手段就是背面試題,最近總結了Java常用的面試題,分享給大家,希望大家都能圓夢大廠,加油,我命由我不由天。







1、JDK 和 JRE 有什么區(qū)別?
JDK(Java Development Kit),Java開發(fā)工具包
JRE(Java Runtime Environment),Java運行環(huán)境
JDK中包含JRE,JDK中有一個名為jre的目錄,里面包含兩個文件夾bin和lib,bin就是JVM,lib就是JVM工作所需要的類庫。
2、== 和 equals 的區(qū)別是什么?
對于基本類型,==比較的是值;
對于引用類型,==比較的是地址;
equals不能用于基本類型的比較;
如果沒有重寫equals,equals就相當于==;
如果重寫了equals方法,equals比較的是對象的內(nèi)容;
3、final 在 java 中有什么作用?
(1)用來修飾一個引用
?如果引用為基本數(shù)據(jù)類型,則該引用為常量,該值無法修改;
?如果引用為引用數(shù)據(jù)類型,比如對象、數(shù)組,則該對象、數(shù)組本身可以修改,但指向該對象或數(shù)組的地址的引用不能修改。
?如果引用時類的成員變量,則必須當場賦值,否則編譯會報錯。
(2)用來修飾一個方法
當使用final修飾方法時,這個方法將成為最終方法,無法被子類重寫。但是,該方法仍然可以被繼承。
(3)用來修飾類
當用final修改類時,該類成為最終類,無法被繼承。
?比如常用的String類就是最終類。
4、java 中的 Math.round(-1.5) 等于多少?
Math提供了三個與取整有關的方法:ceil、floor、round
(1)ceil:向上取整;
Math.ceil(11.3) = 12;
Math.ceil(-11.3) = 11;
(2)floor:向下取整;
Math.floor(11.3) = 11;
Math.floor(-11.3) = -12;
(3)round:四舍五入;
加0.5然后向下取整。
Math.round(11.3) = 11;
Math.round(11.8) = 12;
Math.round(-11.3) = -11;
Math.round(-11.8) = -12;
5、String 屬于基礎的數(shù)據(jù)類型嗎?
不屬于。
八種基本數(shù)據(jù)類型:byte、short、char、int、long、double、float、boolean。
6、String str="i"與 String str=new String(“i”)一樣嗎?
String str="i"會將起分配到常量池中,常量池中沒有重復的元素,如果常量池中存中i,就將i的地址賦給變量,如果沒有就創(chuàng)建一個再賦給變量。
String str=new String(“i”)會將對象分配到堆中,即使內(nèi)存一樣,還是會重新創(chuàng)建一個新的對象。
7、如何將字符串反轉(zhuǎn)?
將對象封裝到stringBuilder中,調(diào)用reverse方法反轉(zhuǎn)。

8、String 類的常用方法都有那些?
(1)常見String類的獲取功能
length:獲取字符串長度;
charAt(int index):獲取指定索引位置的字符;
indexOf(int ch):返回指定字符在此字符串中第一次出現(xiàn)處的索引;
substring(int start):從指定位置開始截取字符串,默認到末尾;
substring(int start,int end):從指定位置開始到指定位置結束截取字符串;
(2)常見String類的判斷功能
equals(Object obj): 比較字符串的內(nèi)容是否相同,區(qū)分大小寫;
contains(String str): 判斷字符串中是否包含傳遞進來的字符串;
startsWith(String str): 判斷字符串是否以傳遞進來的字符串開頭;
endsWith(String str): 判斷字符串是否以傳遞進來的字符串結尾;
isEmpty(): 判斷字符串的內(nèi)容是否為空串"";
(3)常見String類的轉(zhuǎn)換功能
byte[] getBytes(): 把字符串轉(zhuǎn)換為字節(jié)數(shù)組;
char[] toCharArray(): 把字符串轉(zhuǎn)換為字符數(shù)組;
String valueOf(char[] chs): 把字符數(shù)組轉(zhuǎn)成字符串。valueOf可以將任意類型轉(zhuǎn)為字符串;
toLowerCase(): 把字符串轉(zhuǎn)成小寫;
toUpperCase(): 把字符串轉(zhuǎn)成大寫;
concat(String str): 把字符串拼接;
(4)常見String類的其他常用功能
replace(char old,char new) 將指定字符進行互換
replace(String old,String new) 將指定字符串進行互換
trim() 去除兩端空格
int compareTo(String str) 會對照ASCII 碼表 從第一個字母進行減法運算 返回的就是這個減法的結果,如果前面幾個字母一樣會根據(jù)兩個字符串的長度進行減法運算返回的就是這個減法的結果,如果連個字符串一摸一樣 返回的就是0。
9、new String("a") + new String("b") 會創(chuàng)建幾個對象?
對象1:new StringBuilder()
對象2:new String("a")
對象3:常量池中的"a"
對象4:new String("b")
對象5:常量池中的"b"
深入剖析:StringBuilder中的toString():
對象6:new String("ab")
強調(diào)一下,toString()的調(diào)用,在字符串常量池中,沒有生成"ab"
附加題
String s1 = new String("1") + new String("1");//s1變量記錄的地址為:new String
s1.intern();//在字符串常量池中生成"11"。如何理解:jdk6:創(chuàng)建了一個新的對象"11",也就有新的地址;jdk7:此時常量池中并沒有創(chuàng)建"11",而是創(chuàng)建了一個指向堆空間中new String("11")的地址;
String s2 = "11";
System.out.println(s1 == s2);//jdk6:false;jdk7:true
10、如何將字符串反轉(zhuǎn)?
添加到StringBuilder中,然后調(diào)用reverse()。
11、String 類的常用方法都有那些?
equals、length、contains、replace、split、hashcode、indexof、substring、trim、toUpperCase、toLowerCase、isEmpty等等。
12、普通類和抽象類有哪些區(qū)別?
抽象類不能被實例化;
抽象類可以有抽象方法,只需申明,無須實現(xiàn);
有抽象方法的類一定是抽象類;
抽象類的子類必須實現(xiàn)抽象類中的所有抽象方法,否則子類仍然是抽象類;
抽象方法不能聲明為靜態(tài)、不能被static、final修飾。
13、接口和抽象類有什么區(qū)別?
(1)接口
接口使用interface修飾;
接口不能實例化;
類可以實現(xiàn)多個接口;
①java8之前,接口中的方法都是抽象方法,省略了public abstract。②java8之后;接口中可以定義靜態(tài)方法,靜態(tài)方法必須有方法體,普通方法沒有方法體,需要被實現(xiàn);
(2)抽象類
抽象類使用abstract修飾;
抽象類不能被實例化;
抽象類只能單繼承;
抽象類中可以包含抽象方法和非抽象方法,非抽象方法需要有方法體;
如果一個類繼承了抽象類,①如果實現(xiàn)了所有的抽象方法,子類可以不是抽象類;②如果沒有實現(xiàn)所有的抽象方法,子類仍然是抽象類。
14、java 中 IO 流分為幾種?
(1)按流劃分,可以分為輸入流和輸出流;
(2)按單位劃分,可以分為字節(jié)流和字符流;
字節(jié)流:inputStream、outputStream;
字符流:reader、writer;
15、BIO、NIO、AIO 有什么區(qū)別?
(1)同步阻塞BIO
一個連接一個線程。
JDK1.4之前,建立網(wǎng)絡連接的時候采用BIO模式,先在啟動服務端socket,然后啟動客戶端socket,對服務端通信,客戶端發(fā)送請求后,先判斷服務端是否有線程響應,如果沒有則會一直等待或者遭到拒絕請求,如果有的話會等待請求結束后才繼續(xù)執(zhí)行。
(2)同步非阻塞NIO
NIO主要是想解決BIO的大并發(fā)問題,BIO是每一個請求分配一個線程,當請求過多時,每個線程占用一定的內(nèi)存空間,服務器癱瘓了。
JDK1.4開始支持NIO,適用于連接數(shù)目多且連接比較短的架構,比如聊天服務器,并發(fā)局限于應用中。
一個請求一個線程。
(3)異步非阻塞AIO
一個有效請求一個線程。
JDK1.7開始支持AIO,適用于連接數(shù)目多且連接比較長的結構,比如相冊服務器,充分調(diào)用OS參與并發(fā)操作。
由于篇幅過長獲取方式
