Java 面試題

一、 對finalize認識:java

finalize—方法名。是gc操做的運行機制中得一部分,進行gc操做時會調用finalize方法。Java 技術容許使用 finalize() 方法在垃圾收集器將對象從內存中清除出去以前作必要的清理工做。這個方法是由垃圾收集器在肯定這個對象沒有被引用時對這個對象調用的。它是在 Object 類中定義的,所以全部的類都繼承了它。子類覆蓋 finalize() 方法以整理系統資源或者執行其餘清理工做,如實現流的關閉finalize() 方法是在垃圾收集器刪除對象以前對這個對象調用的。程序員

 

二、 &和&&的區別。算法

  

& 是兩個數相與,是運算符
&&是鏈接兩個條件表達式的,兩個條件表達式都爲真時,整個才爲真編程

 

三、 HashMap和Hashtable的區別。數組

 

HashMap不是線程安全的 
安全

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

 

     HashTable是線程安全的一個Collection函數

 

HashMapHashtable的輕量級實現(非線程安全的實現),他們都完成了Map接口,主要區別在於HashMap容許空(null)鍵值(key,因爲非線程安全,效率上可能高於Hashtable
HashMap容許將null做爲一個entrykey或者value,而Hashtable不容許。
HashMapHashtablecontains方法去掉了,改爲containsvaluecontainsKey。由於contains方法容易讓人引發誤解。 
Hashtable繼承自Dictionary類,而HashMapJava1.2引進的Map interface的一個實現。
最大的不一樣是,Hashtable的方法是Synchronize的,而HashMap不是,在多個線程訪問Hashtable時,不須要本身爲它的方法實現同步,而HashMap 就必須爲之提供外同步。 
HashtableHashMap採用的hash/rehash算法都大概同樣,因此性能不會有很大的差別。性能

 

 

4.Collection 和 Collections的區別。 
測試

Collection 和 Collections的區別。 

Collections是個java.util下的類,它包含有各類有關集合操做的靜態方法。 

 

Collection是個java.util下的接口,它是各類集合結構的父接口。

 值得注意的是: ListSetCollection的實現, Map不是

 

五、ArrayListVector的區別。

  簡而言之,從兩方面回答:

.同步性:Vector是線程安全的,也就是說是同步的,而ArrayList是線程序不安全的,不是同步的 

.數據增加:當須要增加時,Vector默認增加爲原來一培,而ArrayList倒是原來的一半 。

   但深刻的講:

1、從存儲數據的方式來看:

一、ArrayList是採用數組方式存儲數據,實現了可變大小的數組。

它容許全部元素,包括null。

其特色:

(1)ArrayList沒有同步。

(2)此數組元素數大於實際存儲的數據以便增長和插入元素,都容許直接序號索引元素,可是插入數據要設計到數組元素移動等內存操做,因此索引數據快插入數據慢。

 

二、Vector也是採用數組方式存儲數據,因爲使用了synchronized方法(線程安全)因此性能上比ArrayList要差。

其特色:

(1)Vector是同步的。

(2)由Vector建立的Iterator,當一個Iterator被建立並且正在被使用,另外一個線程改變了Vector的狀態(例如,添加或刪除了一些元素),這時調用Iterator的方法時將拋出ConcurrentModificationException,所以必須捕獲該異常。

2、從存取操做的效率來看

  在取數據操做中Arraylist最快。

  在存數據操做中 linklist最快。

  在刪除數據操做中linklist最快。

3、從應用的角度來看:
    若是須要快速隨機訪問元素,應該使用ArrayList。
  若是程序在單線程環境中,或者訪問僅僅在一個線程中進行,考慮非同步的類,其效率較高,若是多個線程可能同時操做一個類,應該使用同步的類。

6.GC是什麼? 爲何要有GC?

     GC是垃圾收集的意思(Gabage Collection),內存處理是編程人員容易出現問題的地方,忘記或者錯誤的內存回收會致使程序或系統的不穩定甚至崩潰,Java提供的GC功能能夠自動監測對象是否超過做用域從而達到自動回收內存的目的,Java語言沒有提供釋放已分配內存的顯示操做方法。

    目的就是將不用的資源釋放掉 。Gabage Collection(垃圾回收) 有了GC,程序員就不須要再手動的去控制內存的釋放。當Java虛擬機(VM)內存資源緊張的時候,就會自動地去清理無用對象(沒有被引用到的對象)所佔用的內存空間.若是須要,能夠在程序中顯式地使用System.gc() / System.GC.Collect()來強制進行一次當即的內存清理。

 

 

7.何時用assert。

   assertion(斷言)在軟件開發中是一種經常使用的調試方式,不少開發語言中都支持這種機制。在實現中,assertion就是在程序中的一條語句,它對一個boolean表達式進行檢查,一個正確程序必須保證這個boolean表達式的值爲true;若是該值爲false,說明程序已經處於不正確的狀態下,系統將給出警告或退出。通常來講,assertion用於保證程序最基本、關鍵的正確性。assertion檢查一般在開發和測試時開啓。爲了提升性能,在軟件發佈後,assertion檢查一般是關閉的。

  例如

#include <stdio.h>

#include <assert.h>

void main()

{ float a,b; scan("%f %f",&a,&b); assert(b!=0); printf("%f\n",a/b); }

以上的程序要計算A/B的值,所以要求b!=0,因此在程序中使用了assert()用於確保b!=0,若是b==0,則程序會退出。

 

 

8.short s1 = 1; s1 = s1 + 1;有什麼錯? short s1 = 1; s1 += 1;有什麼錯? (易錯題)

     是報錯爲可能損失精度嗎?呵呵,這個問題的緣由就是全部聲明爲short的類型變量在進行運算時都會自動轉爲int類型的變量,這樣s1+1就不是short型的,而變成int類型的,這時再賦給仍是short類型的s1就會報精度損失錯誤了,這樣改下就不會報錯了

s1=(short)(s1+1),試試看!

 

 

9.sleep() 和 wait() 有什麼區別?

   sleep是線程類(Thread)的方法,致使此線程暫停執行指定時間,給執行機會給其餘線程,可是監控狀態依然保持,到時後會自動恢復。調用sleep不會釋放對象鎖。waitObject類的方法,對此對象調用wait方法致使本線程放棄對象鎖,進入等待此對象的等待鎖定池,只有針對此對象發出notify方法(或notifyAll)後本線程才進入對象鎖定池準備得到對象鎖進入運行狀態。

 

 

10、數組有沒有length()這個方法? String有沒有length()這個方法?
    數組沒有length()這個方法,有length的屬性。String有有length()這個方法。

 

十一、 Set裏的元素是不能重複的,那麼用什麼方法來區分重複與否呢? 是用==仍是equals()? 它們有何區別?
   1、什麼是Set?(what)

     SetCollection容器的一個子接口,它不容許出現重複元素,固然也只容許有一個null對象。

   2、如何來區分重複與否呢?(how)

       JPI中寫的很明白:「set 不包含知足e1.equals(e2) 的元素對 e1 和 e2 」,因而可知回答使用equals()區分更合適。

   3、爲何用equals()而不用==來區分?(why)

     應該從它倆的區別談起,==是用來判斷二者是不是同一對象(同一事物),而equals是用來判斷是否引用同一個對象。再看一下Set裏面存的是對象,仍是對象的引用。根據java的存儲機制可知,set裏面存放的是對象的引用,因此當兩個元素只要知足了equals()時就已經指向同一個對象,

也就出現了重複元素。因此應該用equals()來判斷。

 

12.error和exception有什麼區別?

    Error(錯誤)表示系統級的錯誤和程序沒必要處理的異常,是java運行環境中的內部錯誤或者硬件問題,好比,內存資源不足等,對於這種錯誤,程序基本無能爲力,除了退出運行外別無選擇。
    Exception(違例)表示須要捕捉或者須要程序進行處理的異常,它處理的是由於程序設計的瑕疵而引發的問題或者在外的輸入等引發的通常性問題,是程序必須處理的。

 

 

1三、 接口是否可繼承接口? 抽象類是否可實現(implements)接口? 抽象類是否可繼承實體類(concrete class)?

  

接口能夠繼承接口。

抽象類能夠實現(implements)接口。

抽象類是否可繼承實體類,但前提是實體類必須有明確的構造函數。

 1.接口能夠繼承接口..可是要使用extends~而不是用implements

如:interface a{}

interface b extends a{}

 2.抽象類能夠實現接口..

好比java.util中的AbstractCollection類就是實現的Collection接口

 

1四、 構造器Constructor(構造函數)是否可被override?
    構造器不是方法,那麼用來修飾方法特性的全部修飾符都不能用來修飾構造器(並不等於構造器不具有這些特性,雖然不能用static修飾構造器,但它卻有靜態特性)構造器只能用 public private protected這三個權限修飾符,且不能有返回語句。

      1). 構造器不能是native,final,static,synchronized 的,能夠是public,private,protected或什麼都沒有。    2). 構造器函數裏能夠寫return呢,但後面什麼都不準有(包括null)    3). 構造器不能返回值.      但若是有個"構造器"返值了,它就不是構造器嘍,只是個普通方法    4). super();this();這兩個方法只能在構造方法裏調用.    5). 成員變量聲明時候賦值,比構造函數還早.

相關文章
相關標籤/搜索