当前位置: 首页 > 科技观察

Java开发者容易犯的9个错误

时间:2023-03-13 01:43:37 科技观察

总结这是我认为Java中的通病。如果您不同意任何部分,请留下您的评论。如果您能提出一些其他常见错误,我将不胜感激。1.将Array转换为ArrayList当需要将Array转换为ArrayList时,开发人员经常这样做:Arrays.asList会返回一个ArrayList,但是要特别注意,这个ArrayList是Arrays类的静态内部类,不是java.util。数组列表类。java.util.Arrays.ArrayList类实现了set、get、contains方法,但是没有实现添加元素的方法(其实可以调用add方法,只是没有具体实现,只是抛出UnsupportedOperationException),所以它的大小也是固定的。为了创建一个真正的java.util.ArrayList,您应该这样做:ArrayList的构造函数可以接收一个Collection类型。并且java.util.Arrays.ArrayList已经实现了这个接口。2.判断一个数组是否包含某个值开发者经常这样做:上面的代码可以正常工作,但是没有必要将其转换为集合集合,将List转换为Set需要额外的时间。其实我们可以简单的使用下面的方法:或者第一种方法可读性更好。3.在循环内删除List中的一个元素考虑如下代码,在迭代过程中删除元素:Resultprint:[b,d]上述方法存在一系列问题,当删除一个元素时,大小为列表递减Small,则原索引指向其他元素。所以如果你想在循环中通过索引删除多个元素,它不会正常工作。您可能知道使用迭代器是在循环中删除元素的正确方法,您可能也知道foreach循环类似于迭代器,但事实并非如此。以下代码:将抛出ConcurrentModificationException。但是,下面的代码是可以的:next方法需要在remove方法之前被调用。在foreach循环中,编译器会在删除元素后调用next方法,从而引发ConcurrentModificationException。4、HashTable和HashMap从算法的角度来看,HashTable是一种数据结构名称。但是在Java中,这种数据结构叫做HashMap。HashTable和HashMap之间的主要区别之一是HashTable是同步的,因此,一般来说,您将使用HashMap而不是Hashtable。5、使用集合原始类型(rawtype)在Java中,原始类型(rawtype)和无界通配符类型很容易混淆。以Set为例,Set是原始类型,Set是无界通配符类型。请看下面的代码,add方法使用原始类型List作为入参:运行上面的代码会抛出异常:Exceptioninthread"main"java.lang.ClassCastException:java.lang.Integercannotbecastto爪哇。lang.Stringat...与原始类型的集合一起使用是非常危险的,因为它会跳过泛型类型检查并且不安全。此外,Set、Set和Set有很大不同。6.访问级别开发者经常使用public来修改类字段。虽然其他人很容易通过引用直接获取字段的值,但这是一个糟糕的设计。根据经验,您应该尽可能降低成员属性的访问级别。7.ArrayList和LinkedList为什么开发者经常使用ArrayList和LinkedList,却分不清它们的区别,因为它们看起来很像。但是,它们之间存在巨大的性能差异。简单的说,如果增删操作比较多,随机访问元素不多,应该选择LinkedList。反之亦然。8.可变和不可变不可变对象有很多优点,比如简单和安全。但是你需要为每个不同的值一个单独的对象,太多的对象会导致大量的垃圾收集,所以在可变和不可变之间进行选择时需要有一个平衡。通常,可变对象用于避免创建大量中间对象。一个典型的例子是大量字符串的连接。如果使用不可变对象,会同时有大量符合垃圾回收条件的对象,浪费大量的CPU时间和精力。使用可变对象是正确的解决方案(StringBuilder);此外,还有其他需要可变对象的情况。例如,将可变对象传递给方法,然后无需编写太多语法即可收集各种结果。另一个例子是排序和过滤:当然,您可以编写一个方法来获取原始集合并返回一个已排序的集合,但这对于大型集合来说是一种浪费。9、父类和子类的构造方法出现这个编译错误的原因是父类的默认构造方法未定义。在Java中,如果一个类没有定义构造函数,编译器会默认插入一个无参构造函数;但是如果在父类中定义了构造函数,在这种情况下,编译器不会自动插入一个默认的无参构造方法,这正是上面demo的情况;对于子类,无论是无参构造方法还是有参构造方法,都会默认调用父类的无参构造方法;当编译器试图在这两个构造方法中插入super方法时,编译器报错,因为父类没有默认的无参构造方法;要修复这个错误,很简单:1.在父类中手动定义一个无参构造方法:2.去掉父类中的自定义构造方法3.在子类中编写父类构造方法的调用;比如超(值);翻译链接:http://www.programcreek.com/2014/05/top-10-mistakes-java-developers-make/