主頁 >  其他 > 2020這一年總結出來的Java面試題,常頻面試題大匯總~

2020這一年總結出來的Java面試題,常頻面試題大匯總~

2020-12-13 06:34:47 其他

面試就是大家身邊總是存在各種各樣的可能,而自身又具備這樣的能力,就忍不住想試一試,尤其是到了年關,是一個好的蓄勢并且認真積累的階段,當然面試套路眾多,但對于技術面試來說,主要是考察一個人的技術能力和溝通能力,不同型別的面試官根據自身的理解問的問題也不盡相同,沒有規律可循,

“面試造火箭,作業擰螺絲”首先咱得能擰,才有造火箭的可能啊,這一年整理很多面試的高頻問點也做了決議,今天在這分享給大家!

博主已將以下這些面試題整理成了一個Java面試手冊,是PDF版的,
需要本資料全部面試題的,可以點擊這里!!暗號博客園!

Java語法基礎

1.面向物件和面向程序的區別
面向程序

  1. 優點: 性能比面向物件高,因為類呼叫時需要實體化,開銷比較大,比較消耗 資源;比如單片機、嵌入式開發、Linux/Unix
  2. 等一般采用面向程序開發,性能是 最重要的因素, 缺點: 沒有面向物件易維護、易復用、易擴展

面向物件

  1. 優點: 易維護、易復用、易擴展,由于面向物件有封裝、繼承、多型性的特 性,可以設計出低耦合的系統,使系統更加靈活、更加易于維護 缺點:
  2. 性能比面向程序低

Java 語言有哪些特點

 1. 簡單易學;
 2. 面向物件(封裝,繼承,多型);
 3. 平臺無關性( Java 虛擬機實作平臺無關性);
 4. 可靠性;
 5. 安全性;
 6. 支持多執行緒( C++ 語言沒有內置的多執行緒機制,因此必須呼叫作業系統的多執行緒功能來進行多執行緒程式設計,而 Java 語言卻提供了多執行緒支持);
7.支持網路編程并且很方便( Java 語言誕生本身就是為簡化網路編程設計的,因此 Java 語言不僅支持網路編程而且很方便);
8. 編譯與解釋并存;

關于 JVM JDK 和 JRE 最詳細通俗的解答

JVM
Java 虛擬機(JVM)是運行 Java 位元組碼的虛擬機,JVM 有針對不同系統的特定實作(Windows,Linux,macOS),目的是使用相同的位元組碼,它們都會給出相同的結果,

什么是位元組碼?采用位元組碼的好處是什么?
在 Java 中,JVM 可以理解的代碼就叫做位元組碼(即擴展名為 .class 的檔案),它不面向任何特定的處理器,只面向虛擬機,Java 語言通過位元組碼的方式,在一定程度上解決了傳統解釋型語言執行效率低的問題,同時又保留了解釋型語言可移植的特點,所以 Java 程式運行時比較高效,而且,由于位元組碼并不專對一種特定的機器,因此,Java 程式無須重新編譯便可在多種不同的計算機上運行,

Java 程式從源代碼到運行一般有下面 3 步:
我們需要格外注意的是 .class->機器碼 這一步,在這一步 jvm 類加載器首先加載位元組碼檔案,然后通過解釋器逐行解釋執行,這種方式的執行速度會相對比較慢,而且,有些方法和代碼塊是經常需要被呼叫的,也就是所謂的熱點代碼,所以后面引進了 JIT 編譯器,JIT 屬于運行時編譯,當 JIT 編譯器完成第一次編譯后,其會將位元組碼對應的機器碼保存下來,下次可以直接使用,而我們知道,機器碼的運行效率肯定是高于 Java 解釋器的,這也解釋了我們為什么經常會說 Java 是編譯與解釋共存的語言,

HotSpot 采用了惰性評估(Lazy
Evaluation)的做法,根據二八定律,消耗大部分系統資源的只有那一小部分的代碼(熱點代碼),而這也就是 JIT
所需要編譯的部分,JVM 會根據代碼每次被執行的情況收集資訊并相應地做出一些優化,因此執行的次數越多,它的速度就越快,JDK 9
引入了一種新的編譯模式AOT(Ahead of Time Compilation),它是直接將位元組碼編譯成機器碼,這樣就避免了 JIT
預熱等各方面的開銷,JDK 支持分層編譯和 AOT 協作使用,但是 ,AOT 編譯器的編譯質量是肯定比不上 JIT 編譯器的,

總結:Java 虛擬機(JVM)是運行 Java 位元組碼的虛擬機,JVM 有針對不同系統的特定實作(Windows,Linux,macOS),目的是使用相同的位元組碼,它們都會給出相同的結果,位元組碼和不同系統的 JVM 實作是 Java 語言“一次編譯,隨處可以運行”的關鍵所在,

JDK 和 JRE

JDK 是 Java Development Kit,它是功能齊全的 Java SDK,它擁有 JRE 所擁有的一切,還有編譯器(javac)和工具(如 javadoc 和 jdb),它能夠創建和編譯程式,

JRE 是 Java 運行時環境,它是運行已編譯 Java 程式所需的所有內容的集合,包括 Java 虛擬機(JVM),Java 類別庫,java 命令和其他的一些基礎構件,但是,它不能用于創建新程式,

如果你只是為了運行一下 Java 程式的話,那么你只需要安裝 JRE 就可以了,如果你需要進行一些 Java 編程方面的作業,那么你就需要安裝 JDK 了,但是,這不是絕對的,有時,即使您不打算在計算機上進行任何 Java 開發,仍然需要安裝 JDK,例如,如果要使用 JSP 部署 Web 應用程式,那么從技術上講,您只是在應用程式服務器中運行 Java 程式,那你為什么需要 JDK 呢?因為應用程式服務器會將 JSP 轉換為 Java servlet,并且需要使用 JDK 來編譯servlet,

Oracle JDK 和 OpenJDK 的對比

可能在看這個問題之前很多人和我一樣并沒有接觸和使用過 OpenJDK ,那么Oracle 和 OpenJDK 之間是否存在重大差異?下面通過我通過我收集到一些資料對你解答這個被很多人忽視的問題,

對于 Java 7,沒什么關鍵的地方,OpenJDK 專案主要基于 Sun 捐贈的 HotSpot源代碼,此外,OpenJDK 被選為 Java 7 的參考實作,由 Oracle 工程師維護,
關于 JVM,JDK,JRE 和 OpenJDK 之間的區別,Oracle 博客帖子在 2012 年有一個更詳細的答案:
問:OpenJDK 存盤庫中的源代碼與用于構建 Oracle JDK 的代碼之間有什么區別?
答:非常接近 - 我們的 Oracle JDK 版本構建程序基于 OpenJDK 7 構建,只添加了幾個部分,例如部署代碼,其中包括 Oracle 的 Java 插件和 Java WebStart的實作,以及一些封閉的源代碼派對組件,如圖形光柵化器,一些開源的第三方組件,如 Rhino,以及一些零碎的東西,如附加檔案或第三方字體,展望未來,我們的目的是開源 Oracle JDK 的所有部分,除了我們考慮商業功能的部分,
總結:

  1. Oracle JDK 版本將每三年發布一次,而 OpenJDK 版本每三個月發布一
    次;
  2. OpenJDK 是一個參考模型并且是完全開源的,而 Oracle JDK 是
    OpenJDK 的一個實作,并不是完全開源的;
  3. Oracle JDK 比 OpenJDK 更穩定,OpenJDK 和 Oracle JDK 的代碼幾乎相同,但 Oracle JDK 有更多的類和一些錯誤修復,因此,如果您想開發企業/商業軟體,我建議您選擇 Oracle JDK,因為它經過了徹底的測驗和穩定,某些情況下,有些人提到在使用 OpenJDK 可能會遇到了許多應用程式崩潰的問題,但是,只需切換Oracle JDK 就可以解決問題;
  4. 頂級公司正在使用 Oracle JDK,例如 Android Studio,Minecraft 和IntelliJ IDEA 開發工具,其中 Open JDK 不太受歡迎;
  5. 在回應性和 JVM 性能方面,Oracle JDK 與 OpenJDK 相比提供了更好的性能;
  6. Oracle JDK 不會為即將發布的版本提供長期支持,用戶每次都必須通過更新到最新版本獲得支持來獲取最新版本;
  7. Oracle JDK 根據二進制代碼許可協議獲得許可,而 OpenJDK 根據 GPL 許可獲得許可,

JVM

記憶體模型以及磁區,需要詳細到每個區放什么,
JVM 分為堆區和堆疊區,還有方法區,初始化的物件放在堆里面,參考放在堆疊里面,class 類資訊常量池(static 常量和 static 變數)等放在方法區,new:
1 方法區:主要是存盤類資訊,常量池(static 常量和 static 變數),編譯后的代碼(位元組碼)等資料
2 堆:初始化的物件,成員變數 (那種非 static 的變數),所有的物件實體和陣列都要在堆上分配
3 堆疊:堆疊的結構是堆疊幀組成的,呼叫一個方法就壓入一幀,幀上面存盤區域變數表,運算元堆疊,方法出口等資訊,區域變數表存放的是 8 大基礎型別加上一個應用型別,所以還是一個指向地址的指標
1 本地方法堆疊:主要為 Native 方法服務
2 程式計數器:記錄當前執行緒執行的行號
堆里面的磁區:Eden,survival (from+ to),老年代,各自的特點,
堆里面分為新生代和老生代(java8 取消了永久代,采用了 Metaspace),新生代包含 Eden+Survivor 區,survivor 區里面分為 from 和 to 區,記憶體回收時,如果用的是復制演算法,從 from 復制到 to,當經過一次或者多次 GC 之后,存活下來的物件會被移動到老年區,當 JVM 記憶體不夠用的時候,會觸發 Full GC,清理 JVM 老年區當新生區滿了之后會觸發 YGC,先把存活的物件放到其中一個 Survice區,然后進行垃圾清理,因為如果僅僅清理需要洗掉的物件,這樣會導致記憶體碎片,因此一般會把 Eden 進行完全的清理,然后整理記憶體,那么下次 GC 的時候,就會使用下一個 Survive,這樣回圈使用,如果有特別大的物件,新生代放不下,就會使用老年代的擔保,直接放到老年代里面,因為 JVM 認為,一般大物件的存活時間一般比較久遠,
物件創建方法,物件的記憶體分配,物件的訪問定位,
new 一個物件
GC 的兩種判定方法:
參考計數法:指的是如果某個地方參考了這個物件就+1,如果失效了就-1,當為 0 就會回收但是 JVM 沒有用這種方式,因為無法判定相互回圈參考(A 參考 B,B 參考 A)的情況
參考鏈法: 通過一種 GC ROOT 的物件(方法區中靜態變數參考的物件等-static 變數)來判斷,如果有一條鏈能夠到達 GC ROOT 就說明,不能到達 GC ROOT 就說明可以回收
SafePoint 是什么
比如 GC 的時候必須要等到 Java 執行緒都進入到 safepoint 的時候 VMThread 才能開始執行 GC,

  1. 回圈的末尾 (防止大回圈的時候一直不進入 safepoint,而其他執行緒在等待它進入safepoint)
  2. 方法回傳前
  3. 呼叫方法的 call 之后
  4. 拋出例外的位置

GC 的三種收集方法:標記清除、標記整理、復制演算法的原理與特點,分別用
在什么地方,如果讓你優化收集方法,有什么思路?
先標記,標記完畢之后再清除,效率不高,會產生碎片
復制演算法:分為 8:1 的 Eden 區和 survivor 區,就是上面談到的 YGC
標記整理:標記完畢之后,讓所有存活的物件向一端移動

資料庫

請簡潔描述 MySQL 中 InnoDB 支持的四種事務隔離級別名稱,以及逐級之間的區別?
SQL 標準定義的四個隔離級別為:

read uncommited :讀到未提交資料
read committed:臟讀,不可重復讀
repeatable read:可重讀
serializable :串行事物

在 MySQL 中 ENUM 的用法是什么?
ENUM 是一個字串物件,用于指定一組預定義的值,并可在創建表時使用,
SQL 語法如下:
Create table size(name ENUM('Smail,‘Medium’,‘Large’);
CHAR 和 VARCHAR 的區別?
CHAR 和 VARCHAR 型別在存盤和檢索方面有所不同,
CHAR 列長度固定為創建表時宣告的長度,長度值范圍是 1 到 255, 當 CHAR 值被存盤時,它們被用空格填充到特定長度,檢索 CHAR 值時需洗掉尾隨空格,
列的字串型別可以是什么?
字串型別是:
SET
BLOB
ENUM
CHAR
TEXT
VARCHAR
MySQL 中使用什么存盤引擎?
存盤引擎稱為表型別,資料使用各種技術存盤在檔案中,
技術涉及:
Storage mechanism
Locking levels
Indexing
Capabilities and functions.

MySQL

資料庫三范式是什么?

  1. 第一范式(1NF):欄位具有原子性,不可再分,(所有關系型資料庫系統都滿足第一范式資料庫表中的欄位都是單一屬性的,不可再分)
  2. 第二范式(2NF)是在第一范式(1NF)的基礎上建立起來的,即滿足第二范式(2NF)必須先滿足第一范式(1NF),要求資料庫表中的每個實體或行必須可以被惟一地區分,通常需要為表加上一個列,以存盤各個實體的惟一標識,這個惟一屬性列被稱為主關鍵字或主鍵,
  3. 滿足第三范式(3NF)必須先滿足第二范式(2NF),簡而言之,第三范式(3NF)要求一個資料庫表中不包含已在其它表中已包含的非主關鍵字資訊, >所以第三范式具有如下特征: >>1. 每一列只有一個值 >>2. 每一行都能區分, >>3. 每一個表都不包含其他表已經包含的非主關鍵字資訊,
    有哪些資料庫優化方面的經驗?
  4. 用 PreparedStatement, 一般來說比 Statement 性能高:一個 sql發給服務器去執行,涉及步驟:語法檢查、語意分析, 編譯,快取,
  5. 有外鍵約束會影響插入和洗掉性能,如果程式能夠保證資料的完整性,那在設計資料庫時就去掉外鍵,
  6. 表中允許適當冗余,譬如,主題帖的回復數量和最后回復時間等
  7. UNION ALL 要比 UNION 快很多,所以,如果可以確認合并的兩個結果集中不包含重復資料且不需要排序時的話,那么就使用 UNIONALL, >>UNION 和 UNION ALL 關鍵字都是將兩個結果集合并為一個,但這兩者從使用和效率上來說都有所不同, >1. 對重復結果的處理:UNION 在進行表鏈接后會篩選掉重復的記錄,Union All 不會去除重復記錄, >2. 對排序的處理:Union 將會按照欄位的順序進行排序;UNION ALL 只是簡單的將兩個結果合并后就回傳,
    請簡述常用的索引有哪些種類?
    1.普通索引: 即針對資料庫表創建索引
    2.索引: 與普通索引類似,不同的就是:MySQL 資料庫索引列的值必須唯一,但允許有空值
    3.主鍵索引: 它是一種特殊的唯一索引,不允許有空值,一般是在建表的時候同時創建主鍵索引
    4.組合索引: 為了進一步榨取 MySQL 的效率,就要考慮建立組合索引,即將資料庫表中的多個欄位聯合起來作為一個組合索引,
    以及在 mysql 資料庫中索引的作業機制是什么?
    資料庫索引,是資料庫管理系統中一個排序的資料結構,以協助快速查詢、更新資料庫表中資料,索引的實作通常使用 B 樹及其變種 B+樹
    MySQL 的基礎操作命令:
    1.MySQL 是否處于運行狀態:Debian 上運行命令 service mysqlstatus,在 RedHat 上運行命令 service mysqld status
    2.開啟或停止 MySQL 服務 :運行命令 service mysqld start 開啟服務;運行命令 service mysqld stop 停止服務
    3.Shell 登入 MySQL: 運行命令 mysql -u root -p
    4.列出所有資料庫:運行命令 show databases;
    5.切換到某個資料庫并在上面作業:運行命令 use databasename; 進入名為 databasename 的資料庫
    6.列出某個資料庫內所有表: show tables;
    7.獲取表內所有 Field 物件的名稱和型別 :describe table_name;
    mysql 的復制原理以及流程,
    Mysql 內建的復制功能是構建大型,高性能應用程式的基礎,將 Mysql 的資料分布到多個系統上去,這種分布的機制,是通過將 Mysql 的某一臺主機的資料復制到其它主機(slaves)上,并重新執行一遍來實作的, * 復制程序中一個服務器充當主服務器,而一個或多個其它服務器充當從服務器,主服務器將更新寫入二進制日志檔案,并維護檔案的一個索引以跟蹤日志回圈,這些日志可以記錄發送到從服務器的更新, 當一個從服務器連接主服務器時,它通知主服務器在日志中讀取的最后一次成功更新的位置,從服務器接收從那時起發生的任何更新,然后封鎖并等待主服務器通知新的更新,
    程序如下:
    1.主服務器把更新記錄到二進制日志檔案中,
    2.從服務器把主服務器的二進制日志拷貝到自己的中繼日志(replay log)中,
    3.從服務器重做中繼日志中的時間,把更新應用到自己的資料庫上,

Redis

什么是 Redis?簡述它的優缺點?
Redis 的全稱是:Remote Dictionary.Server,本質上是一個 Key-Value 型別的記憶體資料庫,很像memcached,整個資料庫統統加載在記憶體當中進行操作,定期通過異步操作把資料庫資料 flush 到硬碟上進行保存,
因為是純記憶體操作,Redis 的性能非常出色,每秒可以處理超過 10 萬次讀寫操作,是已知性能最快的Key-Value DB,
Redis 的出色之處不僅僅是性能,Redis 最大的魅力是支持保存多種資料結構,此外單個 value 的最大限制是 1GB,不像 memcached 只能保存 1MB 的資料,因此 Redis 可以用來實作很多有用的功能,
比方說用他的 List 來做 FIFO 雙向鏈表,實作一個輕量級的高性 能訊息佇列服務,用他的 Set 可以做高性能的 tag 系統等等,
另外 Redis 也可以對存入的 Key-Value 設定 expire 時間,因此也可以被當作一 個功能加強版的memcached 來用, Redis 的主要缺點是資料庫容量受到物理記憶體的限制,不能用作海量資料的高性能讀寫,因此 Redis 適合的場景主要局限在較小資料量的高性能操作和運算上,
Redis 與 memcached 相比有哪些優勢?
1.memcached 所有的值均是簡單的字串,redis 作為其替代者,支持更為豐富的資料型別
2.redis 的速度比 memcached 快很多 redis 的速度比 memcached 快很多
3.redis 可以持久化其資料 redis 可以持久化其資料
Redis 支持哪幾種資料型別?
String、List、Set、Sorted Set、hashes
Redis 主要消耗什么物理資源?
記憶體,
Redis 有哪幾種資料淘汰策略?
1.noeviction:回傳錯誤當記憶體限制達到,并且客戶端嘗試執行會讓更多記憶體被使用的命令,
2.allkeys-lru: 嘗試回收最少使用的鍵(LRU),使得新添加的資料有空間存放,
3.volatile-lru: 嘗試回收最少使用的鍵(LRU),但僅限于在過期集合的鍵,使得新添加的資料有空間存放,
4.allkeys-random: 回收隨機的鍵使得新添加的資料有空間存放,
5.volatile-random: 回收隨機的鍵使得新添加的資料有空間存放,但僅限于在過期集合的鍵,
6.volatile-ttl: 回收在過期集合的鍵,并且優先回收存活時間(TTL)較短的鍵,使得新添加的資料有空間
存放,
Redis 官方為什么不提供 Windows 版本?
因為目前 Linux 版本已經相當穩定,而且用戶量很大,無需開發 windows 版本,反而會帶來兼容性等問題,
一個字串型別的值能存盤最大容量是多少?512M
為什么 Redis 需要把所有資料放到記憶體中?
Redis 為了達到最快的讀寫速度將資料都讀到記憶體中,并通過異步的方式將資料寫入磁盤,
所以 redis 具有快速和資料持久化的特征,如果不將資料放在記憶體中,磁盤 I/O 速度為嚴重影響 redis 的
性能,
在記憶體越來越便宜的今天,redis 將會越來越受歡迎, 如果設定了最大使用的記憶體,則資料已有記錄數達到記憶體限值后不能繼續插入新值,
Redis 集群方案應該怎么做?都有哪些方案?
1.codis
2.目前用的最多的集群方案,基本和 twemproxy 一致的效果,但它支持在節點數量改變情況下,舊節點資料可恢復到新 hash 節點,
redis cluster3.0 自帶的集群,特點在于他的分布式演算法不是一致性 hash,而是 hash 槽的概念,以及自身支持節點設定從節點,具體看官方檔案介紹,
3.在業務代碼層實作,起幾個毫無關聯的 redis 實體,在代碼層,對 key 進行 hash 計算,然后去對應的redis 實體操作資料,這種方式對 hash 層代碼要求比較高,考慮部分包括,節點失效后的替代演算法方案,資料震蕩后的自動腳本恢復,實體的監控,等等,

Spring

什么是 spring?
Spring 是個 java 企業級應用的開源開發框架,Spring 主要用來開發 Java 應用, 但是有些擴展是針對構建 J2EE 平臺的 web 應用,Spring 框架目標是簡化 Java 企業級應用開發,并通過 POJO 為基礎的編程模型促進良好的編程習慣,
使用 Spring 框架的好處是什么?
1 輕量:Spring 是輕量的,基本的版本大約 2MB,
2 控制反轉:Spring 通過控制反轉實作了松散耦合,物件們給出它們的依 賴,而不是創建或查找依賴的物件們,
3 面向切面的編程(AOP):Spring 支持面向切面的編程,并且把應用業務 邏輯和系統服務分開,
4 容器:Spring 包含并管理應用中物件的生命周期和配置,
5 MVC 框架:Spring 的 WEB 框架是個精心設計的框架,是 Web 框架的 一個很好的替代品,
6 事務管理:Spring 提供一個持續的事務管理介面,可以擴展到上至本地 事務下至全域事務(JTA),
7 例外處理:Spring提供方便的 API 把具體技術相關的例外(比如由JDBC, HibernateorJDO 拋出的)轉化為一致的 unchecked 例外,
Spring 由哪些模塊組成?
以下是 Spring 框架的基本模塊:
? Coremodule
? Beanmodule
? Contextmodule
? ExpressionLanguagemodule
? JDBCmodule ? ORMmodule
? OXMmodule ? JavaMessagingService(JMS)module
? Transactionmodule
? Webmodule
? Web-Servletmodule
? Web-Strutsmodule
? Web-Portletmodule
核心容器(應用背景關系)模塊,
這是基本的 Spring 模塊,提供 spring 框架的基礎功能,BeanFactory 是任何 以 spring 為基礎的應用的核心,Spring 框架建立在此模塊之上,它使 Spring 成為一個容器,
BeanFactory–BeanFactory 實作舉例,
Bean 工廠是工廠模式的一個實作,提供了控制反轉功能,用來把應用的配置和 依賴從正真的應用代碼中分離, 最常用的 BeanFactory 實作是 XmlBeanFactory 類,
XMLBeanFactory
最常用的就是 org.springframework.beans.factory.xml.XmlBeanFactory,它 根據 XML 檔案中的定義加載 beans,該容器從 XML 檔案讀取配置元資料并用 它去創建一個完全配置的系統或應用,
解釋 AOP 模塊
AOP 模塊用于發給我們的 Spring 應用做面向切面的開發,很多支持由 AOP 聯 盟提供,這樣就確保了 Spring 和其他 AOP 框架的共通性,這個模塊將元資料 編程引入 Spring,

SpringBoot

什么是 Spring Boot?
多年來,隨著新功能的增加,spring 變得越來越復雜,只需訪問 https://spring.io/projects頁面,我們就會看到可以在我們的應用程式中使用的所有 Spring 專案的不同功能,如果必須啟動一個新的 Spring 專案,我們必須添加構建路徑或添加 Maven 依賴關系,配置應用程式服務器,添加 spring 配置,因此,開始一個新的 spring 專案需要很多努力,因為我們現在必須從頭開始做所有事情,
Spring Boot 是解決這個問題的方法,Spring Boot 已經建立在現有 spring 框架之上,使用spring 啟動,我們避免了之前我們必須做的所有樣板代碼和配置,因此,Spring Boot 可以幫助我們以最少的作業量,更加健壯地使用現有的 Spring 功能,
Spring Boot 有哪些優點?
Spring Boot 的優點有:
1.減少開發,測驗時間和努力,
2.使用 JavaConfig 有助于避免使用 XML,
3.避免大量的 Maven 匯入和各種版本沖突,
4.提供意見發展方法,
5.通過提供默認值快速開始開發,
沒有單獨的 Web 服務器需要,這意味著你不再需要啟動 Tomcat,Glassfish 或其他任何東
西,
需要更少的配置 因為沒有 web.xml 檔案,只需添加用@ Configuration 注釋的類,然后添加
用@Bean 注釋的方法,Spring 將自動加載物件并像以前一樣對其進行管理,您甚至可以將
@Autowired 添加到 bean 方法中,以使 Spring 自動裝入需要的依賴關系中,
基于環境的配置 使用這些屬性,您可以將您正在使用的環境傳遞到應用程式:-Dspring.profiles.active = {enviornment},在加載主應用程式屬性檔案后,Spring 將在(application{environment} .properties)中加載后續的應用程式屬性檔案,

什么是 JavaConfig?
Spring JavaConfig 是 Spring 社區的產品,它提供了配置 Spring IoC 容器的純 Java 方法,因此它有助于避免使用 XML 配置,使用 JavaConfig 的優點在于:
面向物件的配置,由于配置被定義為 JavaConfig 中的類,因此用戶可以充分利用 Java 中的面向物件功能,一個配置類可以繼承另一個,重寫它的@Bean 方法等,
減少或消除 XML 配置,基于依賴注入原則的外化配置的好處已被證明,但是,許多開發人員不希望在 XML 和 Java 之間來回切換,JavaConfig 為開發人員提供了一種純 Java 方法來配置與 XML 配置概念相似的 Spring 容器,從技術角度來講,只使用 JavaConfig 配置類來配置容器是可行的,但實際上很多人認為將 JavaConfig 與 XML 混合匹配是理想的,
型別安全和重構友好,JavaConfig 提供了一種型別安全的方法來配置 Spring 容器,由于Java 5.0 對泛型的支持,現在可以按型別而不是按名稱檢索 bean,不需要任何強制轉換或基于字串的查找,

如何重新加載 Spring Boot 上的更改,而無需重新啟動服務器?
這可以使用 DEV 工具來實作,通過這種依賴關系,您可以節省任何更改,嵌入式 tomcat將重新啟動,Spring Boot 有一個開發工具(DevTools)模塊,它有助于提高開發人員的生產力,Java 開發人員面臨的一個主要挑戰是將檔案更改自動部署到服務器并自動重啟服務器,
開發人員可以重新加載 Spring Boot 上的更改,而無需重新啟動服務器,這將消除每次手動部署更改的需要,Spring Boot 在發布它的第一個版本時沒有這個功能,這是開發人員最需要的功能,DevTools 模塊完全滿足開發人員的需求,該模塊將在生產環境中被禁用,它還提供 H2 資料庫控制臺以更好地測驗應用程式,
org.springframework.boot spring-boot-devtools true

Spring Boot 中的監視器是什么?
Spring boot actuator 是 spring 啟動框架中的重要功能之一,Spring boot 監視器可幫助您訪問生產環境中正在運行的應用程式的當前狀態,有幾個指標必須在生產環境中進行檢查和監控,即使一些外部應用程式可能正在使用這些服務來向相關人員觸發警報訊息,監視器模塊公開了一組可直接作為 HTTP URL 訪問的 REST 端點來檢查狀態,

kafka

Kafka 的設計時什么樣的呢?
Kafka 將訊息以 topic 為單位進行歸納
將向 Kafka topic 發布訊息的程式成為 producers.
將預訂 topics 并消費訊息的程式成為 consumer.
Kafka 以集群的方式運行,可以由一個或多個服務組成,每個服務叫做一個 broker.
producers 通過網路將訊息發送到 Kafka 集群,集群向消費者提供訊息
資料傳輸的事物定義有哪三種?
資料傳輸的事務定義通常有以下三種級別:
(1)最多一次: 訊息不會被重復發送,最多被傳輸一次,但也有可能一次不傳輸
(2)最少一次: 訊息不會被漏發送,最少被傳輸一次,但也有可能被重復傳輸.
(3)精確的一次(Exactly once): 不會漏傳輸也不會重復傳輸,每個訊息都傳輸被一次而且僅僅被傳輸一次,這是大家所期望的
Kafka 判斷一個節點是否還活著有那兩個條件?
(1)節點必須可以維護和 ZooKeeper 的連接,Zookeeper 通過心跳機制檢查每個節點的連接
(2)如果節點是個 follower,他必須能及時的同步 leader 的寫操作,延時不能太久
producer 是否直接將資料發送到 broker 的 leader(主節點)?
producer 直接將資料發送到 broker 的 leader(主節點),不需要在多個節點進行分發,為了
幫助 producer 做到這點,所有的 Kafka 節點都可以及時的告知:哪些節點是活動的,目標
topic 目標磁區的 leader 在哪,這樣 producer 就可以直接將訊息發送到目的地了
Kafa consumer 是否可以消費指定磁區訊息?
Kafa consumer 消費訊息時,向 broker 發出"fetch"請求去消費特定磁區的訊息,consumer指定訊息在日志中的偏移量(offset),就可以消費從這個位置開始的訊息,customer 擁有了 offset 的控制權,可以向后回滾去重新消費之前的訊息,這是很有意義的
Kafka 訊息是采用 Pull 模式,還是 Push 模式?
Kafka 最初考慮的問題是,customer 應該從 brokes 拉取訊息還是 brokers 將訊息推送到consumer,也就是 pull 還 push,在這方面,Kafka 遵循了一種大部分訊息系統共同的傳統的設計:producer 將訊息推送到 broker,consumer 從 broker 拉取訊息

一些訊息系統比如 Scribe 和 Apache Flume 采用了 push 模式,將訊息推送到下游的consumer,這樣做有好處也有壞處:由 broker 決定訊息推送的速率,對于不同消費速率的consumer 就不太好處理了,訊息系統都致力于讓 consumer 以最大的速率最快速的消費訊息,但不幸的是,push 模式下,當 broker 推送的速率遠大于 consumer 消費的速率時,consumer 恐怕就要崩潰了,最終 Kafka 還是選取了傳統的 pull 模式

Pull 模式的另外一個好處是 consumer 可以自主決定是否批量的從 broker 拉取資料,Push模式必須在不知道下游
consumer 消費能力和消費策略的情況下決定是立即推送每條訊息還是快取之后批量推送,如果為了避免 consumer
崩潰而采用較低的推送速率,將可能導致一次只推送較少的訊息而造成浪費,Pull 模式下,consumer
就可以根據自己的消費能力去決定這些策略 Pull 有個缺點是,如果 broker 沒有可供消費的訊息,將導致 consumer
不斷在回圈中輪詢,直到新訊息到 t 達,為了避免這點,Kafka 有個引數可以讓 consumer
阻塞知道新訊息到達(當然也可以阻塞知道訊息的數量達到某個特定的量這樣就可以批量發

歡迎作業一到五年的 Java 工程師朋友們加入 Java 進階架構學習交流:952124565,群內提供免費的
Java 架構學習資料(里面有高可用、高并發、高性能及分布式、Jvm 性能調優、Spring 原始碼,
MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx 等多個知識點的架構資
料)合理利用自己每一分每一秒的時間來學習提升自己,不要再用"沒有時間“來掩飾自己思想上的懶
惰!趁年輕,使勁拼,給未來的自己一個交代!

需要本資料全部面試題的,可以點擊這里!!暗號博客園!

這篇文章里面包括的面試題都有,還包括了高可用、高并發、高性能及分布式、Jvm 性能調優、Spring 原始碼,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx 等多個知識點的架構資料)都可以來領取!合理利用自己每一分每一秒的時間來學習提升自己,不要再用"沒有時間“來掩飾自己思想上的懶惰!趁年輕,使勁拼,給未來的自己一個交代

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/233823.html

標籤:其他

上一篇:【WHash】更有空間感的感知哈希

下一篇:TortoiseGit合并、解決沖突、還原那點事。

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more