芯学苑专注java培训十年

当前位置  |首页常见问题 技术问题 芯学苑:进行Java编程操作时经常出现的错误

芯学苑:进行Java编程操作时经常出现的错误

来源:西安芯学苑2017-09-20关键词: 芯学苑,java编程,

  作为一名Java软件工程师,在进行编程的时候经常会出现失误,接下来由芯学苑的老师给大家介绍一下在进行操作时经常出现的错误:

  

11.jpg


  把数组转成ArrayList

  使用Arrays.asList()方法可以得到一个ArrayList,但是得到这个ArrayList其实是定义在Arrays类中的一个私有的静态内部类。这个类虽然和Java.util.ArrayList同名,但是并不是同一个类。Java.util.Arrays.ArrayList类中实现了set(), get(), contains()等方法,但是并没有定义向其中增加元素的方法。也就是说通过Arrays.asList()得到的ArrayList的大小是固定的。

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

  在Java中如何高效的判断数组中是否包含某个元素一文中,虽然可以实现功能,但是效率却比较低。因为将数组压入Collection类型中,首先要将数组元素遍历一遍,然后再使用集合类做其他操作。在判断一个数组是否包含某个值的时候,推荐使用for循环遍历的形式或者使用Apache Commons类库中提供的ArrayUtils类的contains方法。

  在循环中删除列表中的元素

  当一个元素被删除时,列表的大小缩小并且下标也会随之变化,所以当你想要在一个循环中用下标删除多个元素的时候,它并不会正常的生效。也有些人知道以上代码的问题就由于数组下标变换引起的。所以,他们想到使用增强for循环的形式。

  使用原始集合类型

  在Java里边,原始类型和无界通配符类型很容易混合在一起。以Set为例,Set是一个原始类型,而Set< ? >是一个无界通配符类型。 (可以把原始类型理解为没有使用泛型约束的类型)使用原始集合类型是很危险的,因为原始集合类型跳过了泛型类型检查,是不安全的。Set、Set< ? >和Set< ObJect >之间有很大差别。

  访问级别

  程序员们经常使用public作为类中的字段的修饰符,因为这样可以很简单的通过引用得到值,但这并不是好的设计,按照经验,分配给成员变量的访问级别应该尽可能的低。

  ArrayList与LinkedList的选择

  当程序员们不知道ArrayList与LinkedList的区别时,他们经常使用ArrayList,因为它看起来比较熟悉。然而,它们之前有巨大的性能差别。在ArrayList vs LinkedList vs Vector 区别、Java中常见亲属比较等文章中介绍过,简而言之,如果有大量的增加删除操作并且没有很多的随机访问元素的操作,应该首先LinkedList。(LinkedList更适合从中间插入或者删除(链表的特性))

  

12.jpg


  可变与不可变

  在为什么Java要把字符串设计成不可变的一文中介绍过,不可变对象有许多的优点,比如简单,安全等等。同时,也有人提出疑问:既然不可变有这么多好处,为什么不把所有类都搞成不可变的呢?

  通常情况下,可变对象可以用来避免产生过多的中间对象。一个经典的实例就是连接大量的字符串,如果使用不可变的字符串,将会产生大量的需要进行垃圾回收的对象。这会浪费CPU大量的时间,使用可变对象才是正确的方案(比如StringBuilder)。

  父类和子类的构造函数

  如果一个类没有定义构造函数,编译器将会插入一个无参数的默认构造函数。

  如果一个类中定义了一个带参数的构造函数,那么编译器就不会再帮我们创建无参的构造函数。

  我们还应该知道:

  子类的所有构造函数(无论是有参还是无参)在执行时,都会调用父类的无参构造函数。

  所以,编译器试图调用Super类中的无参构造函数。但是父类默认的构造函数未定义,编译器就会报出这个错误信息。

  还是构造函数

  关于这个问题,也是程序员经常出现困惑的地方,在该如何创建字符串,使用” “还是构造函数?中也介绍过.如果你只需要创建一个字符串,你可以使用双引号的方式,如果你需要在堆中创建一个新的对象,你可以选择构造函数的方式。

  在String d = new String("abcd")时,因为字面值“abcd”已经是字符串类型,那么使用构造函数方式只会创建一个额外没有用处的对象。