java面試題——java高階(二)
阿新 • • 發佈:2018-11-04
四、Java高階部分
1.紅黑樹的實現原理和應用場景;
1.(1)每個節點或者是黑色,或者是紅色。 (2)根節點是黑色。 (3)每個葉子節點(NIL)是黑色。 [注意:這裡葉子節點,是指為空(NIL或NULL)的葉子節點!] (4)如果一個節點是紅色的,則它的子節點必須是黑色的。 (5)從一個節點到該節點的子孫節點的所有路徑上包含相同數目的黑節點。 注意: (01) 特性(3)中的葉子節點,是隻為空(NIL或null)的節點。 (02) 特性(5),確保沒有一條路徑會比其他路徑長出倆倍。因而,紅黑樹是相對是接近平衡的二叉樹。 2.紅黑樹的應用比較廣泛,主要是用它來儲存有序的資料,它的時間複雜度是O(lgn),效率非常之高。 例如,Java集合中的TreeSet和TreeMap,C++ STL中的set、map,以及Linux虛擬記憶體的管理,都是通過紅黑樹去實現的。
參考連結:https://www.cnblogs.com/skywang12345/p/3245399.html
https://www.cs.usfca.edu/~galles/visualization/RedBlack.html
2.NIO是什麼?適用於何種場景?
1.NIO是為了彌補IO操作的不足而誕生的網路通訊模型,NIO的一些新特性有:非阻塞I/O,選擇器,緩衝以及管道。管道(Channel),緩衝(Buffer) ,選擇器( Selector)是其主要特徵。 2.伺服器需要支援超大量的長時間連線。比如10000個連線以上,並且每個客戶端並不會頻繁地傳送太多資料。例如總公司的一箇中心伺服器需要收集全國便利店各個收銀機的交易資訊,只需要少量執行緒按需處理維護的大量長期連線。 Jetty、Mina、Netty、ZooKeeper等都是基於NIO方式實現。 參考連結:https://www.jianshu.com/p/59f610d8f97d
3.Java9比Java8改進了什麼;
1. Java 平臺級模組系統。模組化的 JAR 檔案都包含一個額外的模組描述器。在這個模組描述器中, 對其它模組的依賴是通過 “requires” 來表示的。另外, “exports” 語句控制著哪些包是可以被其它模組訪問到的。所有不被匯出的包預設都封裝在模組的裡面。 2.Linking, jlink 工具實現建立針對應用程式進行優化的最小執行時映像而不需要使用完全載入 JDK 安裝版本。 3.Javadoc 現在支援在 API 文件中的進行搜尋。另外,Javadoc 的輸出現在符合相容 HTML5 標準。4.集合工廠方法添加了Set<Integer> ints = Set.of(1, 2, 3); List<String> strings = List.of("first", "second");些方法也可以避免您選擇特定的集合實現 5.從控制檯啟動 jshell ,並直接啟動輸入和執行 Java 程式碼。 jshell 的即時反饋使它成為探索 API 和嘗試語言特性的好工具。 6.Stream 介面中添加了 4 個新的方法:dropWhile, takeWhile, ofNullable。還有個 iterate 方法的新過載方法,可以讓你提供一個 Predicate (判斷條件)來指定什麼時候結束迭代: 7.介面的預設方法 8.新的方式來處理 HTTP 呼叫。這個遲到的特性用於代替老舊的 `HttpURLConnection` API,並提供對 WebSocket 和 HTTP/2 的支援。 9.多版本相容 JAR 功能能讓你建立僅在特定版本的 Java 環境中執行庫程式時選擇使用的 class 版本
參考連結:http://www.importnew.com/24528.html
4.HashMap內部的資料結構是什麼?底層是怎麼實現的?(還可能會延伸考察ConcurrentHashMap與HashMap、HashTable等,考察對技術細節的深入瞭解程度);
HashMap的底層實現都是陣列+連結串列結構實現,新增、刪除、獲取元素時都是先計算hash,根據hash和table.length計算index也就是table陣列的下標,然後進行相應操作.
參考連結:https://blog.csdn.net/u011202334/article/details/51496381
5.說說反射的用途及實現,反射是不是很慢,我們在專案中是否要避免使用反射;
反射機制是Java語言中一個非常重要的特性,它允許程式在執行時進行自我檢查,同時也允許對其內部成員進行操作。反射機制提供的功能主要有:得到一個物件所屬的類;獲取一個類的所有成員變數和方法;在執行時建立物件;在執行時呼叫物件的方法,很多框架(比如 Spring)都是配置化的(比如通過 XML檔案配置JavaBean,Action之類的),為了保證框架的通用性,他們可能根據配置檔案載入不同的物件或類,呼叫不同的方法,這個時候就必須用到反射——執行時動態載入需要載入的物件。 參考連結:https://blog.csdn.net/SongYuxinIT/article/details/81872066
6.說說自定義註解的場景及實現;
使用場景:①類屬性自動賦值。②驗證物件屬性完整性。③代替配置檔案功能,像spring基於註解的配置。④可以生成文件,像java程式碼註釋中的@see,@param等 參考連結:https://blog.csdn.net/bluuusea/article/details/79996572
7.List 和 Map 區別,Arraylist 與 LinkedList 區別,ArrayList 與 Vector 區別;
1.List是有順序的 可重複的,Map是通過鍵值對進行取值的 key和value是一一對應的 2.①ArrayList是實現了基於動態陣列的資料結構,LinkedList基於連結串列的資料結構。 (LinkedList是雙向連結串列,有next也有previous) ②對於隨機訪問get和set,ArrayList覺得優於LinkedList,因為LinkedList要移動指標。 ③對於新增和刪除操作add和remove,LinedList比較佔優勢,因為ArrayList要移動資料。 3.①Vector的方法都是同步的(Synchronized),是執行緒安全的(thread-safe),而ArrayList的方法不是,由於執行緒的同步必然要影響效能,因此,ArrayList的效能比Vector好。 ②當Vector或ArrayList中的元素超過它的初始大小時,Vector會將它的容量翻倍,而ArrayList只增加50%的大小,這樣,ArrayList就有利於節約記憶體空間。
五、Spring相關
8.Spring AOP的實現原理和場景?
Spring bean的作用域和生命週期;
Spring Boot比Spring做了哪些改進? Spring 5比Spring4做了哪些改進;
如何自定義一個Spring Boot Starter?
Spring IOC是什麼?優點是什麼?
SpringMVC、動態代理、反射、AOP原理、事務隔離級別;