<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 10,comments - 2,trackbacks - 0
    1、盡可能的用位運算,比如HashMap的查找Entry<K, V> [] table下標的操作
    static int indexFor(int h, int length) {
        
    return h & (length-1);
    }

    2、對于java.utl.ArrayList、HashMap、LinkedHashMap、HashSet、LinkedSet等的new操作最好指定所需大小。
        2.1、對于ArrayList來說add操作有一行代碼為:ensureCapacity(size + 1);具體實現如下:
     1 public void ensureCapacity(int minCapacity) {
     2     modCount++;
     3     int oldCapacity = elementData.length;
     4     if (minCapacity > oldCapacity) {
     5         Object oldData[] = elementData;
     6         int newCapacity = (oldCapacity * 3)/2 + 1;
     7             if (newCapacity < minCapacity)
     8         newCapacity = minCapacity;
     9             // minCapacity is usually close to size, so this is a win:
    10             elementData = Arrays.copyOf(elementData, newCapacity);
    11     }
    12 }
        可以看出,如果ArrayList超出原先的容量,需要擴容的時候,是先new一個數組,然后把原來的數組拷貝到新數組中。所以如果原先可以確定容量的話,采用public ArrayList(int initialCapacity)構造方法。

        2.2、對于HashMap來說put操作,如果在原有的key中沒有找到匹配項,則需要把key加入到Entry<>[] table中。        具體代碼如下:
    1 void addEntry(int hash, K key, V value, int bucketIndex) {
    2     Entry<K,V> e = table[bucketIndex];
    3     table[bucketIndex] = new Entry<K,V>(hash, key, value, e);
    4     if (size++ >= threshold)
    5         // 當size++ >= 負載因子時,進行擴容操作
    6         resize(2 * table.length);
    7 }
      resize(int newCapacity)代碼如下:
     1 void resize(int newCapacity) {
     2     Entry[] oldTable = table;
     3     int oldCapacity = oldTable.length;
     4     if (oldCapacity == MAXIMUM_CAPACITY) {
     5         threshold = Integer.MAX_VALUE;
     6         return;
     7     }
     8     // 需要重新new 一個Entry數組
     9     Entry[] newTable = new Entry[newCapacity];
    10     transfer(newTable);
    11     table = newTable;
    12     threshold = (int)(newCapacity * loadFactor);
    13 }
    這里調用一個方法transfer(Entry[] newTable)其代碼如下:
     1 void transfer(Entry[] newTable) {
     2     Entry[] src = table;
     3     int newCapacity = newTable.length;
     4     // 對Entry[] src進行循環,把舊的Entry[]拷貝到新的Entry[]中
     5     for (int j = 0; j < src.length; j++) {
     6         Entry<K,V> e = src[j];
     7         if (e != null) {
     8             // 把src賦值為null,為了GC操作的時候,回收原來的Entry[]
     9             src[j] = null;
    10             // 對table[j]的鏈表進行循環
    11             do {
    12                 Entry<K,V> next = e.next;
    13                 // 計算在新的Entry[]數組的下標
    14                 int i = indexFor(e.hash, newCapacity);
    15                 
    16                 e.next = newTable[i];
    17                 newTable[i] = e;
    18                 e = next;
    19             } while (e != null);
    20         }
    21     }
    22 }
        2.3、HashSet、LinkedSet、LinkedMap與上同

    3、數組復制的時候,用System.arraycopy方法,比如2.1中的ensureCapacity(int minCapacity)方法,調用的Arrays.copyOf方法。在Array.copy中調用了System.arraycopy,其代碼如下:
    1 public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) {
    2     T[] copy = ((Object)newType == (Object)Object[].class)
    3         ? (T[]) new Object[newLength]
    4         : (T[]) Array.newInstance(newType.getComponentType(), newLength);
    5     System.arraycopy(original, 0, copy, 0,
    6                      Math.min(original.length, newLength));
    7     return copy;
    8 }

    4、待更新
    posted on 2011-08-16 22:15 showsun 閱讀(704) 評論(0)  編輯  收藏 所屬分類: J2SE
    主站蜘蛛池模板: 久久国产精品免费网站| 亚洲av永久无码精品天堂久久| 免费看国产曰批40分钟| 亚洲第一精品在线视频| 国产精品亚洲专一区二区三区| 免费无码又爽又刺激高潮视频| 亚洲人成人无码网www国产| 亚洲国产系列一区二区三区| 久久这里只精品99re免费| 亚洲精品无码久久久久| 国产亚洲欧美在线观看| 午夜男人一级毛片免费| 亚洲a视频在线观看| yy6080久久亚洲精品| 亚洲精品无码专区| 免费观看的毛片手机视频| 亚洲欧洲另类春色校园网站| 最近中文字幕完整版免费高清| 久久亚洲高清综合| 国产精品免费αv视频| 免费jjzz在在线播放国产| 久久亚洲中文无码咪咪爱| 日韩视频在线免费观看| 欧洲亚洲综合一区二区三区| 亚洲AV综合色区无码一区| 精品无码国产污污污免费网站| 亚洲av永久中文无码精品| 四虎影在线永久免费观看| 18禁止看的免费污网站| 亚洲无mate20pro麻豆| 亚洲一区二区三区影院| 日本在线免费观看| 国产亚洲精品欧洲在线观看| 91情国产l精品国产亚洲区| 亚洲精品免费在线| 国产在线观a免费观看| 亚洲精品动漫在线| 永久免费av无码不卡在线观看| 亚洲啪啪免费视频| 国产成人免费手机在线观看视频| 亚洲精品无码成人|