關注finddreams博客:[http://blog.csdn.net/finddreams/article/details/44403041](http://blog.csdn.net/finddreams/article/details/44403041)
因為Androd使用Java語言來編程的,所以我們做Android開發全面的掌握Java基礎是必須的。在面試的過程中,我們發現很多公司發的筆試題有很多知識點都是Java的,搞安卓久了,Java基礎的一些知識點也都快忘了,今天就讓我們來一起復習一些Java基礎,希望能在面試中用到;
**1、Overload和Override的區別。Overloaded的方法是否可以改變返回值的類型?**
方法的重寫Overriding和重載Overloading是Java多態性的不同表現。重寫Overriding是父類與子類之間多態性的一種表現,重載Overloading是一個類中多態性的一種表現。如果在子類中定義某方法與其父類有相同的名稱和參數,我們說該方法被重寫 (Overriding)。子類的對象使用這個方法時,將調用子類中的定義,對它而言,父類中的定義如同被”屏蔽”了。如果在一個類中定義了多個同名的方法,它們或有不同的參數個數或有不同的參數類型,則稱為方法的重載(Overloading)。Overloaded的方法是可以改變返回值的類型。
**2、String和StringBuffer,StringBuilder的區別**
String 字符串常量
StringBuffer 字符串變量(線程安全)
StringBuilder 字符串變量(非線程安全)
String的長度是不可變的,StringBuffer,StringBuilder的長度是可變的。如果你對字符串中的內容經常進行操作,特別是內容要修改時,那么使用StringBuffer,如果最后需要String,那么使用StringBuffer的toString()方法。
**3、說出ArrayList,Vector, LinkedList的存儲性能和特性**
ArrayList和Vector都是使用數組方式存儲數據,此數組元素數大于實際存儲的數據以便增加和插入元素,它們都允許直接按序號索引元素,但是插入元素要涉及數組元素移動等內存操作,所以索引數據快而插入數據慢,Vector由于使用了synchronized方法(線程安全),通常性能上較ArrayList差,而LinkedList使用雙向鏈表實現存儲,按序號索引數據需要進行前向或后向遍歷,但是插入數據時只需要記錄本項的前后項即可,所以插入速度較快。
**4.字符串“abcde”通過寫一個函數不讓調用第三方的字符串,實現一個字符串倒序,比如字符串“abcde”變成“edcba”**
String src = “abcde”;
String dst = new StringBuffer(src).reverse().toString();
**5、Collection 和 Collections的區別。**
Collection是集合類的上級接口,繼承與他的接口主要有Set 和List.
Collections是針對集合類的一個幫助類,他提供一系列靜態方法實現對各種集合的搜索、排序、線程安全化等操作
**6、final, finally, finalize的區別。**
final 用于聲明屬性,方法和類,分別表示屬性不可變,方法不可覆蓋,類不可繼承。
finally是異常處理語句結構的一部分,表示總是執行。
finalize是Object類的一個方法,在垃圾收集器執行的時候會調用被回收對象的此方法,可以覆蓋此方法提供垃圾收集時的其他資源回收,例如關閉文件等。
**7、sleep() 和 wait() 有什么區別?**
1.這兩個方法來自不同的類分別是,sleep來自Thread類,和wait來自Object類。
2.最主要是sleep方法沒有釋放鎖,而wait方法釋放了鎖,使得其他線程可以使用同步控制塊或者方法。sleep不出讓系統資源;wait是進入線程等待池等待,出讓系統資源,其他線程可以占用CPU。一般wait不會加時間限制,因為如果wait線程的運行資源不夠,再出來也沒用,要等待其他線程調用notify/notifyAll喚醒等待池中的所有線程,才會進入就緒隊列等待OS分配系統資源。sleep(milliseconds)可以用時間指定使它自動喚醒過來,如果時間不到只能調用interrupt()強行打斷。
3.wait,notify和notifyAll只能在同步控制方法或者同步控制塊里面使用,而sleep可以在任何地方使用
4. Sleep需要捕獲異常,而wait不需要
**8、同步和異步有何異同,在什么情況下分別使用他們?舉例說明。**
如果數據將在線程間共享。例如正在寫的數據以后可能被另一個線程讀到,或者正在讀的數據可能已經被另一個線程寫過了,那么這些數據就是共享數據,必須進行同步存取。
當應用程序在對象上調用了一個需要花費很長時間來執行的方法,并且不希望讓程序等待方法的返回時,就應該使用異步編程,在很多情況下采用異步途徑往往更有效率。
**9,抽象類與接口的區別(abstract與interface的區別)**
abstract可以修飾抽象方法,而一個類只要有一個抽象方法,就必須用abstract定義該類,即抽象類。
用interface修飾的類,里面的方法都是抽象方法,因此在定義接口的時候,可以直接不加那些修飾,系統會默認的添上去。接口里面的字段都是公有常量,即public static final修飾的字段。
**10、線程中wait,join,sleep,yield, notify,notifyall,synchronized,區別及聯系**
1).sleep()方法
在指定時間內讓當前正在執行的線程暫停執行,但不會釋放“鎖標志”。不推薦使用。sleep()使當前線程進入阻塞狀態,在指定時間內不會執行。
2).wait()方法
在其他線程調用對象的notify或notifyAll方法前,導致當前線程等待。線程會釋放掉它所占有的“鎖標志”,從而使別的線程有機會搶占該鎖。
喚醒當前對象鎖的等待線程使用notify或notifyAll方法,waite() 和notify()必須在synchronized函數或synchronized block中進行調用。
yield方法暫停當前正在執行的線程對象。yield()只是使當前線程重新回到可執行狀態,所以執行
3)yield()的線程有可能在進入到可執行狀態后馬上又被執行。yield()只能使同優先級或更高優先級的線程有執行的機會。
4).join方法
等待該線程終止。等待調用join方法的線程結束,再繼續執行。如:t.join();//主要用于等待t線程運行結束,若無此句,main則會執行完畢,導致結果不可預測。
**11、接口是否可繼承接口? 抽象類是否可實現(implements)接口? 抽象類是否可繼承實體類(concrete class)?**
接口可以繼承接口。抽象類可以實現(implements)接口,抽象類是否可繼承實體類,但前提是實體類必須有明確的構造函數。
**12、abstract的method是否可同時是static,是否可同時是native,是否可同時是synchronized?**
**13、是否可以繼承String類?**
String類是final類故不可以繼承。
**14、java switch支持的數據類型:**
java支持的數據類型有五種
他們分別是:
byte、char、short、int、枚舉
以上是JDK1.6以前的版本。JDK1.7時,又增加了String,所以相對于JDK1.7而言就是六種了
**15、什么是單例模式,請寫出一個來:**
Singleton模式主要作用是保證在Java應用程序中,一個類Class只有一個實例存在。
一般Singleton模式通常有幾種種形式:
第一種形式: 定義一個類,它的構造函數為private的,它有一個static的private的該類變量,在類初始化時實例話,通過一個public的getInstance方法獲取對它的引用,繼而調用其中的方法。
~~~
public class Singleton {
private Singleton(){}
//注意這是private 只供內部調用
private static Singleton instance = new Singleton();
//這里提供了一個供外部訪問本class的靜態方法,可以直接訪問
public static Singleton getInstance() {
return instance;
}
}
~~~
~~~
第二種形式:
~~~
~~~
public class Singleton {
private static Singleton instance = null;
public static synchronized Singleton getInstance() {
//這個方法比上面有所改進,不用每次都進行生成對象,只是第一次
//使用時生成實例,提高了效率!
if (instance==null)
instance=new Singleton();
return instance; }
}
~~~
其他形式:
定義一個類,它的構造函數為private的,所有方法為static的。
一般認為第一種形式要更加安全些
**16、Java常用的設計模式?說明工廠模式。**
Java中的23種設計模式:
Factory(工廠模式), Builder(建造模式), Factory Method(工廠方法模式),
Prototype(原始模型模式),Singleton(單例模式), Facade(門面模式),
Adapter(適配器模式), Bridge(橋梁模式), Composite(合成模式),
Decorator(裝飾模式), Flyweight(享元模式), Proxy(代理模式),
Command(命令模式), Interpreter(解釋器模式), Visitor(訪問者模式),
Iterator(迭代子模式), Mediator(調停者模式), Memento(備忘錄模式),
Observer(觀察者模式), State(狀態模式), Strategy(策略模式),
Template Method(模板方法模式), Chain Of Responsibleity(責任鏈模式)
工廠模式:工廠模式是一種經常被使用到的模式,根據工廠模式實現的類可以根據提供的數據生成一組類中某一個類的實例,
通常這一組類有一個公共的抽象父類并且實現了相同的方法,但是這些方法針對不同的數據進行了不同的操作。
首先需要定義一個基類,該類的子類通過不同的方法實現了基類中的方法。然后需要定義一個工廠類,工廠類可以根據條件
生成不同的子類實例。當得到子類的實例后,開發人員可以調用基類中的方法而不必考慮到底返回的是哪一個子類的實例。