1,Array 转换成ArrayList
当把一个Array转化成ArrayList时,有人会这么做:
Listlist = Arrays.asList(arr);
这是错误的。因为 Arrays.asList方法返回的是java.util.Arrays.ArrayList,而不是java.util.ArrayList
这个类是Arrays的一个静态内部类,有Set(),Get(),Contains()等方法,但是没有add()方法。就是说只能查或改,不能新增元素。
正确的做法是:
ArrayListarrayList = new ArrayList (Arrays.asList(arr));
2,判断Array包含某个值
有人会这么做:
Setset = new HashSet (Arrays.asList(arr));
return set.contains(targetValue);
这些做功能上没问题,但实际上并不需要将将List转成Set。这会有额外的性能损耗。
可以这样做:
Arrays.asList(arr).contains(targetValue);
或者
for(String s: arr){
if(s.equals(targetValue))
return true;
}
return false;
3,从List的for循环中移除元素
如果要从List的for循环中移除元素,有人会这么做:
ArrayListlist = new ArrayList (Arrays.asList("a", "b", "c", "d"));
for (int i = 0; i < list.size(); i++) {
list.remove(i);
}
System.out.println(list);
结果是什么呢?
[b, d]
原因是在list的remove过程中,list的长度已经发生了改变。
正确的做法是:
ArrayListlist = new ArrayList (Arrays.asList("a", "b", "c", "d"));
Iteratoriter = list.iterator();
while (iter.hasNext()) {
String s = iter.next();
iter.remove();
}
System.out.println(list);
注意:iter.next()一定要在iter.remove()之前调用
4,Hashtable vs HashMap
这二者最大的不同在于,HashTable是线程安全的,每个方法都加了Synchronize。所以性能比较低。多数情况下我们用HashMap比较合适
关于二者细节的不同,可以我会另写一篇
5,直接使用集合的原始类型做方法参数
考虑下面的代码
public static void add(List list, Object o){
list.add(o);
}
public static void main(String[] args){
Listlist = new ArrayList ();
add(list, 10);
String s = list.get(0);
}
这个代码是可以通过编译的,但是add方法直接使用无任何通配符的List做了参数,
在main方法执行时会报ClassCastException
无任何通配符的Collection做方法参数时,没有类型限制,可以让你add任何值,
但是get时会出问题。
6-10下篇继续,觉得不错
请先关注
閱讀更多 IT技術圈 的文章