Java常考面試題(五)


      序言

         好好努力。

                                                                        ---WZY

 

 

一、Iterator和ListIterator的區別是什么?

      自我解答:

            Iterator是針對所有collection來使用的,而看名字ListIterator,顧名思義,就是給list集合特有的,增加了其他專有的方法吧。

      參考答案:

            下面列出了他們的區別:
              Iterator可用來遍歷Set和List集合,但是ListIterator只能用來遍歷List。
              Iterator對集合只能是前向遍歷,ListIterator既可以前向也可以后向。
              ListIterator繼承了Iterator接口,並包含其他的功能,比如:增加元素,替換元素,獲取前一個和后一個元素的索引,等等。

 

      自我評價:

            首先第一映像,我只看過Iterator,第二個ListIterator我是沒聽過的,但是通過這么久的學習,我可以看出,ListIterator就是只能給list集合用,而不是給其他集合,

            1、Iterator:是接口,能給所有的集合使用

            2、ListIterator:也是接口,繼承了Iterator接口,同時肯定對Iterator接口中的方法進行了增強

                ·ListIterator只能對list集合迭代,

                ·ListIterator不僅能向后迭代,也能想前迭代

                ·ListIterator還能增加元素和刪除元素,並且還能獲得前一個元素和后一個元素

             

        注意:使用Iterator迭代的時候需要注意幾個問題

           1、xx.next(); 每次使用這個,就會往后面推一位,也就是索引會往后移一位,

             2、xx.hasNext(); 當檢測到后面沒有值了,返回false,但是指向器還是會往后面移一位。指向最后一位的后一位,這也是在ListIterator發現的,使用Iterator沒有這個考慮,無所謂,因為只有ListIterator才有往前迭代的方法,所以才有前面這一大堆話。

           3、ListIterator使用xx.add();在當前索引的后面增加,不是替代當前索引的值

             4、ListIterator使用xx.set(E);將當前索引的值給替換成我們給定的值

 

 

二、快速失敗(fail-fast)和安全失敗(fail-safe)的區別是什么?

      自我解答:

            這個沒接觸過。。。

      參考答案:

            Iterator的安全失敗是基於對底層集合做拷貝,因此,它不受源集合上修改的影響。

            java.util包下面的所有的集合類都是快速失敗的,快速失敗的迭代器會拋出ConcurrentModificationException異常

            java.util.concurrent包下面的所有的類都是安全失敗的。,而安全失敗的迭代器永遠不會拋出這樣的異常。

 

      自我評價:

            先說一下,這個題目花了我兩個多小時,才徹底弄明白,但是還是很有效果的,比如,我查看了Iterator實現的源碼,和之前看ArrayList源碼時不懂得地方都弄清楚了,Iterator實現的原理和ArrayList源碼分析我會在別的文章中寫出來,到時候可以看看。現在來解決這個問題

            1、fail-fast 和 fail-safe 這兩個針對的是Iterator,

            2、fail-fast:快速失敗,在那些不是線程安全的集合使用Iterator時發生的問題,因為在迭代的時候,有別的線程對集合內部的構造進行了改變,比如,add、delete這類操作,都會使之發生快速失敗。

            3、fail-safe:安全失敗,在線程安全的集合中發生上面的問題,就會出現該fail-safe了。

              因為我明白了其中到底發生了什么,所以,寫上面的文字,我知道意思,可能大家有點不理解,可以先了解一下fail-fast是什么,推薦博文:http://blog.csdn.net/chenssy/article/details/38151189  這里面就詳細講解了fail-fast是什么, 建議先觀看arrayList源碼,在其中重點了解Iterator的實現,還有modCount是什么,知道了這些,結合這篇博文和我說的,差不多就了解啦。

 

 


3、Java中的HashMap的工作原理是什么?

    自我解答:

         使用數組存儲鍵值數據,每個數組中的位置又是一個鏈表。

    參考答案:

         HashMap的底層是用hash數組和單向鏈表實現的 ,當調用put方法是,首先計算key的hashcode,定位到合適的數組索引,然后再在該索引上的單向鏈表進行循環遍歷用equals比較key是否存在,如果存在則用新的value覆蓋原值,如果沒有則在鏈頭保存該值。HashMap的兩個重要屬性是容量capacity和加載因子loadfactor,默認值分布為16和0.75,當容器中的元素個數大於 capacity*loadfactor時,容器會進行擴容resize 為2n,在初始化Hashmap時可以對着兩個值進行修改,負載因子0.75被證明為是性能比較好的取值,通常不會修改,那么只有初始容量capacity會導致頻繁的擴容行為,這是非常耗費資源的操作,所以,如果事先能估算出容器所要存儲的元素數量,最好在初始化時修改默認容量capacity,以防止頻繁的resize操作影響性能。

 

    自我評價:

           1、沒搞清楚hashMap的存儲結構,雖然看了源碼,但還是模模糊糊,現在差不多知道了

         2、hashMap是用hash表和單向鏈表來實現存儲數據的,具體模型如下,並且在hashmap中有一個內部類entry,它有四個屬性V、K、next、hash,我們放入的key和value會分別放入entry的K、V中,所以存放的都市entry對象。

                    

        3、首先將key通過hash算法算出hashcode值,

        4、通過hashcode值找到在hash數組中對應的位置,然后通過equals方法,遍歷單向鏈表,看有沒有相同的key值,如果有,則替換key所對應的value值,如果沒有,將該數據插入鏈表的開始。

 

四、hashCode()和equals()方法的重要性體現在什么地方?

    自我解答:

        這個問題可以看我那邊hashcode詳解的文章,因為有hashCode()和equals()兩個方法,使對數據的查詢的效率變得很高,比如set集合中,就用到了這兩個方法,不可以存放相同的值,這里就得到了體現

    

    參考答案:

        Java中的HashMap使用hashCode()和equals()方法來確定鍵值對的索引,當根據鍵獲取值的時候也會用到這兩個方法。如果沒有正確的實現這兩個方法,兩個不同的鍵可能會有相同的hash值,因此,可能會被集合認為是相等的。而且,這兩個方法也用來發現重復元素。所以這兩個方法的實現對HashMap的精確性和正確性是至關重要的。  

 

    自我評價:

        差不多就是這樣,就解釋一下大概的情況,舉個例子,差不多了。

 

五、HashMap和Hashtable有什么區別?

    自我解答:

        hashMap是Hashtable的父類,hashtable是線程安全的,而hashmap不是。

 

    參考答案:

        HashMap和Hashtable都實現了Map接口,因此很多特性非常相似。但是,他們有以下不同點:
        HashMap允許鍵和值是null,而Hashtable不允許鍵或者值是null。
        Hashtable是同步的,而HashMap不是。因此,HashMap更適合於單線程環境,而Hashtable適合於多線程環境。
        HashMap提供了可供應用迭代的鍵的集合,因此,HashMap是快速失敗的。另一方面,Hashtable提供了對鍵的列舉(Enumeration)。
        一般認為Hashtable是一個遺留的類。

 

    自我評價:

        map的各種繼承關系模糊了,

        1、hashMap的子類是linkedHashMap

        2、hashTable和hashMap的關系就好像arrayList和Vector的關系差不多

        3、hashTable是同步的,而hashMap是異步的,也就是一個線程安全一個線程不安全

        4、hashMap的key值可以為null 而hashTable不可以

        5、具體的可以去看collections集合的那篇總結文章

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM