大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 學習攻略 Java學習 最常見的208道Java最新面試題及答案(四)

最常見的208道Java最新面試題及答案(四)

更新時間:2019-10-15 13:56:09 來源:動力節點 瀏覽2499次


  十三、 Java最新面試題及答案:MyBatis模塊


  125、MyBatis 中 #{}和 ${}的區別是什么?


  #{}是預編譯處理,${}是字符替換。在使用 #{}時,MyBatis 會將 SQL 中的 #{}替換成“?”,配合 PreparedStatement 的 set 方法賦值,這樣可以有效的防止 SQL 注入,保證程序的運行安全。


  126、MyBatis 有幾種分頁方式?


  分頁方式:邏輯分頁和物理分頁。


  邏輯分頁:使用 MyBatis 自帶的 RowBounds 進行分頁,它是一次性查詢很多數據,然后在數據中再進行檢索。


  物理分頁:自己手寫 SQL 分頁或使用分頁插件 PageHelper,去數據庫查詢指定條數的分頁數據的形式。


  127、RowBounds 是一次性查詢全部結果嗎?為什么?


  RowBounds 表面是在“所有”數據中檢索數據,其實并非是一次性查詢出所有數據,因為 MyBatis 是對 jdbc 的封裝,在 jdbc 驅動中有一個 Fetch Size 的配置,它規定了每次最多從數據庫查詢多少條數據,假如你要查詢更多數據,它會在你執行 next()的時候,去查詢更多的數據。就好比你去自動取款機取 10000 元,但取款機每次最多能取 2500 元,所以你要取 4 次才能把錢取完。只是對于 jdbc 來說,當你調用 next()的時候會自動幫你完成查詢工作。這樣做的好處可以有效的防止內存溢出。


  Fetch Size 官方相關文檔:http://t. cn/EfSE2g3


  128、MyBatis 邏輯分頁和物理分頁的區別是什么?


  邏輯分頁是一次性查詢很多數據,然后再在結果中檢索分頁的數據。這樣做弊端是需要消耗大量的內存、有內存溢出的風險、對數據庫壓力較大。


  物理分頁是從數據庫查詢指定條數的數據,彌補了一次性全部查出的所有數據的種種缺點,比如需要大量的內存,對數據庫查詢壓力較大等問題。


  129、MyBatis 是否支持延遲加載?延遲加載的原理是什么?


  MyBatis 支持延遲加載,設置 lazyLoadingEnabled=true 即可。


  延遲加載的原理的是調用的時候觸發加載,而不是在初始化的時候就加載信息。比如調用 a. getB(). getName(),這個時候發現 a. getB() 的值為 null,此時會單獨觸發事先保存好的關聯 B 對象的 SQL,先查詢出來 B,然后再調用 a. setB(b),而這時候再調用 a. getB(). getName() 就有值了,這就是延遲加載的基本原理。





  130、說一下 MyBatis 的一級緩存和二級緩存?


  一級緩存:基于 PerpetualCache 的 HashMap 本地緩存,它的聲明周期是和 SQLSession 一致的,有多個 SQLSession 或者分布式的環境中數據庫操作,可能會出現臟數據。當 Session flush 或 close 之后,該 Session 中的所有 Cache 就將清空,默認一級緩存是開啟的。


  二級緩存:也是基于 PerpetualCache 的 HashMap 本地緩存,不同在于其存儲作用域為 Mapper 級別的,如果多個SQLSession之間需要共享緩存,則需要使用到二級緩存,并且二級緩存可自定義存儲源,如 Ehcache。默認不打開二級緩存,要開啟二級緩存,使用二級緩存屬性類需要實現 Serializable 序列化接口(可用來保存對象的狀態)。


  開啟二級緩存數據查詢流程:二級緩存 -> 一級緩存 -> 數據庫。


  緩存更新機制:當某一個作用域(一級緩存 Session/二級緩存 Mapper)進行了C/U/D 操作后,默認該作用域下所有 select 中的緩存將被 clear。


  131、MyBatis 和 hibernate 的區別有哪些?


  靈活性:MyBatis 更加靈活,自己可以寫 SQL 語句,使用起來比較方便。


  可移植性:MyBatis 有很多自己寫的 SQL,因為每個數據庫的 SQL 可以不相同,所以可移植性比較差。


  學習和使用門檻:MyBatis 入門比較簡單,使用門檻也更低。


  二級緩存:hibernate 擁有更好的二級緩存,它的二級緩存可以自行更換為第三方的二級緩存。


  132、MyBatis 有哪些執行器(Executor)?


  MyBatis 有三種基本的Executor執行器:


  SimpleExecutor:每執行一次 update 或 select 就開啟一個 Statement 對象,用完立刻關閉 Statement 對象;


  ReuseExecutor:執行 update 或 select,以 SQL 作為 key 查找 Statement 對象,存在就使用,不存在就創建,用完后不關閉 Statement 對象,而是放置于 Map 內供下一次使用。簡言之,就是重復使用 Statement 對象;


  BatchExecutor:執行 update(沒有 select,jdbc 批處理不支持 select),將所有 SQL 都添加到批處理中(addBatch()),等待統一執行(executeBatch()),它緩存了多個 Statement 對象,每個 Statement 對象都是 addBatch()完畢后,等待逐一執行 executeBatch()批處理,與 jdbc 批處理相同。


  133、MyBatis 分頁插件的實現原理是什么?


  分頁插件的基本原理是使用 MyBatis 提供的插件接口,實現自定義插件,在插件的攔截方法內攔截待執行的 SQL,然后重寫 SQL,根據 dialect 方言,添加對應的物理分頁語句和物理分頁參數。


  134、MyBatis 如何編寫一個自定義插件?


  自定義插件實現原理:


  MyBatis 自定義插件針對 MyBatis 四大對象(Executor、StatementHandler、ParameterHandler、ResultSetHandler)進行攔截:


  Executor:攔截內部執行器,它負責調用 StatementHandler 操作數據庫,并把結果集通過 ResultSetHandler 進行自動映射,另外它還處理了二級緩存的操作;


  StatementHandler:攔截 SQL 語法構建的處理,它是 MyBatis 直接和數據庫執行 SQL 腳本的對象,另外它也實現了 MyBatis 的一級緩存;


  ParameterHandler:攔截參數的處理;


  ResultSetHandler:攔截結果集的處理。


  自定義插件實現關鍵:


  MyBatis 插件要實現 Interceptor 接口,接口包含的方法,如下:


public interface Interceptor { 

Object intercept(Invocation invocation) throws Throwable; 

Object plugin(Object target); 

void setProperties(Properties properties);

}


  setProperties 方法是在 MyBatis 進行配置插件的時候可以配置自定義相關屬性,即:接口實現對象的參數配置;


  plugin 方法是插件用于封裝目標對象的,通過該方法我們可以返回目標對象本身,也可以返回一個它的代理,可以決定是否要進行攔截進而決定要返回一個什么樣的目標對象,官方提供了示例:return Plugin. wrap(target, this);


  intercept 方法就是要進行攔截的時候要執行的方法。


  自定義插件實現示例:


  官方插件實現:


@Intercepts({@Signature(type = Executor. class, method = "query",

args = {MappedStatement. class, Object. class, RowBounds. class, ResultHandler. class})})

public class TestInterceptor implements Interceptor {

public Object intercept(Invocation invocation) throws Throwable {

Object target = invocation. getTarget(); //被代理對象

Method method = invocation. getMethod(); //代理方法

Object[] args = invocation. getArgs(); //方法參數

// do something . . . . . . 方法攔截前執行代碼塊

Object result = invocation. proceed();

// do something . . . . . . . 方法攔截后執行代碼塊

return result;

}

public Object plugin(Object target) {

return Plugin. wrap(target, this);

}

}



  十四、Java最新面試題及答案:RabbitMQ模塊


  135、RabbitMQ 的使用場景有哪些?


  搶購活動,削峰填谷,防止系統崩塌。


  延遲信息處理,比如 10 分鐘之后給下單未付款的用戶發送郵件提醒。


  解耦系統,對于新增的功能可以單獨寫模塊擴展,比如用戶確認評價之后,新增了給用戶返積分的功能,這個時候不用在業務代碼里添加新增積分的功能,只需要把新增積分的接口訂閱確認評價的消息隊列即可,后面再添加任何功能只需要訂閱對應的消息隊列即可。


  136、RabbitMQ 有哪些重要的角色?


  RabbitMQ 中重要的角色有:生產者、消費者和代理:


  生產者:消息的創建者,負責創建和推送數據到消息服務器;


  消費者:消息的接收方,用于處理數據和確認消息;


  代理:就是 RabbitMQ 本身,用于扮演“快遞”的角色,本身不生產消息,只是扮演“快遞”的角色。


  137、RabbitMQ 有哪些重要的組件?


  ConnectionFactory(連接管理器):應用程序與Rabbit之間建立連接的管理器,程序代碼中使用。


  Channel(信道):消息推送使用的通道。


  Exchange(交換器):用于接受、分配消息。


  Queue(隊列):用于存儲生產者的消息。


  RoutingKey(路由鍵):用于把生成者的數據分配到交換器上。


  BindingKey(綁定鍵):用于把交換器的消息綁定到隊列上。


  138、RabbitMQ 中 vhost 的作用是什么?


  vhost:每個 RabbitMQ 都能創建很多 vhost,我們稱之為虛擬主機,每個虛擬主機其實都是 mini 版的RabbitMQ,它擁有自己的隊列,交換器和綁定,擁有自己的權限機制。


  139、RabbitMQ 的消息是怎么發送的?


  首先客戶端必須連接到 RabbitMQ 服務器才能發布和消費消息,客戶端和 rabbit server 之間會創建一個 tcp 連接,一旦 tcp 打開并通過了認證(認證就是你發送給 rabbit 服務器的用戶名和密碼),你的客戶端和 RabbitMQ 就創建了一條 amqp 信道(channel),信道是創建在“真實” tcp 上的虛擬連接,amqp 命令都是通過信道發送出去的,每個信道都會有一個唯一的 id,不論是發布消息,訂閱隊列都是通過這個信道完成的。


  140、RabbitMQ 怎么保證消息的穩定性?


  提供了事務的功能。


  通過將 channel 設置為 confirm(確認)模式。


  141、RabbitMQ 怎么避免消息丟失?


  把消息持久化磁盤,保證服務器重啟消息不丟失。


  每個集群中至少有一個物理磁盤,保證消息落入磁盤。


  142、要保證消息持久化成功的條件有哪些?


  聲明隊列必須設置持久化 durable 設置為 true.


  消息推送投遞模式必須設置持久化,deliveryMode 設置為 2(持久)。


  消息已經到達持久化交換器。


  消息已經到達持久化隊列。


  以上四個條件都滿足才能保證消息持久化成功。


  143、RabbitMQ 持久化有什么缺點?


  持久化的缺地就是降低了服務器的吞吐量,因為使用的是磁盤而非內存存儲,從而降低了吞吐量。可盡量使用 ssd 硬盤來緩解吞吐量的問題。


  144、RabbitMQ 有幾種廣播類型?


  direct(默認方式):最基礎最簡單的模式,發送方把消息發送給訂閱方,如果有多個訂閱者,默認采取輪詢的方式進行消息發送。


  headers:與 direct 類似,只是性能很差,此類型幾乎用不到。


  fanout:分發模式,把消費分發給所有訂閱者。


  topic:匹配訂閱模式,使用正則匹配到消息隊列,能匹配到的都能接收到。


  145、RabbitMQ 怎么實現延遲消息隊列?


  延遲隊列的實現有兩種方式:


  通過消息過期后進入死信交換器,再由交換器轉發到延遲消費隊列,實現延遲功能;


  使用 RabbitMQ-delayed-message-exchange 插件實現延遲功能。


  146、RabbitMQ 集群有什么用?


  集群主要有以下兩個用途:


  高可用:某個服務器出現問題,整個 RabbitMQ 還可以繼續使用;


  高容量:集群可以承載更多的消息量。


  147、RabbitMQ 節點的類型有哪些?


  磁盤節點:消息會存儲到磁盤。


  內存節點:消息都存儲在內存中,重啟服務器消息丟失,性能高于磁盤類型。


  148、RabbitMQ 集群搭建需要注意哪些問題?


  各節點之間使用“–link”連接,此屬性不能忽略。


  各節點使用的 erlang cookie 值必須相同,此值相當于“秘鑰”的功能,用于各節點的認證。


  整個集群中必須包含一個磁盤節點。


  149、RabbitMQ 每個節點是其他節點的完整拷貝嗎?為什么?


  不是,原因有以下兩個:


  存儲空間的考慮:如果每個節點都擁有所有隊列的完全拷貝,這樣新增節點不但沒有新增存儲空間,反而增加了更多的冗余數據;


  性能的考慮:如果每條消息都需要完整拷貝到每一個集群節點,那新增節點并沒有提升處理消息的能力,最多是保持和單節點相同的性能甚至是更糟。


  150、RabbitMQ 集群中唯一一個磁盤節點崩潰了會發生什么情況?


  如果唯一磁盤的磁盤節點崩潰了,不能進行以下操作


  不能創建隊列


  不能創建交換器


  不能創建綁定


  不能添加用戶


  不能更改權限


  不能添加和刪除集群節點


  唯一磁盤節點崩潰了,集群是可以保持運行的,但你不能更改任何東西。


  151、RabbitMQ 對集群節點停止順序有要求嗎?


  RabbitMQ 對集群的停止的順序是有要求的,應該先關閉內存節點,最后再關閉磁盤節點。如果順序恰好相反的話,可能會造成消息的丟失。



  十五、Java最新面試題及答案:Kafka


  152、kafka 可以脫離 zookeeper 單獨使用嗎?為什么?


  kafka 不能脫離 zookeeper 單獨使用,因為 kafka 使用 zookeeper 管理和協調 kafka 的節點服務器。


  153、kafka 有幾種數據保留的策略?


  kafka 有兩種數據保存策略:按照過期時間保留和按照存儲的消息大小保留。


  154、kafka 同時設置了 7 天和 10G 清除數據,到第五天的時候消息達到了 10G,這個時候 kafka 將如何處理?


  這個時候 kafka 會執行數據清除工作,時間和大小不論那個滿足條件,都會清空數據。


  155、什么情況會導致 kafka 運行變慢?


  cpu 性能瓶頸


  磁盤讀寫瓶頸


  網絡瓶頸


  156、使用 kafka 集群需要注意什么?


  集群的數量不是越多越好,最好不要超過 7 個,因為節點越多,消息復制需要的時間就越長,整個群組的吞吐量就越低。


  集群數量最好是單數,因為超過一半故障集群就不能用了,設置為單數容錯率更高。



  十六、Java最新面試題及答案:Zookeeper模塊


  157、zookeeper 是什么?


  zookeeper 是一個分布式的,開放源碼的分布式應用程序協調服務,是 google chubby 的開源實現,是 hadoop 和 hbase 的重要組件。它是一個為分布式應用提供一致性服務的軟件,提供的功能包括:配置維護、域名服務、分布式同步、組服務等。


  158、zookeeper 都有哪些功能?


  集群管理:監控節點存活狀態、運行請求等。


  主節點選舉:主節點掛掉了之后可以從備用的節點開始新一輪選主,主節點選舉說的就是這個選舉的過程,使用 zookeeper 可以協助完成這個過程。


  分布式鎖:zookeeper 提供兩種鎖:獨占鎖、共享鎖。獨占鎖即一次只能有一個線程使用資源,共享鎖是讀鎖共享,讀寫互斥,即可以有多線線程同時讀同一個資源,如果要使用寫鎖也只能有一個線程使用。zookeeper可以對分布式鎖進行控制。


  命名服務:在分布式系統中,通過使用命名服務,客戶端應用能夠根據指定名字來獲取資源或服務的地址,提供者等信息。


  159、zookeeper 有幾種部署模式?


  zookeeper 有三種部署模式:


  單機部署:一臺集群上運行;


  集群部署:多臺集群運行;


  偽集群部署:一臺集群啟動多個 zookeeper 實例運行。


  160、zookeeper 怎么保證主從節點的狀態同步?


  zookeeper 的核心是原子廣播,這個機制保證了各個 server 之間的同步。實現這個機制的協議叫做 zab 協議。zab 協議有兩種模式,分別是恢復模式(選主)和廣播模式(同步)。當服務啟動或者在領導者崩潰后,zab 就進入了恢復模式,當領導者被選舉出來,且大多數 server 完成了和 leader 的狀態同步以后,恢復模式就結束了。狀態同步保證了 leader 和 server 具有相同的系統狀態。


  161、集群中為什么要有主節點?


  在分布式環境中,有些業務邏輯只需要集群中的某一臺機器進行執行,其他的機器可以共享這個結果,這樣可以大大減少重復計算,提高性能,所以就需要主節點。


  162、集群中有 3 臺服務器,其中一個節點宕機,這個時候 zookeeper 還可以使用嗎?


  可以繼續使用,單數服務器只要沒超過一半的服務器宕機就可以繼續使用。


  163、說一下 zookeeper 的通知機制?


  客戶端端會對某個 znode 建立一個 watcher 事件,當該 znode 發生變化時,這些客戶端會收到 zookeeper 的通知,然后客戶端可以根據 znode 變化來做出業務上的改變。



  十七、Java最新面試題及答案:MySQL模塊


  164、數據庫的三范式是什么?


  第一范式(1NF):強調的是列的原子性,即數據庫表的每一列都是不可分割的原子數據項。


  第二范式(2NF):要求實體的屬性完全依賴于主關鍵字。所謂完全依賴是指不能存在僅依賴主關鍵字一部分的屬性。(在1NF基礎上消除非主屬性對主鍵的部分函數依賴)


  第三范式(3NF):任何非主屬性不依賴于其它非主屬性。(在2NF基礎上消除傳遞依賴)


  165、一張自增表里面總共有 7 條數據,刪除了最后 2 條數據,重啟 MySQL 數據庫,又插入了一條數據,此時 id 是幾?


  表類型如果是 MyISAM ,那 id 就是 8。


  表類型如果是 InnoDB,那 id 就是 6。


  InnoDB 表只會把自增主鍵的最大 id 記錄在內存中,所以重啟之后會導致最大 id 丟失。


  166、如何獲取當前數據庫版本?


  使用 select version() 獲取當前 MySQL 數據庫版本。


  167、說一下 ACID 是什么?


  Atomicity(原子性):一個事務(transaction)中的所有操作,或者全部完成,或者全部不完成,不會結束在中間某個環節。事務在執行過程中發生錯誤,會被恢復(Rollback)到事務開始前的狀態,就像這個事務從來沒有執行過一樣。即,事務不可分割、不可約簡。


  Consistency(一致性):在事務開始之前和事務結束以后,數據庫的完整性沒有被破壞。這表示寫入的資料必須完全符合所有的預設約束、觸發器、級聯回滾等。


  Isolation(隔離性):數據庫允許多個并發事務同時對其數據進行讀寫和修改的能力,隔離性可以防止多個事務并發執行時由于交叉執行而導致數據的不一致。事務隔離分為不同級別,包括讀未提交(Read uncommitted)、讀提交(read committed)、可重復讀(repeatable read)和串行化(Serializable)。


  Durability(持久性):事務處理結束后,對數據的修改就是永久的,即便系統故障也不會丟失。


  168、char 和 varchar 的區別是什么?


  char(n) :固定長度類型,比如訂閱 char(10),當你輸入"abc"三個字符的時候,它們占的空間還是 10 個字節,其他 7 個是空字節。


  優點:效率高;缺點:占用空間;適用場景:存儲密碼的 md5 值,固定長度的,使用 char 非常合適。


  varchar(n) :可變長度,存儲的值是每個值占用的字節再加上一個用來記錄其長度的字節的長度。


  所以,從空間上考慮 varcahr 比較合適;從效率上考慮 char 比較合適,二者使用需要權衡。


  169、float 和 double 的區別是什么?


  float 最多可以存儲 8 位的十進制數,并在內存中占 4 字節。


  double 最可可以存儲 16 位的十進制數,并在內存中占 8 字節。


  170、MySQL 的內連接、左連接、右連接有什么區別?


  內連接關鍵字:inner join;左連接:left join;右連接:right join。


  內連接是把匹配的關聯數據顯示出來;左連接是左邊的表全部顯示出來,右邊的表顯示出符合條件的數據;右連接正好相反。


由于“最常見的208道Java最新面試題及答案”內容太多,本文已滿,請看下文鏈接:


1~30道Java最新面試題及答案請看鏈接:http://www.dabaquan.cn/javazixun/2143.html


31~73道Java最新面試題及答案請看鏈接:http://www.dabaquan.cn/javazixun/2145.html


74~124道Java最新面試題及答案請看鏈接:http://www.dabaquan.cn/javazixun/2146.html


171~208道Java最新面試題及答案請看鏈接:http://www.dabaquan.cn/javazixun/2149.html


提交申請后,顧問老師會電話與您溝通安排學習

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 日日夜夜免费精品 | 朴妮唛禁福利视频在线 | 日韩精品一区二区三区中文在线 | 成人a视频| 欧美一级艳片视频免费观看 | se色综合视频 | 精品视频一区二区 | 99久久99久久精品免费看蜜桃 | 亚洲国产成人久久综合一 | 成人精品视频在线观看播放 | 四虎影视国产精品永久在线 | 久久机热这里只有精品无需 | 亚洲一区二区影院 | 五月婷婷在线免费观看 | 五月狠狠亚洲小说专区 | 黑丝毛片 | 久久精品免视看国产陈冠希 | 久久精品国产一区二区三区日韩 | 老司机成人午夜精品福利视频 | 成年女人视频播放免费观看 | 免费一区二区三区久久 | 国产一区二区三区免费视频 | a网在线| 牛牛影视在线入口 | 91在线免费观看网站 | 嫩草影院麻豆久久视频 | 国产婷婷色一区二区三区 | 七七七久久久久人综合 | 日韩在线国产 | 一级爱爱片 | 日本韩国欧美在线观看 | 水蜜桃网站 | 成年女人在线观看 | 仑乱高清在线一级播放 | 亚洲精国产一区二区三区 | 九九精品视频在线免费观看 | 五月婷婷综合在线视频 | 手机看片福利日韩欧美看片 | 国产欧美精品区一区二区三区 | 日韩精品你懂的在线播放 | 成人欧美 |