Java开发人员容易犯的9个错误

栏目: IT资讯 · 发布时间: 6年前

内容简介:这是我觉得java中比较常见的问题。如果您不同意任一部分,请留下您的评论。如果您能提出其它一些常见的错误,我将会非常感激。当需要把Array转成ArrayList的时候,开发人员经常这样做:

摘要

这是我觉得 java 中比较常见的问题。如果您不同意任一部分,请留下您的评论。如果您能提出其它一些常见的错误,我将会非常感激。

1、Array转ArrayList

当需要把Array转成ArrayList的时候,开发人员经常这样做:

Java开发人员容易犯的9个错误

Arrays.asList会返回一个ArrayList,但是要特别注意,这个ArrayList是Arrays类的静态内部类,并不是java.util.ArrayList类。java.util.Arrays.ArrayList类实现了set,get,contains方法,但是并没有实现增加元素的方法(事实上是可以调用add方法,但是没有具体实现,仅仅抛出UnsupportedOperationException异常),因此它的大小也是固定不变的。为了创建一个真正的java.util.ArrayList,你应该这样做:

Java开发人员容易犯的9个错误

ArrayList的构造方法可以接收一个Collection类型。

而java.util.Arrays.ArrayList已经实现了该接口。

2、判断一个数组是否包含某个值

开发人员经常这样做:

Java开发人员容易犯的9个错误

以上代码可以正常工作,但是没有必要将其转换成set集合,将一个List转成Set需要额外的时间,其实我们可以简单的使用如下方法即可:

Java开发人员容易犯的9个错误

或者

Java开发人员容易犯的9个错误

第一种方法可读性更强。

3、在循环内部删除List中的一个元素

考虑如下代码,在迭代期间删除元素:

Java开发人员容易犯的9个错误

结果打印:[b, d]

在上面这个方法中有一系列的问题,当一个元素被删除的时候,list大小减小,然后原先索引指向了其它元素。所以如果你想在循环里通过索引来删除多个元素,将不会正确工作。

你也许知道使用迭代器是在循环里删除元素的正确方式,或许你也知道foreach循环跟迭代器很类似,但事实情况却不是这样,如下代码:

Java开发人员容易犯的9个错误

将抛出ConcurrentModificationException异常。

然而接下来的代码却是OK的:

Java开发人员容易犯的9个错误

next方法需要在remove方法之前被调用,在foreach循环里,编译器会在删除元素操作后调用next方法,这导致了ConcurrentModificationException异常。

4、HashTable与HashMap

从算法的角度来讲,HashTable是一种数据结构名称。但是在Java中,这种数据结构叫做HashMap。HashTable与HashMap的一个主要的区别是HashTable是同步的,所以,通常来说,你会使用HashMap,而不是Hashtable。

5、使用集合原始类型(raw type)

在Java中,原始类型(raw type)和无界通配符类型很容易让人混淆。举个Set的例子,Set是原始类型,而Set是无界通配符类型。

请看如下代码,add方法使用了一个原始类型的List作为入参:

Java开发人员容易犯的9个错误

运行以上代码将会抛出异常:

Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String at ...

使用原始类型集合非常危险,因为它跳过了泛型类型检查,是不安全的。另外,Set, Set, 和Set这三个有很大的不同。

6、访问级别

开发人员经常使用public修饰类字段,虽然这很容易让别人直接通过引用获取该字段的值,但这是一个不好的设计。根据经验,应该尽可能的降低成员属性的访问级别。

7、ArrayList和LinkedList

为什么开发人员经常使用ArrayList和LinkedList,却不知道他们之间的区别,因为它们看起来很像。然而它们之间有着巨大的性能差异。简单的说,如果有大量的增加删除操作并且没有很多的随机访问元素的操作,应该首选LinkedList。否则反之。

8、可变与不可变

不可变对象有很多优点,如简单、安全等。但是对于每个不同的值都需要一个单独的对象,太多的对象会引起大量垃圾回收,因此在选择可变与不可变的时候,需要有一个平衡。

通常,可变对象用于避免产生大量的中间对象,一个经典的例子是大量字符串的拼接。如果你使用一个不可变对象,将会马上产生大量符合垃圾回收标准的对象,这浪费了CPU大量的时间和精力。使用可变对象是正确的解决方案(StringBuilder);

另外,在有些其它情况下也是需要使用可变对象。例如往一个方法传入一个可变对象,然后收集多种结果,而不需要写太多的语法。另一个例子是 排序 和过滤:当然,你可以写一个方法来接收原始的集合,并且返回一个排好序的集合,但是那样对于大的集合就太浪费了。

9、父类和子类的构造方法

Java开发人员容易犯的9个错误

之所以出现这个编译错误,是因为父类的默认构造方法未定义。在Java中,如果一个类没有定义构造方法,编译器会默认插入一个无参数的构造方法;但是如果一个构造方法在父类中已定义,在这种情况,编译器是不会自动插入一个默认的无参构造方法,这正是以上demo的情况;

对于子类来说,不管是无参构造方法还是有参构造方法,都会默认调用父类的无参构造方法;当编译器尝试在子类中往这两个构造方法插入super方法时,因为父类没有一个默认的无参构造方法,所以编译器报错;

要修复这个错误,很简单:

1、在父类手动定义一个无参构造方法:

Java开发人员容易犯的9个错误

2、移除父类中自定义的构造方法

3、在子类中自己写上父类构造方法的调用;如super(value);

译文链接:

http://www.programcreek.com/2014/05/top-10-mistakes-java-developers-make/

【责任编辑:庞桂玉 TEL:(010)68476606】


以上所述就是小编给大家介绍的《Java开发人员容易犯的9个错误》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Sass and Compass in Action

Sass and Compass in Action

Wynn Netherland、Nathan Weizenbaum、Chris Eppstein、Brandon Mathis / Manning Publications / 2013-8-2 / USD 44.99

Written by Sass and Compass creators * Complete Sass language reference * Covers prominent Compass community plug-ins * Innovative approach to creating stylesheets Cascading Style Sheets paint the we......一起来看看 《Sass and Compass in Action》 这本书的介绍吧!

MD5 加密
MD5 加密

MD5 加密工具

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具