更新時間:2020-03-20 09:57:38 來源:動力節點 瀏覽2825次
談談Java反射機制,動態代理是基于什么原理
反射機制是Java語言提供的一種基礎功能,賦予程序在運行時自省(introspect,官方用語)的能力。通過反射我們可以直接操作類或者對象,比如獲取某個對象的類定義,獲取類聲明的屬性和方法,調用方法或者構造對象,甚至可以運行時修改類定義。
動態代理是一種方便運行時動態構建代理、動態處理代理方法調用的機制,很多場景都是利用類似機制做到的,比如用來包裝RPC調用、面向切面的編程(AOP)。
JDK動態代理:基于Java反射機制實現,必須要實現了接口的業務類才能用這種辦法生成代理對象。新版本也開始結合ASM機制。
cglib動態代理:基于ASM機制實現,通過生成業務類的子類作為代理類。
int和Integer有什么區別?談談Integer的值緩存范圍。
int是我們常說的整形數字,是Java的8個原始數據類型(PrimitiveTypes,boolean、byte、short、char、int、foat、double、long)之一。Java語言雖然號稱一切都是對象,但原始數據類型是例外。
Integer是int對應的包裝類,它有一個int類型的字段存儲數據,并且提供了基本操作,比如數學運算、int和字符串之間轉換等。在Java5中,引入了自動裝箱和自動拆箱功能(boxing/unboxing),Java可以根據上下文,自動進行轉換,極大地簡化了相關編程。
Integer的值默認緩存是-128到127之間。緩存上限值實際是可以根據需要調整的,JVM提供了參數設置:-XX:AutoBoxCacheMax=N。
不管是Integer還Boolean等,都被聲明為“privatefnal”,所以,它們同樣是不可變類型!
對比Vector、ArrayList、LinkedList有何區別?
Vector是線程安全的動態數組,。Vector內部是使用對象數組來保存數據,可以根據需要自動增加容量,當數組已滿時,會創建新的數組,并拷貝原有數組數據。Vector在擴容時會提高1倍
ArrayList是動態數組實現,不是線程安全的,性能要好很多。與Vector近似,ArrayList也是可以根據需要調整容量,不過兩者的調整邏輯有所區別。ArrayList擴容時是增加50%。
Vector和ArrayList作為動態數組,其內部元素以數組形式順序存儲的,所以非常適合隨機訪問的場合。除了尾部插入和刪除元素,往往性能會相對較差,比如我們在中間位置插入一個元素,需要移動后續所有元素。
LinkedList是Java提供的雙向鏈表,它不需要像上面兩種那樣調整容量,也不是線程安全的。LinkedList進行節點插入、刪除卻要高效得多,但是隨機訪問性能則要比動態數組慢。
TreeSet支持自然順序訪問,但是添加、刪除、包含等操作要相對低效(log(n)時間)。
HashSet則是利用哈希算法,理想情況下,如果哈希散列正常,可以提供常數時間的添加、刪除、包含等操作,但是它不保證有序。
LinkedHashSet,內部構建了一個記錄插入順序的雙向鏈表,因此提供了按照插入順序遍歷的能力,與此同時,也保證了常數時間的添加、刪除、包含等操作,這些操作性能略低于HashSet,因為需要維護鏈表的開銷。
在遍歷元素時,HashSet性能受自身容量影響,所以初始化時,除非有必要,不然不要將其背后的HashMap容量設置過大。而對于LinkedHashSet,由于其內部鏈表提供的方便,遍歷性能只和元素多少有關系。
Java提供的默認排序算法:
對于原始數據類型,目前使用的是所謂雙軸快速排序,是一種改進的快速排序算法,早期版本是相對傳統的快速排序
對于對象數據類型,目前則是使用TimSort,思想上也是一種歸并和二分插入排序結合的優化排序算法
對比Hashtable、HashMap、TreeMap有什么不同?
元素特性:HashTable中的key、value都不能為null;HashMap中的key、value可以為null,很顯然只能有一個key為null的鍵值對,但是允許有多個值為null的鍵值對;TreeMap中當未實現Comparator接口時,key不可以為null;當實現Comparator接口時,若未對null情況進行判斷,則key不可以為null,反之亦然。
順序特性:HashTable、HashMap具有無序特性。TreeMap是利用紅黑樹來實現的(樹中的每個節點的值,都會大于或等于它的左子樹種的所有節點的值,并且小于或等于它的右子樹中的所有節點的值),實現了SortMap接口,能夠對保存的記錄根據鍵進行排序。所以一般需要排序的情況下是選擇TreeMap來進行,默認為升序排序方式(深度優先搜索),可自定義實現Comparator接口實現排序方式。
初始化與增長方式:初始化時:HashTable在不指定容量的情況下的默認容量為11,且不要求底層數組的容量一定要為2的整數次冪;HashMap默認容量為16,且要求容量一定為2的整數次冪。擴容時:Hashtable將容量變為原來的2倍加1;HashMap擴容將容量變為原來的2倍。
HashMap基于哈希思想,實現對數據的讀寫。當我們將鍵值對傳遞給put()方法時,它調用鍵對象的hashCode()方法來計算hashcode,然后找到bucket位置來儲存值對象。當獲取對象時,通過鍵對象的equals()方法找到正確的鍵值對,然后返回值對象。HashMap使用鏈表來解決碰撞問題,當發生碰撞了,對象將會儲存在鏈表的下一個節點中。HashMap在每個鏈表節點中儲存鍵值對對象。當兩個不同的鍵對象的hashcode相同時,它們會儲存在同一個bucket位置的鏈表中,可通過鍵對象的equals()方法用來找到鍵值對。如果鏈表大小超過閾值(8),鏈表就會被改造為樹形結構(紅黑樹)。
解決哈希沖突有哪些典型方法呢?
開放定址法:當關鍵字key的哈希地址p=H(key)出現沖突時,以p為基礎,產生另一個哈希地址p1,如果p1仍然沖突,再以p為基礎,產生另一個哈希地址p2,…,直到找出一個不沖突的哈希地址pi,將相應元素存入其中。
再哈希法:當哈希地址Hi=RH1(key)發生沖突時,再計算Hi=RH2(key)……,直到沖突不再產生。這種方法不易產生聚集,但增加了計算時間。
鏈地址法:這種方法的基本思想是將所有哈希地址為i的元素構成一個稱為同義詞鏈的單鏈表,并將單鏈表的頭指針存在哈希表的第i個單元中,因而查找、插入和刪除主要在同義詞鏈中進行。鏈地址法適用于經常進行插入和刪除的情況。
Java提供了哪些IO方式?NIO如何實現多路復用?
傳統的java.io包,它基于流模型實現,提供了我們最熟知的一些IO功能,比如File抽象、輸入輸出流等。交互方式是同步、阻塞的方式。
很多時候,人們也把java.net下面提供的部分網絡API,比如Socket、ServerSocket、HttpURLConnection也歸類到同步阻塞IO類庫,因為網絡通信同樣是IO行為。
在Java1.4中引入了NIO框架(java.nio包),提供了Channel、Selector、Bufer等新的抽象,可以構建多路復用的、同步非阻塞IO程序,同時提供了更接近操作系統底層的高性能數據操作方式。
在Java7中,NIO有了進一步的改進,也就是NIO2,引入了異步非阻塞IO方式,也有很多人叫它AIO(AsynchronousIO)。異步IO操作基于事件和回調機制,可以簡單理解為,應用操作直接返回,而不會阻塞在那里,當后臺處理完成,操作系統會通知相應線程進行后續工作。
NIO多路復用的局限性是什么呢?
由于nio實際上是同步非阻塞io,是一個線程在同步的進行事件處理,當一組事channel處理完畢以后,去檢查有沒有又可以處理的channel。這也就是同步+非阻塞。同步,指每個準備好的channel處理是依次進行的,非阻塞,是指線程不會傻傻的等待讀。只有當channel準備好后,才會進行。那么就會有這樣一個問題,當每個channel所進行的都是耗時操作時,由于是同步操作,就會積壓很多channel任務,從而完成影響。那么就需要對nio進行類似負載均衡的操作,如用線程池去進行管理讀寫,將channel分給其他的線程去執行,這樣既充分利用了每一個線程,又不至于都堆積在一個線程中,等待執行
以上就是動力節點Java培訓機構小編介紹的“2020年互聯網Java常見面試題”的內容,希望對大家有幫助,如有疑問,請在線咨詢,有專業老師隨時為你服務。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習