記錄面試碰到的一些問題

2021-10-19 14:41:16 字數 4326 閱讀 5398

string為什麼被設計為final

為了安全性考慮,string不被繼承並且不可變。

不可變最大的好處就是安全,如果string的值被修改,只是被重新引用到了乙個新的物件和位址上,所以它在多執行緒是執行緒安全的。

便於常量池管理,當兩個string的值相同時,它們會指向同乙個記憶體位址。

string、stringbuilder 和stringbuffer的區別

string是不可變類,任何改變都是生成新的string物件。

其他兩個都是可變類,任何改變都不會生成新的物件。

執行緒的建立方法
執行緒的建立包括繼承thread,實現runnable和實現callable.

start和run的區別
start方法啟動執行緒,是真正意義上的啟動執行緒,會出現非同步執行的效果,呼叫start時,執行緒處於就緒狀態,並沒有執行,得到cpu時間片之後,jvm會自動呼叫執行緒的run方法,run方法執行結束,執行緒結束。

run方法只是類的乙個普通方法,如果直接呼叫run方法,它依舊是在main主線程中跑,還是單執行緒順序執行,並不是啟動了執行緒。

執行緒池

newcachedthreadpool建立乙個可快取執行緒池程

newfixedthreadpool 建立乙個定長線程池

newscheduledthreadpool 建立乙個週期性執行任務的執行緒池

newsinglethreadexecutor 建立乙個單執行緒化的執行緒池

一般使用newcachedthreadpool比較多

newcachedthreadpool,是一種執行緒數量不定的執行緒池,並且其最大執行緒數為integer.max_value。

乙個可快取執行緒池,如果執行緒池長度超過處理需要,可靈活**空閒執行緒,若無可**,則新建執行緒。但是執行緒池中的空閒執行緒都有超時限制,這個超時時長是60秒,超過60秒閒置執行緒就會被**。呼叫execute將重用以前構造的執行緒(如果執行緒可用)。這類執行緒池比較適合執行大量的耗時較少的任務,當整個執行緒池都處於閒置狀態時,執行緒池中的執行緒都會超時被停止。

execute()和submit()方法的區別

接收的引數不一樣,execute()方法的入參為乙個runnable,返回值為void,sumbit()方法,入參可以為callable,也可以為runnable,而且方法有返回值future,可以告訴我它的執行結果,是成功還是失敗,然後繼續下面的操作。

submit()可以進行exception處理; 例如,如果task裡會丟擲checked或者unchecked exception,而你又希望外面的呼叫者能夠感知這些exception並做出及時的處理,那麼就需要用到submit,通過對future.get()進行丟擲異常的捕獲,然後對其進行處理。

jdk1.8的 新特性

default關鍵字,在介面類中,給方法新增default關鍵字可以是方法在本類被實現,並且該方法不用在實現類被實現,可以直接呼叫。

lambad表示式(等我看懂了再寫)

date api更新

1.8引入了datetimeformatter類。

localdate,localtime ,和 localdatetime類,都是執行緒安全的不可變類。

4. stream(暫時未使用過)
stream類似於流,單向,不可往復。可以對集合的所有元素進行篩選,過濾,修改等,但是只能對資料遍歷一次,如果需要第二次操作,必須繼續建立stream流。

stream操作分為三個步驟:建立stream–》中間操作–》最終操作。

5. map底層的更新
map在1.8之後新增了紅黑樹,在鍊錶長度超過8之後會轉換為紅黑樹,低於等於6會轉換為鍊錶,下面map中解釋。

map的基礎概念

map是乙個雙列集合,每個元素都有自己的key和value兩個值,並且一一對應。

key和value可以相同也可以不同,但是key不允許重複。 hashmap是陣列加鍊表組成,jdk1.8之後新增了紅黑樹。

hashmap的主幹是entry陣列,每個entry包含了乙個key-value鍵值對。

這個entry陣列是靜態內部類,包含了key,value,next(指向下乙個entry的引用,單鏈表結構),hash(key的hash值)。

hashmap負載因子預設為0.75,預設空間大小為16,意味著如果大小為16的map,到了第十三個元素,就會擴容為32。

在jdk8的情況下,當鍊表長度超過8,會自動轉換為紅黑樹,利用紅黑樹快速增刪改查的特點提高效能,因為當使用鍊錶時,空間占用小,並且查詢速度不慢,但是如果長度越長,查詢越慢,這時轉為紅黑樹,保障查詢速度,當長度降低到6,又會自動轉換為鍊錶。

hashmap和hashmap是無序的

treemap和linkedhashmap是有序的(treemap是根據key的字典順序來排序,預設公升序,linkedhashmap是記錄了key的插入順序)。

linkedhashmap底層是雜湊表和煉表,鍊錶記錄了新增資料的順序。 treemap底層是二叉樹,二叉樹的中序遍歷保證了資料的有序性。

前序遍歷(根在前,從左往右,一棵樹的根永遠在左子樹前面,左子樹又永遠在右子樹前面 )

中序遍歷(根在中,從左往右,一棵樹的左子樹永遠在根前面,根永遠在右子樹前面)

後序遍歷(根在後,從左往右,一棵樹的左子樹永遠在右子樹前面,右子樹永遠在根前面)

索引型別

normal 普通索引。

unique 唯一索引,不會重複。

full text 全文搜尋的索引,主要搜尋長文章。

索引建立原則

經常排序,分組,聯合查詢(連線查詢)的字段需要建立索引。

經常作為查詢條件的字段。

盡量選擇資料量少的字段。

限制索引的數量,包括刪除不常使用的索引。

索引字段盡量選擇很少進行插入更新的

索引實現

雜湊表,完全平衡二叉樹,b樹,b+樹等資料結構都可以提高查詢速度,但是mysql使用了b+樹。

為什麼通過b+樹實現

因為雜湊索引查詢時,是對查詢條件進行hash,然後取出資料並且拿到所對應那一行資料的位址,進而查詢資料,但是他只能進行精準查詢,不支援範圍查詢,如:where ***>』』 這種就不會生效。

二叉樹是有順序的,左邊的小於右邊的,他查詢的話查詢次數會比雜湊次數更多

b樹同樣比二叉樹的查詢效率要好,因為b樹的乙個節點可以儲存多個元素。

b+樹是b樹的公升級,把非葉子節點冗餘了一下,這樣是為了提高範圍查詢的效率,b+樹同樣有序。

mysql只對一下操作符才使用索引:,>=,between,in,like %%不會生效,但是likexx%卻會生效,not in和<>也不會生效

eureka是spring cloud的註冊中心,主要負責儲存並維護服務的註冊資訊。

服務在啟動時會將自身的資訊傳送給eureka,eureka在接收到之後會進行儲存

eureka client 會每隔 30 秒傳送一次心跳來續約,90s未收到心跳,自動過期剔除。

eureka會將這些資訊儲存在乙個map中feign主要用來微服務之間呼叫,使用是定義介面新增注釋即可。

feign封裝了http呼叫流程,每次呼叫其實是傳送http請求。

原理可以檢視這篇文章,非常詳細

剩餘之後碰到或者搞懂再

mysql碰到的一些問題

今天碰到了一些mysql問題總結一下 error 1100 hy000 table tablename was not locked with lock tables 出現這種問題的原因很多,今天的問題是連線達到了上線,以前設計是10w左右,超過了此資料,就報了上面的錯誤,更改連線數就可以了。有關於...

自己碰到的一些問題

把平時工作中碰到的一些問題和解決辦法寫出來,共勉 1.kcafillmoderemoved,這個是預設值,也就是說當動畫開始前和結束後,動畫對layer都沒有影響,動畫結束後,layer會恢復到原來的狀態 2.kcafillmodeforwards,當動畫結束後,layer不會恢復到原來的狀態,會一...

Mongo db碰到的一些問題

mongo 的總結 1.許可權不夠error couldn t add user command createuser requires authentication 解決方案 先使用超級管理員登入,再進行其他資料庫使用者建立的建立。先退出 命令列,然後重新進入認證,只認證乙個使用者,不要多次使用d...