31.同步器是一些使執行緒能夠等待另一個執行緒的物件,允許它們協調動作。最常用的同步器是CountDownLatch和Semaphore,不常用的是Barrier 和Exchanger
32.例外處理語法結構中只有try塊是必須的,但不能只有try塊,1.7中的增強try除外 因爲其中的try()已經隱含了finally了
33.synchronized很強大,既可以保證可見性,又可以保證原子性,而volatile不能保證原子性!
34.子類不可以繼承父類別的構造方法,只可以呼叫父類別的構造方法。
35.一個演算法通常由兩種基本要素組成:一是(對數據物件的運算和操作),二是(演算法的控制結構)
36.串的樸素模式匹配演算法:最壞時間演算法也就是每次都匹配到字串的最後一位,匹配次數爲m;且匹配到主串的尾部,匹配次數爲n-m+1.所以結果是m*(n-m+1)
觀察者模式:物件間存在一對多關係,如果一個物件被修改時,會自動通知它的依賴物件。
建造者模式:使用對各簡單的物件一步一步構建出一個複雜物件
代理模式:指一個類別可以作爲其他東西的介面
策略模式:將每一個演算法封裝起來,使得每個演算法可以相互替代,使得演算法本身和使用演算法的用戶端分割開來相互獨立
redis一共包含5種數據型別
①字串 String (最基本的型別,可包含任意數據)
②雜湊 Hash (String型別的field、value對映表)
③列表 List (字串列表,有序不唯一)
④集合 set (字串集合,無序唯一)
⑤集合排序 zset (字串集合,可以通過設定分數score進行排序)
39.Redis Cluster在設計中沒有使用一致性雜湊(Consistency Hashing),而是使用數據分片引入雜湊槽(hash slot)來實現
40.在 Java 中,堆被劃分成兩個不同的區域:新生代 ( Young )、老年代 ( Old )。新生代 ( Young ) 又被劃分爲三個區域:Eden、From Survivor、To Survivor。這樣劃分的目的是爲了使 JVM 能夠更好的管理堆記憶體中的物件,包括記憶體的分配以及回收。
41.Integer型別在-128–>127範圍之間是被快取了的,也就是每個物件的記憶體地址是相同的,賦值就直接從快取中取,不會有新的物件產生,而大於這個範圍,將會重新建立一個Integer物件,也就是new一個物件出來,當然地址就不同了,也就!=;
42.String split 這個方法預設返回一個數組, 如果沒有找到分隔符,會把整個字串當成一個長度爲1的字串陣列
43.ThreadLocalMap中使用開放地址法來處理雜湊衝突,而HashMap中使用的是分離鏈表法。之所以採用不同的方式主要是因爲:在ThreadLocalMap中的雜湊值分散得十分均勻,很少會出現衝突。並且ThreadLocalMap經常需要清除無用的物件,使用純陣列更加方便。
44.CountDownLatch 是等待一組執行緒執行完,才執行後面的程式碼。此時這組執行緒已經執行完。
CyclicBarrier 是等待一組執行緒至某個狀態後再同時全部繼續執行執行緒。此時這組執行緒還未執行完。
A、在方法中,修改一個基礎型別的參數永遠不會影響原始參數值。
B、在方法中,改變一個物件參數的參照永遠不會影響到原始參照。然而,它會在堆中建立了一個全新的物件。(譯者注:指的是包裝類和immutable物件)
C、在方法中,修改一個物件的屬性會影響原始物件參數。
D、在方法中,修改集合和Maps會影響原始集合參數。
46.call by value 值傳遞,方法只是得到一個複製出來的值,原來的參數不會被這個方法改變;
call by reference 參照傳遞,傳遞的是參數的地址,方法能改變實際參數。
47.對字串進行sizeof 操作的時候,會把字串的結束符「\0」計算進去的,進行strlen 操作求字元 串的長度的時候,不計算\0 的。
sizeof§:計算的是指針的長度,32位元機器上爲4B
48.cin 表示標準輸入的istream物件
49.集合型別
50.有符號整數的範圍是負數取最大值,正數爲最大值減1.
51.list有序可重複,set無序不可重複
52.Nmap是Linux下的網路掃描和嗅探工具包。
Fiddler是位於用戶端和伺服器端之間的***,也是目前最常用的抓包工具之一 。
Burpsuite是用於攻擊web應用程式的整合平臺。
Map屬於介面型別,不可以new的方式建立物件。
SortedMap屬於介面型別,不可以new的方式建立物件。
HashMap基於雜湊表實現Map介面的類,並允許null的值和null鍵。
TreeMap通過紅黑樹實現Map介面的類,key不可以爲null,會報NullPointerException異常,value可以爲null。
若運算結果的雙符號位爲00, 表示結果爲正數,無溢位;
若運算結果的雙符號位爲11,表示結果爲負數,無溢位;
若運算結果的雙符號位爲10,表示負溢位。
若運算結果的雙符號位爲01,表示正溢位。
run()相當於執行緒的任務處理邏輯的入口方法,它由Java虛擬機器在執行相應執行緒時直接呼叫,而不是由應用程式碼進行呼叫。
而start()的作用是啓動相應的執行緒。啓動一個執行緒實際是請求Java虛擬機器執行相應的執行緒,而這個執行緒何時能夠執行是由執行緒排程器決定的。start()呼叫結束並不表示相應執行緒已經開始執行,這個執行緒可能稍後執行,也可能永遠也不會執行。
56.參數型別是void, 所以先要進行指針轉換:(unsigned int *)然後再取值。
57.a++是右值,不能再進行左值運算
String, StringBuffer,StringBuilder的區別
1.可變與不可變
string物件是不可變的。StringBuffer:是一個可變物件,當對他進行修改的時候不會像String那樣重新建立物件 , 它只能通過建構函式來建立, 如: StringBuffer sb = new StringBuffer();
2.是否多執行緒安全
String中的物件是不可變的,也就可以理解爲常數, 顯然執行緒安全 。
StringBuffer對方法加了同步鎖或者對呼叫的方法加了同步鎖,所以是 執行緒安全的 。
StringBuilder並沒有對方法進行加同步鎖,所以是 非執行緒安全的 。
3.StringBuilder與StringBuffer共同點
StringBuilder與StringBuffer有公共父類別AbstractStringBuilder( 抽象類 )。
抽象類與介面的其中一個區別是:抽象類中可以定義一些子類的公共方法,子類只需要增加新的功能,不需要重複寫已經存在的方法;而介面中只是對方法的申明和常數的定義。
StringBuilder、StringBuffer的方法都會呼叫AbstractStringBuilder中的公共方法,如super.append(…)。只是StringBuffer會在方法上加synchronized關鍵字,進行同步。
最後,如果程式不是多執行緒的,那麼使用StringBuilder效率高於StringBuffer。
效率比較String < StringBuffer < StringBuilder,但是在String S1 =「This is only a」+「simple」+「test」時,String效率最高。
finally塊正常情況下一定會被執行。但是有至少兩個極端情況
如果對應的ty塊沒有執行,則這個try塊的 finally塊並不會被執行
如果在try塊中jvm關機,例如 system.exit(n),則 finally塊也不會執行(都拔電源了,怎麼執行)
finally中如果有 return語句,則會覆蓋try或者 catch中的 retur語句,導致二者無法 return,所以強
烈建議fnll中不要存在 return關鍵字
finalize是 Object類的 protected方法,子類可以覆蓋該方法以實現資源清理工作。
GC在回收物件之前都會呼叫該方法
finalized方法是存在很多問題的
java語言規範並不保證 finalize方法會被及時地執行,更根本不會保證它們一定會被執行
finalized方法可能帶來效能問題,因爲VM通常在單獨的低優先順序執行緒中完成 finalize的執行
finalized方法中,可將待回收物件賦值給 GC Roots可達的物件參照,從而達到物件再生的目的
finalize方法最多由GC執行一次(但可以手動呼叫物件的 finalize方法)