0920Java面試知識點準備

  1. 集合中哪些是線程安全,哪些不是線程安全的?

常見的集合如LinkedList+ArrarList+HashMap集合都是線程不安全的嗎,通過查看集合中的成員方法可以看到沒有添加synchronzied關鍵字.而線程安全的集合由Vector+HashTable,這2個集合中的成員方法添加了synchronzied關鍵字.同時還有一些CorruentHashMap等線程安全集合這裏暫不做複述。

  1. ArrayList集合的內部實現原理?
    ArrayList集合內部的底層實現原理實際上就是一個可變長度的對象數組.
    通過向集合中添加元素或刪除元素的同時,根據內存存儲對象的數組長度與添加元素的長度進行對比判斷,得出是否需要對對象數組進行擴容的依據.而ArrayList集合的刪除元素方法是通過獲取對象元素在對象數組中的位置,通過移動元素後面的對象移動到刪除元素的位置上而實現的,同時將空出來的數組位置 設置爲null,讓GC垃圾回收期進行回收.同時ArrayList集合類繼承了AbstractList類,並且實現List+RandomAccess+Servial接口,這樣得以實現隨機訪問的原理.其中包含4個常量+3個變量.主要是序列化id,默認數組長度10,構造方法使用的默認空對象數組,空對象數組. 修改次數+對象數組存儲位置+集合大小.數組對象存儲在堆中,是一段連續的內存空間.每一個數組元素的下標都是知道的,是首地址+首地址*下標大小.但是對於插入元素來講,需要移動前面或者後面元素的位置.所以總的來講動態數組集合存在查詢塊,插入刪除慢的特點.

  2. java中獲取反射類的三種方式?反射主要應用於哪些方面?
    類名.class/this.getClass()/Class.ForName(“包名路徑”)
    反射的目的主要是能夠動態的獲取加載到內存空間中的實例類文件,能夠對類中方法和變量進行操作.反射能夠獲取到實例類中的成員變量及方法,主要通過Class類來實現.另外有一個@Annotation註解就是通過 創建一個@interface接口,添加自定義屬性或者方法,然後在需要的地方結合註解 對方法 或者變量進行控制.

  3. HashMap集合的內部結構?
    數據+鏈表+紅黑樹。HashMap集合中的底層數據結構是數組+鏈表+紅黑樹.
    數組下標存儲着鏈表的頭結點,當鏈表中數量大於8的時候會將鏈表轉換爲紅黑樹,這是jdk1.8之後新增的一個特性.

    數組:在堆內存空間一段連續的內存空間,數組元素的位置都是已知的。下標位置=下標位置+下標位置*數組下標.所以查詢效率很高,但插入或者刪除元素需要調整其他數組元素的位置,所以較慢.

鏈表:在堆內存空間中不連續的一端存儲區域.每一個節點至少存在着當前節點的位置以及下一個節點的位置.這樣在查詢的時候就需要從頭開始遍歷出所有元素的位置.所以查詢效率很慢.但是在插入或者刪除元素的時候,只需要考慮當前節點及前面節點的下一個節點位置即可。

HashMap集合中存在着Node<K,V>[] table哈希桶數組,說白了就是HashMap結構中的數組,Node<K,V>就是HashMap中的單鏈表結構,是集合中的靜態內部類,實現Map.Entry<K,V>結構,存儲着K,V鍵值對,hash數組下標的位置,以及下一個鏈表的位置.正式因爲Hash集合存在着哈希碰撞,也就是不同的key可能產生想用的hashCode值,導致一個Node<K,V>哈希桶數組下標位置上需要放2個元素,那麼就需要利用元素掛載在單鏈表上,如果超過8個採用紅黑樹結構. 數組擴容的原理其實就是當聲明HashMap集合的時候有一個threhold最大容量長度,默認爲16,當超過默認負載因子0.75,也就是12個的時候,就會調用resize()方法進行集合擴容。

  1. 關於時間複雜度的O(1)和O(n)的理解?
    拿List舉例子,就是LinkedList集合增刪快,查詢慢.所以增刪時間複雜度爲O(1),
    查詢複雜度爲O(n)。而ArrayList集合查詢快,增刪慢.所以查詢複雜度爲O(1),
    增刪複雜度爲O(n)。簡而言之就是複雜度高的是O(n),簡單的是O(1)。

  2. java類加載機制底層實現原理?參考鏈接地址
    java類加載機制主要由3個過程,目的在於將類加載到jvm內存中.包含加載、連接、初始化.連接又包含3個過程,驗證,準備,解析三個過程.
    加載: 將class文件加載到jvm內存中,稱爲類加載,類加載器由jvm提供.加載過程會爲該類創建一個java.lang.Class對象,這也就是使用反射的前提條件.由jvm提供的加載器稱爲系統加載器.當然開發者也可以通過繼承ClassLoader類來創建自己的類加載器.類加載器我無需等到該類使用的時候才加載,java虛擬機允許預先加載某些類.

    **連接:**當jvm將class文件加載到類中,生成一個class對象後,進入到連接階段,連接階段的過程包含 驗證 準備 解析三個過程,主要目的是將類的二進制數據加載到jre中(java運行環境中).
    驗證:主要用於檢查類內部是否存在正確的內部構造.(java語言相對於c++語言來講是安全語言,主要是因爲java語言會有這個階段,比如數組越界的問題).主要目的在於防止class文件的內部字節流內容不會對jvm虛擬機造成損害.主要包含4種驗證:文件格式驗證/元數據驗證/字節碼驗證/符號引用驗證.
    準備:連接的準備階段主要爲類的靜態變量分配內存,設置默認的初始值.
    解析:將二進制數據中的符號引用轉換爲直接引用.符號引用是指任何字面量的引用,而直接引用適用於指向事物的指針.

    **初始化:**爲類的靜態變量設置正確的初始值.類似private static int a=10;
    在準備階段將類的靜態變量設置爲0,而在初始化階段是設置正確的初始值10,所以本質上是沒有衝突的.

大致流程是這樣的.java 編譯器將java文件編譯成class文件–》通過jvm提供的系統類加載器將classs文件加載到內存中,同時爲每一個類創建一個Class類對象—>進入鏈接階段,主要是將內存中的class文件轉換爲二進制數據放到jre環境中去—>驗證二進制數據內部結構是否正確,如果出現不正確的結構如數組越界提示出來—>準備,爲類中靜態變量分配空間,並設置默認初始值–>解析,主要是將裏面的符號引用轉換爲直接引用.–>初始化,將類中的靜態變量設置正確的初始值.
在這裏插入圖片描述

  1. 類加載的時機?
    1.創建一個類的實例,也就是new一個對象
    2.訪問類的靜態變量
    3.訪問類的成員方法
    4.實例化子類對象時首先需要加載父類
    5.Class.forName獲取類
    說白了無非就是用到類的屬性或方法的時候,或者在創建類實例的時候,會加載類.

  2. 類加載器分爲哪幾種?
    類加載的過程主要是將class文件加載到jvm內存中.併爲類生成一個java.lang.Class類對象.java中用全限定名去區分不同的類.而jvm中則需要通過全限定名+類加載器去區分不同的類.因爲不同的類加載器所加載的類是不通用的.比如pg包下的Person類,通過kl加載器加載,那麼該class對象在jvm中的標識就是Person.pg.kl.

jvm中有3種預定的類加載器,當jvm啓動的時候,會使用到下面三種類加載器.
根類加載器:主要用於加載java中的核心代碼包.比如java_home下面jre文件下的rt.jar包(bootstrap loader).
擴展加載器;主要用於加載jre的擴展目錄(extention loader).
系統類加載器:負責加載classpath路徑下的class文件.一般來講沒有特別聲明的都是通過該加載器加載的(system class loader).

  1. java中類加載機制有哪些?
    類加載的目的是將class文件加載到內存中.常見的類加載機制包含全盤加載,雙親委派,緩存機制.
    全盤負責:指的就是當使用類加載器去加載某個類文件並生成class對象時,該類的父類或者引用都由當前這個類加載完成.

雙親委派:雙親委派加載機制主要指的是當加載一個類的時候首先嚐試使用該類的父類加載器去加載當前類,只有當父類加載器無法使用的時候,才使用當前的類加載器去加載當前類.

緩存機制: 緩存機制指的是隻要加載過的類,都會被放入緩存.當一個class類需要被加載的時候,首先判斷緩存中是否存在該class類,如果不存在再調用類加載器進行加載並緩存起來,方便下次的使用.這就是爲什麼修改了class文件後,需要重啓jvm的原因了.因爲該類已經被緩存起來了,下次使用還是用的緩存的,所以需要重啓.

雙親委派機制的原理及優勢?
雙親委派類加載機制主要是當需要加載當前類的時候,首先判斷該父類加載器是否能夠加載當前類,當然如果該父類還有上級,首先到最上級 然後依次遞歸到當前類,如果父類類加載器都沒有辦法,那麼說明需要子加載器自己去想辦法.

優勢在於如果一個類被多次使用或者在不同的地方如靜態變量或者講臺方法等需要類加載的時候,被多次加載那肯定不好的,所以雙親委派當該父類加載器加載之後,便不會在進行加載.其次是考慮到安全問題,類加載器加載類如果是java中的核心類如java.lang.Integer的話,那麼如果網絡上傳一個同樣的類,當發現該類已經被加載 便不會重新加載.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章