Java程序员常犯的几类错误
1.忽视异常
相信很多小伙伴在编程的过程中经常对异常置之不理。针对初学者和有经验的 Java 程序员,最佳实践仍是处理它们。异常抛出通常是带有目的性的,因此在大多数情况下需要记录引起异常的事件。不要小看这件事,如果必要的话,你可以重新抛出它,在一个对话框中将错误信息展示给用户或者将错误信息记录在日志中。至少,为了让其它开发者知晓前因后果,你应该解释为什么没有处理这个异常。
2.ArrayList与LinkedList
这两个似乎很像,当我们不知道之间的区别ArrayList和LinkedList就经常使用ArrayList,因为它看起来很熟悉。但是,它们之间存在巨大的性能差异。LinkedList如果存在大量的添加/删除操作并且没有大量的随机访问操作,则应该首选。
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中所有元素,但是结果却没有成功。原因是忽略了一个关键的问题:当一个元素被删除时,列表的大小缩小并且下标也会随之变化,所以当你想要在一个循环中用下标删除多个元素的时候,它并不会正常的生效。
为什么呢? 迭代器(Iterator)是工作在一个独立的线程中,并且拥有一个 mutex 锁。 迭代器被创建之后会建立一个指向原来对象的单链索引表,当原来的对象数量发生变化时,这个索引表的内容不会同步改变,所以当索引指针往后移动的时候就找不到要迭代的对象,所以按照 fail-fast 原则 迭代器会马上抛出java.util.ConcurrentModificationException 异常。
正确的在遍历过程中删除元素的方法应该是使用Iterator:
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();
}
}
4. 访问级别
许多开发者经常使用public定义字段的访问级别,这样方便通过反射获取字段,但是这是设计非常不好。根据经验字段的访问级别设置的越低越好。public,default,protected,private 如果非必要,建议访问级别设置成private。
为了让学习变得轻松、高效,今天给大家免费分享一套Java入门教学资源。帮助大家在成为Java架构师的道路上披荆斩棘。需要入门的资料关注我后私信回复“1”领取