java.util.Arrays.asList使用体会

下面的代码执行后

[java] view plain copy
  1. private void 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. }  


异常发生


原因:

java.util.Arrays.asList使用体会_第1张图片

是一个不可变的数组,所以修改如下:

[java] view plain copy
  1. private void 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. }  

输出结果:


上面的代码:

[java] view plain copy
  1. ArrayList<String> arrayList = new ArrayList<String>();  
  2.          arrayList.addAll(Arrays.asList(strArray));  

也可改为:
[java] view plain copy
  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);


你可能感兴趣的:(java)