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