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序列化? 可以把對象寫入文本文件或者在網絡中傳輸。 如何實現序列化呢? 讓被序列化的對象所屬的類實現序列化接口。 該接口是一個標記接口。沒有方法需要實現。 =============================================================================