1. 程式人生 > >java面試常見問題及總結

java面試常見問題及總結

string stringbuffer stringbuilder
String 字串常量
StringBuffer 字串變數(執行緒安全)
StringBuilder 字串變數(非執行緒安全)


equals和hashcode
equals一定相等,hashcode是用hash碼進行比較。


執行緒池相關
newCachedThreadPool
建立一個可快取執行緒池,如果執行緒池長度超過處理需要,可靈活回收空閒執行緒,若無可回收,則新建執行緒。
newFixedThreadPool
建立一個指定工作執行緒數量的執行緒池。每當提交一個任務就建立一個工作執行緒,如果工作執行緒數量達到執行緒池初始的最大數,則將提交的任務存入到池佇列中。
 newSingleThreadExecutor
建立一個單執行緒化的Executor,即只建立唯一的工作者執行緒來執行任務,它只會用唯一的工作執行緒來執行任務,保證所有任務按照指定順序(FIFO, LIFO, 優先順序)執行。
newScheduleThreadPool
建立一個定長的執行緒池,而且支援定時的以及週期性的任務執行,支援定時及週期性任務執行。
newWorkStealingPool:建立持有足夠執行緒的執行緒池來支援給定的並行級別,並通過使用多個佇列,減少競爭,它需要穿一個並行級別的引數,如果不傳,則被設定為預設的CPU數量。
ForkJoinPool:支援大任務分解成小任務的執行緒池,這是Java8新增執行緒池,通常配合ForkJoinTask介面的子類RecursiveAction或RecursiveTask使用。




hashmap的底層的實現
陣列加連結串列


redis分散式鎖
        String result = jedis.set(lockKey, requestId, SET_IF_NOT_EXIST, SET_WITH_EXPIRE_TIME, expireTime);
setnx方法 如果不存在 加鎖 如果存在 不做任何操作




redis和memcahed區別
Redis不僅僅支援簡單的k/v型別的資料,同時還提供list,set,zset,hash等資料結構的儲存。
Redis支援資料的備份,即master-slave模式的資料備份。
Redis支援資料的持久化,可以將記憶體中的資料保持在磁碟中,重啟的時候可以再次載入進行使用。


redis資料分片
支援多臺機器記憶體共享,範圍分片或者雜湊分片


Http 快取
瀏覽器快取,具體原理不清楚


spring事務
程式設計式事務管理使用TransactionTemplate或者直接使用底層的PlatformTransactionManager。對於程式設計式事務管理,spring推薦使用TransactionTemplate。
宣告式事務管理建立在AOP之上的。其本質是對方法前後進行攔截,然後在目標方法開始之前建立或者加入一個事務,在執行完目標方法之後根據執行情況提交或者回滾事務。宣告式事務最大的優點就是不需要通過程式設計的方式管理事務,這樣就不需要在業務邏輯程式碼中摻雜事務管理的程式碼,只需在配置檔案中做相關的事務規則宣告(或通過基於@Transactional註解的方式),便可以將事務規則應用到業務邏輯中


Threadlocal原理
執行緒級別上下文,ThreadLocalMap為當前執行緒的一個副本。


服務治理,服務註冊和發現的實現
阿里的dubbo沒用過。結合用zk實現談一下


JVM記憶體區域劃分
程式計數器(Program Counter Register)、Java棧(VM Stack)、本地方法棧(Native Method Stack)、方法區(Method Area)、堆(Heap) 直接記憶體


類載入機制
jvm類載入機制
載入(Loading)、驗證(Verification)、準備(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和解除安裝(Unloading)7個階段。其中準備、驗證、解析3個部分統稱為連線(Linking)


Spring AOP 實現方式及原理
基於介面的動態代理(Dynamic Proxy)
基於子類化的CGLIB代理
JDK動態代理和CGLIB動態代理。JDK動態代理通過反射來接收被代理的類,並且要求被代理的類必須實現一個介面。JDK動態代理的核心是InvocationHandler介面和Proxy類。


設計模式
建立型模式,共五種:工廠方法模式、抽象工廠模式、單例模式、建造者模式、原型模式。
結構型模式,共七種:介面卡模式、裝飾器模式、代理模式、外觀模式、橋接模式、組合模式、享元模式。
行為型模式,共十一種:策略模式、模板方法模式、觀察者模式、迭代子模式、責任鏈模式、命令模式、備忘錄模式、狀態模式、訪問者模式、中介者模式、直譯器模式。


執行緒池原理及引數
ThreadPoolExecutor mExecutor = new ThreadPoolExecutor(corePoolSize,// 核心執行緒數  
                        maximumPoolSize, // 最大執行緒數  
                        keepAliveTime, // 閒置執行緒存活時間  
                        TimeUnit.MILLISECONDS,// 時間單位  
                        new LinkedBlockingDeque<Runnable>(),// 執行緒佇列  
                        Executors.defaultThreadFactory(),// 執行緒工廠  
                        new AbortPolicy()// 佇列已滿,而且當前執行緒數已經超過最大執行緒數時的異常處理策略  
                );  


限流演算法
執行緒池等待  zk日誌演算法


MySQL 索引資料結構
B+樹


ORACLE資料庫事務隔離級別
1、幻想讀:事務T1讀取一條指定where條件的語句,返回結果集。此時事務T2插入一行新記錄,恰好滿足T1的where條件。然後T1使用相同的條件再次查詢,結果集中可以看到T2插入的記錄,這條新紀錄就是幻想。
2、不可重複讀取:事務T1讀取一行記錄,緊接著事務T2修改了T1剛剛讀取的記錄,然後T1再次查詢,發現與第一次讀取的記錄不同,這稱為不可重複讀。
3、髒讀:事務T1更新了一行記錄,還未提交所做的修改,這個T2讀取了更新後的資料,然後T1執行回滾操作,取消剛才的修改,所以T2所讀取的行就無效,也就是髒資料。


執行緒池shuntdown
1、shutdown()


問:shutdown()有什麼功能?


答:阻止新來的任務提交,對已經提交了的任務不會產生任何影響。當已經提交的任務執行完後,它會將那些閒置的執行緒(idleWorks)進行中斷,這個過程是非同步的。


問:如何阻止新來的任務提交?


答:通過將執行緒池的狀態改成SHUTDOWN,當再將執行execute提交任務時,如果測試到狀態不為RUNNING,則丟擲rejectedExecution,從而達到阻止新任務提交的目的。


問:為何對提交的任務不產生任何影響?


答:在呼叫中斷任務的方法時,它會檢測workers中的任務,如果worker對應的任務沒有中斷,並且是空閒執行緒,它才會去中斷。另外的話,workQueue中的值,還是按照一定的邏輯順序不斷的往works中進行輸送的,這樣一來,就可以保證提交的任務按照執行緒本身的邏輯執行,不受到影響。


 


2、shutdownNow()


問:shutdownNow()有什麼功能?


答:阻止新來的任務提交,同時會中斷當前正在執行的執行緒,即workers中的執行緒。另外它還將workQueue中的任務給移除,並將這些任務新增到列表中進行返回。


問:如何阻止新來的任務提交?


答:通過將執行緒池的狀態改成STOP,當再將執行execute提交任務時,如果測試到狀態不為RUNNING,則丟擲rejectedExecution,從而達到阻止新任務提交的目的.


問:如果我提交的任務程式碼塊中,正在等待某個資源,而這個資源沒到,但此時執行shutdownNow(),會出現什麼情況?


答:當執行shutdownNow()方法時,如遇已經啟用的任務,並且處於阻塞狀態時,shutdownNow()會執行1次中斷阻塞的操作,此時對應的執行緒報InterruptedException,如果後續還要等待某個資源,則按正常邏輯等待某個資源的到達。例如,一個執行緒正在sleep狀態中,此時執行shutdownNow(),它向該執行緒發起interrupt()請求,而sleep()方法遇到有interrupt()請求時,會丟擲InterruptedException(),並繼續往下執行。在這裡要提醒注意的是,在啟用的任務中,如果有多個sleep(),該方法只會中斷第一個sleep(),而後面的仍然按照正常的執行邏輯進行。


事務隔離級別


  隔離級別是指若干個併發的事務之間的隔離程度。TransactionDefinition 介面中定義了五個表示隔離級別的常量:


TransactionDefinition.ISOLATION_DEFAULT:這是預設值,表示使用底層資料庫的預設隔離級別。對大部分資料庫而言,通常這值就是TransactionDefinition.ISOLATION_READ_COMMITTED。
TransactionDefinition.ISOLATION_READ_UNCOMMITTED:該隔離級別表示一個事務可以讀取另一個事務修改但還沒有提交的資料。該級別不能防止髒讀,不可重複讀和幻讀,因此很少使用該隔離級別。比如PostgreSQL實際上並沒有此級別。
TransactionDefinition.ISOLATION_READ_COMMITTED:該隔離級別表示一個事務只能讀取另一個事務已經提交的資料。該級別可以防止髒讀,這也是大多數情況下的推薦值。
TransactionDefinition.ISOLATION_REPEATABLE_READ:該隔離級別表示一個事務在整個過程中可以多次重複執行某個查詢,並且每次返回的記錄都相同。該級別可以防止髒讀和不可重複讀。
TransactionDefinition.ISOLATION_SERIALIZABLE:所有的事務依次逐個執行,這樣事務之間就完全不可能產生干擾,也就是說,該級別可以防止髒讀、不可重複讀以及幻讀。但是這將嚴重影響程式的效能。通常情況下也不會用到該級別。
事務傳播行為


所謂事務的傳播行為是指,如果在開始當前事務之前,一個事務上下文已經存在,此時有若干選項可以指定一個事務性方法的執行行為。在TransactionDefinition定義中包括瞭如下幾個表示傳播行為的常量:


TransactionDefinition.PROPAGATION_REQUIRED:如果當前存在事務,則加入該事務;如果當前沒有事務,則建立一個新的事務。這是預設值。
TransactionDefinition.PROPAGATION_REQUIRES_NEW:建立一個新的事務,如果當前存在事務,則把當前事務掛起。
TransactionDefinition.PROPAGATION_SUPPORTS:如果當前存在事務,則加入該事務;如果當前沒有事務,則以非事務的方式繼續執行。
TransactionDefinition.PROPAGATION_NOT_SUPPORTED:以非事務方式執行,如果當前存在事務,則把當前事務掛起。
TransactionDefinition.PROPAGATION_NEVER:以非事務方式執行,如果當前存在事務,則丟擲異常。
TransactionDefinition.PROPAGATION_MANDATORY:如果當前存在事務,則加入該事務;如果當前沒有事務,則丟擲異常。
TransactionDefinition.PROPAGATION_NESTED:如果當前存在事務,則建立一個事務作為當前事務的巢狀事務來執行;如果當前沒有事務,則該取值等價於TransactionDefinition.PROPAGATION_REQUIRED。


CMS演算法
初始標記(CMS-initial-mark) -> 併發標記(CMS-concurrent-mark) -> 重新標記(CMS-remark) -> 併發清除(CMS-concurrent-sweep) ->併發重設狀態等待下次CMS的觸發(CMS-concurrent-reset)。
其中的1,3兩個步驟需要暫停所有的應用程式執行緒的。第一次暫停從root物件開始標記存活的物件,這個階段稱為初始標記;第二次暫停是在併發標記之後, 暫停所有應用程式執行緒,重新標記併發標記階段遺漏的物件(在併發標記階段結束後物件狀態的更新導致)。第一次暫停會比較短,第二次暫停通常會比較長,並且 remark這個階段可以並行標記。