對於short a = 1; a = a + 1;因爲a + 1 運算時會自動提高表達式的類型,因此結果是int型,再複製short類型a時,編譯器將報告須要強制裝換類型的錯誤。html
對於short a = 1; a += 1;因爲 += 是java語言規定的運算符,java編譯器會對它進行特殊處理,所以能夠正確編譯。java
在語法定義上的區別:靜態變量前要加static關鍵字,而實例變量前則不加。算法
在程序運行時的區別:實例變量屬於某個對象的屬性,必須建立了實例對象,其中的實例變量纔會被分配空間,才能使用這個實例變量。靜態變量不屬於某個實例對象,而是屬於類,因此也稱爲類變量,只要程序加載了類的字節碼,不用建立任何實例對象,靜態變量就會被分配空間,靜態變量就能夠被使用了。總之,實例變量必須建立對象後才能夠經過這個對象來使用,靜態變量則能夠直接使用類名來引用。數組
例如,對於下面的程序,不管建立多少個實例對象,永遠都只分配了一個staticVar變量,而且每建立一個實例對象,這個staticVar就會加1;可是,每建立一個實例對象,就會分配一個instanceVar,便可能分配多個instanceVar,而且每一個instanceVar的值都只自加了1次。安全
public class VariantTest{ public static int staticVar = 0; public int instanceVar = 0; public VariantTest(){ staticVar++; instanceVar++; System.out.println(「staticVar=」 + staticVar + 」,instanceVar=」 + instanceVar); } }
使用final關鍵字修飾一個變量時,是指引用變量不能變,引用變量所指向的對象中的內容仍是能夠改變的。數據結構
例如,對於以下語句:app
final StringBuffer strA=new StringBuffer("immutable");
執行以下語句將報告編譯期錯誤:函數
strA=new StringBuffer("");
可是,執行以下語句則能夠經過編譯:性能
strA.append(" broken!");
有人在定義方法的參數時,可能想採用以下形式來阻止方法內部修改傳進來的參數對象:spa
public void method(final StringBuffer param){ }
實際上,這是辦不到的,在該方法內部仍然能夠增長以下代碼來修改參數對象:
param.append("abc");
final 用於聲明屬性,方法和類,分別表示屬性不可變,方法不可覆蓋,類不可繼承。
finally是異常處理語句結構的一部分,表示老是執行。
finalize是Object類的一個方法,在垃圾收集器執行的時候會調用被回收對象的此方法,能夠覆蓋此方法提供垃圾收集時的其餘資源回收,例如關閉文件等。
聲明方法的存在而不去實現它的類被叫作抽象類(abstract class),它用於要建立一個體現某些基本行爲的類,併爲該類聲明方法,但不能在該類中實現該類的狀況。不能建立abstract 類的實例。然而能夠建立一個變量,其類型是一個抽象類,並讓它指向具體子類的一個實例。不能有抽象構造函數或抽象靜態方法。Abstract 類的子類爲它們父類中的全部抽象方法提供實現,不然它們也是抽象類爲。取而代之,在子類中實現該方法。知道其行爲的其它類能夠在類中實現這些方法。
接口(interface)是抽象類的變體。在接口中,全部方法都是抽象的。多繼承性可經過實現這樣的接口而得到。接口中的全部方法都是抽象的,沒有一個有程序體。接口只能夠定義static final成員變量。接口的實現與子類類似,除了該實現類不能從接口定義中繼承行爲。當類實現特殊接口時,它定義(即將程序體給予)全部這種接口的方法。而後,它能夠在實現了該接口的類的任何對象上調用接口的方法。因爲有抽象類,它容許使用接口名做爲引用變量的類型。一般的動態聯編將生效。引用能夠轉換到接口類型或從接口類型轉換,instanceof 運算符能夠用來決定某對象的類是否實現了接口。
HashMap是Hashtable的輕量級實現(非線程安全的實現),他們都完成了Map接口,主要區別在於HashMap容許空(null)鍵值(key),因爲非線程安全,效率上可能高於Hashtable。
HashMap容許將null做爲一個entry的key或者value,而Hashtable不容許。
HashMap把Hashtable的contains方法去掉了,改爲containsvalue和containsKey。由於contains方法容易讓人引發誤解。
Hashtable繼承自Dictionary類,而HashMap是Java1.2引進的Map interface的一個實現。
最大的不一樣是,Hashtable的方法是Synchronize的,而HashMap不是,在多個線程訪問Hashtable時,不須要本身爲它的方法實現同步,而HashMap 就必須爲之提供外同步(若是是ArrayList:List lst = Collections.synchronizedList(new ArrayList());若是是HashMap:Map map = Collections.synchronizedMap(new HashMap());)。
Hashtable和HashMap採用的hash/rehash算法都大概同樣,因此性能不會有很大的差別。
會。如:
int i,i2; return (i-i2); //when i爲足夠大的正數,i2爲足夠大的負數。結果會形成溢位,致使錯誤。
sleep()是線程類Thread的方法,致使此線程暫停執行指定時間,給執行機會給其餘線程,可是監控狀態依然保持,到時後會自動恢復,調用sleep不會釋放對象鎖。
wait()是Object類的方法,對此對象調用wait方法致使本線程放棄對象鎖,進入等待此對象的等待鎖定池,只有針對此對象發出notify方法(或notifyAll)後本線程才進入對象鎖定池準備得到對象鎖進入運行狀態。
Java爲數據結構中的映射定義了一個接口java.util.Map;它有四個實現類,分別是HashMap、Hashtable、LinkedHashMap 和TreeMap
Map主要用於存儲健值對,根據鍵獲得值,所以不容許鍵重複(重複了覆蓋了),但容許值重複。
Hashmap 是一個最經常使用的Map,它根據鍵的HashCode 值存儲數據,根據鍵能夠直接獲取它的值,具備很快的訪問速度,遍歷時,取得數據的順序是徹底隨機的。HashMap最多隻容許一條記錄的鍵爲Null,容許多條記錄的值爲 Null;HashMap不支持線程的同步,即任一時刻能夠有多個線程同時寫HashMap;可能會致使數據的不一致。若是須要同步,能夠用 Collections的synchronizedMap方法使HashMap具備同步的能力,或者使用ConcurrentHashMap。
Hashtable與 HashMap相似,它繼承自Dictionary類,不一樣的是:它不容許記錄的鍵或者值爲空;它支持線程的同步,即任一時刻只有一個線程能寫Hashtable,所以也致使了 Hashtable在寫入時會比較慢。
LinkedHashMap保存了記錄的插入順序,在用Iterator遍歷LinkedHashMap時,先獲得的記錄確定是先插入的.也能夠在構造時用帶參數,按照應用次數排序。在遍歷的時候會比HashMap慢,不過有種狀況例外,當HashMap容量很大,實際數據較少時,遍歷起來可能會比LinkedHashMap慢,由於LinkedHashMap的遍歷速度只和實際數據有關,和容量無關,而HashMap的遍歷速度和他的容量有關。
TreeMap實現SortMap接口,可以把它保存的記錄根據鍵排序,默認是按鍵值的升序排序,也能夠指定排序的比較器,當用Iterator 遍歷TreeMap時,獲得的記錄是排過序的。
通常狀況下,咱們用的最多的是HashMap,HashMap裏面存入的鍵值對在取出的時候是隨機的,它根據鍵的HashCode值存儲數據,根據鍵能夠直接獲取它的值,具備很快的訪問速度。在Map 中插入、刪除和定位元素,HashMap 是最好的選擇。
TreeMap取出來的是排序後的鍵值對。但若是您要按天然順序或自定義順序遍歷鍵,那麼TreeMap會更好。
LinkedHashMap 是HashMap的一個子類,若是須要輸出的順序和輸入的相同,那麼用LinkedHashMap能夠實現,它還能夠按讀取順序來排列,像鏈接池中能夠應用。
1).ArrayList
採用的是數組形式來保存對象的,這種方式將對象放在連續的位置中,因此最大的缺點就是插入刪除時很是麻煩。
LinkedList
採用的將對象存放在獨立的空間中,並且在每一個空間中還保存下一個連接的索引,可是缺點就是查找很是麻煩,要從第一個索引開始。
2).ArrayList和Vector
都是用數組方式存儲數據,此數組元素數要大於實際的存儲空間以便進行元素增長和插入操做,他們都容許直接用序號索引元素,可是插入數據元素涉及到元素移動等內存操做,因此索引數據快而插入數據慢。
3).Vector使用了sychronized方法(線程安全),因此在性能上比ArrayList要差些.。
4).LinkedList使用雙向鏈表方式存儲數據,按序號索引數據須要前向或後向遍歷數據,因此索引數據慢,是插入數據時只須要記錄先後項便可,因此插入的速度快。
在switch(expr1)中,expr1只能是一個整數表達式或者枚舉常量,整數表達式能夠是int基本類型或Integer包裝類型,因爲,byte,short,char均可以隱含轉換爲int,因此,這些類型以及這些類型的包裝類型也是能夠的。顯然,long和String類型都不符合switch的語法規定,而且不能被隱式轉換成int類型,因此,它們不能做用於swtich語句中。
也許有人會說:橫着切,將蛋糕分紅兩個等高的部分就行了嘛。可是通常蛋糕上層是奶油,下層只有乾巴巴的麪包,因此咱們不許備把這個做爲答案之一。若是這個蛋糕沒有被切走一部分,應該如何平分呢?方法固然有不少,可是全部的切法都有一個共同點,那就是這一刀必定通過矩形的中心點。反之亦然,全部通過中心點的直線都能將矩形平均分紅兩部分。帶着這個結論回到開始的問題上,若是一刀通過大小兩個矩形中心點,就能將大矩形 ABCD 和小矩形 AGFE 都分紅面積相等的兩部分,這樣,咱們的問題也就解決了。
在上圖中,矩形AEFG是被偷偷挖走的部分。H和I是大小兩個矩形的中心,直線JLK通過這兩個中心點。能夠看出四邊形AJLG和JLFE的面積是相等的,而四邊形AJKD和JKCB的面積也是相等的,所以剩下的深藍色與綠色的面積也是相等的。
我是天王蓋地虎的分割線
參考:http://www.cnblogs.com/liu-qing-hua/p/3877768.html