数组(array)转成集合(ArrayList)
错误:如经常这样处理
List<String> list = Array.asList(arr);
Arrays.asList()方法返回的是Arrays里的私有静态内部类ArrayList,不是集合java.util.ArrayList类。这是java.util.Arrays.Arrys.ArrayList类内部只有三个方法 set(),get(),contains(),但没有增加元素方法,因此他大小是不变的。要想创建一个集合ArrayList,这样的如:
ArrayList<String> arrayList = new ArrayList<String>(Arrays.asList(arr));
检查一个数组包含这个值(check if an Array contains a value)
开发人员经常这样做:
Set<String> set = new HashSet<String>(Arrays.asList(arr));
return set.contains(targetValue);
代码上多执行了几步,必需先转换成一个集合再给set;
可以这样写:
Arrays.asList(arr).contains(targetValue); or for(String s:arr){if(s.equals(targetValue))return true;}return false;
在删除一个循环内的集合元素
考虑下面的代码,迭代过程中删除元素:
ArrayList<String> list = new ArrayList<String>(Arrays.asList("a","b","c","d"));
for(int i = 0; i< list.size();i++){
list.remove(i);
}
System.out.println(list);
输出结果:
[b,d]
在这个方法是严重问题,当集合里一个元素被删除时,集合长度缩小、下标也发生改变。因此如果使用下标删除循环里的元素,这将正确删除元素。
你可能知道,使用iterator实现元素删除,也知道用foreach像iterator一样删除,但实际上不能的,考虑下面代码:
ArrayList<String> list = new ArrayList<String>(Arrays.asList("a","b","c","d"));
for(String s: list)
{
if(s.equals("a")) list.remove(s);
}
它会抛出ConcurrentModificationException异常
相反就可以:
ArrayList<String> list = new ArrayList<String>(Arrays.asList("a","b","c","d"));
Iterator<String> iter = list.iterator();
while(iter.hasNext())
{
String s = iter.next();
if(s.equals("a"))
{
iter.remove();
}
}
.next 必须在调用.remove()方法前。在foreach循环里,先删除元素然后在调用.next下面元素,这个原因引起ConcurrentModificationException异常,你可能想看ArrayList.iterator().源码;
来源:oschina
链接:https://my.oschina.net/u/729210/blog/272538