Java類加載器面試題集錦

前言

程序在啓動的時候,並不會一次性加載程序所要用的全部class文件,而是根據程序的須要,經過Java的類加載機制(ClassLoader)來動態加載某個class文件到內存當中的,從而只有class文件被載入到了內存以後,才能被其它class所引用。因此ClassLoader就是用來動態加載class文件到內存當中用的。面試

  • Java 8集合中的Stream至關於高級版的Iterator
  • Stream API經過Lambda表達式對集合進行各類很是便利高效的聚合操做,或者大批量數據操做
  • Stream的聚合操做與數據庫SQL的聚合操做sorted、filter、map等很是相似
  • 在數據操做方面,Stream不只能夠經過串行的方式實現數據操做,還能夠經過並行的方式處理大批量數據,提升處理效率

Java集合的根接口是Collection,它又繼承了迭代接口Iterable List接口和Set接口繼承了Collection接口 Map接口是獨立的接口,並無繼承Collection接口 (這裏是重點,面試可能問的比較多) List接口經常使用的實現類有:ArrayList、LinkedList、Vector Set接口經常使用的實現類有:HashSet、LinkedHashSet、TreeSet Map接口經常使用的實現類有:HashMap、HashTable、TreeMap算法

內容

一般會將中間操做稱爲懶操做,正是由於懶操做結合終結操做,數據源構成的處理管道(Pipeline),實現了Stream的高效數據庫

JVM在判斷兩個class是否相同時,不只要判斷兩個類名是否相同,還要判斷是不是同一個類加載器加載的。數組

避免重複加載,父類已經加載了,則子CLassLoader沒有必要再次加載。 考慮安全因素,假設自定義一個String類,除非改變JDK中CLassLoader的搜索類的默認算法,不然用戶自定義的CLassLoader如法加載一個本身寫的String類,由於String類在啓動時就被引導類加載器Bootstrap CLassLoader加載了。安全

數組和集合都是Java中的容器 數組的長度是固定的,集合的長度是可變的 數組只能存儲相同數據類型的數據,這裏的數據類型能夠是基本數據類型,也能夠是引用類型 集合能夠存儲不一樣數據類型的對象的引用(但通常狀況下,咱們會使用泛型來約定只使用1種數據類型),但不能存儲基本數據類型。線程

若是理解了,你們考慮這麼一個問題:ReentrantLock(或者其它基於AQS實現的鎖)是如何保證代碼段中變量(變量主要是指共享變量,存在競爭問題的變量)的可見性?對象

Java內存模型的主要目標是定義程序中各個變量的訪問規則,即在虛擬機中將變量存儲到內存和從內存中取出變量這樣的底層細節。此處的變量主要是指共享變量,存在競爭問題的變量。Java內存模型規定全部的變量都存儲在主內存中,而每條線程還有本身的工做內存,線程的工做內存中保存了該線程使用到的變量的主內存副本拷貝,線程對變量的全部操做(讀取、賦值等)都必須在工做內存中進行,而不能直接讀寫主內存中的變量(根據Java虛擬機規範的規定,volatile變量依然有共享內存的拷貝,可是因爲它特殊的操做順序性規定——從工做內存中讀寫數據前,必須先將主內存中的數據同步到工做內存中,全部看起來如同直接在主內存中讀寫訪問通常,所以這裏的描述對於volatile也不例外)。不一樣線程之間也沒法直接訪問對方工做內存中的變量,線程間變量值得傳遞均須要經過主內存來完成。blog

小結

若是咱們仔細分析concurrent包的源代碼實現,會發現一個通用化的實現模式。繼承

首先,聲明共享變量爲volatile。接口

而後,使用CAS的原子條件更新來實現線程之間的同步。

同時,配合以volatile的讀/寫和CAS所具備的volatile讀和寫的內存語義來實現線程之間的通訊。

相關文章
相關標籤/搜索