標籤:架構 其他 strong 基本資料 int 儲存 enum div 常量
1、"=="和equals方法究竟有什麼區別?
==操作符專門用來比較兩個變數的值是否相等,也就是用於比較變數所對應的記憶體中所儲存的數值是否相同,要比較兩個基本類型的資料或兩個引用變數是否相等,只能用==操作符。
equals方法是用於比較兩個獨立對象的內容是否相同,就好比去比較兩個人的長相是否相同,它比較的兩個對象是獨立的。
2、存取修飾詞public,private,protected,以及不寫(預設)時的區別?
區別如下:
範圍 當前類 同包 子類 其他
public √ √ √ √
protected √ √ √ ×
default √ √ × ×
private √ × × ×
類的成員不寫訪問修飾時預設為default。預設對於同一個包中的其他類相當於公開(public),對於不是同一個包中的其他類相當於私人(private)。受保護(protected)對子類相當於公開,對不是同一包中的沒有父子關係的類相當於私人。
3、String 是最基本的資料類型嗎?
不是。Java中的基礎資料型別 (Elementary Data Type)只有8個:byte、short、int、long、float、double、char、boolean;除了基本類型(primitive type)和枚舉類型(enumeration type),剩下的都是參考型別(reference type)。
4、解釋記憶體中的棧(stack)、堆(heap)和靜態儲存區的用法。
通常我們定義一個基礎資料型別 (Elementary Data Type)的變數,一個對象的引用,還有就是函數調用的現場儲存都使用記憶體中的棧空間;而通過new關鍵字和構造器建立的對象放在堆空間;程式中的字面量(literal)如直接書寫的100、“hello”和常量都是放在靜態儲存區中。棧空間操作最快但是也很小,通常大量的對象都是放在堆空間,整個記憶體包括硬碟上的虛擬記憶體都可以被當成堆空間來使用。
String str = new String(“hello”);
上面的語句中str放在棧上,用new建立出來的字串對象放在堆上,而“hello”這個字面量放在靜態儲存區。
補充:較新版本的Java中使用了一項叫“逃逸分析“的技術,可以將一些局部對象放在棧上以提升對象的操作效能。
5、簡述如下關鍵字用途try、catch、throw、throws、finally
try:保護代碼,如果try中某行代碼出現異常,則try中代碼不再繼續執行。 b) catch:捕獲異常,當try中出現異常,則catch負責捕獲異常,並處理。
throw:拋出異常。
throws:聲明異常。
finally:無論try中是否出現異常,finally一定執行。
6、LinkedList和ArrayList區別?
ArrayList和LinkedList兩者都實現了List介面,但是它們之間有些不同。
(1)ArrayList是由Array所支援的基於一個索引的資料結構,所以它提供對元素的隨機訪問,複雜度為O(1),但LinkedList儲存一系列的節點資料,每個節點都與前一個和下一個節點相串連。所以,儘管有使用索引擷取元素的方法,內部實現是從起始點開始遍曆,遍曆到索引的節點然後返回元素,時間複雜度為O(n),比ArrayList要慢。
(2)與ArrayList相比,在LinkedList中插入、添加和刪除一個元素會更快,因為在一個元素被插入到中間的時候,不會涉及改變數組的大小,或更新索引。
(3)LinkedList比ArrayList消耗更多的記憶體,因為LinkedList中的每個節點儲存了前後節點的引用。
7、物件導向的特徵有哪些方面?
物件導向的特徵主要有以下幾個方面:
1)抽象:抽象是將一類對象的共同特徵總結出來構造類的過程,包括資料抽象和行為抽象兩方面。抽象只關注對象有哪些屬性和行為,並不關注這些行為的細節是什麼。
2)繼承:繼承是從已有類得到繼承資訊建立新類的過程。提供繼承資訊的類被稱為父類(超類、基類);得到繼承資訊的類被稱為子類(衍生類別)。繼承讓變化中的軟體系統有了一定的延續性,同時繼承也是封裝程式中可變因素的重要手段(如果不能理解請閱讀閻宏博士的《Java與模式》或《設計模式精解》中關於橋樑模式的部分)。
3)封裝:通常認為封裝是把資料和操作資料的方法綁定起來,對資料的訪問只能通過已定義的介面。物件導向的本質就是將現實世界描繪成一系列完全自治、封閉的對象。我們在類中編寫的方法就是對實現細節的一種封裝;我們編寫一個類就是對資料和資料操作的封裝。可以說,封裝就是隱藏一切可隱藏的東西,只向外界提供最簡單的編程介面(可以想想普通洗衣機和全自動洗衣機的差別,明顯全自動洗衣機封裝更好因此操作起來更簡單;我們現在使用的智能手機也是封裝得足夠好的,因為幾個按鍵就搞定了所有的事情)。
4)多態性:多態性是指允許不同子類型的對象對同一訊息作出不同的響應。簡單的說就是用同樣的對象引用調用同樣的方法但是做了不同的事情。多態性分為編譯時間的多態性和運行時的多態性。如果將對象的方法視為對象向外界提供的服務,那麼運行時的多態性可以解釋為:當A系統訪問B系統提供的服務時,B系統有多種提供服務的方式,但一切對A系統來說都是透明的(就像電動剃鬚刀是A系統,它的供電系統是B系統,B系統可以使用電池供電或者用交流電,甚至還有可能是太陽能,A系統只會通過B類對象調用供電的方法,但並不知道供電系統的底層實現是什麼,究竟通過何種方式獲得了動力)。方法重載(overload)實現的是編譯時間的多態性(也稱為前綁定),而方法重寫(override)實現的是運行時的多態性(也稱為後綁定)。運行時的多態是物件導向最精髓的東西,要實現多態需要做兩件事:1. 方法重寫(子類繼承父類並重寫父類中已有的或抽象的方法);2. 對象造型(用父類型引用引用子類型對象,這樣同樣的引用調用同樣的方法就會根據子類對象的不同而表現出不同的行為)。
8、String 和StringBuilder、StringBuffer 的區別?
共同點:String StringBuffer StringBuilder 都是字串相關函數,StringBuffer StringBuilder都是AbstractStringBuilder的子類
不同點:
String內容不可變,StringBuffer StringBuilder內容可變
String與StringBuffer安全執行緒,StringBuilder非安全執行緒
如果程式不是多線程的,那麼使用StringBuilder效率高於StringBuffer
9、重載(Overload)和重寫(Override)的區別。重載的方法能否根據傳回型別進行區分?
方法的重載和重寫都是實現多態的方式,區別在於前者實現的是編譯時間的多態性,而後者實現的是運行時的多態性。重載發生在一個類中,同名的方法如果有不同的參數列表(參數類型不同、參數個數不同或者二者都不同)則視為重載;重寫發生在子類與父類之間,重寫要求子類被重寫方法與父類被重寫方法有相同的傳回型別,比父類被重寫方法更好訪問,不能比父類被重寫方法聲明更多的異常(裡氏代換原則)。重載對傳回型別沒有特殊的要求。
10、抽象類別(abstract class)和介面(interface)有什麼異同?
抽象類別和介面都不能夠執行個體化,但可以定義抽象類別和介面類型的引用。一個類如果繼承了某個抽象類別或者實現了某個介面都需要對其中的抽象方法全部進行實現,否則該類仍然需要被聲明為抽象類別。介面比抽象類別更加抽象,因為抽象類別中可以定義構造器,可以有抽象方法和具體方法,而介面中不能定義構造器而且其中的方法全部都是抽象方法。抽象類別中的成員可以是private、預設、protected、public的,而介面中的成員全都是public的。抽象類別中可以定義成員變數,而介面中定義的成員變數實際上都是常量。有抽象方法的類必須被聲明為抽象類別,而抽象類別未必要有抽象方法。
11、HashMap和HashTable有何不同?
HashMap通過hashcode對其內容進行快速尋找,而TreeMap中所有的元素都保持著某種固定的順序,如果你需要得到一個有序的結果你就應該使用TreeMap(HashMap中元素的排列順序是不固定的)。
集合架構”提供兩種常規的Map實現:HashMap和TreeMap (TreeMap實現SortedMap介面)。
在Map 中插入、刪除和定位元素,HashMap 是最好的選擇。但如果您要按自然順序或自訂順序遍曆鍵,那麼TreeMap會更好。使用HashMap要求添加的鍵類明確定義了hashCode()和 equals()的實現。
12、&操作符和&&操作符有什麼區別?
當一個&運算式在求值的時候,兩個運算元都會被求值,&&更像是一個操作符的捷徑。當一個&&運算式求值的時候,先計算第一個運算元,如果它返回true才會計算第二個運算元。如果第一個運算元取值為fale,第二個運算元就不會被求值。
android-------Java 常問的基礎面試題