for迴圈裡面不要進行remove操作

Kunaly發表於2018-02-01

7. 【強制】不要在 foreach 迴圈裡進行元素的 remove / add 操作。 remove 元素請使用 Iterator
方式,如果併發操作,需要對 Iterator 物件加鎖。
正例:
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String item = iterator.next();
if (刪除元素的條件) {
iterator.remove();
}
}
反例:
List<String> list = new ArrayList<String>();
list.add("1");
list.add("2");
for (String item : list) {
if ("1".equals(item)) {
list.remove(item);
}
}
說明:以上程式碼的執行結果肯定會出乎大家的意料,那麼試一下把“1”換成“2”,會是同樣的
結果嗎?

--摘自阿里巴巴開發手冊

package com.kunaly.domain;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

//不要在 foreach 迴圈裡進行元素的 remove / add 操作

public class Test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		List<String> list = new ArrayList<String>();
		list.add("1");
		list.add("2");
		/*for (String item : list) {
			if ("2".equals(item)) {
				list.remove(item);
			}
		}*/
		
		Iterator<String> iterator = list.iterator();
		while(iterator.hasNext()){
			String item = iterator.next();
			if("2".equals(item)){
				iterator.remove();
			}
		}
		
		System.out.println(list);

	}

}


1,不要在 foreach 迴圈裡進行元素的 remove/add 操作

remove 元素請使用 Iterator方式,如果併發操作,需要對 Iterator 物件加鎖。

正例:

1
2
3
4
5
Iterator<String> iterator = list.iterator(); <br>while (iterator.hasNext()) {
String item = iterator.next(); <br>   if (刪除元素的條件) {
       iterator.remove();
   }
}

反例:

1
2
3
4
5
6
7
8
9
public static void main(String args[]){
        List<String> list = new ArrayList<String>();
        list.add("1");
        list.add("1");
        for (String item : list) {
            if ("1".equals(item)) { list.remove(item);
        } }
        System.out.println(list.toString());
    }<br>//output: [1]

for迴圈裡remove元素後,list的下標會減小,導致遍歷不完全。

2,asList 的返回物件是一個 Arrays 內部類,並沒有實現集合的修改方法。Arrays.asList 體現的是介面卡模式,只是轉換介面,後臺的資料仍是陣列。

1
2
3
4
5
6
7
String[] str = new String[] { "you""wu" };
List list = Arrays.asList(str);
str[0] = "yy";
System.out.println(list.toString());
//output: [yy, wu]
list.add("yangguanbao");
//執行時異常

3,集合型別轉換為陣列, 要防止陣列下標越界的問題。用以下方式轉化

1
2
3
4
List<String> list = new ArrayList<String>(2);
list.add("guan");
list.add("bao");
String[] array = new String[list.size()];  

4, try{} catch{}語句塊中:

 

finally的程式碼塊一定會被執行,即使finally程式碼塊之前函式有return語句,finally程式碼塊也會執行

除以下一種特例: System.exit(0);這條語句後的finally將不再執行

finally的作用是無論是否有異常發生,都要對資源進行釋放;資源釋放在finally裡面

5,同一個類的每個物件有不同成員變數儲存空間

同一個類的每個物件共享方法

 

6,java比較物件時,“==”比較的是物件在記憶體堆內的地址

String重寫了Object的equals方法,因而兩個相同的字串,equal返回是true

public boolean equals(Object anObject)

Compares this string to the specified object. 

The result is true if and only if the argument is not null and is a String object 

that represents the same sequence of characters as this object.

 

5,instanceof 判斷前面那個類是否屬於後面的那個類保護後面列的子類

 

6,LIst,Set,Map集合不能新增基本資料型別(放基本型別能自動裝箱成引用型別),必須裝object

 

7,  enctype="multipart/form-data"

 form表單在提交圖片的檔案時要設定enctype型別

不然會報

org.springframework.web.multipart.MultipartException: The current request is not a multipart request

at org.springframework.web.method.annotation.RequestParamMethodArgumentResolver.assertIsMulti


更多詳情參照大牛部落格:點選開啟連結

相關文章