十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
这篇文章主要讲解了“Java开发者容易犯的十个错误是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java开发者容易犯的十个错误是什么”吧!
成都创新互联公司专注为客户提供全方位的互联网综合服务,包含不限于成都网站设计、成都网站建设、陕州网络推广、微信平台小程序开发、陕州网络营销、陕州企业策划、陕州品牌公关、搜索引擎seo、人物专访、企业宣传片、企业代运营等,从售前售中售后,我们都将竭诚为您服务,您的肯定,是我们最大的嘉奖;成都创新互联公司为所有大学生创业者提供陕州建站搭建服务,24小时服务热线:18982081108,官方网址:www.cdcxhl.com
Top1. 数组转换为数组列表
将数组转换为数组列表,开发者经常会这样做:
[java]
Listlist = Arrays.asList(arr);
Arrays.asList()将返回一个数组内部是私有静态类的ArrayList,这不是java.util.ArrayList类,java.util.Arrays.ArrayList类有set()、 get()、 contains()方法,但是没有任何加元素的方法,因此它的大小是固定的。可以用于方便转换list,不能添加新元素,所以选择正确的使用场景。
你也可以这么做来创建一个真正的数组:
[java]
ArrayListarrayList = new ArrayList (Arrays.asList(arr));
ArrayList的构造函数能够接受一个集合类型,这也是java.util.Arrays.ArrayList的超级类型。
Top2. 检查一个数组包含一个值
开发者经常这么做:
[java]
Setset = new HashSet (Arrays.asList(arr));
return set.contains(targetValue);
代码可以工作,但是没有必要首先转换列表到Set,转换一个列表到一个Set需要额外的时间。因此你可以把它简化为:
[java]
Arrays.asList(arr).contains(targetValue);
或
[java]
for(String s: arr){
if(s.equals(targetValue))
return true;
}
return false;
第一个比第二个更具可读性
Top3. 在一个循环中从一个列表里删除一个元素
考虑下面删除元素的代码在迭代中的结果:
[java]
ArrayListlist = new ArrayList (Arrays.asList("a", "b", "c", "d"));
for (int i = 0; i < list.size(); i++) {
list.remove(i);
}
System.out.println(list);
输出是:
[java]
[b, d]
该方法有一个严重的问题,当一个元素被删除时,列表收缩的大小以及指针改变了。所以想要在循环内利用指针删除多个元素是无法正常进行的。
这种情况下使用迭代器才是正确的方法,foreach循环在Java中的工作像是一个迭代器,但实际上并不是,考虑下面的代码:
[java]
ArrayListlist = new ArrayList (Arrays.asList("a", "b", "c", "d"));
for (String s : list) {
if (s.equals("a"))
list.remove(s);
}
它会报出ConcurrentModificationException异常。
相反下面这个就可以正常工作。
[java]
ArrayListlist = new ArrayList (Arrays.asList("a", "b", "c", "d"));
Iteratoriter = 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是同步的。
Top5. 使用集合的原始类型
在Java中,原始类型和无限制的通配符类型很容易被混淆。以Set为例,Set是原始类型,而Set(?)则是无限制的通配符类型。
考虑下面的代码,以一个原始类型List作为参数:
[java]
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);
}
该代码会抛出一个异常:
[java]
Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
at ...
使用原始类型集合是危险的,因为原始类型集合跳过了泛型类型检查,也不安全。Set、Set和Set