[版權聲明] 自由轉載-非商用-非衍生-保持署名 (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)
看異常信息 = 上下左右找你認識的東西(線索);有些人,甚至拆開每一個單詞都不認識,但合起來他知道數組越界了。常見異常就那麼幾個,熟能生巧。3 指的是第 3 個索引越界了。
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"); 格式化字符串見SimpleDateFormat的API
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");