2023-04-18_面试题复盘笔记(121)
一、北大軟件武漢分公司 Java后端一面 30min
1.自我介紹
2. Java基本數(shù)據(jù)類型有哪些?
Java基本數(shù)據(jù)類型有以下8種:
1.byte: 8位有符號整數(shù),取值范圍為-128到127。
2.short: 16位有符號整數(shù),取值范圍為-32768到32767。
3.int: 32位有符號整數(shù),取值范圍為-2147483648到2147483647。
4.long: 64位有符號整數(shù),取值范圍為-9223372036854775808到9223372036854775807。
5.float: 32位IEEE 754浮點數(shù)。
6.double: 64位IEEE 754浮點數(shù)。
7.char: 16位Unicode字符,取值范圍為’\u0000’(0)到’\uffff’(65535)。
8.boolean: 布爾值,取值為true或false。
3.String有哪些常用方法?
String類有很多常用方法,其中一些包括:
1.length():返回字符串的長度。
2.charAt(int index):返回給定索引處的字符。
3.substring(int beginIndex, int endIndex):返回從起始索引到終止索引的子字符串。
4.equals(Object other):比較字符串是否相等。
5.indexOf(String str):返回給定字符串在該字符串中第一次出現(xiàn)的索引。
6.toLowerCase()和toUpperCase():轉(zhuǎn)換字符串為小寫或大寫。
7.replace(char oldChar, char newChar):替換字符串中的字符。
8.split(String regex):根據(jù)給定的正則表達式將字符串拆分為字符串數(shù)組。
9.trim():去除字符串前后的空格。
10.isEmpty():判斷字符串是否為空。
4.重載和重寫有什么區(qū)別?
重載和重寫是兩個不同的概念。重載(overloading)是指在一個類中同時存在多個同名但參數(shù)不同的方法,編譯器會根據(jù)參數(shù)類型和數(shù)量的不同來決定使用哪個方法;而重寫(override)是指在子類中重新實現(xiàn)父類的方法,子類的方法與父類的方法名和參數(shù)類型都相同,但方法體不同。重載是針對相同的類中的方法,而重寫是針對父類和子類之間的方法。
5.Java三大特性?
Java三大特性包括面向?qū)ο蟆⒖缙脚_性和自動內(nèi)存管理。
6.你了解Java集合嗎?
Java集合類可以分為三種類型:Set,List和Map。其中Set接口不允許包含重復元素,List接口按照插入順序保存元素,Map接口將鍵映射到值。常用的集合類包括:
1.Set接口:HashSet、TreeSet、LinkedHashSet等。
2.List接口:ArrayList、LinkedList、Vector等。
3.Map接口:HashMap、TreeMap、LinkedHashMap等。
此外,還有Queue接口和Deque接口等集合類。
7.請說一下Map中各個實現(xiàn)類的區(qū)別?
HashMap、TreeMap和LinkedHashMap是Java中常用的三種Map實現(xiàn)類,它們的主要區(qū)別如下:
HashMap
HashMap使用哈希表來實現(xiàn),它能夠快速的根據(jù)key來查找value。HashMap不保證其中元素的順序,因為它不會保證插入順序和迭代順序一致。由于HashMap是非線程安全的,所以在多線程的情況下需要進行加鎖或者使用ConcurrentHashMap。
TreeMap
TreeMap基于紅黑樹實現(xiàn),它能夠保證其中元素的順序。當需要按照元素的鍵值進行遍歷時,使用TreeMap可以非常高效的實現(xiàn)這個過程。TreeMap是有序的,因為它具有按照key值排序的特性。
LinkedHashMap
LinkedHashMap繼承了HashMap的特征,并且使用一個雙向鏈表來保證插入順序和迭代順序一致,因此LinkedHashMap既保證了元素的順序,又有著HashMap的快速查找特性。
總的來說,HashMap適用于快速查找鍵對應(yīng)的值,而TreeMap適用于對元素進行排序的場景,LinkedHashMap則可以在需要有序性的場景中使用,并且在需要對元素進行遍歷時還能夠保證效率。
8. 你看過HashMap的源碼嗎?
HashMap是Java中常用的數(shù)據(jù)結(jié)構(gòu),用于存儲鍵值對,并支持O(1)時間復雜度的插入、查詢、刪除等操作。
HashMap的源碼解析如下:
1.HashMap是一個實現(xiàn)了Map接口的類,內(nèi)部使用數(shù)組和鏈表實現(xiàn)。
2.HashMap中的鍵值對是以Entry對象的形式存儲的,每個Entry對象包含一個鍵、一個值和指向下一個Entry對象的引用。
3.HashMap內(nèi)部維護了一個默認容量為16的數(shù)組table,負載因子為0.75,默認擴容因子為2。當HashMap中的元素數(shù)量超過容量與負載因子的乘積時,即會觸發(fā)擴容操作。
4.HashMap使用哈希函數(shù)將鍵映射到對應(yīng)的數(shù)組下標上,實現(xiàn)快速查詢。
5.如果哈希函數(shù)產(chǎn)生了哈希沖突,即多個鍵映射到同一個數(shù)組下標上,HashMap會使用鏈表將這些鍵值對串起來,以便查詢時遍歷鏈表查找。
6.在插入新的鍵值對時,HashMap會根據(jù)哈希函數(shù)計算出對應(yīng)的數(shù)組下標,并將新的鍵值對插入到該位置的鏈表中。如果該位置的鏈表長度超過閾值(默認為8),則將這個鏈表轉(zhuǎn)化為紅黑樹,以提高查詢效率。
7.在查詢、刪除鍵值對時,HashMap根據(jù)哈希函數(shù)計算出對應(yīng)的數(shù)組下標,并遍歷該位置的鏈表或紅黑樹,查找對應(yīng)的鍵值對。如果鏈表或紅黑樹中沒有對應(yīng)的鍵值對,則返回null。
總之,HashMap是一個高效的數(shù)據(jù)結(jié)構(gòu),能夠快速地插入、查詢、刪除鍵值對。不過,對于高度散列的數(shù)據(jù)集,也可能導致哈希沖突的增加,進而導致查詢效率下降。因此,在使用HashMap時,需要合理地設(shè)置容量和負載因子,以及注意鍵的哈希函數(shù)的設(shè)計。
9.請說一下ArrayList和LinkedList的區(qū)別
ArrayList和LinkedList是Java中常用的兩種列表實現(xiàn)方式。它們的主要區(qū)別在于底層數(shù)據(jù)結(jié)構(gòu)不同,ArrayList底層是動態(tài)數(shù)組,而LinkedList底層是雙向鏈表。由于底層數(shù)據(jù)結(jié)構(gòu)不同,它們在訪問、插入、刪除元素時的時間復雜度有所不同。在訪問元素方面,ArrayList比LinkedList更快,因為ArrayList可以通過數(shù)組下標直接訪問元素,而LinkedList需要通過遍歷鏈表來查找元素;在插入和刪除元素方面,LinkedList比ArrayList更快,因為LinkedList只需要修改節(jié)點的指針,而ArrayList需要移動數(shù)據(jù)。所以,如果需要經(jīng)常訪問元素,使用ArrayList更好;如果需要經(jīng)常插入和刪除元素,使用LinkedList更好。
10.SpringMVC有了解嗎?
SpringMVC是基于Spring框架之上的MVC架構(gòu)模式的Web應(yīng)用程序開發(fā)框架。它提供了豐富的特性,如請求映射,視圖解析,數(shù)據(jù)綁定和校驗,異常處理等,使得開發(fā)人員能夠高效、靈活、簡單地開發(fā)Web應(yīng)用程序。
11.SpringIOC和AOP有了解嗎?
SpringIOC (Inversion of Control) 是一種通過控制反轉(zhuǎn)來達到松耦合、可擴展和易測試的開發(fā)框架。它是一種依賴注入的方式,它可以把依賴的對象注入到相應(yīng)的類中,從而解耦和簡化了應(yīng)用的開發(fā)。
AOP (Aspect-Oriented Programming) 是一種編程模式,它將編程邏輯分成多個模塊(切面),每個模塊負責不同的功能,可以在不修改原有代碼的情況下,為應(yīng)用增加新的功能或處理橫切關(guān)注點的問題。 Spring AOP 基于動態(tài)代理實現(xiàn)切面,可以很好地支持面向切面的編程。
12.創(chuàng)建線程池的參數(shù)?
創(chuàng)建線程池的參數(shù)包括線程池的大小、核心線程數(shù)、最大線程數(shù)、空閑線程存活時間、工作隊列類型、工作隊列大小等。
13.MySQL的連接查詢方式?
MySQL的連接查詢方式有三種:
1.內(nèi)連接(INNER JOIN):只返回符合條件的行。
2.左連接(LEFT JOIN):返回左側(cè)表中的所有行和符合條件的右側(cè)表中的行。
3.右連接(RIGHT JOIN):返回右側(cè)表中的所有行和符合條件的左側(cè)表中的行。
14.Left Join 、Right Join和Inner Join有什么區(qū)別?
Left Join、Right Join和Inner Join是SQL中常用的三種連接方式。
1.Inner Join:只返回兩個表中匹配的行。如果兩個表中有任何一方?jīng)]有匹配的行則不顯示。
2.Left Join:返回左表中所有的行,而右表中不符合條件的行則增加NULL值。如果右表中有任何一方?jīng)]有匹配的行則也會顯示。
3.Right Join:和Left Join相反,返回右表中所有的行,而左表中不符合條件的行則增加NULL值。如果左表中有任何一方?jīng)]有匹配的行則也會顯示。
所以,區(qū)別在于對于符合條件的行和不符合條件的行的處理方式不同。
二、美團一面涼經(jīng)
1.TCP和UDP
TCP和UDP都是計算機網(wǎng)絡(luò)傳輸協(xié)議。TCP是傳輸控制協(xié)議,UDP是用戶數(shù)據(jù)報協(xié)議。 TCP建立連接并保證數(shù)據(jù)可靠傳輸,而UDP則是無連接的,不保證數(shù)據(jù)可靠傳輸。
TCP使用三次握手建立連接,并在傳輸過程中進行數(shù)據(jù)的校驗和流量控制;UDP沒有連接的概念,沒有流量控制和重發(fā)機制,適用于一些實時性要求較高的應(yīng)用,如視頻流傳輸?shù)取?br /> 總的來說,TCP適用于對數(shù)據(jù)傳輸可靠性要求高、需要雙向通信的應(yīng)用,而UDP適用于數(shù)據(jù)傳輸實時性要求高、可以容忍少量數(shù)據(jù)丟失的應(yīng)用。
2.list和set
Java中的List和Set都是集合框架中的接口,它們的實現(xiàn)類都可以存儲一組元素。其中,List接口提供了一種有序的集合,允許存儲重復元素。而Set接口則提供了一種無序的集合,不允許存儲重復元素。
具體來說,List可以通過索引來訪問元素,而Set只能通過迭代器來訪問元素。此外,List還提供了許多有序集合的特定操作,如獲取子列表、插入、刪除等。而Set則提供了判斷集合相等、判斷元素是否存在等操作。
在使用時,應(yīng)根據(jù)實際需求選擇合適的集合類型。如果需要保證集合中元素的順序或者需要允許存儲重復元素,應(yīng)該選擇List。如果需要保證元素的唯一性或者不關(guān)心順序,應(yīng)該選擇Set。
3.數(shù)組和鏈表
數(shù)組和鏈表都是數(shù)據(jù)結(jié)構(gòu)。數(shù)組是一種線性數(shù)據(jù)結(jié)構(gòu),用于在內(nèi)存中存儲一組相同類型的元素。數(shù)組中的元素是連續(xù)的,并且可以通過索引訪問,索引通常從0開始。
鏈表也是一種線性數(shù)據(jù)結(jié)構(gòu),但它的元素是不連續(xù)的。相反,每個元素都包含指向下一個元素的指針。由于它們的靈活性,鏈表在插入和刪除元素時比數(shù)組更有效。
區(qū)別:
1.存儲方式:數(shù)組是按順序存儲數(shù)據(jù),鏈表是按指針存儲數(shù)據(jù)。
2.插入和刪除操作:在數(shù)組中,如果要在中間插入或刪除元素,則需要移動后續(xù)元素。鏈表中,只需要更改指針即可。這使得鏈表對于插入和刪除操作更加高效。
3.訪問元素:數(shù)組中訪問元素非常快,因為可以通過索引直接計算出元素的地址。在鏈表中,必須按順序遍歷鏈表找到相應(yīng)的元素。
4.空間使用:數(shù)組在創(chuàng)建時需要固定大小的空間,而鏈表可以動態(tài)分配內(nèi)存并且不需要一開始指定大小。
4.MySQL底層實現(xiàn)
MySQL底層實現(xiàn)包括存儲引擎、數(shù)據(jù)結(jié)構(gòu)、算法等。其中存儲引擎是MySQL的核心組件,主要負責數(shù)據(jù)的存儲和管理。MySQL支持多種存儲引擎,包括InnoDB、MyISAM、Memory等,每種存儲引擎都有其特定的優(yōu)缺點和適用場景。數(shù)據(jù)結(jié)構(gòu)和算法也是MySQL底層實現(xiàn)的重要組成部分,它們直接影響MySQL的性能和穩(wěn)定性。MySQL采用了B+樹和哈希等數(shù)據(jù)結(jié)構(gòu),以及查詢優(yōu)化和索引優(yōu)化等算法來提高數(shù)據(jù)庫的效率。
5.哈希表底層實現(xiàn)(數(shù)組+鏈表)
哈希表底層實現(xiàn)通常是基于數(shù)組和鏈表結(jié)合使用的,即將元素存入數(shù)組中,當產(chǎn)生哈希沖突時,通過鏈表將沖突的元素串在一起形成鏈表,從而實現(xiàn)快速查找和插入的功能。哈希表的關(guān)鍵在于哈希函數(shù)的設(shè)計,它能夠?qū)⑷我忾L度的輸入數(shù)據(jù)映射到固定長度的哈希值,從而保證快速查找。
6.什么情況下索引會失效?
索引會失效的情況有以下幾種:
1.當查詢條件中使用了函數(shù)或者表達式來做計算時,索引失效。
2.當查詢條件中使用了大于、小于或者不等于的條件來查詢字符串類型的字段時,由于字符串類型的比較是按照字母的順序進行的,索引失效。
3.當查詢條件中使用了 OR 連接多個條件時,如果其中一個條件不能使用索引的話,就會導致索引失效。
4.當查詢條件中使用了 LIKE 操作符并且通配符在首字母位置時,例如 ‘%abc’,索引失效。
5.當查詢條件中使用了 IS NULL 或者 IS NOT NULL 這樣的條件時,由于 NULL 值不能使用索引,索引失效。 總之,只要查詢條件中涉及到無法使用索引優(yōu)化的操作,就可能會導致索引失效。
7.POST和GET安全性
POST和GET都是HTTP請求方法,但它們在安全性方面有所不同。
GET請求將請求信息附在URL后面,明文傳輸,易被攔截和篡改,因此不適合傳輸敏感信息。
POST請求將請求信息放在請求體中,不會被明文傳輸,更安全可靠,適合于傳輸敏感信息或大量數(shù)據(jù)。
總之,如果您想傳輸敏感信息或大量數(shù)據(jù),應(yīng)該使用POST請求來確保安全性。
8.什么情況下要用線程池
線程池用來處理多個任務(wù)的場景,通過重用已創(chuàng)建的線程降低線程創(chuàng)建和銷毀的開銷。當需要處理大量短時間的任務(wù)時,使用線程池可以減少線程的創(chuàng)建和銷毀,提高性能,避免系統(tǒng)資源過度消耗。同時,線程池還可以限制并發(fā)線程的數(shù)量,避免線程資源被耗盡。一般情況下,線程池的使用是針對任務(wù)執(zhí)行時間較短,但數(shù)量較多的情況。
9.線程池創(chuàng)建的關(guān)鍵信息
線程池的創(chuàng)建需要關(guān)注以下幾個關(guān)鍵信息:
1.線程池中線程的數(shù)量:要根據(jù)任務(wù)類型和系統(tǒng)配置來設(shè)置合理的線程數(shù),避免過多或過少的資源浪費。
2.線程池中任務(wù)隊列的長度:要根據(jù)任務(wù)量和線程處理能力設(shè)置合適的隊列長度,以避免任務(wù)過多時因為隊列滿導致的任務(wù)丟失。
3.線程池中線程池管理器的調(diào)度方式:根據(jù)實際需求可以選擇不同的調(diào)度方式,如優(yōu)先調(diào)度、平均調(diào)度等。
4.線程池中線程的狀態(tài):線程池需要監(jiān)測線程的狀態(tài),及時發(fā)現(xiàn)并處理異常狀態(tài),避免因為線程意外關(guān)閉而導致程序崩潰。
5.線程池中任務(wù)的類型:根據(jù)實際需求和系統(tǒng)特點,可以選擇適宜的任務(wù)類型,如異步任務(wù)、循環(huán)任務(wù)、定時任務(wù)等。
以上是線程池創(chuàng)建時需要關(guān)注的關(guān)鍵信息,通過合理的設(shè)置可以使線程池的運行更加穩(wěn)定、高效。
10.介紹一下分布式
分布式系統(tǒng)是由多個獨立的計算機組成的網(wǎng)絡(luò)系統(tǒng),這些計算機通過網(wǎng)絡(luò)連接起來,相互協(xié)作完成任務(wù)。分布式系統(tǒng)具有以下特點:
1.分布性:系統(tǒng)中的各個節(jié)點分布在不同的物理位置上,通過網(wǎng)絡(luò)連接起來。
2.并發(fā)性:系統(tǒng)中的各個節(jié)點可以同時執(zhí)行多個任務(wù)。
3.協(xié)作性:系統(tǒng)中的各個節(jié)點相互協(xié)作完成任務(wù)。
4.通信性:節(jié)點之間通過網(wǎng)絡(luò)通信交換數(shù)據(jù)。
5.容錯性:系統(tǒng)可以通過備份和冗余機制,保證在出現(xiàn)故障時能夠正常運行。
6.可擴展性:系統(tǒng)可以通過增加節(jié)點的方式,擴展其處理能力。
三、青穎飛帆 Java開發(fā) 面試
1.優(yōu)化過sql語句嗎
優(yōu)化 SQL 語句的方法有以下幾種:
1.確保使用正確的索引。可以使用 EXPLAIN 命令查看查詢計劃,找出性能瓶頸在哪里。
2.減少查詢的結(jié)果集。可以使用 SELECT 只選擇需要的列,或者使用 LIMIT 限制結(jié)果集的大小。
3.避免模糊查詢。模糊查詢會導致全表掃描,性能非常低下。可以使用索引或者全文搜索進行優(yōu)化。
4.避免使用子查詢。子查詢會導致多次查詢,性能非常低下。可以使用 JOIN 或者表連接進行優(yōu)化。
5.將計算交給應(yīng)用程序。一些計算可以在應(yīng)用程序中完成,而不是在 SQL 語句中計算,可以減輕數(shù)據(jù)庫的負擔。
這些是常用的 SQL 優(yōu)化方法,可以根據(jù)具體情況進行選擇。
2.explain中的key字段所寫的一定是它會用的嗎 其他字段都是什么意思?
對于"explain"中的key字段,它所寫的內(nèi)容是需要被使用的。其他字段的意思如下:
1.model:指定使用的模型,缺省為通用模型。
2.version:指定使用的模型版本,缺省為最新版本。
3.topn:返回結(jié)果的條數(shù),缺省為5。
4.mode:指定解釋模式,缺省為常規(guī)解釋。
5.kbid:指定知識庫ID,缺省為通用知識庫。
需要注意的是,除了key字段以外,其他字段都是可選的,根據(jù)具體的使用場景和需求進行設(shè)置。同時,在使用explain API時,用戶需要提供有效的API Key,以保證認證和授權(quán)。希望以上信息能夠幫助到您,如需進一步了解,可參考官方文檔或咨詢相關(guān)技術(shù)人員。
3.索引的機制
索引是用于快速定位、訪問和檢索數(shù)據(jù)的一種數(shù)據(jù)結(jié)構(gòu)。在計算機領(lǐng)域中,常見的索引結(jié)構(gòu)包括B樹、Hash表、B+樹等。不同的索引結(jié)構(gòu)適用于不同的場景,例如B樹適用于范圍查詢,Hash表適用于精確查詢。
4.葉子節(jié)點一定是放的數(shù)據(jù)嗎
不一定。在樹形結(jié)構(gòu)中,葉子節(jié)點一般是沒有子節(jié)點的節(jié)點。它們可以放置數(shù)據(jù),但也可以代表其他意義。例如,在文件系統(tǒng)的樹形結(jié)構(gòu)中,葉子節(jié)點可能代表文件,也可能代表空文件夾。
5.事務(wù)安全
事務(wù)安全是指在數(shù)據(jù)庫中進行的事務(wù)操作具有ACID屬性,即原子性、一致性、隔離性和持久性。原子性指事務(wù)要么全部執(zhí)行,要么全部不執(zhí)行;一致性指事務(wù)將數(shù)據(jù)庫從一種有效狀態(tài)轉(zhuǎn)換為另一種有效狀態(tài);隔離性指多個事務(wù)同時執(zhí)行時,每個事務(wù)都能夠感知到其他事務(wù)的執(zhí)行結(jié)果,但是不會受到其他事務(wù)的干擾;持久性指在事務(wù)完成后,對數(shù)據(jù)庫的修改將會被永久保存。
6.@Transcational機制
@Transactional機制是一種處理事務(wù)的方式,它可以確保在需要修改多個數(shù)據(jù)源的情況下,所有數(shù)據(jù)源都成功更新或回滾,以保持數(shù)據(jù)的一致性和完整性。通常用于關(guān)系型數(shù)據(jù)庫中。
7.事務(wù)與事務(wù)之間怎么保證隔離
在數(shù)據(jù)庫中,通過事務(wù)隔離級別來保證事務(wù)之間的隔離。常用的事務(wù)隔離級別有讀未提交(read uncommitted)、讀提交(read committed)、可重復讀(repeatable read)和串行化(serializable)。不同的隔離級別對事務(wù)之間的隔離程度有所不同,隔離級別越高,事務(wù)之間的隔離程度越高,但是同時也可能會影響性能。因此,需要根據(jù)具體情況來選擇合適的隔離級別。
8.事務(wù)的特性
事務(wù)的特性有四個,它們分別是:原子性、一致性、隔離性和持久性。
其中,原子性指事務(wù)中所有操作要么全部完成,要么全部不完成;一致性指事務(wù)前后數(shù)據(jù)的狀態(tài)保持一致;隔離性指多個事務(wù)并發(fā)執(zhí)行時,每個事務(wù)都應(yīng)該被隔離開來,互不干擾;持久性指事務(wù)一旦提交,對數(shù)據(jù)的修改就會永久保存到數(shù)據(jù)庫中,即使系統(tǒng)發(fā)生故障也不會丟失。
9.事務(wù)隔離級別 默認的是什么
默認的事務(wù)隔離級別是 READ COMMITTED。
10.get和post區(qū)別
HTTP中的GET和POST都是HTTP請求方法,用于從服務(wù)器獲取數(shù)據(jù)或向服務(wù)器提交數(shù)據(jù)。它們之間的主要區(qū)別在于:GET請求會向服務(wù)器請求特定的資源,而POST請求會向服務(wù)器提交數(shù)據(jù)。在GET請求中,所有請求數(shù)據(jù)都以查詢字符串的形式附加到URL中,而在POST請求中,請求數(shù)據(jù)則包含在請求體中。此外,GET請求相對于POST請求更容易緩存、更容易被爬蟲搜索引擎索引。
11.http是什么協(xié)議 https呢
HTTP指的是超文本傳輸協(xié)議,是一種用于傳輸超媒體文檔的應(yīng)用層協(xié)議。HTTPS指的是超文本傳輸安全協(xié)議,是在HTTP的基礎(chǔ)上加入SSL/TLS協(xié)議進行加密通信的協(xié)議。
12.TCP過程中怎么識別對方
TCP通過IP地址和端口號識別對方。IP地址用于識別一臺計算機,端口號用于識別該計算機上的進程或服務(wù)。在TCP連接建立時,客戶端和服務(wù)器端都會指定一個端口號,彼此通過IP地址和端口號進行通信。通過這種方式,TCP可以同時支持多個應(yīng)用程序在同一臺計算機上進行通信,并確保每個連接都是唯一的。
13.介紹Java中用的集合類
在Java中,集合類是一組可變大小的對象,用于存儲其他對象。主要集合類包括:
1.ArrayList:基于數(shù)組實現(xiàn)的可變大小數(shù)組,提供快速的訪問和隨機訪問能力。
2.LinkedList:基于鏈表實現(xiàn)的集合類,可以方便地在集合中添加和刪除元素。
3.HashSet:基于哈希表實現(xiàn)的集合類,沒有順序,不允許重復元素。
4.TreeSet:基于紅黑樹實現(xiàn)的集合類,按照元素的自然順序排序,并且不允許重復元素。
5.LinkedHashMap:基于哈希表和鏈表實現(xiàn)的有序集合類,可以按照加入元素的順序訪問集合中的元素。
四、普元信息Java實習生面經(jīng)
1.==與equals的區(qū)別
在Java中,"=="是比較兩個對象的引用是否相等,也就是是否指向了同一個內(nèi)存地址;而"equals"是比較兩個對象內(nèi)容是否相等,也就是是否具有相同的屬性值。如果沒有在類中重寫equals方法,則默認比較的仍然是兩個對象的引用是否相等。
2.數(shù)組與鏈表的區(qū)別
數(shù)組和鏈表都是數(shù)據(jù)結(jié)構(gòu),它們的主要區(qū)別在于數(shù)據(jù)的組織方式。數(shù)組是一組連續(xù)的內(nèi)存單元,用于存儲相同類型的數(shù)據(jù)。它們可以通過索引來訪問,因此數(shù)組的訪問速度很快。但是,數(shù)組的大小是固定的,一旦聲明后,不能再改變大小。而鏈表則是一組非連續(xù)的內(nèi)存單元,每個節(jié)點存儲數(shù)據(jù)和指向下一個節(jié)點的指針。因此,訪問鏈表中的元素需要遍歷整個鏈表,速度比數(shù)組慢一些。但是,鏈表的大小可以動態(tài)調(diào)整,可以在運行時添加、刪除節(jié)點。總的來說,數(shù)組適合于需要快速訪問數(shù)據(jù)和大小固定的情況,而鏈表適合于需要動態(tài)調(diào)整大小和插入或刪除元素的情況。
3.jvm的垃圾回收算法
JVM的垃圾回收算法有很多種,其中比較常見的有標記清除算法、復制算法、標記整理算法以及分代收集算法。每種算法都有其適用的場景和優(yōu)缺點,具體的選擇也要根據(jù)實際情況進行權(quán)衡和取舍。
4.string A=abc ,String B=adc ; AB是否相等
AB不相等,因為A和B的第二個字符不同。
5.mysql事務(wù)隔離級別
MySQL事務(wù)隔離級別包括READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ和SERIALIZABLE。不同的隔離級別具有不同的并發(fā)控制機制,可以避免數(shù)據(jù)不一致和臟數(shù)據(jù)等問題。但是,更高的隔離級別會帶來更嚴重的性能問題。
6.mysql索引
MySQL索引是一種數(shù)據(jù)結(jié)構(gòu),用于提高數(shù)據(jù)庫查詢效率。它可以按照一定的規(guī)則對表中的數(shù)據(jù)進行排序,并可以快速地查詢特定的數(shù)據(jù),從而加快數(shù)據(jù)庫的查詢速度。在MySQL中,常用的索引類型包括B-Tree索引、全文索引和哈希索引等。
7.redis為什么快
Redis 之所以快速,是因為它使用了內(nèi)存存儲和異步 I/O 的特性。Redis 將熱點數(shù)據(jù)存儲在內(nèi)存中,而不是磁盤上,這極大地加快了數(shù)據(jù)讀寫速度。當然,這也意味著 Redis 支持的數(shù)據(jù)規(guī)模是有限的。此外,Redis 還利用了異步 I/O 實現(xiàn)了高效的單線程處理,避免了多線程帶來的線程切換開銷。
8.redis的基本數(shù)據(jù)類型
常見的Redis基本數(shù)據(jù)類型有五種:字符串類型(string)、哈希類型(hash)、列表類型(list)、集合類型(set)和有序集合類型(sorted set)。這五種數(shù)據(jù)類型在Redis中被廣泛使用,可以滿足各種不同的數(shù)據(jù)處理需求。
9.redis的持久化
Redis支持兩種持久化方式:RDB和AOF。
RDB持久化是指在指定的時間間隔內(nèi)將內(nèi)存中的數(shù)據(jù)集快照寫入磁盤。可以手動執(zhí)行SAVE命令,也可以設(shè)置自動保存策略,如SAVE 900 1表示在900秒之內(nèi)如果有至少1個鍵值被改變就自動執(zhí)行一次SAVE操作。RDB的優(yōu)點是文件較小,適合備份,恢復速度較快;缺點是需要定期執(zhí)行SAVE操作,會有數(shù)據(jù)丟失的風險。
AOF持久化是指將每個寫操作都寫入日志文件,寫入順序與執(zhí)行順序一致。可以設(shè)置同步方式,如每秒同步一次(sync每秒一次),每次寫操作都同步(always),或者使用無同步(no)方式。AOF優(yōu)點是保證數(shù)據(jù)的完整性,可重放所有操作;缺點是文件較大,不適合備份,恢復速度較慢。
10.redis的淘汰機制
Redis的淘汰機制指的是在內(nèi)存空間不足時,Redis會根據(jù)一定的算法淘汰一些舊的,不使用的key-value對,騰出空間給新的數(shù)據(jù)使用。Redis目前提供了五種淘汰策略,分別為:volatile-lru(從已設(shè)置過期時間的數(shù)據(jù)集中挑選最近最少使用的數(shù)據(jù)淘汰)、volatile-ttl(從已設(shè)置過期時間的數(shù)據(jù)集中挑選將要過期的數(shù)據(jù)淘汰)、volatile-random(從已設(shè)置過期時間的數(shù)據(jù)集中任意選擇數(shù)據(jù)淘汰)、allkeys-lru(從數(shù)據(jù)集中挑選最近最少使用的數(shù)據(jù)淘汰)、allkeys-random(從數(shù)據(jù)集中任意選擇數(shù)據(jù)淘汰)。
11.Spring IOC 和AOP
Spring IOC(控制反轉(zhuǎn))是一種設(shè)計模式,它允許將對象之間的依賴關(guān)系委托給容器來管理。在Spring中,容器會負責實例化、初始化和連接對象,而不是由對象自己來完成。AOP(面向切面編程)是一種編程范式,它可以在不修改原始代碼的情況下,通過將公共行為(如日志記錄、性能監(jiān)控等)從程序邏輯中分離出來,從而使代碼更加模塊化和易于擴展。在Spring中,可以使用AOP來增強對象的行為,例如為方法添加事務(wù)管理或安全檢查。
12.Mybatis 中受用#{} 與 ${}的區(qū)別
#{} 是預(yù)編譯處理,${} 是字符串替換。
Mybatis 在處理 #{} 時,會將 sql 中的 #{} 替換為?號,調(diào)用 PreparedStatement 的 set 方法來賦值;
Mybatis 在處理 ${} 時,就是把 ${} 替換成變量的值。
使用 #{} 可以有效的防止 SQL 注入,提高系統(tǒng)安全性
13.linux常用命令
一些常用的Linux命令有:ls、cd、pwd、mkdir、rm、cp、mv、touch、cat、grep、find、ps、top、ifconfig等。
14.linux怎么查找一個已知進程的進程號
查找一個已知進程的進程號可以使用命令行工具ps -ef | grep 進程名,其中進程名可以是進程的可執(zhí)行文件名或進程的任何名稱,通過該命令可以查找到匹配的進程并輸出該進程的詳細信息,其中包括該進程的PID,即進程號。另外,如果您知道該進程的PID,也可以使用命令kill PID來殺掉該進程。
五、美團到店廣告Java 一面
1.整體設(shè)計是怎樣的?
2.底層的數(shù)據(jù)表?說一說其中有哪些外鍵?
3.說說你對Mybatis的理解?為什么能夠幫助我們?nèi)プ鲞@種解耦?
Mybatis是一款開源的持久層框架,它支持自定義SQL、存儲過程和高級映射機制,可以簡化開發(fā)人員在數(shù)據(jù)訪問層的工作。Mybatis通過XML配置文件和Java注解的方式來實現(xiàn)與數(shù)據(jù)庫的交互,從而將SQL語句與Java代碼進行了解耦。
Mybatis的主要優(yōu)勢在于它使得Java開發(fā)人員可以通過簡單的配置文件和注解來進行數(shù)據(jù)庫訪問,而不需要編寫大量的JDBC代碼。另外,Mybatis的靈活性也讓它成為了許多大型Web應(yīng)用的首選持久層框架。
通過使用Mybatis,我們可以將業(yè)務(wù)邏輯和底層數(shù)據(jù)訪問邏輯分開,從而實現(xiàn)系統(tǒng)的解耦。這意味著我們可以根據(jù)不同的需求(例如,不同的數(shù)據(jù)庫或者數(shù)據(jù)訪問方式)來更改數(shù)據(jù)訪問代碼,而不需要修改應(yīng)用程序的代碼。這不僅能提高代碼的靈活性和可維護性,也能減少應(yīng)用程序開發(fā)的工作量。
4.這個項目你有哪些收獲?
5.Kafka
Kafka是一個分布式流處理平臺,被廣泛應(yīng)用于海量實時數(shù)據(jù)處理中。它基于發(fā)布/訂閱機制,支持高可用和容錯,并能夠在處理大量數(shù)據(jù)時保持高性能和低延遲。Kafka通常用于數(shù)據(jù)收集、日志聚合、流處理和實時分析等領(lǐng)域。
6.盤梯性
盤梯性是指通過一系列的變換,使得初始問題可以被轉(zhuǎn)化為一個簡單的形式,從而便于解決。這個概念經(jīng)常出現(xiàn)在數(shù)學和計算機科學中。具體來說,在優(yōu)化問題中,盤梯性是指一種特定形式的約束條件,可以通過變換將其簡化為輪廓消失約束。而在矩陣論中,盤梯性則是一種與特定矩陣的分解有關(guān)的性質(zhì)。
7.ack機制
ACK機制是一種通信協(xié)議中的確認機制,用于在數(shù)據(jù)傳輸過程中確認接收到的數(shù)據(jù)包是否正確。在收到數(shù)據(jù)包后,接收方發(fā)送一個ACK確認信號,告訴發(fā)送方數(shù)據(jù)已經(jīng)被正確接收。ACK機制可以確保數(shù)據(jù)的可靠性和完整性,在網(wǎng)絡(luò)通信中應(yīng)用廣泛。
8.pull和push兩種的優(yōu)缺點
Pull 和 Push 是兩種常見的數(shù)據(jù)傳輸方式。Pull 是由接收方主動從發(fā)送方獲取數(shù)據(jù),而 Push 則是發(fā)送方主動向接收方傳輸數(shù)據(jù)。
Pull 的優(yōu)點是可以控制數(shù)據(jù)的獲取頻率,接收方可以根據(jù)自己的需要決定何時獲取數(shù)據(jù),避免了不必要的傳輸,同時也可以降低發(fā)送方的壓力。缺點是當數(shù)據(jù)需要及時更新時,需要頻繁地獲取數(shù)據(jù),可能會導致網(wǎng)絡(luò)擁堵或增加延遲。
Push 的優(yōu)點是可以實時傳輸數(shù)據(jù),及時更新信息,提高實時性。同時也可以減少接收方的等待時間,降低延遲,提高數(shù)據(jù)傳輸效率。缺點是數(shù)據(jù)傳輸可能沒有經(jīng)過接收方的授權(quán),容易受到網(wǎng)絡(luò)攻擊和數(shù)據(jù)泄漏的風險。
綜上所述,兩種傳輸方式具有各自的優(yōu)缺點,應(yīng)根據(jù)具體情況選擇合適的方式。
9.Redis數(shù)據(jù)結(jié)構(gòu)
Redis是一個基于內(nèi)存的開源Key-Value存儲系統(tǒng)。它支持多種數(shù)據(jù)結(jié)構(gòu),包括字符串(string),哈希表(hash),列表(list),集合(set),有序集合(sorted set)等。其中,字符串類型是最常用的數(shù)據(jù)結(jié)構(gòu)之一,它支持字符串的存儲和操作,比如存儲和獲取字符串、計數(shù)器、位圖等。哈希表類型可以存儲多個鍵值對,類似于關(guān)聯(lián)數(shù)組,可以快速地進行讀取和修改操作。列表類型可以存儲一組有序的元素,支持從頭部或尾部進行插入和彈出元素等操作。集合類型可以存儲多個元素,支持交集、并集、差集等操作。有序集合類型類似于集合類型,但多了一個權(quán)重值,可以按照權(quán)重值進行排序。
10.Redis中的String底層
Redis中的String底層數(shù)據(jù)結(jié)構(gòu)是簡單動態(tài)字符串(SDS)。這種結(jié)構(gòu)可以自動擴展容量,同時支持高效的追加、刪除、插入等操作。此外,SDS還支持O(1)復雜度的字符串長度計算、常數(shù)級別的時間復雜度的字符串切割等高性能操作,能夠滿足Redis的高吞吐量、低延遲的要求。
11.volatile
volatile 關(guān)鍵字是用于編寫并發(fā)程序的時候使用的。在多線程環(huán)境下,某些變量可能被多個線程同時訪問和修改,這就會導致對這些變量的可見性問題。
當一個變量被聲明為 volatile 類型時,編譯器會把對這個變量的讀寫操作都直接映射到內(nèi)存上,這樣就能確保多個線程之間對這個變量的可見性。
不過,使用 volatile 并不能確保對變量的操作的原子性,也就是說,對 volatile 變量的寫操作可能會被編譯器優(yōu)化,導致多個線程對同一個變量的修改產(chǎn)生沖突。因此,如果需要對變量的操作具有原子性,可以使用 synchronized 或者 Lock 等同步機制來保證。
12. synchronized和lock
synchronized 和 Lock 都是 Java 中用于實現(xiàn)線程同步的機制。它們之間的主要區(qū)別在于 sychronized 是 Java 語言原生層面的關(guān)鍵字,而 Lock 是 Java API 中的一個類。
synchronized 關(guān)鍵字是隱式的,它的加鎖和解鎖操作是由 JVM 自動完成的,而 Lock 對象則需要顯式的進行加鎖和解鎖操作。
另外,Lock 對象可以支持多個 Condition(條件),而 synchronized 關(guān)鍵字只能支持一個相關(guān)條件。此外,Lock 對象還提供了更加靈活的加鎖和解鎖機制,可以更好地滿足并發(fā)編程的需求。
13.jvm內(nèi)存結(jié)構(gòu)
JVM內(nèi)存結(jié)構(gòu)主要分為以下幾個部分:
程序計數(shù)器:用于存儲當前線程執(zhí)行的字節(jié)碼指令地址。
Java虛擬機棧:每個線程都有自己的虛擬機棧,用于存儲局部變量、方法出口等信息。
堆:用于存儲對象實例和數(shù)組,是Java程序的動態(tài)內(nèi)存區(qū)域。
方法區(qū):用于存儲類的信息、常量、靜態(tài)變量等,也稱為永久代,但在Java 8之后已經(jīng)逐漸被元空間所代替。
本地方法棧:用于支持本地方法(native方法)的執(zhí)行。
這些部分組成了JVM內(nèi)存結(jié)構(gòu),它們在Java程序的運行過程中扮演著不同的角色。
14. OOM
OOM全稱為Out Of Memory,是Java中常見的一種運行時錯誤,表示內(nèi)存不足。當JVM無法分配更多的內(nèi)存空間時,就會拋出OOM錯誤。通常情況下,OOM錯誤是由于程序中存在內(nèi)存泄漏、內(nèi)存溢出等問題引起的。如果不解決OOM問題,會導致應(yīng)用程序崩潰,影響用戶體驗和應(yīng)用系統(tǒng)穩(wěn)定性。
15.內(nèi)存泄漏 內(nèi)存溢出
內(nèi)存溢出指的是當程序運行時需要分配的內(nèi)存超過了系統(tǒng)可用的內(nèi)存時,導致程序崩潰或無法繼續(xù)運行。而內(nèi)存泄漏指的是程序中已經(jīng)不再需要的內(nèi)存沒有被及時地釋放,導致這些內(nèi)存無法被再次使用,最終導致系統(tǒng)的性能降低或崩潰。區(qū)別在于內(nèi)存泄漏是因為沒有正確釋放內(nèi)存導致的問題,而內(nèi)存溢出是因為需要的內(nèi)存超過了系統(tǒng)的可用內(nèi)存。
16.內(nèi)存泄漏和內(nèi)存溢出有什么好的解決方法?
對于內(nèi)存泄漏,一般通過定期執(zhí)行垃圾回收器(GC)來清理不再被引用的對象,或者通過程序設(shè)計避免出現(xiàn)內(nèi)存泄漏的情況。對于內(nèi)存溢出,可以通過增加JVM的堆內(nèi)存、優(yōu)化程序代碼等方式來解決。此外,還可以使用一些工具來監(jiān)控和分析程序的內(nèi)存使用情況,找出內(nèi)存泄漏和內(nèi)存溢出的具體原因。
17.如何確認垃圾回收
在 JVM 中,垃圾回收器通過兩種方式來確定哪些對象可以被回收。第一種是引用計數(shù)法,即每個對象都有一個計數(shù)器,當有其他對象引用該對象時,計數(shù)器加一,引用該對象的對象被銷毀時,計數(shù)器減一,當計數(shù)器的值為零時,對象被標記為垃圾,等待回收。但這種方法存在循環(huán)引用的問題,因此 JVM 采用的是第二種方法,即可達性分析法。可達性分析法是從一組稱為 GC 根的對象開始,搜索所有與之直接或間接相連的對象,任何未被搜索到的對象都被標記為垃圾,等待回收。
18.哪些可以作為GCRoots呢
GCRoots 是指被視為“根”的對象,是在垃圾回收中保持活動對象的關(guān)鍵點。以下對象可以作為 GCRoots:
1.虛擬機棧中的對象
2.方法區(qū)中類靜態(tài)屬性引用的對象
3.方法區(qū)中常量引用的對象
4.本地方法棧中 JNI(Java Native Interface)引用的對象
5.虛擬機內(nèi)部引用的基本數(shù)據(jù)類型對象,如系統(tǒng)類加載器等。
19.在代碼中引入一個自定義的類要怎么做呢?
要在Java代碼中引入一個自定義的類,需要使用Java的import語句。具體操作步驟如下:
1.編寫自定義的類,并將其保存在一個java文件中,例如MyClass.java;
2.在另外一個Java文件中引入MyClass類,可以這樣寫import語句:import 包名.MyClass;
3.在需要使用MyClass類的地方直接使用MyClass即可。
需要注意的是,如果導入的類和當前類不在同一個包中,就要加上包名。如果不加包名,Java會默認在同一包中查找該類。如果找不到,就會報錯。如果不確定類的完整路徑,可以使用Java的自動導入功能,即在需要使用該類的地方輸入該類的簡化名稱,然后按下CTRL+SHIFT+O快捷鍵,Java會自動導入相關(guān)類。
20.非阻塞IO
非阻塞IO(Non-blocking IO)是指在讀寫數(shù)據(jù)的過程中,不會阻塞當前線程,允許程序在等待數(shù)據(jù)到達的同時繼續(xù)執(zhí)行其他任務(wù)。相比阻塞IO,非阻塞IO能夠提高程序的并發(fā)性和響應(yīng)速度,適用于高并發(fā)、高吞吐量的場景。非阻塞IO通常使用異步IO或多路復用技術(shù)來實現(xiàn)。
21. 序列化和反序列化
序列化是將對象轉(zhuǎn)換成可存儲或可傳輸?shù)母袷?#xff0c;例如將對象轉(zhuǎn)換成二進制或JSON格式。反序列化則是將序列化后的數(shù)據(jù)重新轉(zhuǎn)換成對象的過程。序列化和反序列化可以用于數(shù)據(jù)存儲和網(wǎng)絡(luò)通信等應(yīng)用場景。
22. static變量會參與序列化嗎
對于靜態(tài)變量,在Java中不會參與序列化過程。序列化只會包括實例變量,它是根據(jù)對象的實例信息進行序列化的。靜態(tài)變量屬于類,所有對象共享,它們保存在JVM的方法區(qū)中,不隸屬于任何一個實例對象。因此,靜態(tài)變量不會參與對象的序列化和反序列化過程。
23.如果在服務(wù)端修改了類,增刪字段,那么對反序列化有影響嗎
如果在服務(wù)端修改了類,增刪字段,那么對于之前已經(jīng)序列化的對象進行反序列化時會出現(xiàn)錯誤。因為反序列化時需要使用與序列化時相同的類定義,如果類定義已經(jīng)發(fā)生了變化,那么就會出現(xiàn)無法讀取某些字段的情況,從而導致反序列化失敗。為了避免這種情況,可以使用一些類似于版本控制的方法來解決,比如序列化時添加版本號,在反序列化時根據(jù)版本號來適配不同的類定義。
24.HashMap的設(shè)計
HashMap是Java中一個非常常用的數(shù)據(jù)結(jié)構(gòu),它是一種哈希表實現(xiàn)的Map接口,它提供了鍵值對的映射關(guān)系,并且支持常數(shù)時間的插入、刪除和查找操作。在一個HashMap中,每一個鍵值對被存儲在一個桶中,而每個桶是由一個鏈表或者紅黑樹實現(xiàn)的。當插入或者查找一個鍵值對時,HashMap會首先計算出對應(yīng)的哈希值,然后根據(jù)哈希值找到對應(yīng)的桶,從而提高插入、查找和刪除操作的效率。
25. HashMap線程安全嗎?體現(xiàn)在哪里?
HashMap在多線程環(huán)境下是不安全的,因為多個線程同時修改HashMap時可能會導致數(shù)據(jù)不一致的問題。具體體現(xiàn)在并發(fā)修改HashMap時可能會導致元素丟失或覆蓋,或者導致死循環(huán)等問題。為了實現(xiàn)線程安全,可以使用ConcurrentHashMap或者在使用HashMap時進行同步處理(比如使用Collections.synchronizedMap方法)。
26.concurrentHashMap
ConcurrentHashMap是Java集合框架中的一個線程安全的哈希表實現(xiàn)。它支持高并發(fā)的讀寫操作,采用了分段鎖的機制,同時保證了并發(fā)性和數(shù)據(jù)的一致性。相比于Hashtable和synchronizedMap等線程安全的哈希表實現(xiàn),ConcurrentHashMap可以同時進行讀取和寫入操作而不需要加鎖整個表,因此并發(fā)性能更高。
27.在jdk1.8中cas+synchronized與segment相比的好處是什么?
在 JDK1.8 中,使用 CAS(Compare And Swap)和 synchronized(鎖)機制實現(xiàn)并發(fā)同步。相比于 JDK1.7 中使用的 Segment 機制,CAS 和 synchronized 在性能和并發(fā)度上都有所提高。
具體來說,CAS 操作相當于一個樂觀鎖,當進行操作時,先比較當前內(nèi)存值是否和預(yù)期值相等,如果相等則進行操作,否則不進行操作。這避免了競爭和阻塞,提高了并發(fā)度。而 synchronized 在加鎖時會阻塞其他的線程,降低了并發(fā)度。此外,CAS 操作在執(zhí)行時也更加輕量級,性能更優(yōu)。
另外,JDK1.8 中的 ConcurrentHashMap 通過分段鎖,從而減少了對全局鎖的依賴,也提高了并發(fā)度和性能。而在 JDK1.7 中的 ConcurrentHashMap 使用的是 Segment 機制,需要對每個 Segment 加鎖,帶來了一定的性能損失。
28. 線程創(chuàng)建
常見的線程創(chuàng)建方式有以下幾種:
1.繼承Thread類,重寫run()方法來實現(xiàn)線程
2.實現(xiàn)Runnable接口,重寫run()方法來實現(xiàn)線程
3.實現(xiàn)Callable接口,通過FutureTask包裝器來包裝Callable的返回結(jié)果
4.使用線程池創(chuàng)建線程
這些都是 Java 中常見的線程創(chuàng)建方式。
29.線程池參數(shù) 創(chuàng)建線程的流程
關(guān)于線程池參數(shù),一般包括核心線程數(shù)、最大線程數(shù)、隊列類型、隊列長度、線程存活時間等。核心線程數(shù)是線程池中最少的線程數(shù),也是保證線程池最少有幾個線程在工作的參數(shù);最大線程數(shù)是線程池中最多能容納的線程數(shù);隊列類型可以分為有界隊列和無界隊列,分別對應(yīng)的是有界緩存池和無界緩存池;隊列長度代表著線程池隊列能夠緩存的任務(wù)數(shù)量;線程存活時間是當線程池中的線程數(shù)量大于核心線程數(shù)時,這些多余的空閑線程能夠存活的最長時間。
至于創(chuàng)建線程的流程,基本上分為以下幾步:
1.創(chuàng)建線程池
2.當需要執(zhí)行任務(wù)時,向線程池提交任務(wù)
3.線程池調(diào)用線程工廠創(chuàng)建新的線程
4.新線程從任務(wù)隊列中取出任務(wù)并執(zhí)行
5.執(zhí)行完任務(wù)后,線程重新回到線程池中被復用
以上就是線程池參數(shù)及創(chuàng)建線程的流程的基本介紹。希望對您有所幫助。
30.線程池源碼看過嗎?
線程池是一種可以優(yōu)化線程使用的方式,其實現(xiàn)思路就是在系統(tǒng)啟動時創(chuàng)建一定數(shù)量的線程,并將它們放置在線程池中,等待工作的到來。當需要進行任務(wù)處理的時候,就可以從線程池中取出一個空閑的線程來完成任務(wù),可以避免頻繁創(chuàng)建和銷毀線程所產(chǎn)生的開銷,因此在并發(fā)編程中得到了廣泛的應(yīng)用。
Java提供了Executor框架,實現(xiàn)線程池的功能。其中,ThreadPoolExecutor類是Java內(nèi)置的線程池實現(xiàn)類,具有靈活性和優(yōu)秀的封裝性,可以滿足大多數(shù)并發(fā)編程需求。使用ThreadPoolExecutor時需要注意一些參數(shù):
corePoolSize:線程池核心線程數(shù);
maximumPoolSize:線程池最大線程數(shù);
keepAliveTime:線程存活時間;
workQueue:任務(wù)隊列;
threadFactory:線程生產(chǎn)工廠類;
handler:線程異常處理類。
31.sleep 和wait的區(qū)別
sleep和wait都可以讓程序等待一段時間,不過它們的用途是有所不同的。sleep是讓線程或進程停止執(zhí)行一段指定的時間,而wait則是讓線程或進程等待某個特定的事件發(fā)生。wait通常用在多線程或多進程的情況下,當一個線程或進程需要等待其他線程或進程完成一定的工作后再繼續(xù)執(zhí)行時,就可以使用wait。在wait被喚醒之前,它會一直阻塞。而sleep則是一個單獨的操作,它不需要等待任何特定的事件發(fā)生,只需要暫停一段時間即可。
32.start和run
start()是啟動一個線程,而run()是線程中的方法。也就是說,調(diào)用start()方法會新建一個線程并執(zhí)行線程的任務(wù),而使用run()方法僅僅是執(zhí)行該方法的代碼塊,不會新建線程。
33.MySQL日志有哪些
MySQL日志一般分為以下幾類:
1.錯誤日志(error log):記錄MySQL Server啟動、運行過程中的錯誤信息,例如某個操作失敗、某個文件無法讀取等。
2.查詢?nèi)罩?#xff08;query log):記錄MySQL Server收到的所有查詢請求,包括查詢語句、連接信息、查詢時間等。
3.慢查詢?nèi)罩?#xff08;slow query log):記錄查詢響應(yīng)時間超過設(shè)定時間閾值的查詢語句、連接信息、查詢時間等。
4.二進制日志(binary log):記錄MySQL Server的數(shù)據(jù)更改操作,例如insert、update、delete等,以便進行數(shù)據(jù)恢復和復制等操作。
5.撤銷日志(undo log):用于事務(wù)的回滾、MVCC的實現(xiàn)等。
6.重做日志(redo log):用于事務(wù)的提交、崩潰恢復等。
以上是MySQL日志的主要種類,不同的日志有不同的作用和使用場景。
34.undolog和redolog的作用是什么
undolog和redolog是數(shù)據(jù)庫日志文件,用于記錄操作數(shù)據(jù)的過程和結(jié)果。
undo log(撤銷日志)記錄的是事務(wù)執(zhí)行前的數(shù)據(jù)狀態(tài)和相關(guān)操作,以便在撤銷操作時將數(shù)據(jù)恢復到事務(wù)執(zhí)行之前的狀態(tài)。
redo log(重做日志)記錄的是事務(wù)執(zhí)行過程中所進行的修改操作,以便在重啟數(shù)據(jù)庫后將數(shù)據(jù)恢復到事務(wù)執(zhí)行后的狀態(tài)。
簡單來說,undolog記錄的是“回退”操作,而redolog記錄的則是“前進”操作;兩種日志文件的作用是為了保證數(shù)據(jù)的一致性、可靠性和安全性。
35.MVCC用于解決什么問題的?
MVCC(Multi-Version Concurrency Control)用于解決并發(fā)控制問題。它允許多個事務(wù)能夠同時訪問同一數(shù)據(jù),而不會相互干擾或產(chǎn)生不一致的結(jié)果。在MVCC中,每個事務(wù)可以看到數(shù)據(jù)庫中的一個歷史版本,這個歷史版本會與事務(wù)的隔離級別進行比較,以確保每個事務(wù)都能看到它應(yīng)該看到的數(shù)據(jù)。
36.索引的作用
索引的作用是在大型數(shù)據(jù)集中,通過創(chuàng)建一個快速的索引結(jié)構(gòu),可以提高數(shù)據(jù)的檢索速度和準確性。索引可以幫助我們快速地定位到特定的數(shù)據(jù)記錄。在數(shù)據(jù)庫中,通過索引可以更快地查詢數(shù)據(jù),也可以加速排序操作和提高查詢結(jié)果的準確性。在搜索引擎中,索引可以幫助我們快速地搜索到相關(guān)的信息。
37. 時間復雜度?
在Java語言中,時間復雜度常用的有O(1)、O(log n)、O(n)、O(n log n)、O(n2)等,表示程序執(zhí)行所需要的時間與數(shù)據(jù)規(guī)模之間的關(guān)系。其中,O(1)表示執(zhí)行時間與數(shù)據(jù)規(guī)模無關(guān),即為常數(shù)級別的時間復雜度;O(log n)表示執(zhí)行時間隨著數(shù)據(jù)規(guī)模的增加而增加,但增加速度逐漸減慢;O(n)表示執(zhí)行時間與數(shù)據(jù)規(guī)模成線性關(guān)系;O(n log n)表示執(zhí)行時間隨著數(shù)據(jù)規(guī)模的增加而增加,但增加速度比O(n)慢;O(n2)表示執(zhí)行時間與數(shù)據(jù)規(guī)模成平方關(guān)系,執(zhí)行時間增長非常快。
六、wind萬得Java實習
1.Java語言聊聊和其他語言區(qū)別
Java語言與其他語言的主要區(qū)別在于其跨平臺性和自動內(nèi)存管理機制。Java語言可以在不同的操作系統(tǒng)和硬件上運行,而不需要修改代碼,這是因為Java源代碼被編譯成可移植的字節(jié)碼,然后在Java虛擬機(JVM)上執(zhí)行。 另外,Java還具有自動內(nèi)存管理機制,這意味著程序員無需手動分配和釋放內(nèi)存,因為Java虛擬機會自動管理內(nèi)存分配和釋放。其他語言,如C ++,需要手動進行內(nèi)存管理,這可能會導致內(nèi)存泄漏和其他問題。 此外,Java語言還具有面向?qū)ο缶幊痰奶匦?#xff0c;提供了許多面向?qū)ο蟮母拍詈凸ぞ?#xff0c;如類、對象、封裝、繼承和多態(tài)。這使得Java語言易于理解和使用,并且有助于提高代碼的可讀性和重用性。
2.面向?qū)ο笕筇匦?各自理解
三大特性是封裝、繼承和多態(tài)。封裝指的是將數(shù)據(jù)和方法組合成一個有機的整體,對外隱藏實現(xiàn)的細節(jié),只向外界提供訪問接口。繼承指的是從已有的類派生出新的類,新類繼承了基類的屬性和方法,可以覆蓋父類中的方法并添加新的方法和屬性。多態(tài)指的是多種形態(tài),同一種行為在不同的對象中有不同的表現(xiàn)形式,允許不同的子類對象對同一方法作出不同的響應(yīng)。
3.String、StringBuffer、StringBuilder 區(qū)別
String、StringBuffer和StringBuilder都是Java中表示字符串的類。它們的區(qū)別主要在于它們的可變性和線程安全性。
String是不可變的類,一旦創(chuàng)建它的值就無法改變。當需要對String進行拼接操作時,每次操作都會創(chuàng)建一個新的String對象,非常浪費資源。
StringBuffer和StringBuilder是可變的類,他們都提供了append()方法來進行字符串拼接。不同的是,StringBuffer是線程安全的,而StringBuilder則是非線程安全的。
因此,如果需要在多線程環(huán)境下進行字符串拼接,應(yīng)該選擇StringBuffer。而在單線程環(huán)境下,如果字符串拼接操作較頻繁,應(yīng)該選擇StringBuilder。
4.string 我想要加幾個字符 咋辦
你可以使用字符串的拼接操作,如將想要添加的字符與原字符串拼接起來即可,例如:
string str = "Hello"; str += " World"; cout << str; // 輸出:Hello World如果你想在特定位置添加字符,可以使用字符串的 insert 方法,如:
string str = "Hello"; str.insert(5, "world"); // 在第 5 個字符后面插入 "world" cout << str; // 輸出:Hello world5.MySQL 成績表查成績 每人一到三門課
如果您想要查詢每個人的一到三門課的成績,您可以使用如下的 MySQL 查詢語句:
SELECT name, course1, course2, course3 FROM score;其中,name 表示學生的姓名,course1、course2 和 course3 分別表示三門課的成績。
如果您只想要查詢某個學生的成績,可以使用如下的語句:
其中,name=‘張三’ 表示查詢姓名為張三的學生的成績。
6.鎖聽過嗎 干啥用的
Java中的鎖用于實現(xiàn)線程同步和互斥訪問共享資源。多個線程可以同時訪問一個共享資源,并且鎖能夠確保在任意時刻,只有一個線程可以訪問該共享資源,從而避免了多個線程同時修改一個變量或?qū)ο髮е碌臄?shù)據(jù)不一致性和并發(fā)問題。Java中的鎖包括synchronized關(guān)鍵字和Lock對象,它們可以實現(xiàn)不同的鎖定機制和線程同步。
7.類鎖和實例鎖區(qū)別
類鎖和實例鎖的區(qū)別在于鎖住的對象不同。類鎖是鎖住類的class對象,而實例鎖是鎖住實例對象。一個類只有一個class對象,而可以有多個實例對象。當一個線程獲取了類鎖,其他線程便不能同時獲取該類的鎖,直到該線程釋放鎖為止;而當一個線程獲取了某個實例對象的鎖時,其他線程還可以獲取該類其他實例對象的鎖。因此,類鎖和實例鎖的范圍和對象都不相同。
8.Redis 數(shù)據(jù)類型
Redis支持多種數(shù)據(jù)類型,包括字符串(String)、哈希(Hash)、列表(List)、集合(Set)和有序集合(Sorted Set)等。每種數(shù)據(jù)類型都有自己的特點和用途。例如,字符串可以保存任意格式的數(shù)據(jù),哈希可以表示對象的屬性和屬性值,列表和集合可以用來保存多個值,有序集合可以按照分數(shù)排序保存一組元素等。這些數(shù)據(jù)類型都可以通過Redis命令進行操作和管理。
9.最近在看啥基礎(chǔ) :Redis
10.Redis 消息隊列咋實現(xiàn)
Redis 消息隊列可以通過 Redis 的 List 數(shù)據(jù)結(jié)構(gòu)來實現(xiàn)。具體步驟如下:
1.將消息添加到一個 List 中,可以使用 Redis 的 LPUSH / RPUSH 命令。
2.消費者使用 RPOP / BLPOP 命令從 List 中讀取消息,并進行處理。
3.可以使用 Redis 的 BRPOPLPUSH 命令將消息從一個 List 中移動到另一個 List 中,同時防止多個消費者重復處理同一個消息。
此外,Redis 還提供了一些高級特性,如批量讀取、阻塞讀取、監(jiān)聽多個消息隊列等。這些特性可以大大提高消息隊列的性能和可靠性。
11.Redis 持久化 咋實現(xiàn)
Redis 提供了兩種持久化方式:RDB 持久化和 AOF 持久化。
RDB 持久化可以在指定的時間間隔內(nèi)將內(nèi)存中的數(shù)據(jù)集快照寫入磁盤,對于數(shù)據(jù)恢復方面的需求來說,RDB 持久化是比較適合的。而 AOF 持久化則可以將 Redis 執(zhí)行的所有寫命令都寫入一個日志文件中,當服務(wù)器重啟時可以通過重新執(zhí)行日志中的命令來恢復原始數(shù)據(jù)。相較于 RDB,AOF 的數(shù)據(jù)完整性更好,但同時會增加硬盤的 I/O 開銷。
通過 Redis 的配置文件,可以設(shè)置 RDB 和 AOF 持久化的參數(shù),來滿足各種場景下的需要。
12.一萬個文件亂序在文件中,找到1-10號文件怎么做
您可以使用快速排序算法對這些文件進行排序,然后找到1-10號文件即可。步驟如下:
1.選取一個基準數(shù),比如選第一個數(shù)為基準數(shù)。
2.將所有比基準數(shù)小的數(shù)放在它前面,比基準數(shù)大的數(shù)放在它后面。這個過程也叫做分區(qū)操作(partition)。
3.遞歸地將基準數(shù)左邊的數(shù)和右邊的數(shù)分別進行排序。
4.當只有一個數(shù)或者沒有數(shù)需要排序時,排序完成。
5.找到排好序的第1-10號文件即可。
需要注意的是,在排序時要使用時間復雜度為O(nlogn)的排序算法,如快速排序、歸并排序等。
七、焦點科技 后端實習(OC)
1.開頭經(jīng)典自我介紹
2.介紹項目(具體問了其中的redis項目,負責哪些功能,利用什么技術(shù)實現(xiàn))
3.項目中遇到的難點
4.登錄功能怎么實現(xiàn)的
登錄功能的實現(xiàn)需要涉及到前端頁面、后臺接口以及數(shù)據(jù)庫的設(shè)計。以下是一個基本的登錄功能實現(xiàn)步驟:
1.前端頁面:設(shè)計登錄頁面,包括用戶名和密碼的輸入框,以及登錄按鈕。
2.后臺接口:設(shè)計一個處理登錄請求的后臺接口,接收前端傳遞的用戶名和密碼參數(shù)。
3.數(shù)據(jù)庫設(shè)計:設(shè)計一個用戶表,其中包含用戶名和密碼兩個字段,并將用戶信息存儲到數(shù)據(jù)庫中。
登錄功能的實現(xiàn)流程如下:
1.用戶在前端頁面輸入用戶名和密碼,并點擊登錄按鈕。
2.前端向后臺發(fā)送登錄請求,將用戶名和密碼參數(shù)傳遞給后臺接口。
3.后臺接口接收到請求后,從數(shù)據(jù)庫中查詢用戶信息,檢查用戶名和密碼是否匹配。
4.如果用戶名和密碼匹配,則生成一個唯一的登錄憑證(如token),并將該憑證存儲到數(shù)據(jù)庫中,并將該憑證返回給前端。
5.前端接收到登錄憑證后,將該憑證存儲到本地(如cookie或localStorage)中,并將用戶重定向到主頁面。
6.在用戶訪問需要登錄權(quán)限的頁面時,前端將登錄憑證攜帶到后臺接口,并進行驗證。
7.后臺接口接收到請求后,從數(shù)據(jù)庫中查詢該登錄憑證是否有效,如果有效則返回請求結(jié)果,否則返回登錄失效提示。
需要注意的是,登錄功能的實現(xiàn)還需要考慮安全性問題,如密碼加密存儲、防止SQL注入、防止跨站攻擊等。
5.數(shù)據(jù)庫怎么實現(xiàn)的
6.有沒有寫過sql
7.如果有兩張表,他們直接有關(guān)聯(lián)關(guān)系,具體怎么設(shè)計
通常情況下,我們可以通過為表之間的關(guān)系創(chuàng)建外鍵來實現(xiàn)表之間的關(guān)聯(lián)關(guān)系。具體來說,我們可以在一個表中創(chuàng)建一個指向另一個表的外鍵,這樣就能夠在兩個表之間建立關(guān)聯(lián)。在創(chuàng)建外鍵時,我們需要考慮以下幾個因素:
外鍵所指向的表和列:我們需要指定外鍵指向的目標表和目標列,這樣才能建立起正確的關(guān)聯(lián)關(guān)系。
外鍵是否允許為空:如果我們允許外鍵為空,那么意味著該表的記錄可能與另一個表中的記錄沒有任何關(guān)聯(lián)。否則,我們必須確保所有記錄之間都有正確的關(guān)聯(lián)關(guān)系。
外鍵的級聯(lián)刪除行為:當我們從目標表中刪除一條記錄時,如果存在其他表中指向該記錄的外鍵,我們需要考慮對這些記錄的處理方式。一般來說,我們可以指定級聯(lián)刪除行為,這樣就可以自動刪除與目標記錄相關(guān)的所有外鍵記錄。
總之,通過正確定義外鍵,我們可以輕松地實現(xiàn)兩個表之間的關(guān)聯(lián)關(guān)系,并保證數(shù)據(jù)的完整性和一致性。
八、小廠面試
1.Java幾大特性 展開說說
Java有以下幾大特性:
1.簡單易學:Java語言相對于其他編程語言來說比較簡單易學,其語法與C++等其他語言相比簡化了很多。
2.面向?qū)ο?#xff1a;Java是一種面向?qū)ο蟮木幊陶Z言,類、繼承、封裝、多態(tài)等面向?qū)ο蟮奶匦远嫉玫搅撕芎玫闹С帧?br /> 3.平臺無關(guān)性:Java程序可以在不同的操作系統(tǒng)上運行,而不需要進行任何修改。這一特性主要是由于Java虛擬機(JVM)的存在。
4.安全性:Java的安全性能非常高,主要是因為JVM可以對Java代碼進行安全檢查并提供執(zhí)行環(huán)境的安全性保障。
5.多線程:Java支持多線程編程,可以充分利用多核處理器的性能,提高程序的效率。
6.高性能:Java語言在編譯和執(zhí)行效率上都和其他編程語言相差不大,且有很多性能優(yōu)化的工具和框架。
7.開源社區(qū):Java擁有一個非常龐大的開源社區(qū),有很多優(yōu)秀的開源庫、框架和工具。
2. 說一下集合,具體實現(xiàn)都說一下 ?為什么要用鎖
Java中常見的集合包括List、Set、Map三種類型。它們的具體實現(xiàn)分別為ArrayList、LinkedList、Vector、HashSet、LinkedHashSet、TreeSet、HashMap、LinkedHashMap、TreeMap。
Java中的鎖用于實現(xiàn)線程同步和互斥訪問共享資源。多個線程可以同時訪問一個共享資源,并且鎖能夠確保在任意時刻,只有一個線程可以訪問該共享資源,從而避免了多個線程同時修改一個變量或?qū)ο髮е碌臄?shù)據(jù)不一致性和并發(fā)問題。Java中的鎖包括synchronized關(guān)鍵字和Lock對象,它們可以實現(xiàn)不同的鎖定機制和線程同步。
3.為什么使用多線程
多線程是指在一個程序中可以同時運行多個線程,每個線程可以獨立執(zhí)行不同的任務(wù)。它的作用是可以提高程序的執(zhí)行效率和并發(fā)性,使程序更加高效地利用計算機的資源。多線程可以使復雜的程序更加簡單、可維護和可擴展,同時可以使用戶界面更加流暢,并且可以避免長時間的阻塞。
4.線程的實現(xiàn)方式
Java中線程的實現(xiàn)方式包括繼承Thread類、實現(xiàn)Runnable接口、實現(xiàn)Callable接口、使用線程池等。
5.Java提供的線程池說一下
Java提供了以下線程池:
1.FixedThreadPool:該線程池包含固定數(shù)量的線程,由于線程數(shù)固定,因此任務(wù)可能會在隊列中等待執(zhí)行。
2.CachedThreadPool:該線程池包含可緩存的線程,如果線程數(shù)超過了需求,那么多余的線程將會被回收,這個線程池適合處理大量的短時間任務(wù)。
3.ScheduledThreadPool:該線程池包含固定數(shù)量的線程,可以定時執(zhí)行任務(wù),適合需要定時執(zhí)行任務(wù)的應(yīng)用。
4.SingleThreadPool:該線程池包含只有一個線程的線程池,適合需要保持任務(wù)按順序執(zhí)行的應(yīng)用。
6.說一下連接查詢有什么特點
連接查詢的特點是可以將來自多個表的數(shù)據(jù)進行關(guān)聯(lián),查詢出符合條件的結(jié)果。在連接查詢中,通常使用join操作符來將兩個或多個表進行關(guān)聯(lián),然后通過指定查詢條件來過濾結(jié)果集。連接查詢可以更加靈活地操作數(shù)據(jù),可以在不同的表中查詢出相關(guān)聯(lián)的數(shù)據(jù),擴展了數(shù)據(jù)查詢的范圍和靈活性。
7.出了一個簡單的連表SQL
8. jdbc用過嗎 ? jdbc有哪些重要參數(shù)
JDBC(Java Database Connectivity)是Java語言編程中用于連接和操作關(guān)系型數(shù)據(jù)庫的標準API。它允許Java應(yīng)用程序通過一個標準的Java API來訪問關(guān)系型數(shù)據(jù)庫。
JDBC的重要參數(shù)包括:
1.URL(Uniform Resource Locator):指定數(shù)據(jù)庫的位置。
2.Driver:數(shù)據(jù)庫的驅(qū)動程序,用于連接不同的數(shù)據(jù)庫。
3.User Name:使用數(shù)據(jù)庫的用戶名。
4.Password:使用數(shù)據(jù)庫的用戶密碼。
5.Connection:連接對象,允許Java應(yīng)用程序與數(shù)據(jù)庫進行交互。
6.Statement:封裝并執(zhí)行SQL語句的對象。
7.ResultSet:執(zhí)行查詢后返回的結(jié)果集對象。
9.mybatis有什么特點?為什么要使用它呢?
MyBatis是一種優(yōu)秀的持久化框架,具有以下特點:
1.簡單易用:MyBatis的API簡單易懂,使用起來非常方便。
2.靈活性強:MyBatis不會對我們的應(yīng)用程序架構(gòu)造成影響,因為它完全是基于Java POJO對象的,使得我們可以自由地編寫SQL語句和映射標簽。
3.可以自定義SQL:我們可以寫自定義SQL語句和存儲過程,這樣可以靈活適配應(yīng)用程序。
4.提供多種映射標簽:MyBatis提供了很多種標簽,可以很方便地映射數(shù)據(jù)庫表和Java對象。
5.提供一級緩存和二級緩存:MyBatis提供一級緩存和二級緩存,可以有效地提高應(yīng)用程序的性能。
使用MyBatis可以使我們的開發(fā)效率更高,代碼更簡潔,同時還可以提高應(yīng)用程序性能。
10.你的數(shù)據(jù)庫配置都寫在哪里呢
application.properties文件中
九、用友 java實習 一面面經(jīng)
1.java常見的集合有哪些
Java常見的集合包括:List、Set、Map、Queue等。其中,List可以有重復元素,Set不允許有重復元素,Map通過鍵值對來存儲元素,Queue則是先進先出的數(shù)據(jù)結(jié)構(gòu)。具體集合類的實現(xiàn)有:ArrayList、LinkedList、HashSet、LinkedHashSet、TreeSet、HashMap、LinkedHashMap和TreeMap等。
2.數(shù)據(jù)庫索引有哪些缺點
數(shù)據(jù)庫索引的一些缺點包括:
1.增加了數(shù)據(jù)插入、更新、刪除等操作的時間和成本;
2.索引占用磁盤空間,特別是對于大表來說;
3.索引需要額外的維護成本;
4.當數(shù)據(jù)分布不均勻時,索引對性能的提升可能不太顯著;
5.索引可能需要頻繁重構(gòu)以保證查詢效率,這也會增加額外的成本和風險。
3.SpringBoot的核心功能
Spring Boot的核心功能包括:
1.自動裝配:Spring Boot通過@Configuration和@EnableAutoConfiguration,可以自動配置大量的Spring框架常用的組件和類庫,極大簡化了Spring的開發(fā)和配置。
2.Starter依賴:通過引入與應(yīng)用相關(guān)的所謂"Starter"依賴,Spring Boot可以自動引入應(yīng)用所需的依賴,從而可以讓開發(fā)者專注于業(yè)務(wù)開發(fā),不再關(guān)心依賴包沖突等底層實現(xiàn)問題。
3.Actuator:提供了一些監(jiān)控和管理的端點,可以方便地進行應(yīng)用狀態(tài)的監(jiān)測和管理。
4.內(nèi)嵌Web服務(wù)器:Spring Boot內(nèi)置Tomcat、Jetty和Undertow等Web服務(wù)器,并提供了自動配置,簡化了Web應(yīng)用的開發(fā)和部署過程。
5.簡化的配置:Spring Boot提供了許多簡化配置的方式,例如通過application.properties文件,可以方便地配置應(yīng)用的各種屬性和行為。
總之,Spring Boot的核心功能是極大簡化Spring框架的開發(fā)和部署,提高了開發(fā)效率和代碼質(zhì)量。
4.SpringBoot有哪些缺點
Spring Boot的一些缺點包括:
1.配置過于冗長,需要編寫大量的注解和配置文件。
2.依賴關(guān)系過于復雜,可能導致程序的運行速度變慢。
3.對于初學者來說比較難以理解,需要一定的學習成本。
4.SpringBoot的自動配置功能可能會導致一些難以發(fā)現(xiàn)的問題,需要謹慎使用。
5.整合其他框架的時候可能會出現(xiàn)一些不兼容的問題。
總結(jié)
以上是生活随笔為你收集整理的2023-04-18_面试题复盘笔记(121)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android学习之复选框checkbo
- 下一篇: 【Devc++】战斗1.0.2