1、Map下的NPE
直接上代碼:
Map類集合K/V能不能存儲null值的情況,如下表格:
2、foreach遍歷集合刪除元素
在遍歷集合時對元素進行add/remove操作要使用Iterator,使用for循環時會報錯,一定會報錯嗎?看代碼:
情況2:
public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("1"); list.add("2"); list.add("3"); for(String str : list){ if("2".equals(str)){ list.remove(str); } } Iterator<String> it = list.iterator(); while(it.hasNext()){ String temp = it.next(); if("2".equals(temp)){ it.remove(); } } System.out.println(list.toString()); }
程序不會報錯,貌似foreach只有操作倒數第二個元素才沒問題。但是我們依然要注意不要在foreach循環里進行元素的remove/add操作。remove元素要使用Iterator方式,如果並發操作,需要對Iterator對象加鎖。
3、Arrays.asList()數組轉換集合
這個工具類應該都用過,可以很方便的把數組轉換為集合,但是一些細節需要注意:
public static void main(String[] args) { String[] str = new String[]{"a","b"}; List list = Arrays.asList(str); list.add("c");//報錯 // str[0] = "d"; for(Object o : list){ System.out.println(o); } }
注意:Arrays.asList()把數組轉換成集合時,不能使用其修改集合的相關方法,它的add/remove/clear方法會拋出UnsupportedOperationException異常。asList()的返回對象是一個Arrays內部類,並沒有實現集合的修改方法。所以,如果需要修改集合,要在轉換之前操作。還需要注意一點,在你轉換后,再對數組的值進行修改,集合也會跟着變化。
4、toArray()集合轉換數組
當我們需要把一個集合轉換成數組時,往往會調用toArray()方法,如果使用的是無參的方法,會報ClassCastException異常。
原因:直接使用toArray()無參方法返回值只能是Object[]類,若強轉成其它類型數組將會拋出異常。
解決方案:使用<T> T[] toArray(T[] a);有參數這個方法,代碼如下: