1. 程式人生 > >Java開發中遇到的問題記錄

Java開發中遇到的問題記錄

日常工作中遇到的一些問題筆記:
1. JDK1.7與1.8中 Map的hash方法有變動,導致的結果是HashSet讀取的時候是有序的。
2. return的用法:一個是返回方法指定型別的值(這個值總是確定的),一個是結束方法的執行(僅僅一個return語句)。
3. for each 底層用的還是iterator。
4. Hash表採用一個對映函式 f : key —> address 將關鍵字對映到該記錄在表中的儲存位置,從而在想要查詢該記錄時,可以直接根據關鍵字和對映關係計算出該記錄在表中的儲存位置,通常情況下,這種對映關係稱作為Hash函式,而通過Hash函式和關鍵字計算出來的儲存位置(注意這裡的儲存位置只是表中的儲存位置,並不是實際的實體地址)稱作為Hash地址。
5. Map <

int,int> 這樣是會報錯的,泛型的宣告必須是一個類,int是基本資料型別而不是一個類,這裡應該用int的封裝類Integer做宣告,應該是Map<Integer,Integer>
6. HashMap預設的容量是16,預設載入因子是0.75(3/4),構造方法中可以修改的。

    static final int DEFAULT_INITIAL_CAPACITY = 16;    
    static final float DEFAULT_LOAD_FACTOR = 0.75f;

7.HashMap和TreeMap的區別

HashMap:陣列方式儲存key/value,執行緒非安全,允許null作為key和value,key不可以重複,value允許重複,不保證元素迭代順序是按照插入時的順序,key的hash值是先計算key的hashcode值,然後再進行計算,每次容量擴容會重新計算所以key的hash值,會消耗資源,要求key必須重寫equals和hashcode方法
預設初始容量16,載入因子0.75,擴容為舊容量乘2,查詢元素快,如果key一樣則比較value,如果value不一樣,則按照連結串列結構儲存value,就是一個key後面有多個value;
TreeMap:基於紅黑二叉樹的NavigableMap的實現,執行緒非安全,不允許null,key不可以重複,value允許重複,存入TreeMap的元素應當實現Comparable介面或者實現Comparator介面,會按照排序後的順序迭代元素,兩個相比較的key不得丟擲classCastException。主要用於存入元素的時候對元素進行自動排序,迭代輸出的時候就按排序順序輸出
8.一個Map中刪除一個不存在的Key是不會報錯的

        Map map = new Hashtable();
        map.remove("1");

9.HashMap 因為resize,所以在多執行緒下會產生不安全:

Exception in thread "新執行緒2" java.util.ConcurrentModificationException
    at java.util.HashMap$HashIterator.nextEntry(HashMap.java:922)
    at java.util.HashMap$EntryIterator.next(HashMap.java:962
) at java.util.HashMap$EntryIterator.next(HashMap.java:960) at java.util.AbstractMap.toString(AbstractMap.java:518) at java.lang.String.valueOf(String.java:2849) at java.lang.StringBuilder.append(StringBuilder.java:128) at com.wxx.runnable.MyRunnable2.run(MyRunnable2.java:21) at java.lang.Thread.run(Thread.java:745)