《关于我的那些面经》滴滴Java岗(附答案)
手撕單例模式
所謂單例,就是整個程序有且僅有一個實例。該類負責創(chuàng)建自己的對象,同時確保只有一個對象被創(chuàng)建。
在Java,一般常用在工具類的實現(xiàn)或創(chuàng)建對象需要消耗資源。
特點:類構(gòu)造器私有、持有自己類型的屬性、對外提供獲取實例的靜態(tài)方法
- 懶漢模式
線程不安全,延遲初始化,嚴格意義上不是不是單例模式
- 餓漢模式
線程安全,比較常用,但容易產(chǎn)生垃圾,因為一開始就初始化
public class Singleton { private static Singleton instance = new Singleton(); private Singleton (){} public static Singleton getInstance() { return instance; } }雙重鎖模式
線程安全,延遲初始化。這種方式采用雙鎖機制,安全且在多線程情況下能保持高性能。
雙重檢查模式,進行了兩次的判斷,第一次是為了避免不要的實例,第二次是為了進行同步,避免多線程問題。由于singleton=new Singleton()對象的創(chuàng)建在JVM中可能會進行重排序,在多線程訪問下存在風險,使用volatile修飾signleton實例變量有效,解決該問題。
靜態(tài)內(nèi)部類單例模式
public class Singleton { private Singleton(){}public static Singleton getInstance(){ return Inner.instance; } private static class Inner { private static final Singleton instance = new Singleton(); } }只有第一次調(diào)用getInstance方法時,虛擬機才加載 Inner 并初始化instance ,只有一個線程可以獲得對象的初始化鎖,其他線程無法進行初始化,保證對象的唯一性。目前此方式是所有單例模式中最推薦的模式,但具體還是根據(jù)項目選擇。
在以上所有的單例模式中,推薦靜態(tài)內(nèi)部類單例模式。非常直觀,即保證線程安全又保證唯一性。
眾所周知,單例模式是創(chuàng)建型模式,都會新建一個實例。那么一個重要的問題就是反序列化。當實例被寫入到文件到反序列化成實例時,我們需要重寫readResolve方法,以讓實例唯一。
Java線程池各種參數(shù)
ThreadPoolExecutor的重要參數(shù)
1.corePoolSize:核心線程數(shù):核心線程會一直存活,及時沒有任務(wù)需要執(zhí)行。
當線程數(shù)小于核心線程數(shù)時,即使有線程空閑,線程池也會優(yōu)先創(chuàng)建新線程處理。
設(shè)置allowCoreThreadTimeout=true(默認false)時,核心線程會超時關(guān)閉。
2.queueCapacity:任務(wù)隊列容量(阻塞隊列)
當核心線程數(shù)達到最大時,新任務(wù)會放在隊列中排隊等待執(zhí)行。
3.maxPoolSize:最大線程數(shù)
當線程數(shù)>=corePoolSize,且任務(wù)隊列已滿時。線程池會創(chuàng)建新線程來處理任務(wù)。
當線程數(shù)=maxPoolSize,且任務(wù)隊列已滿時,線程池會拒絕處理任務(wù)而拋出異常。
4.keepAliveTime:線程空閑時間
當線程空閑時間達到keepAliveTime時,線程會退出,直到線程數(shù)量=corePoolSize。
如果allowCoreThreadTimeout=true,則會直到線程數(shù)量=0。
5.allowCoreThreadTimeout:允許核心線程超時
6.rejectedExecutionHandler:任務(wù)拒絕處理器
兩種情況會拒絕處理任務(wù):(1)當線程數(shù)已經(jīng)達到maxPoolSize,切隊列已滿,會拒絕新任務(wù)。(2)當線程池被調(diào)用shutdown()后,會等待線程池里的任務(wù)執(zhí)行完畢,再shutdown。如果在調(diào)用shutdown()和線程池真正shutdown之間提交任務(wù),會拒絕新任務(wù)。線程池會調(diào)用rejectedExecutionHandler來處理這個任務(wù)。如果沒有設(shè)置默認是AbortPolicy,會拋出異常。
手撕two linkedlist megre to one
/*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/ class Solution {public ListNode mergeTwoLists(ListNode l1, ListNode l2) {ListNode head=new ListNode(0);ListNode temp=head;while(l1!=null && l2!=null){if(l1.val>l2.val){temp.next=l2;l2=l2.next;}else{temp.next=l1;l1=l1.next; }temp=temp.next;}if(l1!=null){temp.next=l1;}else{temp.next=l2;}return head.next;} }Linux命令
我這里簡單列舉,還要多多練習復雜的操作。
Linux的常用命令介紹:
? ? ? ?問題:
? ? ? ? ? ? ? ?因為平時開發(fā)的時候,對于服務(wù)器主機的操作系統(tǒng)是不需要界面的。
? ? ? ? ? ? ? ?那么我們?nèi)绾问褂貌僮飨到y(tǒng)完成資源的操作呢?
? ? ? ?使用:
? ? ? ? ? ? ? ?命令方式
? ? ? ?作用:
? ? ? ? ? ? ? ?使用命令來替換界面的操作。
? ? ? ?內(nèi)容:
? ? ? ? ? ? ? ?1、查看IP信息:ifconfig
? ? ? ? ? ? ? ?2、進入指定的文件目錄: cd
? ? ? ? ? ? ? ? ? ? ? ?絕對路徑: cd /目錄/子目錄/../..
? ? ? ? ? ? ? ? ? ? ? ?相對路徑: ?cd ?當前路徑的子目錄/子目錄/../..
? ? ? ? ? ? ? ? ? ? ? ?注意 :
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?第一個 /表示根目錄
? ? ? ? ? ? ? ?3、退回上級目錄:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? cd .. ?回退當上級目錄,退一層
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? cd ../.. 回退兩次
? ? ? ? ? ? ? ?4、查看當前路徑:pwd
? ? ? ? ? ? ? ?5、查看當前目錄下的內(nèi)容:
? ? ? ? ? ? ? ? ? ? ? ?ls:只顯示文件名或者目錄名
? ? ? ? ? ? ? ? ? ? ? ?ll:以詳細信息的方法列出當前目錄的內(nèi)容
? ? ? ? ? ? ? ?6、自動補全:tab
? ? ? ? ? ? ? ? ? ? ? ?注意:我們需要寫出要操作的文件或者目錄的從頭開始的一部分唯一的名字。
? ? ? ? ? ? ? ?7、清屏:clear
? ? ? ? ? ? ? ?8、創(chuàng)建目錄:
? ? ? ? ? ? ? ? ? ? ? ?mkdir 文件名 ? ? ? ? ? ? ? ? ? ? ? ? ?在當前目錄下創(chuàng)建指定的文件夾
? ? ? ? ? ? ? ? ? ? ? ?mkdir /目錄名/目錄名/../../新的文件名 ? ?在指定的目錄下創(chuàng)建新的文件夾
? ? ? ? ? ? ? ?9、創(chuàng)建文件:
? ? ? ? ? ? ? ? ? ? ? ?vi 新的文件名 示例:vi my.txt
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?注意:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?會直接進入文本狀態(tài),需要點擊鍵盤的i鍵或者insert鍵進入編輯狀態(tài)。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?書寫內(nèi)容后先點擊esc鍵退出編輯狀態(tài)。然后輸入
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?:q! 強制退出
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?:q 退出,但不保存
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?: wq 保存并退出
? ? ? ? ? ? ? ? ? ? ? ?vim 新的文件名 ?示例: vim you.java
? ? ? ? ? ? ? ? ? ? ? ?vi和vim的區(qū)別:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?vi命令打開的文本編輯器中沒有顏色標識
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?vim命令的文本編輯器中帶有關(guān)鍵字顏色
? ? ? ? ? ? ? ?10、編輯現(xiàn)有文件:vi或者vim
? ? ? ? ? ? ? ? ? ? ? ?vi 現(xiàn)有文件名
? ? ? ? ? ? ? ? ? ? ? ?vim 現(xiàn)有文件名
? ? ? ? ? ? ? ?11、查看文件內(nèi)容:cat命令
? ? ? ? ? ? ? ? ? ? ? ?cat 文件名 ?在控制顯示所有的文件信息
? ? ? ? ? ? ? ?12、查看指定前多少行數(shù)據(jù): head命令
? ? ? ? ? ? ? ? ? ? ? ?默認顯示前10行
? ? ? ? ? ? ? ? ? ? ? ?head -n 行數(shù) 文件名
? ? ? ? ? ? ? ?13、查看指定后多少行數(shù)據(jù):tail命令
? ? ? ? ? ? ? ? ? ? ? ?默認顯示后10行
? ? ? ? ? ? ? ? ? ? ? ?tail -n 行數(shù) 文件名
? ? ? ? ? ? ? ?14、動態(tài)查看文件的內(nèi)容:tailf 命令
? ? ? ? ? ? ? ? ? ? ? ?作用:動態(tài)的顯示文件的內(nèi)容,一旦文件內(nèi)容增加了,控制臺會立即顯示出來
? ? ? ? ? ? ? ? ? ? ? ?tailf -行數(shù) 文件名
? ? ? ? ? ? ? ? ? ? ? ?默認顯示后10行
? ? ? ? ? ? ? ?15、追加內(nèi)容:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?echo 內(nèi)容>>文件名
? ? ? ? ? ? ? ?16、復制
? ? ? ? ? ? ? ? ? ? ? ?cp 文件絕對路徑 ?新的文件絕對路徑
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?作用:將指定的文件復制到指定路徑下的文件中
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?示例:cp /usr/local/wollo/my.txt ?/usr/mm.txt
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?注意:復制的同時重命名
? ? ? ? ? ? ? ? ? ? ? ?cp ?文件 ?新的文件名
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?作用:在當前目錄下復制文件,同時重命名
? ? ? ? ? ? ? ? ? ? ? ?cp -r 目錄路徑 ? 新的路徑
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?作用:將指定的目錄下的全部復制到指定的路徑下
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?示例: cp -r /usr/local/wollo ?/usr/wollo2
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?注意:同時可以對文件夾的名字進行重命名
? ? ? ? ? ? ? ?17、刪除
? ? ? ? ? ? ? ? ? ? ? ?刪除文件
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?rm 文件名
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?作用:刪除當前目錄下的指定文件
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?注意:會提示是否要刪除,輸入y刪除,輸入n取消
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?rm -rf 文件名:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?作用:刪除指定的文件
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?注意:不會提示,直接刪除
? ? ? ? ? ? ? ? ? ? ? ?刪除目錄
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?rm -r 目錄名
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?作用:刪除指定的目錄
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?注意:會有提示語,但是不能在當前目錄下刪除自己。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?rm -rf 目錄名:強制刪除
? ? ? ? ? ? ? ?18、剪切
? ? ? ? ? ? ? ? ? ? ? ?mv 文件 ?新的路徑
? ? ? ? ? ? ? ?19、解壓文件
? ? ? ? ? ? ? ? ? ? ? ?tar -zxvf 壓縮包名? ? ? ? ? ? ? ? ? ? ?
HashMap?
這里也是簡單寫一下算了,具體多學。
//map Map<Integer, Integer> map=new HashMap<Integer, Integer>();int size()//K-V關(guān)系數(shù)量 boolean isEmpty()//是否為空 增:V put(K?key,V?value)//放入K-V鍵值對void putAll(Map<K,V> m)//放入m包含的所以鍵值對 刪:V remove(Object?key)//刪除key對應(yīng)的鍵值對void clear()//刪除所有鍵值對 改:直接put,會覆蓋舊的記錄 查:boolean containsKey(Object?key)//是否包含keyboolean containsValue(Object?value)//是否包含valueV get(Object?key)//得到key對應(yīng)的value 生成集合:Set<K> keySet()//返回包含所有key的setCollection<V> values()//返回包含所有value的CollectionTreeMap特有: public K firstKey()//返回第一個key(最高) public K lastKey()//返回最后一個key(最低)- ?哈希沖突:若干Key的哈希值如果落在同一個數(shù)組下標上,將組成一條鏈,對Key的查找需要遍歷鏈上的每個元素執(zhí)行equals()比較,1.8后優(yōu)化為紅黑樹
- 負載極限,“負載極限”是一個0~1的數(shù)值,“負載極限”決定了hash表的最大填滿程度。當hash表中的負載因子達到指定的“負載極限”時,hash表會自動成倍地增加容量(桶的數(shù)量),并將原有的對象重新分配,放入新的桶內(nèi),這稱為rehashing。默認當HashMap中的鍵值對達到數(shù)組大小的75%時,即會rehashing。
解釋0.75:
是時間和空間成本上的一種折中:
- 較高的“負載極限”(也就是數(shù)組小)可以降低占用的空間,但會增加查詢數(shù)據(jù)的時間開銷
- 較低的“負載極限”(也就是數(shù)組大)會提高查詢數(shù)據(jù)的性能,但會增加hash表所占用的內(nèi)存開銷
可以根據(jù)實際情況來調(diào)整“負載極限”值。
HashMap線程不安全
HashTable線程安全,實現(xiàn)的方式是在修改數(shù)據(jù)時鎖住整個HashTable,效率低,ConcurrentHashMap做了相關(guān)優(yōu)化
ConcurrentHashMap
線程安全,其關(guān)鍵在于使用了鎖分離技術(shù)。它使用了多個鎖來控制對hash表的不同部分進行的修改。
ConcurrentHashMap內(nèi)部使用段(Segment)來表示這些不同的部分,每個段其實就是一個小的Hashtable,它們有自己的鎖。
只要多個修改操作發(fā)生在不同的段上,它們就可以并發(fā)進行。
默認將hash表分為16個桶,諸如get、put、remove等常用操作只鎖住當前需要用到的桶,讀操作大部分時候都不需要用到鎖。
(JDK1.8已經(jīng)摒棄了Segment,并發(fā)控制使用Synchronized和CAS來操作,整個看起來就像是優(yōu)化過且線程安全的HashMap,雖然在JDK1.8中還能看到Segment的數(shù)據(jù)結(jié)構(gòu),但是已經(jīng)簡化了屬性,只是為了兼容舊版本。)
?
jvm垃圾回收機制
標記-清除
該算法分為“標記”和“清除”階段:首先標記出所有需要回收的對象,在標記完成后統(tǒng)一回收所有被標記的對象。它是最基礎(chǔ)的收集算法,后續(xù)的算法都是對其不足進行改進得到。這種垃圾收集算法會帶來兩個明顯的問題:
復制
為了解決效率問題,“復制”收集算法出現(xiàn)了。它可以將內(nèi)存分為大小相同的兩塊,每次使用其中的一塊。當這一塊的內(nèi)存使用完后,就將還存活的對象復制到另一塊去,然后再把使用的空間一次清理掉。這樣就使每次的內(nèi)存回收都是對內(nèi)存區(qū)間的一半進行回收。
標記-整理
根據(jù)老年代的特點提出的一種標記算法,標記過程仍然與“標記-清除”算法一樣,但后續(xù)步驟不是直接對可回收對象回收,而是讓所有存活的對象向一端移動,然后直接清理掉端邊界以外的內(nèi)存。
分代收集
當前虛擬機的垃圾收集都采用分代收集算法,這種算法沒有什么新的思想,只是根據(jù)對象存活周期的不同將內(nèi)存分為幾塊。一般將 java 堆分為新生代和老年代,這樣我們就可以根據(jù)各個年代的特點選擇合適的垃圾收集算法。
比如在新生代中,每次收集都會有大量對象死去,所以可以選擇復制算法,只需要付出少量對象的復制成本就可以完成每次垃圾收集。而老年代的對象存活幾率是比較高的,而且沒有額外的空間對它進行分配擔保,所以我們必須選擇“標記-清除”或“標記-整理”算法進行垃圾收集。
HotSpot的算法
可達性分析會導致gc停頓,因為必須保證確保一致性,也就是凍結(jié)在某個時間點,所以我們必須要停頓。
但是停頓太久的代價我們是不能承受的。
在hotspot虛擬機中,采用OopMap結(jié)構(gòu)記錄哪些地方存著引用的。
但是,也不可能為每一個指令設(shè)置OopMap,只有在“安全點”才記錄,gc也是在安全點才暫停。
安全點的選定不能太少:導致gc等待時間長
太多:導致過分增大負荷。
但是還不能解決問題:我們確實保證了運行時,隔一段時間就能進入安全點,但是不運行的時候呢?(程序未搶到cpu很久)
安全區(qū):指這一段代碼中,引用關(guān)系絕對不會發(fā)生變化。在這個區(qū)域中任意地方開始gc都是安全的。
concurrenthashmap原理
見上文
如何給項目數(shù)據(jù)庫加鎖?
鏈接
前后端交互?
看你用的什么模板,我用的leaf
項目的redis怎么用?
這個看我redis總結(jié),或者你自己想想怎么用的。
redis的入門/原理/實戰(zhàn)大總結(jié)
項目Spring MVC如何接收參數(shù)?
springboot1——spring相關(guān)入門
MySQL事務(wù)隔離級別
事務(wù)的隔離級別分為:未提交讀(read uncommitted)、已提交讀(read committed)、可重復讀(repeatable read)、串行化(serializable)。
未提交讀:A事務(wù)已執(zhí)行,但未提交;B事務(wù)查詢到A事務(wù)的更新后數(shù)據(jù);A事務(wù)回滾;---出現(xiàn)臟數(shù)據(jù)
已提交讀:A事務(wù)執(zhí)行更新;B事務(wù)查詢;A事務(wù)又執(zhí)行更新;B事務(wù)再次查詢時,前后兩次數(shù)據(jù)不一致;---不可重復讀
可重復讀:A事務(wù)無論執(zhí)行多少次,只要不提交,B事務(wù)查詢值都不變;B事務(wù)僅查詢B事務(wù)開始時那一瞬間的數(shù)據(jù)快照;
MySQL的持久化和redis的持久化
還是看我redis總結(jié)
如何配置項目服務(wù)器?
linux-在cenos上安裝大全(nginx/JRE/maven/Tomcat/MYSQL/redis/kafka/es...)
Linux如何查看端口沖突?
1.查找被占用的端口
netstat -tln netstat -tln | grep 80netstat -tln?查看端口使用情況,而netstat -tln | grep 80?則是只查看端口80的使用情況
2.查看端口屬于哪個程序?端口被哪個進程占用
lsof -i :803.殺掉占用端口的進程
kill -9 進程id如何查看項目日志?
1.tail
假定日志文件為catalina.log
tail -f catalina.log????該命令用來的查看動態(tài)的日志信息
tail -fn 200 catalina.log????查看最后200行日志,且動態(tài)顯示
tail -f catalina.log | grep '過濾字符串'???????顯示存在需要過濾的字符串的行的動態(tài)的日志信息
2.grep
grep '過濾字符串' catalina.log????從日志文件中過濾出字符串
grep -r '過濾字符串' ./????從當前目錄中的所有文件中過濾出字符串
3.less
less catalina.log????進入日志文件,然后
g????是到文件頭部
G????也就是Shift+g,到文件尾部
ctrl+F????向前移動一屏
ctrl+B????向后移動一屏
ctrl+D????向前移動半屏
ctrl+U????向后移動半屏
Collection.sort()底層用的什么排序方法
接口中能否定義常量?
Jvm的內(nèi)存模型
類的靜態(tài)變量和靜態(tài)方法能否被子類繼承?
子類中能否調(diào)用父類的靜態(tài)變量和靜態(tài)方法?
String a = New string ("a");在jvm中如何存儲?
Jvm調(diào)整堆大小?
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎
總結(jié)
以上是生活随笔為你收集整理的《关于我的那些面经》滴滴Java岗(附答案)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows及Android倍速播放视
- 下一篇: 京东华为 Java开发历年经典题汇总