突破程序猿基本課(筆記)

第一課: 數組與內存控制


1、數組的初始化有兩種方式 靜態和動態
2、Java的數組是靜態的  JS的數組是動態的
3、java數組變量是引用型變量,並不是數組對象本身,只要讓數組變量指向有效的數組對象即可。
4、所有局部變量都是放在棧內存中、不管是基本變量還是引用類型變量
   都存在在各自的棧區,但引用類型變量所引用的對象(數組和普通的java對象)
   則總是存儲在堆內存之中。
5、引用類型變量只是棧內存中變量的本身,何時變爲引用的實際對象?
引用變量本質上只是一個指針,只要通過引用變量訪問屬性,或者引用
變量來調用方法,則引用變量會由引用對象所替代
 
 
第二課:對象與內存控制


1、大量的創建對象,讓系統分配內存有兩點壞處
   使得可用內存減少,降低運行的性能。
   加重垃圾回收的負擔,降低運行性能
   
2、靜態先非靜態 非靜態先與構造器 
   平級的看源碼順序覆蓋。
   
3、被final修飾的變量一旦被賦值就無法改變


4、兩個變量的組合無法形成宏替換


5、對於普通局部變量而言,他們的作用域是在方法內部,當方法
   執行結束也就消失了,但是內部類則可能產生閉包,閉包將
   使得局部變量脫離它所在的方法存在。
   
   
第三課:常見的java集合實現細節


1、ArrayList初始長度爲10


2、可以把Map集合中的Value當成Key的附屬,當系統決定了key的存儲位置之後
   Value隨之保存在那裏即可.


3、put的過程是首先根據key的hashCode()返回值決定Entry的存儲位置
   如果兩個Entry的key的返回值相同,那他們存儲位置相同,如果兩個
   Entry的key通過equals返回爲true那麼key不會被覆蓋,新添加
   的Entry的Value覆蓋原來Entry中的Value
   如果equals比較返回爲false,新添加的Entry將與集合中原來的Entry
   形成Entry鏈而且新添加的Entry位於Entry鏈的頭部
   
3、當size++>=threshold時,HashMap會自動調用resize方法擴充HashMap的
   容量。每擴充一次,HashMap的容量就增大一倍。默認HashMap的初始容量爲
   16負載因子爲0.75 threshold=16*0.75
   
4、無論何時 HashMap的每一個桶只存儲一個元素Entry 由於Entry對象可以
   包含一個引用變量用於指向下一個Entry,因此可能出現:HashMap的bucket
   只有一個Entry但這個Entry指向另一個Entry這樣就形成了Entry鏈
   
5、負載因子增加空間利用率變大 時間效率變小
   負載因子減少空間利用率小 時間效率增加
   
6、HashSet底層完全依賴於HashMap 只不過value是用靜態的new Object();
   有一點不同 當key 完全相同(hashCode和equals)不會覆蓋 
   
7、TreeSet底層完全仿造HashSet是使用了TreeMap


8、TreeMap採用了一種紅黑樹的排序二叉樹來保存Map中每一個Entry


9、ThreeMap比較耗能,因爲底層是用一顆紅黑樹來保存集合中的Entry
   添加、取出元素的性能都比HashMap低,但優勢在於總能按key根據指定排序
   規則保持有序狀態,TreeSet中的所有元素總是根據指定排序規則保持有序狀態
10、TreeMap這個工具類從內部結構看就是一顆紅黑樹,而TreeMap的每個Entry
   就是該紅黑樹的一個節點。
   
11、ArrayList底層採用數組來保存每個集合元素 LinkedList則是一種鏈表存儲的
    線性表,本質是一種雙向鏈表
    
12、對於ArrayList集合而言,當程序向ArrayList中添加、刪除集合元素時,ArrayList
    底層都與需要對數組進行‘整體搬家’因此性能非常差
    
13、ArrayList的get方法來取出ArrayList集合中的元素時 性能和數組幾乎相同
    非常快
   
   
14、LinkedList本質上就是一個雙向鏈表 因此它使用內部類來保存每個集合元素


15、LinkedList獲取指定索引處的元素是比較麻煩的,開銷比較大。


16、從get角度來說ArrayList的性能要比LinkedList好很多


17、add(int index, Object obj)向List集合添加元素ArrayList需要整體搬家(寫的時候)
    
18、當添加的元素超過原來list數組長度的時候 就建立新的數組長度1.5倍於
   原來數組長度的新數組 原來數組需要垃圾回收器回收
   
19、LinkedList主要開銷在於add時的entry(index)需要不斷搜索過去 直到找到index
   處的元素,然後再在該元素之前插入新元素。
   
20、總體來說ArrayList的性能要高於LinkedList的性能
    但是若程序希望不斷調用add、remove時需要考慮LinkedList
    
第四課:Java內存回收


1、Java內存管理包括內存分配創建Java對象和回收Java對象。這兩方面都是
   JVM自動完成。
   
2、強引用:程序創建一個對象,並把這個對象賦給一個引用變量。這個引用變量就是
   強引用,當一個對象被一個或一個以上的強引用變量所引用時,它處於可達
   狀態,它不可能被系統垃圾回收機制回收
   
3、軟引用需要通過SoftReference類來實現,對於軟引用而言當系統內存空間
   足夠時,它不會被系統回收,程序可以使用該對象;當系統內存空間不足時,
   系統將會回收它。
   SoftReference<Person> people = new SoftReference[1000];
   
4、創建100000個Person會導致內存不足而中止,而SoftReference就會很好的解決
   這一問題。這就是軟引用的原因所在。
   
5、如果存在無用的內存沒有回收回來,那就是內存泄露.


6、Object obj = new Object(); obj = null; //執行耗時 耗費內存的操作。


7、儘量少用靜態變量.


8、避免在經常調用的方法、循環中創建Java對象.


9、緩存經常使用的對象.


10.考慮使用SoftReference 當程序需要創建長度很長的數組時,可以保證項目
   不會宕機。但是需要做出判空操作。
  
第五課: 表達式中的陷阱


1、String Integer 使用直接量 不需要new


2、StringBuffer是線程安全的


3、字符串底層實際上採用一個字符串數組來保存該字符串所包含


4、string使用compareTo比較


5、byte-short|char-int-long-float-double


6、String strArr[] = str.split("\\.");


7、啓動線程用start()方法 不是用run方法.


8、靜態類的同步方法(非靜態類鎖是類對象  靜態類鎖是類本身)


9、多線程的情景下應該使用線程安全的類。




第六課:流程控制的陷阱
第七課:面向對象的陷阱


1、instance of 可以保證不報NPE


2、創建Java對象可以 new 反序列化 反射 clone等方法


3、構造器中不能使用遞歸調用.


4、內部類的作用其實更多的是爲了操作多繼承這一功能。


5、被static關鍵字修飾的成員(Field 方法 內部類 初始化快 內部類枚舉)
   都屬於類本身 而不是單個的Java對象 具體到靜態方法也是 靜態方法屬於
   類,而不是屬於Java對象.
   
6、儘量使用靜態內部類,而不是非靜態內部類。對於靜態內部類來說,外部類
   相當於它的一個包,因此靜態內部類的用法簡單很多,限制少很多。
   
7、靜態內部類不能訪問外部類的非靜態成員.




第八課:異常的陷阱


1、finally{if(null != oos){try{oos.close}catch(Exception ex){ex.print()}}}
   1、保證關閉操作總是會被執行
   2、關閉每個資源之前保證不爲null
   3、單獨使用try catch保證關閉資源時引發的異常不會影響到其他資源的關閉
   
2、當程序執行try catch遇到throw 語句時 throw會導致該方法立即結束,系統
   執行throw語句時不會立即拋出異常而是去找尋finally 如果 finally有立即
   結束的方法 比如return 那麼就立即結束。否則繼續拋出之前沒有執行的異常。
   
3、不要用catch代替流程控制
   
4、子類不能拋出比父類範圍更多的異常 


第九課: 線性表


1、線性表是數組的加強。
   長度是動態的;可以插入元素;可以刪除元素;可以搜索指定位置的元素
   可以清空所有元素;


第十課:棧和隊列


1、棧後進先出 Stack  Dqueue


第11課:二叉樹






   
 
   
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章