android複習路之java基礎下

Java異常類構架圖:

1.Throwable是java類中所有錯誤的異常類的超類,Throwable包含兩個子類,error和exception。它們通常用於指明是哪種異常。

2.RuntimeException RuntimeException是那些可能在 Java 虛擬機正常運行期間拋出的異常的超類。 編譯器不會檢查RuntimeException異常。 例如,除數爲零時,拋出ArithmeticException異常。RuntimeException是ArithmeticException的超類。當代碼發生除數爲零的情況時,倘若既"沒有通過throws聲明拋出ArithmeticException異常",也"沒有通過try...catch...處理該異常",也能通過編譯。這就是我們所說的"編譯器不會檢查RuntimeException異常"! 如果代碼會產生RuntimeException異常,則需要通過修改代碼進行避免。 例如,若會發生除數爲零的情況,則需要通過代碼避免該情況的發生!

3.Java將可拋出(Throwable)的結構分爲三種類型: 被檢查的異常(Checked Exception),運行時異常(RuntimeException)和錯誤(Error)。
(01) 運行時異常 定義 : RuntimeException及其子類都被稱爲運行時異常。 特點 : Java編譯器不會檢查它。 也就是說,當程序中可能出現這類異常時,倘若既"沒有通過throws聲明拋出它",也"沒有用try-catch語句捕獲它",還是會編譯通過。例如,除數爲零時產生的ArithmeticException異常,數組越界時產生的IndexOutOfBoundsException異常,fail-fail機制產生的ConcurrentModificationException異常等,都屬於運行時異常。 雖然Java編譯器不會檢查運行時異常,但是我們也可以通過throws進行聲明拋出,也可以通過try-catch對它進行捕獲處理。 如果產生運行時異常,則需要通過修改代碼來進行避免。 例如,若會發生除數爲零的情況,則需要通過代碼避免該情況的發生!
(02) 被檢查的異常 定義 : Exception類本身,以及Exception的子類中除了"運行時異常"之外的其它子類都屬於被檢查異常。 特點 : Java編譯器會檢查它。 此類異常,要麼通過throws進行聲明拋出,要麼通過try-catch進行捕獲處理,否則不能通過編譯。例如,CloneNotSupportedException就屬於被檢查異常。當通過clone()接口去克隆一個對象,而該對象對應的類沒有實現Cloneable接口,就會拋出CloneNotSupportedException異常。 被檢查異常通常都是可以恢復的。
(03) 錯誤 定義 : Error類及其子類。 特點 : 和運行時異常一樣,編譯器也不會對錯誤進行檢查。 當資源不足、約束失敗、或是其它程序無法繼續運行的條件發生時,就產生錯誤。程序本身無法修復這些錯誤的。例如,VirtualMachineError就屬於錯誤。 按照Java慣例,我們是不應該是實現任何新的Error子類的!

OOM:
OutOfMemoryError異常
除了程序計數器外,虛擬機內存的其他幾個運行時區域都有發生OutOfMemoryError(OOM)異常的可能,
Java Heap 溢出
一般的異常信息:java.lang.OutOfMemoryError:Java heap spacess
java堆用於存儲對象實例,我們只要不斷的創建對象,並且保證GC Roots到對象之間有可達路徑來避免垃圾回收機制清除這些對象,就會在對象數量達到最大堆容量限制後產生內存溢出異常。
出現這種異常,一般手段是先通過內存映像分析工具(如Eclipse Memory Analyzer)對dump出來的堆轉存快照進行分析,重點是確認內存中的對象是否是必要的,先分清是因爲內存泄漏(Memory Leak)還是內存溢出(Memory Overflow)。
如果是內存泄漏,可進一步通過工具查看泄漏對象到GC Roots的引用鏈。於是就能找到泄漏對象時通過怎樣的路徑與GC Roots相關聯並導致垃圾收集器無法自動回收。
如果不存在泄漏,那就應該檢查虛擬機的參數(-Xmx與-Xms)的設置是否適當。
虛擬機棧和本地方法棧溢出
如果線程請求的棧深度大於虛擬機所允許的最大深度,將拋出StackOverflowError異常。
如果虛擬機在擴展棧時無法申請到足夠的內存空間,則拋出OutOfMemoryError異常
這裏需要注意當棧的大小越大可分配的線程數就越少。
運行時常量池溢出
異常信息:java.lang.OutOfMemoryError:PermGen space
如果要向運行時常量池中添加內容,最簡單的做法就是使用String.intern()這個Native方法。該方法的作用是:如果池中已經包含一個等於此String的字符串,則返回代表池中這個字符串的String對象;否則,將此String對象包含的字符串添加到常量池中,並且返回此String對象的引用。由於常量池分配在方法區內,我們可以通過-XX:PermSize和-XX:MaxPermSize限制方法區的大小,從而間接限制其中常量池的容量。
方法區溢出
方法區用於存放Class的相關信息,如類名、訪問修飾符、常量池、字段描述、方法描述等。
異常信息:java.lang.OutOfMemoryError:PermGen space
方法區溢出也是一種常見的內存溢出異常,一個類如果要被垃圾收集器回收,判定條件是很苛刻的。在經常動態生成大量Class的應用中,要特別注意這點。

Java面向對象的三個特徵與含義。

繼承:繼承是從已有類得到繼承信息創建新類的過程。提供繼承信息的類被稱爲父類(超類、基類);得到繼承信息的類被稱爲子類(派生類)。繼承讓變化中的軟件系統有了一定的延續性,同時繼承也是封裝程序中可變因素的重要手段。

封裝:通常認爲封裝是把數據和操作數據的方法綁定起來,對數據的訪問只能通過已定義的接口。面向對象的本質就是將現實世界描繪成一系列完全自治、封閉的對象。我們在類中編寫的方法就是對實現細節的一種封裝;我們編寫一個類就是對數據和數據操作的封裝。可以說,封裝就是隱藏一切可隱藏的東西,只向外界提供最簡單的編程接口

多態:多態性是指允許不同子類型的對象對同一消息作出不同的響應。簡單的說就是用同樣的對象引用調用同樣的方法但是做了不同的事情。多態性分爲編譯時的多態性和運行時的多態性。如果將對象的方法視爲對象向外界提供的服務,那麼運行時的多態性可以解釋爲:當A系統訪問B系統提供的服務時,B系統有多種提供服務的方式,但一切對A系統來說都是透明的。運行時的多態是面向對象最精髓的東西,要實現多態需要做兩件事:1. 方法重寫(子類繼承父類並重寫父類中已有的或抽象的方法)。2. 對象造型(用父類型引用引用子類型對象,這樣同樣的引用調用同樣的方法就會根據子類對象的不同而表現出不同的行爲)。

Override和Overload的含義與區別。

Overload:顧名思義,是重載。它可以表現類的多態性,可以是函數裏面可以有相同的函數名但是參數名、類型不能相同;或者說可以改變參數、類型但是函數名字依然不變。

Override:就是ride(重寫)的意思,在子類繼承父類的時候子類中可以定義某方法與其父類有相同的名稱和參數,當子類在調用這一函數時自動調用子類的方法,而父類相當於被覆蓋(重寫)了。

方法的重寫Overriding和重載Overloading是Java多態性的不同表現。重寫Overriding是父類與子類之間多態性的一種表現,重載Overloading是一個類中多態性的一種表現。如果在子類中定義某方法與其父類有相同的名稱和參數,我們說該方法被重寫 (Overriding)。子類的對象使用這個方法時,將調用子類中的定義,對它而言,父類中的定義如同被“屏蔽”了。如果在一個類中定義了多個同名的方法,它們或有不同的參數個數或有不同的參數類型,則稱爲方法的重載(Overloading)。Overloaded的方法是可以改變返回值的類型。

Interface與abstract類的區別。

抽象類和接口都不能夠實例化,但可以定義抽象類和接口類型的引用。一個類如果繼承了某個抽象類或者實現了某個接口都需要對其中的抽象方法全部進行實現,否則該類仍然需要被聲明爲抽象類。接口比抽象類更加抽象,因爲抽象類中可以定義構造器,可以有抽象方法和具體方法,而接口中不能定義構造器而且其中的方法全部都是抽象方法。抽象類中的成員可以是private、默認、protected、public的,而接口中的成員全都是public的。抽象類中可以定義成員變量,而接口中定義的成員變量實際上都是常量。有抽象方法的類必須被聲明爲抽象類,而抽象類未必要有抽象方法。

Static class 與non static class的區別。

內部靜態類不需要有指向外部類的引用。但非靜態內部類需要持有對外部類的引用。非靜態內部類能夠訪問外部類的靜態和非靜態成員。靜態類不能訪問外部類的非靜態成員。他只能訪問外部類的靜態成員。一個非靜態內部類不能脫離外部類實體被創建,一個非靜態內部類可以訪問外部類的數據和方法,因爲他就在外部類裏面。


java集合框架:

1 Map
鍵映射到值的對象。
有如下特徵:
一個映射不能包含重複的鍵
每個鍵最多隻能映射到一個值。
某些映射實現可明確保證其順序,如TreeMap類
另一類映射實現則不保證順序如HashMap
Map可以將key序列、value序列單獨抽取出來。使用keySet()抽取key序列,將所有key生成一個Set。使用values抽取value序列,將所有value生成一個Collection,爲什麼key生成Set,而value生成Collection?因爲key總是獨一無二,value允許重複。

2 Set
不能包含重複元素的Collection。如下特徵:
Set不包含滿足e1.euqals(e2)
最多包含一個null元素(這裏是指HashSet,TreeSet不支持插入null)
不可隨機訪問包含的元素
Set沒有同步方法。

3 List
如下特徵:
可隨機訪問包含的元素
元素時有序的
可在任意位置增、刪元素
允許重複元素。

4 Queue
隊列,特點是先進先出。
Queue在使用時儘量避免Collection的add()和remove()方法,而是要使用offer()來加入元素,使用poll來獲取並移出元素。他們的優點是通過返回值可以判斷成功與否。add()和remove()方法在失敗的時候會拋出異常。
如果使用前端而不移出該元素,使用element()或者peek()方法。值得注意的是LinkedList類實現了Queue接口,因此我們可以把LinkedList當初Queue來用。
Queue實現通常不允許插入null元素。儘管某些實現(如LinkedList)並不禁止將null插入到Queue中,即使在允許null的實現中,也不應將null插入到Queue中,因爲null也作poll方法的一個特殊返回值,表明隊列不包含元素。

5 Stack
Stack繼承自Vector(可增長的對象數組),也是同步的。他通過五個操作對類Vector進行了擴展,允許將向量視爲堆棧。他提供了通常的push和pop操作,以及取堆棧頂點的peek方法。測試堆棧是否爲空的empty方法、在堆棧中查找項並確定對堆棧頂距離的search方法。


ArrayList、LinkedList、Vector的底層實現和區別


從同步性來看,ArrayList和LinkedList是不同步的,而Vector是的。所以線程安全的話,可以使用ArrayList或LinkedList,可以節省爲同步而耗費的開銷。但在多線程下,有時候就不得不使用Vector了。當然,也可以通過一些辦法包裝ArrayList、LinkedList,使我們也達到同步,但效率可能會有所降低。


從內部實現機制來講ArrayList和Vector都是使用Object的數組形式來存儲的。當你向這兩種類型中增加元素的時候,如果元素的數目超出了內部數組目前的長度它們都需要擴展內部數組的長度,Vector缺省情況下自動增長原來一倍的數組長度,ArrayList是原來的50%,所以最後你獲得的這個集合所佔的空間總是比你實際需要的要大。如果你要在集合中保存大量的數據,那麼使用Vector有一些優勢,因爲你可以通過設置集合的初始化大小來避免不必要的資源開銷。
ArrayList和Vector中,從指定的位置(用index)檢索一個對象,或在集合的末尾插入、刪除一個對象的時間是一樣的,可表示爲O(1)。但是,如果在集合的其他位置增加或者刪除元素那麼花費的時間會呈線性增長O(n-i),其中n代表集合中元素的個數,i代表元素增加或移除元素的索引位置,因爲在進行上述操作的時候集合中第i和第i個元素之後的所有元素都要執行(n-i)個對象的位移操作。LinkedList底層是由雙向循環鏈表實現的,LinkedList在插入、刪除集合中任何位置的元素所花費的時間都是一樣的O(1),但它在索引一個元素的時候比較慢,爲O(i),其中i是索引的位置,如果只是查找特定位置的元素或只在集合的末端增加、移除元素,那麼使用Vector或ArrayList都可以。如果是對其它指定位置的插入、刪除操作,最好選擇LinkedList。


Map、Set、List、Queue、Stack的特點與用法。
List 可以通過下標 (1,2..) 來取得值,值可以重複
而 Set 只能通過遊標來取值,並且值是不能重複的
ArrayList , Vector , LinkedList 是 List 的實現類
ArrayList 是線程不安全的, Vector 是線程安全的,這兩個類底層都是由數組實現的
LinkedList 是線程不安全的,底層是由鏈表實現的
Map 是鍵值對集合
HashTable 和 HashMap 是 Map 的實現類
HashTable 是線程安全的,不能存儲 null 值
HashMap 不是線程安全的,可以存儲 null 值
Stack類:繼承自Vector,實現一個後進先出的棧。提供了幾個基本方法,push、pop、peak、empty、search等。
Queue接口:提供了幾個基本方法,offer、poll、peek等。已知實現類有LinkedList、PriorityQueue等。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章