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