2015筆試面試經驗——java基礎

1. 九種基本數據類型的大小,以及他們的封裝類。html

2. Switch可否用string作參數?前端

答案:在Java語言中Swith可使用參數類型有:Only convertible int values, strings or enum variables are permittedjava

   能夠自動轉換爲整型的(byte,short,int),String類型,枚舉類型。python

   Java中不能作爲Switch參數的有boolean,float,double,long(不能直接轉換爲int啊)。android

3. equals與==的區別。ios

  http://www.cnblogs.com/zhxhdean/archive/2011/03/25/1995431.htmlweb

  http://www.cnblogs.com/zhxhdean/archive/2011/03/26/1996468.html面試

4. Object有哪些公用方法?算法

clone、equals、finalize、getClass、hashCode、notify、notifyAll、toString、wait。segmentfault

5. Java的四種引用,強弱軟虛,用到的場景。

強引用:強引用不會被GC回收,而且在java.lang.ref裏也沒有實際的對應類型,平時工做接觸的最多的就是強引用。
    Object obj = new Object();這裏的obj引用即是一個強引用。若是一個對象具備強引用,那就相似於必不可少的生活用品,垃圾回收器毫不會回收它。  當內存空 間不足,Java虛擬機寧願拋出OutOfMemoryError錯誤,使程序異常終止,也不會靠隨意回收具備強引用的對象來解決內存不足問題。

軟引用:若是一個對象只具備軟引用,那就相似於可有可物的生活用品。若是內存空間足夠,垃圾回收器就不會回收它,若是內存空間不足了,就會回收這些對象的內存。只 要垃圾回收器沒有回收它,該對象就能夠被程序使用。軟引用可用來實現內存敏感的高速緩存。 軟引用能夠和一個引用隊列(ReferenceQueue)聯合使用,若是軟引用所引用的對象被垃圾回收,Java虛擬機就會把這個軟引用加入到與之關聯的引用隊列中。

弱引用:

弱引用(weak reference)在強度上弱於軟引用,經過類WeakReference來表示。它的做用是引用一個對象,可是並不阻止該對象被回收。若是使用一個強引用的話,只要該引用存在,那麼被引用的對象是不能被回收的。弱引用則沒有這個問題。在垃圾回收器運行的時候,若是一個對象的全部引用都是弱引用的話,該對象會被回收。弱引用的做用在於解決強引用所帶來的對象之間在存活時間上的耦合關係。弱引用最多見的用處是在集合類中,尤爲在哈希表中。哈希表的接口容許使用任何Java對象做爲鍵來使用。當一個鍵值對被放入到哈希表中以後,哈希表對象自己就有了對這些鍵和值對象的引用。若是這種引用是強引用的話,那麼只要哈希表對象自己還存活,其中所包含的鍵和值對象是不會被回收的。若是某個存活時間很長的哈希表中包含的鍵值對不少,最終就有可能消耗掉JVM中所有的內存。

對於這種狀況的解決辦法就是使用弱引用來引用這些對象,這樣哈希表中的鍵和值對象都能被垃圾回收。Java中提供了WeakHashMap來知足這一常見需求。

虛引用:

在介紹幽靈引用以前,要先介紹Java提供的對象終止化機制(finalization)。在Object類裏面有個finalize方法,其設計的初衷是在一個對象被真正回收以前,能夠用來執行一些清理的工做。由於Java並無提供相似C++的析構函數同樣的機制,就經過 finalize方法來實現。可是問題在於垃圾回收器的運行時間是不固定的,因此這些清理工做的實際運行時間也是不能預知的。幽靈引用(phantom reference)能夠解決這個問題。在建立幽靈引用PhantomReference的時候必需要指定一個引用隊列。當一個對象的finalize方法已經被調用了以後,這個對象的幽靈引用會被加入到隊列中。經過檢查該隊列裏面的內容就知道一個對象是否是已經準備要被回收了。

幽靈引用及其隊列的使用狀況並很少見,主要用來實現比較精細的內存使用控制,這對於移動設備來講是頗有意義的。程序能夠在肯定一個對象要被回收以後,再申請內存建立新的對象。經過這種方式可使得程序所消耗的內存維持在一個相對較低的數量。

6. Hashcode的做用。

快速定位。

7. ArrayList、LinkedList、Vector的區別。

LinkedList類
  LinkedList實現了List接口,容許null元素。此外LinkedList提供額外的get,remove,insert方法在LinkedList的首部或尾部。這些操做使LinkedList可被用做堆棧(stack),隊列(queue)或雙向隊列(deque)。
  注意LinkedList沒有同步方法。若是多個線程同時訪問一個List,則必須本身實現訪問同步。一種解決方法是在建立List時構造一個同步的List:
    List list = Collections.synchronizedList(new LinkedList(...));

ArrayList類
  ArrayList實現了可變大小的數組。它容許全部元素,包括null。ArrayList沒有同步。
size,isEmpty,get,set方法運行時間爲常數。可是add方法開銷爲分攤的常數,添加n個元素須要O(n)的時間。其餘的方法運行時間爲線性。
  每一個ArrayList實例都有一個容量(Capacity),即用於存儲元素的數組的大小。這個容量可隨着不斷添加新元素而自動增長,可是增加算法並無定義。當須要插入大量元素時,在插入前能夠調用ensureCapacity方法來增長ArrayList的容量以提升插入效率。
  和LinkedList同樣,ArrayList也是非同步的(unsynchronized)。

Vector
  Vector很是相似ArrayList,可是Vector是同步的。由Vector建立的Iterator,雖然和ArrayList建立的Iterator是同一接口,可是,由於Vector是同步的,當一個Iterator被建立並且正在被使用,另外一個線程改變了Vector的狀態(例如,添加或刪除了一些元素),這時調用Iterator的方法時將拋出ConcurrentModificationException,所以必須捕獲該異常。

8. String、StringBuffer與StringBuilder的區別。

String 字符串常量
StringBuffer 字符串變量(線程安全)
StringBuilder 字符串變量(非線程安全)

簡要的說, String 類型和 StringBuffer 類型的主要性能區別其實在於 String 是不可變的對象, 所以在每次對 String 類型進行改變的時候其實都等同於生成了一個新的 String 對象,而後將指針指向新的 String 對象,因此常常改變內容的字符串最好不要用 String ,由於每次生成對象都會對系統性能產生影響,特別當內存中無引用對象多了之後, JVM 的 GC 就會開始工做,那速度是必定會至關慢的。
 而若是是使用 StringBuffer 類則結果就不同了,每次結果都會對 StringBuffer 對象自己進行操做,而不是生成新的對象,再改變對象引用。因此在通常狀況下咱們推薦使用 StringBuffer ,特別是字符串對象常常改變的狀況下。而在某些特別狀況下, String 對象的字符串拼接實際上是被 JVM 解釋成了 StringBuffer 對象的拼接,因此這些時候 String 對象的速度並不會比 StringBuffer 對象慢。

java.lang.StringBuilder一個可變的字符序列是5.0新增的。此類提供一個與 StringBuffer 兼容的 API,但不保證同步。該類被設計用做 StringBuffer 的一個簡易替換,用在字符串緩衝區被單個線程使用的時候(這種狀況很廣泛)。若是可能,建議優先採用該類,由於在大多數實現中,它比 StringBuffer 要快。二者的方法基本相同。

9. Map、Set、List、Queue、Stack的特色與用法。

10. HashMap和HashTable的區別。

  1 HashMap不是線程安全的

            hastmap是一個接口 是map接口的子接口,是將鍵映射到值的對象,其中鍵和值都是對象,而且不能包含重複鍵,但能夠包含重複值。HashMap容許null key和null value,而hashtable不容許。

  2   HashTable是線程安全的一個Collection。

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 就必須爲之提供外同步。 
Hashtable和HashMap採用的hash/rehash算法都大概同樣,因此性能不會有很大的差別。

11. HashMap和ConcurrentHashMap的區別,HashMap的底層源碼。

  HashMap是容許插入key和value是null的數據的,而ConcurrentHashMap是不容許key和value是null的。

12. TreeMap、HashMap、LindedHashMap的區別。

13. Collection包結構,與Collections的區別。

  Collection是集合類的上級接口,子接口主要有Set 和List、Map。 

  Collections是針對集合類的一個幫助類,提供了操做集合的工具方法:一系列靜態方法實現對各類集合的搜索、排序、線程安全化等操做。

14. try catch finally,try裏有return,finally還執行麼?

  會執行。

15. Excption與Error包結構。OOM你遇到過哪些狀況,SOF你遇到過哪些狀況。

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

  面向對象的三個基本特徵是:封裝、繼承、多態。 

17. Override和Overload的含義去區別。

方法的重寫(Overriding)和重載(Overloading)是Java多態性的不一樣表現。 重寫(Overriding)是父類與子類之間多態性的一種表現,而重載(Overloading)是一個類中多態性的一種表現。
若是在子類中定義某方法與其父類有相同的名稱和參數,咱們說該方法被重寫 (Overriding)。子類的對象使用這個方法時,將調用子類中的定義,對它而言,父類中的定義如同被"屏蔽"了。
若是在一個類中定義了多個同名的方法,它們或有不一樣的參數個數或有不一樣的參數類型或有不一樣的參數次序,則稱爲方法的重載(Overloading)。不能經過訪問權限、返回類型、拋出的異常進行重載.

18. Interface與abstract類的區別。

參數 抽象類 接口
默認的方法實現 它能夠有默認的方法實現 接口徹底是抽象的。它根本不存在方法的實現
實現 子類使用extends關鍵字來繼承抽象類。若是子類不是抽象類的話,它須要提供抽象類中全部聲明的方法的實現。 子類使用關鍵字implements來實現接口。它須要提供接口中全部聲明的方法的實現
構造器 抽象類能夠有構造器 接口不能有構造器
與正常Java類的區別 除了你不能實例化抽象類以外,它和普通Java類沒有任何區別 接口是徹底不一樣的類型
訪問修飾符 抽象方法能夠有publicprotecteddefault這些修飾符 接口方法默認修飾符是public。你不可使用其它修飾符。
main方法 抽象方法能夠有main方法而且咱們能夠運行它 接口沒有main方法,所以咱們不能運行它。
多繼承 抽象方法能夠繼承一個類和實現多個接口 接口只能夠繼承一個或多個其它接口
速度 它比接口速度要快 接口是稍微有點慢的,由於它須要時間去尋找在類中實現的方法。
添加新方法 若是你往抽象類中添加新的方法,你能夠給它提供默認的實現。所以你不須要改變你如今的代碼。 若是你往接口中添加方法,那麼你必須改變實現該接口的類。

19. Static class 與non static class的區別。

http://blog.csdn.net/zhandoushi1982/article/details/8453522

20. java多態的實現原理。

21. 實現多線程的兩種方法:Thread與Runable。

http://blog.csdn.net/touch_2011/article/details/6891026

22. 線程同步的方法:sychronized、lock、reentrantLock等。

23. 鎖的等級:方法鎖、對象鎖、類鎖。

24. 寫出生產者消費者模式。

25. ThreadLocal的設計理念與做用。

26. ThreadPool用法與優點。

27. Concurrent包裏的其餘東西:ArrayBlockingQueue、CountDownLatch等等。

28. wait()和sleep()的區別。

http://www.cnblogs.com/DreamSea/archive/2012/01/16/SleepAndWaitDifferent.html

29. foreach與正常for循環效率對比。

 

 

 

垃圾回收機制

http://www.cnblogs.com/laoyangHJ/articles/java_gc.html

30. Java IO與NIO。

http://segmentfault.com/q/1010000000314712

31. 反射的做用於原理。

http://www.cnblogs.com/chenliang901114/archive/2013/04/23/javalearner.html

32. 泛型經常使用特色,List<String>可否轉爲List<Object>。

http://www.zhihu.com/question/19822505

33. 解析XML的幾種方式的原理與特色:DOM、SAX、PULL。

34. Java與C++對比。

http://www.weixueyuan.net/view/5944.html

35. Java1.7與1.8新特性。

36. 設計模式:單例、工廠、適配器、責任鏈、觀察者等等。

37. JNI的使用。


Java抽象類與接口的區別

不少常見的面試題都會出諸如抽象類和接口有什麼區別,什麼狀況下會使用抽象類和什麼狀況你會使用接口這樣的問題。本文咱們將仔細討論這些話題。

在討論它們之間的不一樣點以前,咱們先看看抽象類、接口各自的特性。

抽象類

抽象類是用來捕捉子類的通用特性的 。它不能被實例化,只能被用做子類的超類。抽象類是被用來建立繼承層級裏子類的模板。以JDK中的GenericServlet爲例:

1
2
3
4
5
6
7
8
9
public abstract class GenericServlet implements Servlet, ServletConfig, Serializable {
     // abstract method
     abstract void service(ServletRequest req, ServletResponse res);
 
     void init() {
         // Its implementation
     }
     // other method related to Servlet
}

HttpServlet類繼承GenericServlet時,它提供了service方法的實現:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class HttpServlet extends GenericServlet {
     void service(ServletRequest req, ServletResponse res) {
         // implementation
     }
 
     protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
         // Implementation
     }
 
     protected void doPost(HttpServletRequest req, HttpServletResponse resp) {
         // Implementation
     }
 
     // some other methods related to HttpServlet
}

接口

接口是抽象方法的集合。若是一個類實現了某個接口,那麼它就繼承了這個接口的抽象方法。這就像契約模式,若是實現了這個接口,那麼就必須確保使用這些方法。接口只是一種形式,接口自身不能作任何事情。以Externalizable接口爲例

1
2
3
4
5
6
public interface Externalizable extends Serializable {
 
     void writeExternal(ObjectOutput out) throws IOException;
 
     void readExternal(ObjectInput in) throws IOException, ClassNotFoundException;
}

當你實現這個接口時,你就須要實現上面的兩個方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class Employee implements Externalizable {
 
     int employeeId;
     String employeeName;
 
     @Override
     public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
         employeeId = in.readInt();
         employeeName = (String) in.readObject();
 
     }
 
     @Override
     public void writeExternal(ObjectOutput out) throws IOException {
 
         out.writeInt(employeeId);
         out.writeObject(employeeName);
     }
}

抽象類和接口的對比

參數 抽象類 接口
默認的方法實現 它能夠有默認的方法實現 接口徹底是抽象的。它根本不存在方法的實現
實現 子類使用extends關鍵字來繼承抽象類。若是子類不是抽象類的話,它須要提供抽象類中全部聲明的方法的實現。 子類使用關鍵字implements來實現接口。它須要提供接口中全部聲明的方法的實現
構造器 抽象類能夠有構造器 接口不能有構造器
與正常Java類的區別 除了你不能實例化抽象類以外,它和普通Java類沒有任何區別 接口是徹底不一樣的類型
訪問修飾符 抽象方法能夠有publicprotecteddefault這些修飾符 接口方法默認修飾符是public。你不可使用其它修飾符。
main方法 抽象方法能夠有main方法而且咱們能夠運行它 接口沒有main方法,所以咱們不能運行它。
多繼承 抽象方法能夠繼承一個類和實現多個接口 接口只能夠繼承一個或多個其它接口
速度 它比接口速度要快 接口是稍微有點慢的,由於它須要時間去尋找在類中實現的方法。
添加新方法 若是你往抽象類中添加新的方法,你能夠給它提供默認的實現。所以你不須要改變你如今的代碼。 若是你往接口中添加方法,那麼你必須改變實現該接口的類。
相關文章
相關標籤/搜索