??大家好,我是陳哈哈,北漂五年,相信大家和我一樣,
都有一個大廠夢,作為一名資深Java選手,深知面試重要性,接下來我準備用100天時間,基于Java崗面試中的高頻面試題,以每日3題的形式,帶你過一遍熱門面試題及恰如其分的解答,
??一路走來,隨著問題加深,發現不會的也愈來愈多,但底氣著實足了不少,相信不少朋友和我一樣,榷訓月累才是最有效的學習方式!想起高三時一個同學的座右銘:只有沉下去,才能浮上來,共勉(juan),

來了,家鄉的味道:棗莊 辣子雞
車票
- 面試題1:JDK1.8的新特性有哪些?
- 面試題2:什么是內部類?內部類的作用?
- 面試題3:內部類有哪幾種?分別介紹一下
- 每日小結
??本欄目Java開發崗高頻面試題主要出自以下各技術堆疊:Java基礎知識、集合容器、并發編程、JVM、Spring全家桶、MyBatis等ORMapping框架、MySQL資料庫、Redis快取、RabbitMQ訊息佇列、Linux操作技巧等,
面試題1:JDK1.8的新特性有哪些?
- 介面的默認和靜態方法:
??Java 8允許我們給介面添加一個非抽象的方法實作,只需要使用 default關鍵字即可,這個特征又叫做擴展方法,
public interface JDK8Interface {
// static修飾符定義靜態方法
static void staticMethod() {
System.out.println("介面中的靜態方法");
}
// default修飾符定義默認方法
default void defaultMethod() {
System.out.println("介面中的默認方法");
}
}
- Lambda 運算式:
??例如:(x, y) -> { return x + y; };λ運算式有三部分組成:引數串列,箭頭(->),以及一個運算式或陳述句塊,
??在Java 8 中你就沒必要使用這種傳統的匿名物件的方式了,Java 8提供了更簡潔的語法,lambda運算式:
Collections.sort(names, (String a, String b) -> {
return b.compareTo(a);
});
- 方法與建構式參考:
??Java 8 允許你使用 :: 關鍵字來傳遞方法或者建構式參考,上面的代碼展示了如何參考一個靜態方法,我們也可以參考一個物件的方法:
converter = something::startsWith;
String converted = converter.convert("Java");
System.out.println(converted);
- 函式式介面:
??所謂的函式式介面,當然首先是一個介面,然后就是在這個介面里面只能有一個抽象方法,
- Annotation 注解:支持多重注解:
??很多時候一個注解需要在某一位置多次使用,
@YourAnnotation
@YourAnnotation
public void test(){
//TODO
}
- 新的日期時間 API:
??Java 8新的Date-Time API (JSR 310)受Joda-Time的影響,提供了新的java.time包,可以用來替代java.util.Date和java.util.Calendar,
??一般會用到Clock、LocaleDate、LocalTime、LocaleDateTime、ZonedDateTime、Duration這些類,對于時間日期的改進還是非常不錯的,
- Base64編碼:
??Base64編碼是一種常見的字符編碼,可以用來作為電子郵件或Web Service附件的傳輸編碼,
??在Java 8中,Base64編碼成為了Java類別庫的標準,Base64類同時還提供了對URL、MIME友好的編碼器與解碼器,
- JavaScript引擎Nashorn:
??Nashorn允許在JVM上開發運行JavaScript應用,允許Java與JavaScript相互呼叫,
- Stream的使用:
??Stream API是把真正的函式式編程風格引入到Java中,其實簡單來說可以把Stream理解為MapReduce,當然Google的MapReduce的靈感也是來自函式式編程,她其實是一連串支持連續、并行聚集操作的元素,從語法上看,也很像linux的管道、或者鏈式編程,代碼寫起來簡潔明了,非常酷帥!
- Optional:
??Java 8引入Optional類來防止空指標例外,Optional類最先是由Google的Guava專案引入的,Optional類實際上是個容器:它可以保存型別T的值,或者保存null,使用Optional類我們就不用顯式進行空指標檢查了,
- 擴展注解的支持:
??Java 8擴展了注解的背景關系,幾乎可以為任何東西添加注解,包括區域變數、泛型類、父類與介面的實作,連方法的例外也能添加注解,
- 并行(parallel)陣列:
??支持對陣列進行并行處理,主要是parallelSort()方法,它可以在多核機器上極大提高陣列排序的速度,
- 編譯器優化:
??Java 8將方法的引數名加入了位元組碼中,這樣在運行時通過反射就能獲取到引數名,只需要在編譯時使用-parameters引數,
- 其他核心 API 的改進
Java IO改進
一些IO改進包括:
- Files.list(Path dir) 回傳延遲填充的Stream,其元素是目錄中的條目,
- Files.lines(Path path) 從檔案中讀取所有行作為流,
- Files.find() 通過在以給定起始檔案為根的檔案樹中搜索檔案,回傳通過路徑延遲填充的Stream,
- BufferedReader.lines() 回傳一個Stream,其元素是從此BufferedReader中讀取的行,
集合 API 的改進
我們已經看到了 forEach()方法和用于集合的 Stream API,Collection API還有一些新方法是:
- Iterator forEachRemaining(Consumer action)在所有元素都已處理完畢或該動作引發例外之前,對每個剩余元素執行給定操作的默認方法,
- Collection removeIf(Predicate filter)洗掉此集合中所有滿足特定條件的元素的默認方法,
- Collection spliterator() 該方法回傳Spliterator實體,該實體可用于順序或并行遍歷元素,
- map replaceAll(),compute(),merge()方法,
- 具有鍵沖突的HashMap類的性能改進

課間休息,看看晚間燒烤攤子~~
怎么說,餓了么?
面試題2:什么是內部類?內部類的作用?
??將一個類定義在另一個類或者另一個方法里面,這樣的類稱著內部類;值得注意的是,內部類能夠訪問外部類的所有成員,包括private修飾的,
舉例:把類Inner定義在類Outer中,類Inner就被稱為內部類,
class Outer {
class Inner {
}
}
注意:
- 內部類是一個編譯時的概念,一旦編譯成功,就會成為完全不同的兩類,
- 對于一個名為 outer 的外部類和其內部定義的名為 inner 的內部類,編譯完成后出現 outer.class 和 outer$inner.class 兩類,
- 所以內部類的成員變數/方法名可以和外部類的相同,
內部類的作用
1、內部類可以很好的實作隱藏,
??非內部類是不可以使用 private和 protected修飾的,但是內部類卻可以,從而達到隱藏的作用,同時也可以將一定邏輯關系的類組織在一起,增強可讀性,
2、間接的實作多繼承,
內部類提供了Java的"多重繼承"的解決方案,彌補了Java類是單繼承的不足
??每個內部類都能獨立地繼承自一個(介面的)實作,所以無論外部類是否已經繼承了某個(介面的)實作,對于內部類都沒有影響,如果沒有內部類提供的可以繼承多個具體的或抽象的類的能力,一些設計與編程問題就很難解決,所以說內部類間接的實作了多繼承,
內部類特點
- 內部類仍然是一個獨立的類,在編譯之后內部類會被編譯成獨立的.class檔案,但是前面冠以外部類的類名和$符號
- 內部類不能用普通的方式訪問,內部類是外部類的一個成員,因此內部類可以自由地訪問外部類的成員變數,無論是否是private的
- 內部類宣告成靜態的,就不能隨便的訪問外部類的成員變數了,此時內部類只能訪問外部類的靜態成員變數

小城故事多,晚上大排檔走一走,真香!
面試題3:內部類有哪幾種?分別介紹一下
- ?成員內部類
- ?區域內部類
- 靜態內部類
- 匿名內部類
成員內部類
成員內部類——就是位于外部類成員位置的類
?
public class Outer {
//不對外開放的
class Inner{
public void show(){
System.out.println("成員內部類");
}
}
}
特點:
- 內部類就像一個實體成員一樣存在于外部類中,
- 內部類可以訪問外部類的所有成員就想訪問自己的成員一樣沒有限制,
- 內部類中的 this 指的是內部類的實體物件本身,如果要用外部類的實體物件就可以用類名 .this 的方式獲得,
- 內部類物件中不能有靜態成員,原因很簡單,內部類的實體物件是外部類實體物件的一個成員,
區域內部類
區域內部類——就是定義在一個方法或者一個作用域里面的類;
class Outer {
public void method(){
class Inner {
System.out.println("區域內部類");
}
}
}
特點:
- 方法中的內部類沒有訪問修飾符, 即方法內部類對包圍它的方法之外的任何東西都不可見,
- 方法內部類只能夠訪問該方法中的區域變數,所以也叫區域內部類,而且這些區域變數一定要是final修飾的常量,
靜態內部類
??我們所知道static是不能用來修飾類的,但是成員內部類可以看做外部類中的一個成員,所以可以用static修飾,這種用static修飾的內部類我們稱作靜態內部類,也稱作嵌套內部類.
特點:不能使用外部類的非static成員變數和成員方法
class Outter {
int age = 10;
static age2 = 20;
public Outter() {
}
static class Inner {
public method() {
System.out.println(age);//錯誤
System.out.println(age2);//正確
}
}
}
?
public class Test {
public static void main(String[] args) {
Outter.Inner inner = new Outter.Inner();
inner.method();
}
}
匿名內部類
一個沒有名字的類,是內部類的簡化寫法
本質:其實是繼承該類或者實作介面的子類匿名物件
public abstract class A implements B{
public void A(){
System.out.println("A");
}
}
public interface B{
public void B();
}
public class Test {
public static void main(String[] args) {
//new出介面或者實作類
A a= new A (){
//實作介面里未實作的方法
public void B() {
System.out.println("匿名內部類");
}
};
a.A();
a.B();
}
特點:
- 一個類用于繼承其他類或是實作介面,并不需要增加額外的方法,只是對繼承方法的事先或是覆寫,
- 只是為了獲得一個物件實體,不需要知道其實際型別,
- 類名沒有意義,也就是不需要使用到,
每日小結
??今天我們復習了面試中常考的java基礎相關的三個問題,你做到心中有數了么?對了,如果你的朋友也在準備面試,請將這個系列扔給他,如果他認真對待,肯定會感謝你的!!好了,今天就到這里,學廢了的同學,記得在評論區留言:打卡,,給同學們以激勵,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/292027.html
標籤:java
