Java开发者易犯错误Top10
来源:互联网 发布:java web 商城 编辑:程序博客网 时间:2024/06/06 01:07
本文总结了Java开发者经常会犯的前十种错误列表。
Top1. 数组转换为数组列表
将数组转换为数组列表,开发者经常会这样做:
List<String> list = Arrays.asList(arr);
Arrays.asList()将返回一个数组内部是私有静态类的ArrayList,这不是java.util.ArrayList类,java.util.Arrays.ArrayList类有set()、 get()、 contains()方法,但是没有任何加元素的方法,因此它的大小是固定的。你应该这么做来创建一个真正的数组:
ArrayList<String> arrayList = new ArrayList<String>(Arrays.asList(arr));
ArrayList的构造函数能够接受一个集合类型,这也是java.util.Arrays.ArrayList的超级类型。
Top2. 检查一个数组包含一个值
开发者经常这么做:
Set<String> set = new HashSet<String>(Arrays.asList(arr));return set.contains(targetValue);
代码可以工作,但是没有必要首先转换列表到Set,转换一个列表到一个Set需要额外的时间。因此你可以把它简化为:
Arrays.asList(arr).contains(targetValue);
或
for(String s: arr){ if(s.equals(targetValue)) return true;} return false;
第一个比第二个更具可读性
Top3. 在一个循环中从一个列表里删除一个元素
考虑下面删除元素的代码在迭代中的结果:
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]
该方法有一个严重的问题,当一个元素被删除时,列表收缩的大小以及指针改变了。所以想要在循环内利用指针删除多个元素是无法正常进行的。
这种情况下使用迭代器才是正确的方法,foreach循环在Java中的工作像是一个迭代器,但实际上并不是,考虑下面的代码:
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()的源代码。
Top4. Hashtable vs HashMap
根据算法的常规,Hashtable是对数据结构的称呼。但是在Java中,数据结构的名称是HashMap。Hashtable和HashMap关键不同之一是Hashtable是同步的。
关于这一点可查看以下两个链接:
HashMap vs. TreeMap vs. Hashtable vs. LinkedHashMap
Map问题Top10
Top5. 使用集合的原始类型
在Java中,原始类型和无限制的通配符类型很容易被混淆。以Set为例,Set是原始类型,而Set(?)则是无限制的通配符类型。
考虑下面的代码,以一个原始类型List作为参数:
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);}
该代码会抛出一个异常:
Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String at ...
使用原始类型集合是危险的,因为原始类型集合跳过了泛型类型检查,也不安全。Set、Set和Set之间有很大的不同。详细可查看
Raw type vs. Unbounded wildcard 和 Type Erasure 。
Top6. 访问级别
开发者经常对类域使用public,这很容易通过直接引用获得域值,但这是一个非常糟糕的设计。根据经验来说是给予成员的访问级别越低越好。
详细情况可点击查看Java中成员访问级别: public、protected、private
完整内容点此查看
- Java开发者易犯错误Top10
- Java开发者易犯错误Top10
- Java开发者易犯错误Top10
- Java开发者易犯错误Top10
- Java开发者易犯错误Top10
- Java开发者易犯错误Top10
- Java开发者易犯错误Top10
- Java开发者易犯错误Top10
- Java开发者易犯错误Top10
- Java开发者易犯错误Top10
- Java开发者易犯错误Top10
- Java开发者易犯错误Top10
- Java开发者易犯错误
- Java常犯错误top10
- Java常犯错误top10
- Java易犯错误
- Java编程易犯错误
- JAVA 十个低级易犯错误
- php5.5以下版本配置opcache
- 树莓派更改更新源
- Svn分支管理
- 阳和移动开发
- 内核中返回结构体首地址的函数container_of
- Java开发者易犯错误Top10
- thinkphp3.2.3 ueditor1.4.3 图片上传操作,在线删除上传图片功能。
- java thread cpu
- 服务器如何允许和禁止CNAME访问
- MySQL主从复制
- java自定义annotation使用详解
- Unity3D开发——LeRunning角色选择界面制作
- 嵌套类,内部类,匿名内部类再学习
- HTTP报文详解