java面試寶典有點難度

1:string, stringbuffer stringbuilder的區別, string 不可修改的底層原因
string 長度不可改變
stringbuffer 線程安全情況下的長度改變
stringbuilder 非線程安全情況下的長度改變,單線程有限考慮

底層原因:string不但類本身被定義爲final類,而去其中的屬性跟方法都被定義爲final,所以其長度固定。

2:list, set, map區別
List,Set,Map將持有對象一律視爲Object類別。
Collection、List、Set、Map都是接口,不能實例化。
繼承自它們的 ArrayList, Vector, HashTable, HashMap是具象class,這些纔可被實例化。
vector容器確切知道它所持有的對象隸屬什麼型別。vector不進行邊界檢查。

Collection
├List
│├LinkedList
│├ArrayList
│└Vector
│ └Stack
└Set
Map
├Hashtable
├HashMap
└WeakHashMap
Collection接口:是最基本的集合接口,其中的一些允許元素相同一些不允許相同,一些能排序而一些不能排序,JAVA SDK不允許直接繼承collection接口,但是允許繼承他們的子接口list跟set。
 如何遍歷Collection中的每一個元素?不論Collection的實際類型如何,它都支持一個iterator()的方法,該方法返回一個迭代子,使用該迭代子即可逐一訪問Collection中每一個元素。典型的用法如下:
    Iterator it = collection.iterator(); // 獲得一個迭代子
    while(it.hasNext()) {
      Object obj = it.next(); // 得到下一個元素
    }
list接口是有序的Collection,使用此接口能夠精確的控制插入元素,同時用戶也可以使用索引進行訪問。這類似於array。但是跟SET不同,list允許有相同的元素。

linklist實現list接口,允許null元素,並且多了很多額外的方add(),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,因此必須捕獲該異常。

set接口,不允許有重複元素的collection,很明顯,Set的構造函數有一個約束條件,傳入的Collection參數不能包含重複的元素。
  請注意:必須小心操作可變對象(Mutable Object)。如果一個Set中的可變元素改變了自身狀態導致Object.equals(Object)=true將導致一些問題。

MAP接口,Map沒有繼承Collection接口,Map提供key到value的映射。個Map中不能包含相同的key,每個key只能映射一個 value。Map接口提供3種集合的視圖,Map的內容可以被當作一組key集合,一組value集合,或者一組key-value映射。

3:ArrayList,Vector和LinkedList的存儲性能和特性
ayyaylist跟vectior都是使用數組方式存儲數據的,次數組元素大於實際的數據元素便於添加元素,它們都允許直接按序號索引元素,但是插入元素要涉及數組元素移動等內存操作,所以索引數據快而插入數據慢,由於vector是現成安全的所以速度上要較arraylist慢,LinkedList使用雙向鏈表實現存儲,按序號索引數據需要進行前向或後向遍歷,但是插入數據時只需要記錄本項的前後項即可,所以插入速度較快
4:Conncurrent的包理解。

5:java抽象類(abstract)和接口(interface)的本質區別
抽象類中可以有自己的構造函數,都是接口沒有,
抽象類中可以有普通成員變量,但是接口沒有,只有靜態的不可改變的變量
抽象類中可以定義普通方法,但是接口中只能定義抽象方法
抽象類中可以包含靜態方法,但是接口中不可以
一個是多繼承,另一個事單繼承
6 Java中的類變量、成員變量、實例變量、局部變量、靜態變量、全局變量
一個類中大概有2部分組成,一個是屬性,一個是方法
在變量定義部分定義的變量叫累的成員變量,成員變量在整個類中有效,(全局變量應該是成員變量的俗稱)在方法體中定義的變量叫做局部變量,局部變量只在定義它的方法中有效.

成員變量又分爲
實例變量

類變量(static靜態變量).

class One
{
float x; //x爲實例變量
static int y; //只要有關鍵字static, y爲類變量
}
總的概括就是:在變量定義位置定義的變量爲類的成員變量,成員變量又分爲2類,一類值類變量,(static的靜態變量),一類是實例變量。
Comparable與Comparator區別:
這2個都是用來實現集合中的排序的的,comparable只是集合內壁的排序,comparator是集合外部的排序需要在外部實現其接口
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章