1、将数组转换为数组列表
错误:List<String> list =Arrays.asList(arr);
正确:ArrayList<String> list =new ArrayList<String>(Arrays.asList(arr));
解释:Arrays.asList()方法返回一个受指定数组支持的固定大小的列表,这不是java.util.ArrayList类,java.util.Arrays.ArrayList类有set()、 get()、 contains()方法,但是没有任何加元素的方法,因此它的大小是固定的。ArrayList的构造函数能够接受一个集合类型,这也是java.util.Arrays.ArrayList的超级类型。
2、检查一个数组包含一个值
最好方法:Arrays.asList(arr).contains(targetValue);//首先把数组转换为ArrayList,然后调用contains()方法。
其次方法:for(String s:arr){
if(targetValue.equals(s)){
return true;
}
}
return false;
不好方法:HashSet<String> set =new HashSet(Arrays.asList(arr));//首先将数组转换为ArrayList, //然后再转换为HashSet
return set.contains(targetValue);
解释:最后一种方法代码可以工作,但是没有必要首先转换列表到Set,转换一个列表到一个Set需要额外的时间。
3、在一个循环中从一个列表里删除一个元素
错误做法:ArrayList<String> list =new ArrayList<String>(Arrays.asList("a","b","c","d"));
for(int i=0;i<list.size();i++){
list.remove(i);
}
解释:这种做法最后的结果是list中还有[b,d],因为当一个元素被删除时,列表收缩大小并且指针改变了,所以想要在循环内利用指针删除多个元素是无法正常进行的。
错误做法: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异常的原因。4、ArrayList VS LinkedList
如果你不知道ArrayList和LinkedList之间的区别时,你可能会经常的选用ArrayList,因为它看起来看熟悉。然而它们之间有巨大的性能不同。简单的来说,如果有大量的添加/删除操作,并且没有很多的随机存取操作时,LinkedList应该是你的首选。