面試-java基礎

  1. List 和 Set 的區別
 
1.1    list是有序集合(容器)且元素能夠重複,輸出順序就是插入順序;Set是無序集合且元素不能夠重複。
1.2    list能夠存放多個null;set只能夠存一個null
1.3     經常使用list有ArrayList,LinkedList,vector;
  •      ArrayList
  • 優勢:ArrayList是實現了基於動態數組的數據結構,由於地址連續,一旦數據存儲好了,查詢操做效率會比較高(在內存裏是連着放的)。
  • 缺點:由於地址連續, ArrayList要移動數據,因此插入和刪除操做效率比較低。
  • LinkedList
  • 優勢:LinkedList基於鏈表的數據結構,地址是任意的,因此在開闢內存空間的時候不須要等一個連續的地址,對於新增和刪除操做add和remove,LinedList比較佔優點LinkedList 適用於要頭尾操做或插入指定位置的場景
  • 缺點:由於LinkedList要移動指針,因此查詢操做性能比較低。
  • 適用場景分析:
  •  當須要對數據進行對此訪問的狀況下選用ArrayList,當須要對數據進行屢次增長刪除修改時採用LinkedList。
  • vector
  • ArrayList和Vector都是用數組實現的,主要有這麼三個區別:
 
  • 1.Vector是多線程安全的,線程安全就是說多線程訪問同一代碼,不會產生不肯定的結果。而ArrayList不是,這個能夠從源碼中看出,Vector類中的方法不少有synchronized進行修飾,這樣就致使了Vector在效率上沒法與ArrayList相比;
  • 2.兩個都是採用的線性連續空間存儲元素,可是當空間不足的時候,兩個類的增長方式是不一樣。
  • 3.Vector能夠設置增加因子,而ArrayList不能夠。
  • 4.Vector是一種老的動態數組,是線程同步的,效率很低,通常不同意使用。
 
  •     經常使用的set有HashSet,LinkedSet,Treeset,[簡單介紹]
  • HashSet
  • .HashSe哈希表實現的,HashSet中的數據是無序的,能夠放入null,但只能放入一個null,二者中的值都不能重複,就如數據庫中惟一約束 
  • HashSet要求放入的對象必須實現HashCode()方法,放入的對象,是以hashcode碼做爲標識的,而具備相同內容的String對象,hashcode是同樣,因此放入的內容不能重複。可是同一個類的對象能夠放入不一樣的實例
  • 適用場景分析:HashSet是基於Hash算法實現的,其性能一般都優於TreeSet。爲快速查找而設計的Set,咱們一般都應該使用HashSet,在咱們須要排序的功能時,咱們才使用TreeSet。
  • LinkedSet
 
  • Treeset
  • TreeSet 二差樹(紅黑樹的樹據結構)實現的,Treeset中的數據是自動排好序的,不容許放入null值 
1.4    [應用場景]
    1.若是你常常會使用索引來對容器中的元素進行訪問,那麼 List 是你的正確的選擇。若是你已經知道索引了的話,那麼 List 的實現類好比 ArrayList 能夠提供更快速的訪問,若是常常添加刪除元素的,那麼確定要選擇LinkedList。
    2.若是你想容器中的元素可以按照它們插入的次序進行有序存儲,那麼仍是 List,由於 List 是一個有序容器,它按照插入順序進行存儲。
    3.若是你想保證插入元素的惟一性,也就是你不想有重複值的出現,那麼能夠選擇一個 Set 的實現類,好比 HashSet、LinkedHashSet 或者 TreeSet。全部 Set 的實現類都遵循了統一約束好比惟一性,並且還提供了額外的特性好比 TreeSet 仍是一個 SortedSet,全部存儲於 TreeSet 中的元素可使用 Java 裏的 Comparator 或者 Comparable 進行排序。LinkedHashSet 也按照元素的插入順序對它們進行存儲。
    4.若是你以鍵和值的形式進行數據存儲那麼 Map 是你正確的選擇。你能夠根據你的後續須要從 Hashtable、HashMap、TreeMap 中進行選擇。
    
    
 
注意:
LinkedList、ArrayList、HashSet是非線程安全的,Vector是線程安全的;
HashMap是非線程安全的,HashTable是線程安全的;
StringBuilder是非線程安全的,StringBuffer是線程安全的。
 
擴展:
HashMap 非線程安全  
HashMap:基於哈希表實現。使用HashMap要求添加的鍵類明肯定義了hashCode()和equals()[能夠重寫hashCode()和equals()],爲了優化HashMap空間的使用,您能夠調優初始容量和負載因子。 
 
TreeMap:非線程安全基於紅黑樹實現。TreeMap沒有調優選項,由於該樹總處於平衡狀態。 
 
適用場景分析:
HashMap和HashTable:HashMap去掉了HashTable的contains方法,可是加上了containsValue()和containsKey()方法。HashTable同步的,而HashMap是非同步的,效率上比HashTable要高。HashMap容許空鍵值,而HashTable不容許。
HashMap:適用於Map中插入、刪除和定位元素。 
Treemap:適用於按天然順序或自定義順序遍歷鍵(key)。 
 
 
 
  1. HashSet 是如何保證不重複的 

1.hashset是基於哈希表實現的,先要根據hash碼值(就是key的hashcode值)去判斷,而後在用equals判斷,都相等爲已有元素,不在存儲。不然做爲新元素存存儲。html

  
  三、HashMap 是線程安全的嗎,爲何不是線程安全的(最好畫圖說明多線程環境下不安全)? 
1.不是線程安全的,因爲hash碰撞,以及擴容致使
  **經過Entry內部的next變量能夠知道使用的是鏈表,這時候咱們能夠知道,若是多個線程,在某一時刻同時操做HashMap並執行put操做,而有大於兩個key的hash值相同,
如圖中a一、a2,這個時候須要解決碰撞衝突,而解決衝突的辦法上面已經說過,對於鏈表的結構在這裏再也不贅述,暫且不討論是從鏈表頭部插入仍是從尾部初入,
這個時候兩個線程若是剛好都取到了對應位置的頭結點e1,而最終的結果可想而知,a一、a2兩個數據中勢必會有一個會丟失

 

  **多個線程同時檢測到總數量超過門限值的時候就會同時調用resize操做,各自生成新的數組並rehash後賦給該map底層的數組table,java

結果最終只有最後一個線程生成的新數組被賦給table變量,其餘線程的均會丟失。並且當某些線程已經完成賦值而其餘線程剛開始的時候,就會用已經被賦值的table做爲原始數組,這樣也會有問題node

   **(仍是解釋擴容致使線程不安全問題)若是多個線程同時檢測到元素個數超過數組大小*loadFactor,這樣就會發生多個線程同時對Node數組進行擴容,都在從新計算元素位置以及複製數據,可是最終只有一個線程擴容後的數組會賦給table,也就是說其餘線程的都會丟失,而且各自線程put的數據也丟失算法

 
四、HashMap 的擴容過程 
  參考:https://blog.csdn.net/aichuanwendang/article/details/53317351
     https://www.cnblogs.com/KingIceMou/p/6976574.html
 
  1.數組的長度2的32冪,hashmap初始大小爲16,負載因子默認我0.75
  2.hashmap是懶加載,構造完HashMap對象後,只要不進行put 方法插入元素以前,HashMap並不會去初始化或者擴容table:
  3.插入數據時,會去判斷hashmap的哈希表長度*負載因子,若是這個值小於hashmap中當前元素的個數,就會去調用resize方法去擴容。
 
  參考:https://www.cnblogs.com/kuoAT/p/6771653.html
arraylist動態擴容,初始大小爲10或者0(無參構造器),以1.5倍大小擴容,調用grow方法。
  
 
五、HashMap 1.7 與 1.8 的 區別,說明 1.8 作了哪些優化,如何優化的?
  https://www.cnblogs.com/stevenczp/p/7028071.html
  1.使用node數組存數據,對key作哈希獲得的hashcode後,若是hashcode重複,會放到鏈表中,若是超過8個把鏈表轉化爲紅黑樹,這樣查找會快點
  2.要實現Compare接口,若是不實現尚未1.7的快
  
  hashmap實現compare接口
  https://blog.csdn.net/zly9923218/article/details/51656920
六、final finally finalize
  1.final是修飾符,能夠修復類,方法,屬性;
  2.被final修飾的類不能被繼承;被final修飾的方法只能使用,不能被重載;被final修飾的變量就是常量了,必須有初始值,不能拿被修改。
  
  finally 是處理異常時來執行清除操做,無論有沒有拋出,捕獲,finally塊最後都會被執行。
 
  finalize 在垃圾回收器將對象從內存中清除出去以前作必要的清理工做。
七、強引用 、軟引用、 弱引用、虛引用
  

  強引用是使用最廣泛的引用:Object o=new Object(); 特色:不會被GC數據庫

  軟引用用來描述一些還有用可是並不是必須的對象,在Java中用java.lang.ref.SoftReference類來表示。對於軟引用關聯着的對象,只有在內存不足的時候JVM纔會回收該對象。
  所以,這一點能夠很好地用來解決OOM的問題,而且這個特性很適合用來實現緩存:好比網頁緩存、圖片緩存等數組

  弱引用與軟引用的區別在於:只具備弱引用的對象擁有更短暫的生命週期。在垃圾回收器線程掃描它所管轄的內存區域的過程當中,
  一旦發現了只具備弱引用的對象,無論當前內存空間足夠與否,都會回收它的內存。不過,因爲垃圾回收器是一個優先級很低的線程,
  所以不必定會很快發現那些只具備弱引用的對象緩存

 

  虛引用也稱爲幻影引用:一個對象是都有虛引用的存在都不會對生存時間都構成影響,也沒法經過虛引用來獲取對一個對象的真實引用。
  惟一的用處:能在對象被GC時收到系統通知,JAVA中用PhantomReference來實現虛引用。安全

  

 

  
八、Java反射 
 
九、Arrays.sort 實現原理和 Collection 實現原理
  
十、LinkedHashMap的應用 
  1.須要保證插入順序的
  
十一、cloneable接口實現原理 
  
十二、異常分類以及處理機制
  
1三、wait和sleep的區別 
  
1四、數組在內存中如何分配
  
 
參考:
  • 比較好的參考關於list,set
https://blog.csdn.net/qq_22118507/article/details/51576319
 
 
 
 
 
 
*************************************************
一:List接口
    1.List集合表明一個有序集合,集合中每一個元素都有其對應的順序索引。List集合容許使用重複元素,能夠經過索引來訪問指定位置的集合元素
 
ArrayList:
    1.ArrayList是一個動態數組,也是咱們最經常使用的集合,初始容量(10),該容量表明瞭數組的大小。隨着容器中的元素不斷增長,容器的大小也會隨着增長
    2.ArrayList擅長於隨機訪問。同時ArrayList是非同步的
 
LinkedList
    1.LinkedList是一個雙向鏈表,除了有ArrayList的基本操做方法外還額外提供了get,remove,insert方法在LinkedList的首部或尾部
    2.LinkedList不能隨機訪問,LinkedList也是非同步的
    
Vector
    1. 與ArrayList類似,可是Vector是同步的。因此說Vector是線程安全的動態數組。它的操做與ArrayList幾乎同樣。
    
Stack
    1.Stack繼承自Vector,實現一個後進先出的堆棧。Stack提供5個額外的方法使得Vector得以被看成堆棧使用。基本的push和pop 方法,還有peek方法獲得棧頂的元素,empty方法測試堆棧是否爲空,search方法檢測一個元素在堆棧中的位置。Stack剛建立後是空棧。
    
二:Set接口
    1.Set是一種不包括重複元素的Collection,Set接口有三個具體實現類,分別是散列集HashSet、鏈式散列集LinkedHashSet和樹形集TreeSet。
    
HashSet
    1.HashSet 是一個沒有重複元素的集合。它是由HashMap實現的不保證元素的順序;HashSet是非同步的
    2.HashSet的實現方式大體以下,經過一個HashMap存儲元素,元素是存放在HashMap的Key中,而Value統一使用一個Object對象
 
LinkedHashSet  
    1. LinkedHashSet繼承自HashSet,有序,非同步
TreeSet
    1.TreeSet是一個有序集合,其底層是基於TreeMap實現的,非線程安全
    
三:Map接口
HashMap
    1.以哈希表數據結構實現,查找對象時經過哈希函數計算其位置,它是爲快速查詢而設計的,其內部定義了一個hash表數組(Entry[] table),元素會經過哈希轉換函數將元素的哈希地址轉換成數組中存放的索引,若是有衝突,則使用散列鏈表的形式將全部相同哈希地址的元素串起來,可能經過查看HashMap.Entry的源碼它是一個單鏈表結構。
LinkedHashMap
    1.
TreeMap
    1.TreeMap 是一個有序的key-value集合,非同步基於紅黑樹(Red-Black tree)實現,每個key-value節點做爲紅黑樹的一個節點。TreeMap存儲時會進行排序的,會根據key來對key-value鍵值對進行排序,其中排序方式也是分爲兩種,一種是天然排序,一種是定製排序,具體取決於使用的構造方法
參考:
https://www.cnblogs.com/xiaoxi/p/6089984.html
相關文章
相關標籤/搜索