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


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

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

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

 

eclipse用 workspace 管理 working set 管理 project 管理 package 管理 class

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

 

高淇Java300集 · 匠仙版筆記 

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


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

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

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. 試題:乘除 2、4、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@e54、equalsIgnoreCase() 忽略大小寫的相等、startWith()/endsWith() 看是不是參數開頭/結尾、indexOf(→)/lastIndexOf(←) 返回第一個char的索引或-1、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");


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM