posts - 72, comments - 66, trackbacks - 0, articles - 0

          2010年3月2日


          sudo vim /etc/vmware/config

          在最下面添加一句話:
          xkeymap.nokeycodeMap = true

          posted @ 2010-06-09 15:39 Fingki.li 閱讀(592) | 評論 (0)編輯 收藏

          在使用Iterator處理Collection時,注意java.util.ConcurrentModificationException。
          1.如果你僅僅是對collection進行遍歷查詢,那么不必?fù)?dān)心什么。
          2.但如果你在遍歷過程中要對collection進行刪除,那么你就要注意了。
          For example:
          private void testDel() {  
          1.     List<String> list = new ArrayList<String>();  
          2.     for (int i = 0; i < 10; i++) {  
          3.         String str = "td" + i;  
          4.         list.add(str);  
          5.     }  
          6.   
          7.     for (Iterator it = list.iterator(); it.hasNext();) {  
          8.         String str = (String) it.next();  
          9.         if (str.equals("td5")) {  
          10.             // list.remove(str);  // 刪除方法一 
          11.             it.remove();  // 刪除方法二 
          12.         }  
          13.     }  

          上面的代碼運行沒有問題,但如果你用“方法一”替代“方法二”,則會出現(xiàn)java.util.ConcurrentModificationException。
          (用for-each遍歷也會出個類似問題)
          具體原因是可以看一下先看看List中的remove方法源碼:
          1. public boolean remove(Object o) {  
          2.     if (o == null) {  
          3.         for (int index = 0; index < size; index++)  
          4.             if (elementData[index] == null) {  
          5.                 fastRemove(index);  
          6.                 return true;  
          7.             }  
          8.     } else {  
          9.         for (int index = 0; index < size; index++)  
          10.             if (o.equals(elementData[index])) {  
          11.                 fastRemove(index);  
          12.                 return true;  
          13.             }  
          14.     }  
          15.     return false;  
          16. }  
          17.   
          18. private void fastRemove(int index) {  
          19.     modCount++; // 特別注意這里,這里只增加了modCount的值  
          20.     int numMoved = size - index - 1;  
          21.     if (numMoved > 0)  
          22.         System.arraycopy(elementData, index + 1, elementData, index,  
          23.                 numMoved);  
          24.     elementData[--size] = null; // Let gc do its work  

          接著看。刪除后得到下一個元素的代碼,it.next():  it為AbstractList的內(nèi)部類Iterator的一個實例。
          1. public E next() {  
          2.     checkForComodification();  
          3.     try {  
          4.         E next = get(cursor);  
          5.         lastRet = cursor++;  
          6.         return next;  
          7.     } catch (IndexOutOfBoundsException e) {  
          8.         checkForComodification();  
          9.         throw new NoSuchElementException();  
          10.     }  
          11. }  
          12.   
          13. final void checkForComodification() {  //注意這個方法
          14.     if (modCount != expectedModCount)  //檢查這兩個值是否相同
          15.         throw new ConcurrentModificationException();  

          最后看Iterator的remove()方法的源代碼:
          1. public void remove() {  
          2.     if (lastRet == -1)  
          3.         throw new IllegalStateException();  
          4.     checkForComodification();  
          5.     try {  
          6.         AbstractList.this.remove(lastRet);  
          7.         if (lastRet < cursor)  
          8.             cursor--;  
          9.         lastRet = -1;  
          10.         expectedModCount = modCount; // 設(shè)置expectedModCount  
          11.     } catch (IndexOutOfBoundsException e) {  
          12.         throw new ConcurrentModificationException();  
          13.     }  
          14. }  
          15.   
          16. final void checkForComodification() {  
          17.     if (modCount != expectedModCount)  
          18.         throw new ConcurrentModificationException();  

          這下就明白了,list的remove方法只修改了modCount值,而iterator的remove能同步modCount和expectedModCount.



          posted @ 2010-03-02 12:22 Fingki.li 閱讀(5088) | 評論 (1)編輯 收藏

          Ubuntu 時區(qū)時間設(shè)置:
          執(zhí)行
          tzselect(有的版本用tzconfig)
          按照提示進行選擇時區(qū)
          sudo cp /usr/share/zoneinfo/Asia/ShangHai /etc/localtime
          執(zhí)行
          sudo ntpdate cn.pool.ntp.org
          cn.pool.ntp.org是位于中國的公共NTP服務(wù)器,用來同步你的時間

          時間
          sudo date

          posted @ 2010-03-02 11:51 Fingki.li 閱讀(468) | 評論 (0)編輯 收藏

          主站蜘蛛池模板: 繁峙县| 扶余县| 乐亭县| 涞源县| 冀州市| 尉氏县| 成都市| 瑞安市| 万州区| 邵阳县| 吐鲁番市| 凤山市| 探索| 自贡市| 定远县| 合作市| 陇西县| 弋阳县| 肥乡县| 大姚县| 北宁市| 兴文县| 磴口县| 青岛市| 马关县| 仙游县| 晴隆县| 柏乡县| 梅河口市| 巴彦县| 阿鲁科尔沁旗| 武川县| 南汇区| 太仓市| 云霄县| 宣城市| 海盐县| 台安县| 灵寿县| 乐东| 揭阳市|