代碼簡潔,思惟清晰,習慣註釋
命名習慣:
1.包名:全部字母一概小寫;
2.接口名和類名:每個單詞首字母大寫,若含有縮寫,則每一個縮寫字母均大寫;
3.方法名和變量名:第一個單詞首字母小寫,後面的每個單詞的首字母均大寫;
4.常量名:每個字母都要大寫,如有多個單詞,以「_」鏈接
5.命名要見名知意
eclipse快捷鍵:
1.刪除不引用的包/補上要引用的包:Ctrl+Shift+O
2.單行註釋:Ctrl+/
3.多行註釋:Ctrl+Shift+/,取消多行註釋:Ctrl+Shift+\
4.命令補齊:Alt+/
方法前若是有static修飾,那麼能夠用類名.方法來調用。
方法前有final,那麼不能重寫該方法
類名前有修飾符public時,類名必須和文件名一致。
當用cmd來編譯Java文件時,出現沒法加載主類的狀況時,是因爲classpath設置的緣由,用set classpath把classpath清除掉。
標識符不能使用數字開頭,不能使用關鍵字,Java是嚴格區分字母大小寫。
文檔註釋:/**註釋*/,用javadoc命令能夠把文檔註釋的內容抽取出來成爲HTML格式。註釋的內容不會編譯到字節碼文件裏面,即註釋多不會形成Java文件變大。
多行註釋裏面不能包含多行註釋。註釋是以/*開始,以*/結尾。註釋能夠用來縮小錯誤代碼的範圍。
定義常量方式:1.final 數據類型 常量名 = 值;2.final 數據類型 常量名;常量名 = 值;常量不能當作變量來改變值。
java基本數據類型:整數類(byte,short,int,long),文本類(char),浮點類(float,double)和邏輯類(boolean)
在有static修飾的方法裏面調用其餘方法時,調用的方法也要有static修飾。
instanceof是用來判斷一個類是否屬於一個類或者其子類。
構造函數:
1.構造方法名要與類名一致
2.構造函數的聲明處不能有返回值,包括void
3.不能在構造函數中使用return返回一個值
4.構造方法不能被static,final,abstract,native和synchronized修飾
抽象類(abstract):
1.只定義方法聲明但不包含方法體,這樣的方法稱爲抽象方法
2.抽象類能夠不含有抽象方法,也能夠存在一個或者多個抽象方法
3.abstract關鍵字不能修飾屬性和構造方法
包(package):
1.導入包的時候不能直接導入方法,但能夠靜態引入
2.靜態引入:在import關鍵字後加上static,就能夠引入方法,但該方法須要是一個公共靜態(public static)方法或(public static final)常量
接口(interface):
1.若是一個抽象類裏的全部方法都是抽象的,那麼用interface來建立這個類
2.接口裏的方法默認是public abstract,能夠不寫,系統會默認聲明這些修飾符
3.接口裏面能夠有成員變量,方法默認的修飾符是public static final;
4.接口能夠支持多繼承,類只能支持單繼承
5.類與類之間的關係是繼承,用extends實現;類與接口之間的關係是實現,用implement實現
6.接口的方法都是抽象方法,即沒有方法體,以分號結束,不能出現{}
7.interface的修飾符不能使用private和protected,通常建議用public
8.接口名前建議加「I」,這樣比較規範。
異常(Exception)
1.異常類都是繼承自Throwable類,異常分爲error和exception。
2.error 不能被拋出,exception能夠拋出,exception類分爲(非檢查類)RuntimeException類和(檢查類)其餘異常類。
3.處理異常
try-catch以及try-catch-finally
try{
//一些會拋出異常的方法
}catch(Exception e){
//處理該異常的代碼塊
}...
catch(Exception e){
//處理該異常的代碼塊
}
try-catch以及try-catch-finally後面的代碼會執行,而不會中斷。而且catch裏的Exception須要按從小到大的順序,由於異常的父類是Exception,全部子類都繼承它,catch會尋找最近的Exception
throw和throws:
1.throw關鍵字做用在語句上面,而throws關鍵字是做用在方法上面
2.throw用於拋出異常,throws用於標誌某個方法可能會拋出異常
內部類
1.內部類的對象能夠訪問其所在的外部類的全部屬性,包括私有屬性
2.外部類要訪問內部類的屬性和方法就必須先有對象再經過對象來訪問屬性和方法java
多線程
建立線程的兩種方法:
1.繼承Thread
2.實現Runnable接口
Thread
啓動線程:經過調用Thread的start()方法 數組
一.繼承Thread
1.建立一個類繼承Thread
2.重寫run方法
3.建立一個線程對象,而後調用start()方法啓動線程
二.實現Runnable接口
1.建立一個類實現Runnable接口
2.重寫run方法
3.建立一個任務
4.建立一個Thread對象,把第三步建立的任務傳遞給這個類
5.調用start()方法,啓動線程
線程的狀態:
新建狀態
就緒狀態
運行狀態
阻塞狀態
死亡狀態
java線程的命名規則:Thread-i
Thread.currentThread();獲取當前正在執行的線程對象的引用
線程是相互獨立的,一個線程的操做不會影響其餘線程,即一個線程出現了異常,不會影響其餘線程的進行
main方法執行結束後,jvm是沒有中止運行的。還會運行其它的線程。
一個線程對象只能調用一次start()方法,若屢次調用會拋出異常"IllegalThreadStateException"。
Runnable接口中只有一個抽象方法run()。
線程的run方法不能拋出異常,由於父類Thread裏的run方法原來沒有拋出異常,重寫run方法時不能加上異常。
在繼承Thread類來建立線程中,經過關鍵字static能夠實現數據共享,但不建議這樣作,由於這樣會使內存負荷
多線程安全問題:
多線程安全問題產生緣由:
1.必須有多線程的狀況,並且有共享資料
2.多線程執行代碼多於一行
線程同步鎖:
synchronized(對象){
同步代碼塊
}
當synchronized用在函數上時,鎖住的是當前對象,這時使用這個函數後每次只能運行一個線程,即只要有一個線程進入這個函數,那麼其餘線程必須等這個線程執行完後,才能進入這個函數
在使用同步鎖的時候,用的鎖對象必定要是同一個對象
當使用同步方法的時候,其實鎖對象是當前對象(this)
當使用靜態的同步方法的時候,其實鎖的對象是類的字節碼文件對象
發生死鎖:多線程,鎖嵌套
線程間的通信:
wait();
notify();
notifyAll(); 安全
自動裝箱:當基本數據類型賦值給對象類型的時候,基本數據類型會自動裝箱成對象類型
自動拆箱:當基本數據類型和對象類型進行運算時,對象類型就會被自動拆箱爲基本數據類型數據結構
數組查詢數據效率比鏈表高,鏈表插入刪除數據效率比數組高。
-------------------------------------------------------------------------------------------------------------
java.util包下:
Set
HashSet:
數據結構是hash表,往HashSet裏面存放元素的時候,會先調用對象的hashcode方法,獲取哈希值,經過哈希值算出元素在hashset裏面的索引。若是相等,不存;不相等,經過其餘的方法把元素存入hashset。若是兩個元素的索引不相等,不調用equals方法直接存入hashset中。
TreeSet:
數據結構是二叉樹,多線程
泛型:jdk1.5以上版本出現的一個徹底機制。
好處:一、把運行時異常ClassCastExcetion轉換到編譯時異常。提升安全性。
二、避免強制類型轉換。
<>:何時使用<>?
<>,當程序操做的引用數據類型不肯定時,就可使用<>來限定,把須要操做的數據類型傳入就好了。
<>是控制引用數據類型的參數範圍的。
一、泛型是用於編譯時期的安全機制。不是運用於運行時期的。
在生成的class文件中是不存在泛型的。爲何?可以兼容jdk1.5之前的版本。---泛型的擦除。
在迭代的時候,jvm會把擦除的泛型還原,以便迭代的時候可以明確類型-----泛型的修補。
2.泛型類:class 類名<E>{
} app
3.泛型方法:修飾符 <E> 返回值類型 方法名稱(){
}
泛型聲明只能放在修飾符後,返回值類型前。
4.泛型通配符。用?表示接受的類型不肯定。可是注意,不能使用?類型聲明對象。
泛型上限。? extends 類:只能接受指定類型或者是指定類型的子類對象。
泛型下限。? super 類:只能接受指定類型或者是指定類型的父類對象。eclipse
Map接口:
Collection一次只能添加一個元素,Map一次能夠添加一對元素。
public interface Map<K,V> 將鍵映射到值的對象。一個映射不能包含重複的鍵;每一個鍵最多隻能映射到一個值
方法:
1.添加元素
V put(K key, V value) 將指定的值與此映射中的指定鍵關聯(可選操做)。
返回值V:之前與 key 關聯的值,若是沒有針對 key 的映射關係,則返回 null。(若是該實現支持 null 值,則返回 null 也可能表示此映射之前將 null 與 key 關聯)。
void putAll(Map<? extends K,? extends V> m) 從指定映射中將全部映射關係複製到此映射中(可選操做)。
2.刪除元素
void clear()
今後映射中移除全部映射關係(可選操做)。
V remove(Object key)
若是存在一個鍵的映射關係,則將其今後映射中移除(可選操做),返回對應Key所對應Value的值。
3.判斷
boolean containsKey(Object key);
若是此映射包含指定鍵的映射關係,則返回 true。
boolean containsValue(Object value);
若是此映射將一個或多個鍵映射到指定值,則返回 true。
boolean isEmpty(); 判斷是否爲空
4.獲取
V get(Object key);
返回指定鍵所映射的值;若是此映射不包含該鍵的映射關係,則返回 null。
int size(); 獲取長度。 jvm
Set<K> keySet() (拿的是鍵的集合)
返回此映射中包含的鍵的 Set 視圖。(Set集合裏存放的是惟一值,鍵是惟一值)
使用KeySet能夠把鍵所有放到Set集合中,由於Set集合裏有迭代器,能夠調用迭代器。用key來接收it.next();調用get(key)來獲取鍵所映射的值函數
Set<Map.Entry<K,V>> entrySet() (拿的是映射的集合) Entry是Map的內部類
返回此映射中包含的映射關係的 Set 視圖。
使用Map.Entry能夠把鍵和值所有放到Set集合裏,調用Set裏的迭代器,Map.Entry下有getKey()和getValue(),分別獲取鍵和對應的值
Collection<V> values() (拿的是value的集合)
獲取Map集合中全部的value的值並放入Collection中 (Collection裏存放的值不是惟一值,值是不惟一的)this
Map下經常使用的子類:
|-----Hashtable 數據結構是Hash表,鍵和值不能爲空,惟一,同步,JDK1.0版本
|-----HashMap 數據結構是Hash表,鍵和值能夠爲null,不一樣步,無序
|-----TreeMap 數據結構是二叉樹,鍵和值不能爲null,無序,能夠對鍵進行排序,不一樣步
Map<Integer,String> mp = new HashMap<Integer,String>(); 注意泛型只能用引用數據類型,不能使用基本數據類型
IO
設備之間數據傳輸
Java裏面的數據是以流來實現傳輸
流對象在Java.io包裏
按照流向分類:
1.輸入流:從其餘設備讀取文件到Java程序
2.輸出流:從設備寫數據到其餘設備
按照文件處理方式分類:
1.字符流:專門處理純文本數據
2.字節流:以字節爲單位處理數據
字節流主要有兩個類:
1.Reader----Input
2.Writer----Output
凡是與IO操做的代碼都會發生異常(好比寫入盤符錯誤等),因此在寫代碼時要拋出異常。輸出流會把寫入的數據先放到緩衝區裏,要調用刷新緩衝區的方法才能把數據寫入到文件中
在操做完數據以後要記得關閉流(close()方法),關閉流以前會先刷新緩衝區
Windows下換行的轉義字符是\r\n。這是不一樣操做系統內部對轉義字符設置的不一樣形成的
FileWriter(String fileName, boolean append)
append表示是否以追加模式來建立流對象,若是爲true,則表示會在已有的數據上追加數據,若爲false則會覆蓋原來的數據
private static final String LINE_SEPARATOR = System.getProperty("line.separator");獲取系統的換行符
read()一次讀取一個字符,並返回讀取字符的整數表示形式。若讀到末尾,則返回-1。
字符數組在定義長度時取1024
複製的原理:循環讀寫
裝飾模式
BufferedWriter裏的一個方法void newLine() 能夠換行
java裏面有兩種方式顯示路徑:/和\\。
使用系統的輸入輸出流不用關閉流,使用字符的輸出流要刷新,使用字節的輸出流不用刷新。
String裏面有將字母轉化大小寫的方法,toUpperCase和toLowerCase
遞歸:函數調用本身(注意使用條件,不然會形成棧溢出;使用遞歸次數不宜太大,不然一樣會形成棧溢出)