java.util.Arrays.asList使用体会

下面的代码执行后

  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. }  


异常发生


原因:

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

  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. }  

输出结果:


上面的代码:

  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);


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值