什么是面向物件?
-
面向程序注重事情的每一個步驟
-
面向物件注重事情有哪些參與者以及各自需要干什么
-
封裝:明確標識允許外部使用的所有成員函式和資料項
-
繼承:繼承基類的方法,并且自己做出擴展或改變
-
多型:繼承、方法重寫、父類參考子類物件(便于開發擴展新的功能)
父型別別 變數名 = new 子類物件(); 變數名.方法名(); // 呼叫的是子類的方法,但是沒辦法呼叫子類獨有的功能
多載和重寫的區別?
- 多載:發生在同一個類中,方法名必須相同,引數型別不同、個數不同、順序不同,方法回傳值和訪問修飾符可以不同,發生在編譯時
- 重寫:發生在父子類中,方法名、引數串列必須相同,回傳值范圍小于等于父類,拋出的例外范圍小于等于父類,訪問修飾符范圍大于等于父類;如果父類方法訪問修飾符為private則子類不能重寫該方法
介面和抽象類的區別?
- 抽象類:可以存在普通成員函式,可以是各種型別的,只能繼承一個
- 介面:只能存在public abstract 方法,成員變數只能是public static final 型別的,介面可以實作多個
JDK、JRE、JVM三者區別和聯系?
-
JDK:Java開發工具
-
JRE:Java運行時環境
-
JVM:Java虛擬機
-
JDK(JRE(JVM))
== 和 equals(筆試)
- == :對比堆疊中的值,基本資料型別是變數的值,參考型別是堆中記憶體物件的地址
- equals:可以重寫
final的作用?
- 修飾類時,類不可以被繼承
- 修飾方法時,方法不可被子類覆寫,但是可以多載
- 修飾變數時,變數一旦被賦值就不可以更改它的值
String、StringBuffer、StringBuilder區別及使用場景?
- String:是final修飾的,不可變,每次操作都會產生新的String物件
- StringBuffer:在原物件上操作,是執行緒安全的,它的方法都是synchronize修飾
- StringBuilder:在原物件上操作,是執行緒不安全的
- 性能:StringBuilder > StringBuffer > String
- 場景:優先使用 StringBuilder,多執行緒使用共享變數時使用StringBuffer(解決并發問題)
List 和 Set 的區別?
- List:有序,按物件進入的順序保存物件,可重復,允許多個Null元素物件,可以用iterator取出所有的元素,再逐一遍歷,還可以使用get(int index)獲取指定的下標元素
- Set:無序,不可重復,最多允許一個Null元素物件,取元素時只能用iterator介面取得所有元素,再逐一遍歷各個元素
hashCode 與 equals?
- equals:默認是object中的方法相等與“==”,也可以重寫它的方法
- hashCode:兩個物件相等,則hashCode一定相同;兩個物件相等,對兩個物件分別呼叫equals方法都回傳true;兩個物件有相同的hashCode值,他們也不一定是相等的;equals方法被覆寫過,則hashCode方法也必須被覆寫;hashCode()的默認行為是對堆上的物件產生獨特值,如果沒有重寫hashCode(),則該class的兩個物件無論如何都不會相等
ArrayList 和 LinkedList的區別?
- ArrayList:基于動態陣列,連續記憶體存盤的,適合下標訪問,有自己的擴容機制,如果陣列空間足夠,尾插法效率可能比LinkedList的更高效
- LinkedList:基于鏈表,可以存盤在分散的記憶體中,適合做資料插入及洗掉操作,不適合查詢
HashMap 和 HashTable 的區別?其底層實作是什么?
-
區別:
- HashMap 方法沒有synchronize修飾,執行緒不安全;HashTable是執行緒安全的
- HashMap允許key和value為null,而HashTable不允許
-
底層實作:(陣列 + 鏈表實作)
-
jdk8開始鏈表高度到8,陣列長度超過64,鏈表轉變為紅黑樹,元素以內部Node節點存在
- 計算key的hash值,二次hash然后對陣列長度取模,對應到陣列下標
- 如果沒有產生hash沖突,則直接創建Node存入陣列
- 如果產生hash沖突,先進行equals比較,相同則取代該元素,不同則判斷鏈表高度插入鏈表,鏈表高度達到8,并且陣列長度到64則轉變為紅黑樹,長度低于6則將紅黑樹轉回鏈表
- key為null,存在下標0的位置
-
陣列擴容
-
Java中的類加載器
- BootStrapClass
- ExtClassLoader
- AppClassLoader
什么是雙親委派模型?好處?
- 向上委派:實際上就是查找快取,是否加載了該類,有就直接回傳,沒有繼續向上
- 向下查找:查找加載路徑,有就加載回傳,沒有就繼續向下查找
- 主要為了安全性,避免用戶自己撰寫的類動態替換Java的核心類
- 避免類的重復加載,因為JVM中區分不同類,不僅僅是根據類名,相同的class檔案被不同的ClassLoader加載就是不同的兩個類
執行緒的生命周期
-
執行緒通常有五種狀態:創建,就緒,運行,阻塞和死亡狀態
- 新建狀態(New):新創建了一個執行緒
- 就緒狀態(Runnable):執行緒物件創建后,其他執行緒呼叫該物件的start方法,該狀態的執行緒位于可運行執行緒池中,變得可運行,等待獲取CPU的使用權
- 運行狀態(Running):就緒狀態的執行緒獲取了CPU,執行程式代碼
- 阻塞狀態(Blocked):阻塞狀態是執行緒因為某種原因放棄CPU使用權,暫時停止運行,直到執行緒進入就緒狀態,才有機會轉到運行狀態
- 死亡狀態(Dead):執行緒執行完了或者因為例外退出了run方法,該執行緒結束生命周期
?
-
阻塞的情況分為三種:
- 等待阻塞:運行執行緒執行wait方法,該執行緒會釋放占用的所有資源,JVM會吧執行緒放入“等待池”中,進入這個狀態后,是不能自動喚醒的,必須依靠其他執行緒呼叫notify或notifyAll方法才能被喚醒,wait是object類的方法
- 同步阻塞:運行的執行緒在獲取物件的同步鎖時,若同步鎖被別的執行緒占用,則JVM會把該執行緒放入“鎖池”中
- 其它阻塞:運行的執行緒執行sleep或join方法,或者發出I/O請求時,JVM會把該執行緒置為阻塞狀態,當sleep狀態超時,join等待執行緒終止或者超時,或者I/O處理完畢時,執行緒重新轉入就緒狀態,sleep是Thread類的方法
并發的三大特性
- 原子性:不被中斷操作,要不全部執行完成,要不都不執行
- 可見性:當多個執行緒訪問同一個變數時,一個執行緒修改了這個變數的值,其他執行緒能夠立即看得到修改的值
- 有序性:虛擬機在進行代碼編譯時,對那些改變順訊之后不會對最終結果造成影響的代碼,虛擬機不一定惠安張我們寫的代碼順序來執行,有可能將他們重排序
為什么用執行緒池?解釋下執行緒池引數
- 降低資源消耗;提高執行緒利用率,降低創建和銷毀執行緒的消耗
- 提高回應速度;任務來了,直接有執行緒可用可執行,而不是先創建執行緒,再執行
- 提高執行緒的可管理性;執行緒是稀缺資源,使用執行緒池可以統一分配調優監控
執行緒池處理流程
- 執行緒池執行任務
- 判斷執行緒是否已滿,未滿就創建核心執行緒,滿了就繼續下面流程
- 判斷任務佇列是否已滿,未滿就將任務放入佇列中,滿了就繼續下面流程
- 判斷執行緒數是否達到,未達到就創建臨時執行緒執行,達到就執行下面流程
- 根據拒絕策略處理任務
執行緒池中阻塞佇列的作用?為什么是先添加佇列而不是先創建最大執行緒?
- 阻塞佇列通過阻塞可以保留住當前想要繼續入隊的任務;它可以保證任務佇列中沒有任務是阻塞獲取任務的執行緒,使得執行緒進入wait狀態,釋放CPU資源;它自帶阻塞和喚醒功能,不需要額外處理,無任務執行時,執行緒池利用阻塞佇列的take方法掛起,從而維持核心執行緒的存活、不至于一直占用CPU資源
- 在創建新執行緒的時候,是要獲取全域鎖的,這個時候其他的就得阻塞,影響了整體效率
執行緒池中執行緒復用原理
- 執行緒池將執行緒和任務進行解耦,執行緒是執行緒,任務是任務,擺脫之前通過Thread創建執行緒時的一個執行緒必須對應一個任務的限制
- 在執行緒池中,同一個執行緒可以從阻塞佇列中不斷獲取新任務來執行,其核心在于執行緒池對Thread進行了封裝,并不是每次執行任務都會呼叫Thread.start()來創建新執行緒,而是讓每個執行緒去執行一個“回圈任務”,在這個“回圈任務中”不停檢查是否有任務需要被執行,如果有則直接執行,也就是呼叫任務中的run方法,將run方法當成一個普通的方法執行,通過這種方式只使用固定的執行緒就將所有的任務run方法串聯起來
索引的基本原理
- 索參考來快速地尋找那些具有特定值的記錄,如果沒有索引,一般說執行查詢時遍歷整張表
- 索引的原理:就是把無序的資料變成有序的查詢
- 把創建了索引的列的內容進行排序
- 對排序結果生成倒排表
- 在倒排表內容上拼上資料地址鏈
- 在查詢的時候,先拿到倒排表內容,再取出資料地址鏈,從而拿到具體資料
索引設計原則
- 查詢更快、占用空間更小
MySQL鎖的型別有哪些?
- 基于鎖的屬性:共享鎖,排他鎖
- 基于鎖的粒度分類:行級鎖(INNODB)、表級鎖(INNODB、MYISAM)、頁級鎖(BDB引擎)、記錄鎖、間隙鎖、臨鍵鎖
- 基于鎖的狀態:意向共享鎖、意向排他鎖
事務的基本特性和隔離級別
- 事務的基本特性ACID分別是:(用戶微信轉賬場景)
- 原子性:一個事務中的操作要么全部成功,要么全部失敗
- 一致性:資料庫總是從一個一致性的狀態轉換到另一個一致性的狀態
- 隔離性:一個事務的修改在最終提交前,對其他事務是不可見的
- 持久性:一旦事務提交,所做的修改就會永久保存到資料庫中
- 隔離性有4個隔離級別:
- ru讀未提交,可能會讀到其他事務未提交的資料,也叫臟讀
- rc讀已提交,兩次讀取結果不一致,叫做不可重復讀
- rr可重復讀,MySQL默認級別,每次讀取的結果都一樣,但是可能產生幻讀
- 串行,一般不會使用,它會給每一行讀取的資料加鎖,會導致大量超時和鎖競爭的問題
如何實作IOC容器
- 組態檔配置包掃描路徑
- 遞回包掃描獲取的.class檔案
- 反射、確定需要交給IOC管理的類
- 對需要注入的類進行依賴注入
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/299536.html
標籤:其他
上一篇:入職金融IT國企之路
下一篇:獲取最近使用應用串列
