Java程序员常犯的几大错误

java免费学习请关注评论处

1.ArrayList与LinkedList

当开发人员不知道之间的区别ArrayList和LinkedList他们经常使用ArrayList,因为它看起来很熟悉。但是,它们之间存在巨大的性能差异。LinkedList如果存在大量的添加/删除操作并且没有大量的随机访问操作,则应该首选。

2.可变与不可变

不可变对象具有诸如简单性,安全性等诸多优点。但是,它需要为每个不同的值分别创建一个对象,并且过多的对象可能会导致垃圾收集的高成本。在可变和不可变之间进行选择时应该有一个平衡。

通常,可变对象用于避免产生太多中间对象。一个典型的例子是连接大量的字符串。如果你使用一个不可变的字符串,你会产生很多对象,这些对象可以立即进行垃圾回收。这浪费了时间和精力在CPU上,使用可变对象的正确解决方案(例如StringBuilder)。

String result = “” ;

for (String s : arr ){

result = result + s ;

}

3.Super和Sub的构造函数

在Java中,如果一个类没有定义构造函数,编译器默认会为该类插入一个默认的无参构造函数。如果在Super类中定义了一个构造函数,在这种情况下,Super(String s),编译器不会插入默认的无参数构造函数。这是上面超级类的情况。

Sub类的构造函数(带有-argument或no-argument)将调用无参数的Super构造函数。由于编译器试图向Sub类中的2个构造函数中插入super(),但Super的默认构造函数未定义,因此编译器会报告错误消息。

要解决这个问题,只需要1)添加一个Super()构造函数给Super类

4.使用原始类型的集合

在Java中,原始类型和无界通配符类型很容易混合在一起。以Set为例,Set是原始类型,Set而是无界通配符类型。

考虑使用原始类型List作为参数的以下代码:

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);

}

这段代码会抛出一个异常,使用原始类型集合是危险的,因为原始类型集合跳过了泛型类型检查并且不安全。

5.检查数组是否包含值

开发人员经常这样做:

Set set = new HashSet(Arrays.asList(arr));

return set.contains(targetValue);

代码有效,但不需要先将列表转换为首先设置。将列表转换为集合需要额外的时间。它可以像下面这样简单:Arrays.asList(arr).contains(targetValue);

要么:

for(String s: arr){

if(s.equals(targetValue))

return true;

}

return false;

6.从循环内的列表中删除元素

下面的代码在迭代过程中删除元素:

ArrayList list = new ArrayList(Arrays.asList("a", "b", "c", "d"));

for (int i = 0; i

list.remove(i);

}

这种方法存在严重的问题。当一个元素被删除时,列表的大小会缩小,并且索引也会改变。所以,如果你想通过使用索引删除循环内的多个元素,那将无法正常工作。

您可能知道使用迭代器是删除循环内部元素的正确方法,并且您知道Java中的foreach循环像迭代器一样工作,但事实上并非如此。考虑下面的代码:

ArrayList list = new ArrayList(Arrays.asList("a", "b", "c", "d"));

for (String s : list) {

if (s.equals("a"))

list.remove(s);

}

它会抛出ConcurrentModificationException。

相反,以下是确定的:

ArrayList list = new ArrayList(Arrays.asList("a", "b", "c", "d"));

Iterator iter = list.iterator();

while (iter.hasNext()) {

String s = iter.next();

if (s.equals("a")) {

iter.remove();

}

}

.next()必须在之前被调用.remove()。在foreach循环中,编译器会.next()在删除元素的操作之后调用该函数,从而导致该操作ConcurrentModificationException。你可能想看看ArrayList.iterator()的源代码。

java免费学习请关注评论处

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180223A0IBW500?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券