[原] 高淇Java300集系列筆記 (待續)

[版權聲明] 自由轉載-非商用-非衍生-保持署名 (CC BY-NC-ND 3.0)html

[發表日期] 2015年12月22日 18:00  @歡樂小匠仙  
java

[原文地址] http://leeyee93.cnblogs.com/p/5067451.html
程序員

 

eclipse用 workspace 管理 working set 管理 project 管理 package 管理 class正則表達式

記住:表達式(運算、甚至一個數)是有返回值的!sql

 

高淇Java300集 · 匠仙版筆記 數據庫

先將編程環境的編碼改爲 UTF-8, 避免後患無窮編程


1.學習方式:深刻內存結構、分析JDK源碼;學習JAVA:企業級服務器端開發 + Android開發;學習編程語言的方法:找準一門語言,精通它。json

2. 一代機器語言 - 二代彙編語言 - 三代高級語言(面向過程、面向對象) - 四代SQL(存疑):向着人更加容易使用的方向發展。api

3. 作產品的標準:比上一代產品更加容易被人使用、功能更增強大。數組


4. 機器0101 - 彙編abbr. - 硬件從電子管到晶體管性能提高,計算機開始能夠作更多的事,因而須要更多軟件,彙編不夠了。

5. 面向過程C_FORTRAN_COBOL_PASCAL_ADA;面向對象C++_JAVA_C#


6. JAVA核心優點:跨平臺。JVM (Sun針對不一樣系統提供不一樣虛擬機、由Sun解決系統差別而不用你操心)

  

8. JAVA各版本和體系架構:

   

9. JDK(oracle.com/downloads)

  


10. 標識符以字母、下劃線、美圓符開頭(甚至漢字)。

11. Unicode中一個字符佔兩個字節:1B=8bit, 2^8=256; 2B=16bit, 2^16=65536; 漢字大概佔兩萬。

12. 字符集 (ISO8859-1 - BIG5 + GB2312 GBK GB18030 + Unicode)。

  


13. JAVA數據類型:四類八種基本類型 + 對象引用。

  

14. byte short int long _ 1 2 4 8 字節 _ -128~127 正負3萬 正負21億 國象棋盤放米;BigInteger類。

15. 進制轉換:Integer.to?String(), ?=Binary Octal Hex。

16. 整型常量 (字面量) 默認是int;(初始化) 整型常量不超範圍能夠自動轉型爲 byte short char

17. float double _ 4 8字節。浮點常量 (字面量) 默認是double。

18. float範圍比int大,有限範圍內表示無限的小數,並不能精確表示全部小數,有舍入偏差;使用BigDecimal類精確;避免比較浮點數。

19. char佔2字節;轉義字符(單引、雙引、反斜槓、製表、換行);運算時直接看成整數來運算。

20. 自動類型轉換:

  

21. 自動類型轉換:int/long能夠轉float但可能損失精度,long能夠轉double但可能損失精度,int轉double不會。

22. 強轉超出了目標類型的表數範圍,就會被截斷成爲一個徹底不一樣的值。

23. 注意作二元運算符的計算時,自動類型轉換可能會致使類型提高的問題。

24. 自動類型轉換看容量(容量是表數範圍而不是字節數), long是2^63,float是3.4e38 (double是1.7e308)。


25. JDK7新特性:二進制整數0b (用於更方便地操做內存與移位運算,寫遊戲和權限管理會經常使用)。

26. JDK7新特性:下劃線分隔符 (對長數字進行分段書寫, 四位一隔致脫口唸出)。


27. 局部變量在使用前必須先聲明和初始化。

28. final常量(最終變量)只能被初始化一次;使用 [全大寫+下劃線] 命名 (Ruby約定高於配置 -小寫就是變量 大寫就是常量)。

29. 標識zhi4符:見名知意 動名分開 - 變量名、方法名首字母小寫和駝峯;類名首字母大寫和駝峯。


30. 運算符:

  

31. 二元運算符類型提高與一元運算符的順序:

  

32. 邏輯短路:邏輯&&的第一個是false則不算第二個 邏輯或的第一個是true則不算第二個;移位與或不短路。

33. 邏輯與或只能操做布爾變量,按位與或(位運算符)還能夠操做整數;按位與& - 有0則0無0則1;按位異或^ - 同則0;取反~。

34. 注意:int 四個字節,默認二進制32位;取反會改變符號位。

35. 左移一位 (<<1 ) 至關於乘以2,右移一位 ( >>1 ) 至關於除以2;移位運算符後面跟着的操做數是移動的位數。

36. 試題:乘除 二、四、8… 怎麼算最快?移位。

37. 優先級:先乘除後加減 表達式裏面優先使用小括號來組織。


38. 編程的本質:儘快地將業務邏輯用代碼實現!而學javase用記事本仍是eclipse其實關係不大,不要在這種問題上用錯力。

39. eclipse: Window - Show view - Outline視圖用於查看類結構。主要是看方法,尤爲是重載。

40. eclipse: 斷點:程序在調試模式下運行時會停下來的地方 (雙擊加消斷點,右鍵debug as)。

41. eclipse: debug視圖的4個按鈕:運行到下個斷點或運行到底F8 中止CTRL+F2 進入方法F5 下一行F6 (F2=Focus Ctrl+1=QuickFix)。

42. eclipse: F11=debug,Ctrl+F11=run;將run改成F10 (其實也不用改,若是不設斷點,debug就是run),Hide Toolbar。


43. 控制語句:(順序結構)、[單雙多]選擇結構(if好習慣-即便1行都打花括號-不然控制範圍只有第一條語句)、循環結構。

44. switch語句專作等值判斷,注意break丟失致使case穿透:無視case值而接着執行case裏的代碼直到碰到break爲止。

45. 多行case只寫值、不寫體,間接地利用case穿透作多個等值判斷。

46. JDK7新特性:switch表達式結果能夠是字符串 (+int和枚舉)。

47. while循環:若是條件知足,則再來一次(先判斷後執行,而 do{}while(); 先執行後判斷)。


48. eclipse: 修改變量名,爲防遺漏要使用右鍵 - Refactor – Rename。

  

49. 解題技巧:【刪題幹】簡化分解難題,一塊一塊實現

50. 解題技巧: for循環打印九九乘法表?首先要保持一個積極的心態,「你確定會!」,首先你不學循環你會不會?第一反應是我能作,而後再去考慮怎麼作的問題。

51. goto的影子:帶標籤的break和continue (JAVA保留goto關鍵字但沒有功能)。


52. 方法:形參parameter-在方法被調用時用於接收外界輸入的數據;實參argument-調用方法時實際傳給方法的數據。本質不一樣:形參的本質是一個名字,不佔用內存空間。實參的本質是一個變量,已經佔用內存空間。

  

53. 方法:JAVA中只有值傳遞-基本數據類型傳數據值自己,引用類型傳對對象的引用,而不是對象自己。

54. 設計方法的原則:方法的本意是功能塊,就是實現某個功能的語句塊的集合。咱們設計方法的時候,最好保持方法的原子性,就是一個方法只完成1個功能,這樣利於咱們後期的擴展。

55. 遞歸 = 遞歸頭(何時不調本身) +遞歸體(何時調本身)。

  

56. 遞歸圖示與內存精講:遞歸兩個階段-遞推與迴歸。

  http://www.cnblogs.com/whl2012/p/3608973.html

57. 遞歸:程序調用自身的編程技巧 (例題:階乘計算和斐波那契數列)。


58. api:包(全部包) - 類(包下全部的類和接口) - 詳(類和接口的詳細說明);點 Overview 列出全部的包,二級連接有「包概述」。

59. 包?相似於「文件夾」,解決類之間的重名問題 和 便於管理類(合適的類位於合適的包)。

60. 包名:域名倒着寫,再加上模塊名,並於內部管理類。

61. eclipse: 習慣徹底使用 ctrl+n 新建 項目(注意working_set)、包、類。

  

62. 之後建類都放在包裏,不要使用 default 包; package打包:第一句非註釋性語句; com.liyi 和 com.liyi.test 是兩個獨立的包。

63. JDK中主要的包 (lang是java的核心包,默認導入直接用)。

  

64. eclipse: 生成項目文檔。

  

65. javadoc - 錯誤:編碼GBK的不可映射字符。javac -encoding utf8 ClassName.java

  

66. eclipse: 項目右鍵 - Show in - System Explorer。


67.從鍵盤輸入: new Scanner(System.in); .next(); .nextInt()


68. 面向對象本質 (object oriented:(運行時)經過對象來【組織(封裝)數據】和 (設計時)經過類來【組織代碼】)

  

69. 面向過程以【方法(函數)】爲單位組織代碼 (上千方法,難以合做和擴展,80s軟件危機,以C「結構體」爲橋樑,過渡到 ...),面向對象以【類】爲單位組織代碼。

70. 結構體只能將相近的變量丟到一塊兒,在其基礎上,將相近的方法也丟到一塊兒;而方法須要反覆操做變量數據,乾脆把他倆合在一塊兒,就出現了新的概念 - 類。

71. 語言發展史:C - 帶類的C(C++) - JAVA(C++-)。

72. 面向過程:這件事須要幾個步驟。有槍了,就用槍的思惟去思考。面向對象:這件事裏有哪些個對象。

  

73. 物以類聚,分紅騎兵、炮兵,可是炮兵開炮也是有步驟。不是有了面向對象就不須要面向過程了。面向對象只是分類,方法的實現仍是面向過程。面向對象把握總體,面向過程完成細節。

74. 須要大規模協做的,面向過程搞不掂(你不可能瞭解每個步驟細節並方法化),大粒度的面向對象最擅長幹這個。

  

75. 「毛」的面向對象:架構優良,擴充容易,便於處理協做問題。

  

76. OOP本質;對象和類:先有對象後有類,先寫類後new對象。

  


77. 實例變量默認會自動初始化,局部變量不會、必須先手動初始化後使用。

78. 精彩的內存分析(main方法) - 操做對象就是操做他的地址 (引用reference,佔4個字節,1位16進制=4位二進制,1位8進制=3位二進制)。

  

79. JVM爲每一個已加載的類都維護一個常量池。常量池共享機制:先檢查其餘常量池裏有沒有相同的常量,有就共享。

80. 垃圾回收機制:沒有被引用的對象叫作垃圾。finalize方法是JAVA提供給程序員用來釋放對象或資源的方法,但儘可能少用,由於不保證執行 (能夠for循環大規模耗盡內存來測試閉包)。

  

81. 優劣:C++若是多人協做編程,出錯的機率極大 (開飯館的比喻:家庭 vs 餐館 vs 食堂設想:垃圾回收和手動並用)。

82. 構造方法本質上有返回值(但不須要作任何定義),只用於構造類的對象,經過new來調用 (由於方法須要對象調,此時無對象),默認無參、自定則無。

83. eclipse: Alt+Shift+S = Source;構造方法也是方法,也能夠 重載。

84. static內存分析:

  

85. this又叫隱式參數,咱們調用方法時並無手動傳,但jvm本身會把他傳進去,this存對象地址值、指向當前對象。由於方法只有一份,若是參數裏沒有this,又如何知道是哪一個對象在調用。

86. 普通方法中,this老是指向調用該方法的對象;構造方法中,this老是指向正要初始化的對象;不能用於static方法;this()調用其餘構造器,必須位於第一句。

87. super是另外一個隱式參數,指向子類對象內部的父類對象。


88. 面向對象三大特徵:繼承、封裝(隱藏)、多態。

89. OOD:類是對對象的抽象,繼承是對某一批類的抽象,從而實現對現實世界更好的建模;OOP:提升代碼的複用性(代碼重用)。extends=擴展,子類是父類的擴展。

  

90. 重寫和重載不要緊,重寫是從新實現(覆蓋)繼承自父類的方法以適應具體狀況,重載是一個方法名對應多個形參列表不一樣的方法實現。

91. eclipse: 設置 Ctrl+單擊 查看 jdk類 源碼。

92. toString()的源代碼:類名getClass().getName() + '@' + 十六進制哈希碼Integer.toHexString(hashCode());8位16進制=32位2進制,int型地址。

93. eclipse: 類名Hover~ Ctrl+T = 查看類繼承樹;快捷鍵記不住就 右鍵。

94. super:直接父類 對象 的引用 (JAVA能夠繼承多個父類,但直接父類只能一個,父類的父類們即間接父類)。

  

95. eclipse: 選中一段文字(默認當前行),alt+上下方向鍵,能夠上下移動行;空白處 alt+斜線,第一條提示便是 構造器。

96. 構造器內存結構:對象包對象 (wrap結構)。

  

97. 僅從代碼複用角度,組合 徹底能夠替代 繼承。

98. eclipse: 每次保存都會留恢復點,右鍵 Compare with - Local history,能夠選擇保存點對比。

99. 邏輯上,is-a關係使用繼承,has-a關係使用組合。

100. final關鍵字修飾 變量、方法、類(String、Math)

  

101. 封裝:encapsulation (capsule是膠囊、太空艙的意思);隱藏對象內部的複雜性,只對外公開簡單的接口。

  

102. 訪問控制符及類屬性的處理 (成員變量所有私有、常量和static能夠公開)。

  


103. 多態 (調用時只要類裏有方法聲明就能夠經過編譯) - 3個必要條件

        說一套,作一套(堆內存裏實際是什麼就是什麼),這就是多態。

  

105. instanceof的使用。

  

106. 多態的內存分析: this做爲隱式參數,永遠指向最終對象,但super有層級。

  


107. 抽象方法:只有方法的聲明,沒有方法體 (多抽象~)。

  

抽象方法必須被子類實現,這就是規範。意義在於:將方法的 [設計] 與 [實現] 分離

108.@Override是註解,被標註的覆蓋方法名不能改。註解是jdk5新。

109.接口中只有:常量(public static final)和抽象方法(public abstract)。[設計] 與 [實現] 分離。接口表明規範。

接口裏沒有什麼能夠繼承的,就是用來被實現的,因此關鍵字是implements。

常量的使用:MyInterface.MAX_SPEED。

110.有些「能飛的」東西,未必有繼承關係。如飛機和石頭。對於JAVA,接口補充和改善了「多繼承」機制。

111.爲何須要接口?接口抽象類的區別?

  

112. 接口支持多繼承。接口足夠簡單,不會引入過於的複雜性。可是…

接口常量名歧義:The field TestClass.MAX_VALUE is ambiguous


113.回調的實現:CallBack (或Hook, 鉤子函數),所謂「調哪個、回頭再說」,先把調用寫死,而後你傳哪一個我調哪一個。也稱爲 模板方法模式[多態的應用]

  

將你不肯定如何實現的方法,或者可能有多種實現 (如「畫窗口」,每次畫的內容都不同),交給別人實現。[awt的實現:你寫畫窗口的方法、負責註冊和調用,內部其實就是一個鉤子;若是重寫了方法咱們沒有調用它,卻莫名其妙被調(執行)了,要想到這]

你在個人「鉤子」上「掛」什麼我執行什麼 (方法以 父類引用(抽象類或接口,更規範) 作形參,傳不一樣的子類對象;那個方法就是鉤子)。

114.interface命名,不少人喜歡首字母加I,如IMyInterface。


*115.馮諾依曼體系結構的本質:加法器+存儲器。

*116.關於學習和暈。

  


117.內部類:在另外一個類內部定義的類。

  場合:在只爲所在外部類提供服務的狀況下優先使用。如CPU就是爲Computer服務的,別的類也用不着。

  好處:別人不能直接訪問 CPU,要經過它從屬的 外部類(於內部可)直接訪問(提供公共方法);CPU能夠直接使用Computer的私有屬性 (但外部類不能訪問內部類的私有屬性)。

  (內部類提供了更好的封裝,只能讓外部類直接訪問,不容許同一個包中的其餘類直接訪問)

118.內部類的分類:成員內部類(靜態_當一個靜態內部類對象存在,並不必定存在對應的外部類對象、非靜態)

  匿名內部類(適合只須要使用一次的類,定義和調用一塊兒,如鍵盤監聽操做)

      new 父類構造器(實參列表) 實現接口() { //匿名內部類類體 }

  局部內部類(用得極少,將類定義在方法內部、做用域限於本方法)。

119. 成員內部類編譯後的字節碼文件名:Outer$Inner.class。

將成員內部類的地位當作類的成員來理解,更容易明白其調用方式。

120. 非靜態成員內部類。

建立內部類對象:①Outer o = new Outer(); Outer.Inner i = o.new Inner(); ②Outer.Inner i = new Outer().new Inner();

內部類調用外部類屬性若是名字衝突,使用 Outer.this.attribute_name; 構造器裏使用this.attribute_name引用內部屬性。

非靜態內部類裏能夠直接訪問外部類的私有成員。

這是由於:在非靜態內部類對象裏,保存了一個寄存它的外部類對象引用。當調用非靜態內部類的實例方法時,必須有一個非靜態內部類實例,而非靜態內部類實例必須寄存在外部類實例裏。

非靜態內部類對象單獨屬於外部類的某個對象,就像外部類的成員變量同樣。

先有外部類對象,才能再有內部類對象。

<anchor> 非靜態內部類中不容許有靜態屬性和方法(和初始化塊) 

關於JAVA的類加載順序:

public class Outer {
  class NotStaticInner {
    
static int i = 0; //這樣寫是不合法的.
    static final int CONSTANT = 0; //這樣寫是合法的 } }

  首先加載類,執行其static變量初始化,接下來執行對象的建立,初始化非靜態成員變量;

  若是咱們要執行代碼中的變量i初始化,那麼必須先加載Outer,再加載NotStaticInner,初始化靜態變量i。

  問題就出在加載NotStaticInner上面,把NotStaticInner當作Outer的非靜態成員變量,它的加載必須在外部類對象建立之後進行。要加載NotStaticInner必須在實例化Outer以後完成,而JVM要求全部的靜態變量初始化必須在對象建立以前完成,這樣便產生了矛盾。

  常量之因此能夠 (不論有無static),由於 JAVA 在編譯期就肯定全部常量,放到常量池當中。

   

  [注] 嵌套類 = 靜態內部類 (ThInJa.P193);非靜態內部類的「靜態」屬性和方法均可以經過放在外部類中定義而解決,由於內部類的對象也能夠輕鬆調用他們。

 

(外部類的)靜態成員不能 訪問 非靜態成員(非靜態內部類)Cannot make a static reference to the non-static field, 訪問時都不必定有。

非靜態內部類對象必須寄存在外部類對象裏,但外部類對象卻沒必要必定有非靜態內部類寄存其中。(fk.P202)

121.靜態內部類。

當一個靜態內部類對象存在,並不必定存在對應的外部類對象,因此靜態內部類的實例方法不能直接訪問外部類的實例方法

外部類能夠經過 StaticInner.attribute_name 訪問其靜態成員。

  建立內部類對象:Outer.StaticInner sInner = new Outer.StaticInner();

122.在修飾類方面,static只能修飾內部類。Illegal modifier for the class; only public, abstract & final are permitted.

123.總結:①普通的成員內部類能夠訪問外部類的普通的屬性和方法。②普通的成員內部類能夠看做外部類的一個普通的屬性(因此能夠訪問外部類的其餘成員)。普通內部類對象必須寄宿在外部類對象裏面。必須先有外部類對象,纔能有內部類對象。③靜態內部類加了static修飾之後,靜態內部類對象存在,它的外部類對象不必定存在,靜態內部類不能訪問外部類的普通的屬性和方法,可是靜態內部類能夠直接訪問外部類的靜態的屬性和方法。


124. Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3 ——最多見的異常

                  at cn.bjsxt.array.Test01.main(Test01.java:9)

看異常信息 = 上下左右找你認識的東西(線索);有些人,甚至拆開每一個單詞都不認識,但合起來他知道數組越界了。常見異常就那麼幾個,熟能生巧。指的是第 個索引越界了。

125. (1)數組是相同數據類型的有序集合

   (2)數組也是對象。數組元素至關於對象的成員變量 (詳情請見內存圖 00:26:15@e52)

   (3)數組長度是肯定的,不可變的。若是越界,則報:ArrayIndexOutOfBoundsException

126. 操做對象就是操做它的引用,對象數組每一個元素裏放的是對象的引用。

127. length是數組對象的final屬性。

128.數組的使用:聲明、建立數組對象、初始化。大部分「容器」的底層實現都是數組。

129.初始化:默認、動態(for)、靜態(回車排版、必須和聲明一塊兒用)。

130. new默認初始化:數組元素至關於對象的成員變量。數字0,布爾false,char\u0000,引用null。

131.final聲明的引用,意思是不能再次指向別的對象;但指向對象的屬性值能不能改,取決於這個類有沒有提供對應的set方法。String類裏的private final char value[],之因此不能改是由於沒有提供方法,而不是由於final。

132.String是類,其length()方法只是將value.length返回。String類稱爲不可變字符序列!

*133. @Deprecated [ˈdeprəkeɪt] 註解的方法會有刪除線,表示不推薦、已淘汰的方法,每每有更佳的解決方案。

134.String類的經常使用方法:多重構造器、length()、isEmpty() 用value的長度判斷、charAt() 作了越界檢查、equals() 00:25:38@e5四、equalsIgnoreCase() 忽略大小寫的相等、startWith()/endsWith() 看是否是參數開頭/結尾、indexOf(→)/lastIndexOf(←) 返回第一個char的索引或-一、substring()、replace() 不會改變原字符串的內容、split()、trim() 去除只在首尾的全部空格、toString()、toCharArray() 疑問:爲何不直接返回value?、toLowerCase()/toUpperCase()。——能夠看看源碼

135.String全等==:指向常量池,編譯器優化 (javac編譯能夠對字符串常量直接相加的表達式進行優化,沒必要要等到運行期去進行加法運算處理,而是在編譯時去掉其中的加號,直接將其編譯成一個這些常量相連的結果);new兩個對象,「兩個」必定不全等。String相等equals():內容相等。

136.replace()的參數是字符和字符串(CharSequence是接口),replaceAll()的參數是正則表達式;相同點是都是所有替換。只想替換第一次出現的,可使用 replaceFirst()。

137.使用 + 拼接字符串,循環1000次,1000個對象就出現了。new String(「a」) 還有倆對象 (00:12:25@e55)若是是服務器程序,對象數*線程數,空間消耗將是災難。

138.可變字符序列:StringBuilder(線程不安全/效率高),StringBuffer(線程安全/效率低)。使用局部變量,通常使用StringBuilder。

139. eclipse: 查看源碼時,使用F4或右鍵,查看運行層次Open Type Hierarchy。

140.StringBuilder(和StringBuffer同繼承自抽象類AbstractStringBuilder),默認初始化長度爲16;或指定長度;若指定內容,則長度再加16。最強的方法是append(),扔true也作字符串鏈接,且return this可用於寫方法鏈。

141.使用StringBuilder作字符串的拼接纔是正解,new StringBuilder(「a」) 全程只有兩個對象。

142.append()方法的擴容函數(append→ensureCapacityInternal→expandCapacity),每次長度不夠使先把value長度」乘2加2」,還不夠直接設所須要的大小;value = Arrays.copyOf(value, newLength) 內部實際建了個新數組用System.arraycopy()把老的替換了。老數組被GC回收掉。

143.delete() 刪除起止索引[0起]內容_包頭不包尾+同則不做爲replace()直接改數組、insert() 數組是查詢方便,而插入刪除修改不方便,須要「移位」、reverse()。——能夠看看源碼

144.仿照StringBuilder和ArrayList類源碼,本身寫一個容器類MyArrayList,選擇實現其中的一些越界檢查rangeCheck()、擴容extendCapacity()、CURD等方法。Create/Update/Read/Delete

145.System.arraycopy()是一個native修飾的靜態方法,若是新數組比原數組的length小則會拋出java.lang.ArrayIndexOutOfBoundsException異常。Arrays.copyOf()不會由於長度問題而報錯,由於Arrays.copyOf()的返回值是在內部 new 好的新數組,其大小就等於newLength。可是Arrays.copyOf()方法最後也是調用System.arraycopy()的,不過因爲以前已經對數組進行了處理,因此不會報出異常。(瞭解:關於native關鍵字涉及到JNI,native修飾的方法是一個原生態方法,方法對應的實現不是在當前文件,而是在用其餘語言,如C和C++實現的文件中。Java語言自己不能對操做系統底層進行訪問和操做,可是能夠經過JNI接口調用其餘語言來實現對底層的訪問)

146.多維數組。數組元素仍是數組 ( int[][] )

聲明和初始化從高維到低維 (第一維都不知道多少怎麼知道第二維!而第二維多少都有可能!見下圖148)。

147.二維數組靜態初始化:

int[][] a = {{1,2}, {3,4,0,9}, {5,6,7}};       // 沒必要須是規則矩陣形式

  

148.二維數組動態初始化:

  

  

int[][] a = new int[3][];

  a[0] = new int[2];  a[1] = new int[4];  a[2] = new int[3];

    a[0][0] = 1;  a[0][1] = 2;

    a[1][0] = 3;  a[1][1] = 4;  a[1][2] = 5;  a[1][3] = 6;

    a[2][0] = 7;  a[2][1] = 8;  a[2][2] = 9;

149.矩陣的加法和打印,二維數組實現。同階i和j,雙重for。


150.數組拷貝 Arrays.copyOf()/System.arraycopy()、數組排序Arrays.sort()、數組二分查找 Arrays.binarySearch() 找不到返回 <0、數組json打印 Arrays.toString()、填充Arrays.fill()。(Arrays.asList()和對象排序自定義compareTo()詳見容器)

API:在 System 類提供的設施中,有標準輸入、標準輸出和錯誤輸出流;對外部定義的屬性和環境變量的訪問;加載文件和庫的方法;還有快速複製數組的一部分的實用方法。

151.本身實現:冒泡排序(我好像一直混淆了"選擇排序")、二分查找(先排序)。

152.命令行參數:①java Test a b "c d"  有空格就用雙引號引發來做爲一個參數。

②eclipse:Run Configurations   

153.加強for循環:for(DataType ai : array)。可打foreach出來。


經常使用類

154.包裝類(Wrapper Class):將基本類型數據轉換成對象。value做基本數據類型的私有final屬性,外面包了層對象。

  

  

155.Integer繼承了父類Number裏的許多方法。

Integer.MAX_VALUE/Integer.MIN_VALUE、toHexString()、valueOf()、parseInt()、intValue()、equals()。數字轉字符串,+"" 便可。

156.自動裝箱和拆箱。JDK5.0在編譯器(不是虛擬機)裏作了手腳。

  

Integer b = null;     int c = b;  報空指針異常,由於編譯器改進代碼,私下調用了intValue()方法。

157. Integer a = 1234;          Integer b = 1234; 此時a != b。

   Integer a = 123;            Integer b = 123; 此時a == b。

關於緩存:[-128, 127] 之間的數,仍然當作基本數據類型來處理,爲了提升效率。基本數據類型仍是比對象快!

詳見 新浪博客,Integer.valueOf(int i)返回一個表示指定的int值的Integer實例,new Integer(i)產生一個新的Integer對象。Integer.valueOf()內部調用了 IntegerCache.cache[i + offset] 優化方法,當-128=<i<=127的時候,返回的是IntegerCache中的數組的值;當 i>127 或 i<-128 時,返回的是Integer類對象。


 158.時間處理類。Date類有兩個包util工具用類和sql數據庫用類,導包時不要導錯。

格里高利曆是公曆。 

159.Date類。(時間戳)

   能夠推負數到1970年之前。毫秒和秒是千進位。

160. Date()的構造器裏用this()傳參System.currentTimeMillis()。

技巧:先寫帶參數的構造器,而後使用this()來調用之,實現無參的構造器。

161.toGMTString() 轉換格林尼治時間(已廢棄)、toLocaleString() 轉換本地日期習慣(已廢棄)。已廢棄的方法,API裏會提供替換方案(replaced by…)。一開始Date類很強大,後來一分爲三。

162.long get/setTime()、before()/after() 比較時間大小[能夠本身寫]、toString()。

163.抽象類DateFormat和它的一個實現SimpleDateFormat,用於完成字符串和時間對象的轉化。注意是text包。

技巧:Ctrl+T去看該抽象類有哪些(官方)子類實現能夠用。

DateFormat df = new SimpleDateFormat("yyyy年MM月dd日 hh:mm:ss"); 格式化字符串見SimpleDateFormatAPI

format()[時間→字符串] 和 parse()[字符串→時間] 方法。

164.Calendar日曆抽象類,月份常量0-11(Jan.-Dec.),周平常量是1,週六是7。用於完成long類型的數和日期進行轉換。計算機認識long,人認識年月日時刻,此搭橋。GregorianCalendar格里高利曆實現類。

*165.使用chm版的api索引。學寫文檔註釋就看一看jdk源碼文檔註釋和文檔顯示效果,幾個標籤記住就會用。

  

166. eclipse: Ctrl+shift+o (organize imports)能夠導入須要的包。

  

167. eclipse: Ctrl+shift+s 能夠保存全部未保存的文件。

168.日曆類經常使用方法:①各類重載set(使用Calendar.常量),其中set(field, value)方法能夠單獨指定,如c.set(Calendar.DATE, 25);不設的話採用當前時間(與DateFormat有區別) ②獲取特定信息get(field); 獲取時間Date getTime()/long getTimeInMillis() ③setTime(Date d) ④日期計算add(field, value),加負爲減。

169.獲取本月天數:移動下月,設置首日,首日減一。(DAY_OF_WEEK表明「星期幾」)

  法一:

  c.add(Calendar.MONTH, 1);   c.set(Calendar.DATE, 1);     c.add(Calendar.DATE, -1);     int days = c.get(Calendar.DATE);

  法二:

  c.getActualMaximum(Calendar.DATE);

 

*170.輸出時注意print(); 和 println();

171. 解題技巧: 積極心態調整——這事兒能不能作,先說能夠作,再想辦法怎麼作(回去哪怕加班呢)。能作多少作多少(總比不作強),作着作着就有感受了(慢慢一點點改進);先把簡單的作了,難點一個個突破,而後就over了。這樣、機會愈來愈多,工資愈來愈多。(另見:第50條)

172. eclipse: Ctrl+D直接刪除當前行,可能會和emmet插件衝突,須要unbind該命令重啓再設置。

  


173.io.File類:文件(目錄也是文件)路徑名的抽象表示形式。與文件相關的操做就查它的API。

  

  路徑分隔符直接寫/也不要緊。

  File f = new File("c:/file"); // 如今對象f就表明這個文件

  File f2 = new File("c:/");

  File f3 = new File(f2, "file");

相關文章
相關標籤/搜索