1. 程式人生 > >java.util.Arrays.asList使用體會

java.util.Arrays.asList使用體會

下面的程式碼執行後

  1. privatevoid onButtonAsListClick() {  
  2.     String[] strArray = new String[] { "aa""bb" };  
  3.     List<String> list = Arrays.asList(strArray);  
  4.     try {  
  5.         list.add("cc");  
  6.     } catch (Exception e) {  
  7.         Log.i("AsList""add failure");  
  8.     }  
  9. }  


異常發生


原因:

是一個不可變的陣列,所以修改如下:

  1. privatevoid onButtonAsListClick() {  
  2.     String[] strArray = new String[] { "aa""bb" };  
  3.     ArrayList<String> arrayList = new ArrayList<String>();  
  4.     arrayList.addAll(Arrays.asList(strArray));  
  5.     try {  
  6.         arrayList.add("cc");  
  7.     } catch (Exception e) {  
  8.         Log.i("AsList"
    "add failure");  
  9.     }  
  10.     for (String string : arrayList) {  
  11.         Log.i("AsList", string);  
  12.     }  
  13. }  

輸出結果:


上面的程式碼:

  1. ArrayList<String> arrayList = new ArrayList<String>();  
  2.          arrayList.addAll(Arrays.asList(strArray));  

也可改為:
  1. ArrayList<String> arrayList = new ArrayList<String>(  
  2.                 Arrays.asList(strArray));  

效果一樣。

最近程式碼中需要對兩個陣列求交,想當然便用到了List中的retainAll函式,但要將將陣列轉換成list。程式碼如下:

String[] abc = new String[] { "abc", "acd", "add" };
String[] abd = new String[] {"acd", "cd", "de"};

List<String> abcList = Arrays.asList(abc);
List<String> abdList = Arrays.asList(abd);

abcList.retainAll(abdList);

沒想到執行後卻丟擲了異常:

java.lang.UnsupportedOperationException
at java.util.AbstractList.remove(AbstractList.java:144)
at java.util.AbstractList$Itr.remove(AbstractList.java:360)
at java.util.AbstractCollection.retainAll(AbstractCollection.java:370)

反編譯後才發現原來 Arrays.asList返回的ArrayList並不是java.util.ArrayList,而是在Arrays類中重新定義的一下內部類ArrayList:

private static class ArrayList<E> extends AbstractList<E>
implements RandomAccess, java.io.Serializable
{
private static final long serialVersionUID = -2764017481108945198L;
private final E[] a;

ArrayList(E[] array) {
if (array==null)
throw new NullPointerException();
a = array;

//.....其它的省略

}

這個ArrayList並沒有重寫remove方法。

修改成如下,問題解決:

String[] abc = new String[] { "abc", "acd", "add" };
String[] abd = new String[] {"acd", "cd", "de"};

List<String> abcList = new ArrayList<String>(Arrays.asList(abc));
List<String> abdList = new ArrayList<String>(Arrays.asList(abd));

abcList.retainAll(abdList);