Java程序员最常犯的10个错误(1-5)

Java程序员最常犯的10个错误(1-5)


1,Array 转换成ArrayList

当把一个Array转化成ArrayList时,有人会这么做:

List list = Arrays.asList(arr);

这是错误的。因为 Arrays.asList方法返回的是java.util.Arrays.ArrayList,而不是java.util.ArrayList

这个类是Arrays的一个静态内部类,有Set(),Get(),Contains()等方法,但是没有add()方法。就是说只能查或改,不能新增元素。

正确的做法是:

ArrayList arrayList = new ArrayList(Arrays.asList(arr));

2,判断Array包含某个值

有人会这么做:

Set set = 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循环中移除元素,有人会这么做:

ArrayList list = 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的长度已经发生了改变。

正确的做法是:

	ArrayList list = new ArrayList(Arrays.asList("a", "b", "c", "d"));
Iterator iter = 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){
List
list = new ArrayList();
add(list, 10);
String s = list.get(0);
}

这个代码是可以通过编译的,但是add方法直接使用无任何通配符的List做了参数,

在main方法执行时会报ClassCastException

无任何通配符的Collection做方法参数时,没有类型限制,可以让你add任何值,

但是get时会出问题。

6-10下篇继续,觉得不错

请先关注


分享到:


相關文章: