小小又去面試啦,對面試題再次的總結。
redis 相關
redis 有幾種數據結構
redis有五種數據結構,分別是String(字元串),Hash(字典),List(列表),Set(集合),Sorted Set(有序集合) 這五種數據結構是redis的五種數據結構
Redis持久化方式
redis持久化方式有兩種,分別是快照和追加式文件,
1.對於快照而言,持久化會在特定的時間間隔,保存時間點的數據快照。2.追加式文件持久化方式伺服器在收到寫操作的時候,在伺服器啟動的時候,會逐條的執行,從而重建裡面的數據,寫操作記錄的格式和redis協議一樣,以追加的方式保存。3.兩種持久化方式會長久的存在,當redis重啟的時候,追加式文件則會優先用於重建數據。
Java數據結構
Java 有以下幾種數據結構,
List
List 存放的是有序的可重複的。List關注的是索引,擁有一系列和索引相關的方法,查詢速度快。
Set
Set 存放的是無序的不能重複的,集合中的對象,只是簡單的把對象加入到集合中。
Map
Map 存放的是鍵值對,鍵可以重複,值可以重複,根據鍵得到值,對map集合遍歷的時候,先得到set的鍵的集合,對set集合進行遍歷,得到相應的值。
redis 鎖
鎖
鎖一共有三種鎖,分別是線程鎖,進程鎖,分布式鎖。
線程鎖
對於線程鎖而言,主要用來給代碼塊,方法加鎖,當某個方法或者代碼使用鎖的時候,在同一時刻,只有一個線程執行該方法或者代碼塊,線程鎖只在同一JVM中有效果,因為線程鎖的實現在根本上是依靠線程之間共享記憶體實現,例如synchronized是共享對象頭,顯示鎖Lock是共享某個變量。
進程鎖
為了控制同一作業系統中,多個進程訪問共享資源,因為進程具有獨立性,各個進程無法訪問其他進程資源,因此無法通過synchronized等線程實現進程鎖
分布式鎖
當多個進程不在同一作業系統中,用分布式鎖控制多個進程對資源的訪問。
鎖的自旋
鎖的自旋使用的是CAS算法算法,當一個線程在獲取鎖的時候,如果鎖已經被其他線程獲取,那麽該線程將會循環等待,然後不斷的判斷鎖能否成功的獲取,直到獲取鎖才能夠退出循環。
redis 鎖基本命令
在redis裡添加key作為redis鎖,跑完自動進行delete。
redis 死鎖解決辦法
這裡對redis進行死鎖,通過時間控制,把redis超時作為控制,或者redis的value作為時間控制。
ArrayList 擴容
初始陣列容量為10,獲取到擴容的容量,複製到當前的陣列。每次擴容1.5 倍。
LinkList擴容
底層維護的是雙向列表,有前後的指針進行維護。
Java 數據類型各佔幾個字節
byte 1個字節。short 2字節。int 4個字節。long 8字節。float 4個字節。double 8字節 char 2字節 boolean 1字節。
如何計算
用MAX_獲得 例如
Integer.MAX_
編程題
public class C1 { public int stuId; // 學生學號 public int courseId; // 課程編號 public int score; // 分數
/** 將學生成績列表轉換成兩級的Map,用於查詢任意學生的任意課程成績
參數 list : 一個學年學生一學期全部課程成績 返回值Map的key是學生學號,value 的map key是學生的課程編號, value 該學生這門課的成績 **/ public static Map toMap(List list) {
}}
答案
Map map = new HashMap();for(C1 tmp:list){ if(map.get(tmp.stuId) == null){ Map grade = new HashMap(); grade.put(tmp.coureseId,tmp.score); map.put(tmp.stuId, grade); } else map.get(tmp.studId).put(tmp.coureseId,tmp.score);}return map;
小明菜市場