java多執行緒、集合和IO面試題_02

黑澤明軍發表於2018-04-08

java多執行緒、集合和IO面試題_02

=============================================================================
邏輯思考題:

1:你有一桶果凍,其中有黃色、綠色、紅色三種,閉上眼睛抓取同種顏色的兩個。抓取多少個就可以確定你肯定有兩個同一顏色的果凍?
    4個
-----------------------------------------------------------------------------
2:如果你有無窮多的水,一個3公升的提捅,一個5公升的提捅,兩隻提捅形狀上下都不均勻,問你如何才能準確稱出4公升的水?
    5-3+5-3
    3+3+3-5
-----------------------------------------------------------------------------
3:有8個顏色,大小一樣的小球,其中的一個質量和比其他的重,給你一個天平,你最少幾次就可以稱出那個重的球。(不要想著自己用手拿)
    2次
    
    先分成三份3個、3個、2個,
    稱3個、3個,
    若重的在其中一份,再分成三份1個、1個、1個;
    稱1個、1個,若重的在其中一份,就稱出了。
    若重的不在其中,那剩餘的1個就是重的。
    若稱的3個相等,說明在2個裡面。
    
    思想:更多可能的利用推理。
=============================================================================
面試題:

1:請介紹一下自己(2-3分鐘)
    姓名、家鄉。
    經驗(專案經驗)和能力(自學能力)。
    態度:對程式設計有興趣
    興趣愛好:可提可不提
-----------------------------------------------------------------------------
2:你有男/女朋友嗎?你結婚了嗎?
    穩定性
    精力,加班,出差。
    你家庭和睦嗎?
-----------------------------------------------------------------------------
3:你有什麼要問的嗎?
    對公司一定要有了解。(太偏僻的公司女同學就不要去了)
    公司的前景、業務方向。
    談錢不傷感情。(心裡有個底線6000,開口7000)
=============================================================================
面試題:

多執行緒:

1:多執行緒有幾種實現方法,都是什麼?同步有幾種實現方法,都是什麼?
    兩種。
    
    繼承Thread類
    實現Runnable介面
    
    兩種。
  
    同步程式碼塊
    同步方法(靜態同步方法)
-----------------------------------------------------------------------------
2:啟動一個執行緒是用run()還是start()?
    start();
    
    run():封裝了被執行緒執行的程式碼,直接呼叫僅僅是普通方法的呼叫。
    start():啟動執行緒,並由JVM自動呼叫run()方法。
-----------------------------------------------------------------------------
3:sleep() 和 wait() 有什麼區別?
    sleep():必須指定時間,不釋放鎖。
            是Thread類中的一個方法,用於執行緒休眠,休眠時間結束後,該執行緒可以自動喚醒。
    wait():可以不指定時間,也可以指定時間,並立即釋放鎖。
            是Object類中的一個方法,用於執行緒等待,如果想要喚醒,必須使用notify()或notifyAll()(不能自動喚醒)。
-----------------------------------------------------------------------------
4:執行緒的基本概念及執行緒的生命週期
    執行緒:是程式(程式)的執行單元,執行路徑。
    
    新建-->就緒-->執行-->死亡
    新建-->就緒-->執行-->阻塞-->就緒-->執行-->死亡
-----------------------------------------------------------------------------

集合:

1: HashMap和Hashtable的區別。
    歷史原因:Hashtable是基於陳舊的Dictionary類的,HashMap是Java1.2引進的Map介面的一個實現。
    同步性:Hashtable是執行緒安全的,也就是說是同步的;而HashMap是執行緒序不安全的,不是同步的。
    值:只有HashMap可以讓你將空值作為一個表的條目的key或value。
HashMap類和Hashtable類的區別注意:Hashtable的第二個單詞是小寫,繼承了老版本jdk1.0的命名錯誤,如同System類下的靜態方法Arraycopy()一樣)
    HashMap類:不同步,執行緒不安全,效率高。允許null鍵和null值。
    Hashtable類:同步,執行緒安全,效率低。不允許null鍵和null值。
    其實HashMap類就是用來替代Hashtable類的。如同ArrayList類用來替代Vector類一樣。

Hashtable是執行緒安全的,而且名字沒有按照駝峰格式命名。Hashtable雖然是執行緒安全的,但是效率比較低。
HashMap是非執行緒安全的,在多執行緒修改的時候,會出現異常或者是死迴圈。

補充掌握的知識點
    java.util.concurrent.ConcurrentHashMap<K,V>
    ConcurrentHashMap類的特點:Hashtable的執行緒安全 + HashMap的高效能

    只針對需要修改的資料進行加鎖(Hashtable執行緒安全的體現)
    對其它不需要修改的資料不新增鎖,可以直接獲取(HashMap高效能的體現)

舉例理解:
    遊樂場某一項專案需要維護,這個時候只針對需要維護的這個專案加鎖,
    而其它無需維護的專案仍然對外開放(即不加鎖),而不是一個專案需要維護就必須關掉整個遊樂場。
-----------------------------------------------------------------------------
2:ArrayList和Vector的區別。 
    同步性:Vector是執行緒安全的,也就是說是同步的;而ArrayList是執行緒序不安全的,不是同步的。
    資料增長:當需要增長時,Vector預設增長為原來一培,而ArrayList卻是原來的一半。
-----------------------------------------------------------------------------
3:Collection和Collections的區別。
    Collections是個java.util下的類,它包含有各種有關集合操作的靜態方法。 
    Collection是個java.util下的介面,它是各種集合結構的父介面,有兩個子介面List和Set。
-----------------------------------------------------------------------------
4:List、Set、Map是否繼承自Collection介面?
    List、Set不是繼承自Map介面,它們繼承自Collection介面。
   Map介面本身就是一個頂層介面。
-----------------------------------------------------------------------------
5:說出ArrayList、Vector、LinkedList的儲存效能和特性?
    ArrayList
        底層資料結構是陣列,查詢快,增刪慢。
        執行緒不安全,效率高。
    Vector
        底層資料結構是陣列,查詢快,增刪慢。
        執行緒安全,效率低。
    LinkedList
        底層資料結構是連結串列,查詢慢,增刪快。
        執行緒不安全,效率高。
-----------------------------------------------------------------------------
6:你所知道的集合類都有哪些?主要方法?
    ArrayList,LinkedList,HashSet,HashMap  
    
    Collection(介面):
        add()
        remove()
        contains()
        iterator()
        size()
        遍歷:
            增強for
            迭代器
            
        |--List
            get()
            遍歷:
                普通for
        |--Set
---------------------------------------    
    Map(介面):
        put()
        remove()
        containskey(),containsValue()
        keySet()
        value()
        get()
        entrySet()
        size()
        遍歷:
            根據鍵找值。
            根據鍵值對物件分別找鍵和值。
-----------------------------------------------------------------------------

IO:

1: java中有幾種型別的流?JDK為每種型別的流提供了一些抽象類以供繼承,請說出他們分別是哪些類?
    位元組流,字元流。
    位元組流繼承於InputStream、OutputStream,
    字元流繼承於Reader、Writer。
    在java.io包中還有許多其他的流,主要是為了提高效能和使用方便。
-----------------------------------------------------------------------------
2:什麼是java序列化,如何實現java序列化?
    
    可以把物件寫入文字檔案或者在網路中傳輸。
    
    如何實現序列化呢?
        讓被序列化的物件所屬的類實現序列化介面。
        該介面是一個標記介面。沒有方法需要實現。
=============================================================================

 

我的GitHub地址:https://github.com/heizemingjun
我的部落格園地址:http://www.cnblogs.com/chenmingjun
我的螞蟻筆記部落格地址:http://blog.leanote.com/chenmingjun
Copyright ©2018 黑澤明軍
【轉載文章務必保留出處和署名,謝謝!】

相關文章