第一課: 數組與內存控制
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課:二叉樹
突破程序猿基本課(筆記)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章
java 學習泛型遇到的問題
爱上学习
2018-08-27 20:04:12
JSP 中的2種包含(導入)
爱上学习
2018-08-27 20:03:43
HashMap部分源碼閱讀,主要是put方法相關的部分
HeiShuaiGuo
2018-08-27 20:03:32
public String(byte[] bytes, int offset, int length)
Myrkyn
2018-08-27 20:03:04
jstl標籤 fmt:formatDate 設置當前時間顯示星期幾
HaHa_Sir
2018-08-27 20:02:59
Java 反射,reflect
crossy
2018-08-27 20:02:58
JVM的內存區域劃分
相由心生fhy
2018-08-27 20:02:39
SpringMVC使用ajax 實現文件下載
HaHa_Sir
2018-08-27 20:02:23
java寫一個簡單的jdbc數據庫連接池
HaHa_Sir
2018-08-27 20:02:23
Servlet輸出JSON數據Servlet向瀏覽器返回JSON數據
HaHa_Sir
2018-08-27 20:02:22
原生Servlet文件上傳和下載Servlet多個文件上傳
HaHa_Sir
2018-08-27 20:02:22
GET和POST請求的區別
HaHa_Sir
2018-08-27 20:02:21
java Object 類中clone方法用法記錄
HaHa_Sir
2018-08-27 20:02:21
SpringMVC重定向參數中文丟失和MyBatis關聯查詢時問題總結
HaHa_Sir
2018-08-27 20:02:21
java註解學習---@Inherited註解的理解學習(四)
HaHa_Sir
2018-08-27 20:02:09