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
更多詳情參照大牛部落格:點選開啟連結