千家信息网

Java开发人员有哪些最常犯的错误

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,这篇文章主要讲解了"Java开发人员有哪些最常犯的错误",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Java开发人员有哪些最常犯的错误"吧!Array
千家信息网最后更新 2026年11月01日Java开发人员有哪些最常犯的错误

这篇文章主要讲解了"Java开发人员有哪些最常犯的错误",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Java开发人员有哪些最常犯的错误"吧!

Array转ArrayList

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

List list = Arrays.asList(arr);

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

ArrayList arrayList = new ArrayList(Arrays.asList(arr));

ArrayList的构造方法可以接收一个Collection类型,而java.util.Arrays.ArrayList已经实现了该接口。

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

开发人员经常这样做:

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

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

Arrays.asList(arr).contains(targetValue);

或者

for(String s: arr){ if(s.equals(targetValue)) return true;}return false;

第一种方法可读性更强。

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

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

ArrayList list = new ArrayList(Arrays.asList("a", "b", "c","d"));for (int i = 0; i < list.size(); i++) { list.remove(i);}System.out.println(list);

结果打印:

[b, d]

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

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

ArrayList list = new ArrayList(Arrays.asList("a", "b", "c","d"));for (String s : list) { if (s.equals("a")) list.remove(s);}

将抛出ConcurrentModificationException异常。

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

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()的源码。

HashTable与HashMap

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

更多信息:HashMap vs. TreeMap vs. Hashtable vs. LinkedHashMap Top 10 questions about Map

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

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

请看如下代码,add方法使用了一个原始类型的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);}

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

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

使用原始类型集合非常危险,因为它跳过了泛型类型检查,是不安全的。另外,Set, Set, 和Set这三个有很大的不同,具体请看:类型擦除和Raw type vs. Unbounded wildcard。

访问级别

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

相关阅读:public, default, protected, and private

ArrayList和LinkedList

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

可变与不可变

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

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

String result="";for(String s: arr){ result = result + s;}

另外,在有些其它情况下也是需要使用可变对象。例如往一个方法传入一个可变对象,然后收集多种结果,而不需要

写太多的语法。另一个例子是排序和过滤:当然,你可以写一个方法来接收原始的集合,并且返回一个排好序的集合,但是那样对于大的集合就太浪费了。

Why we need mutable classes?

父类和子类的构造方法

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

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

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

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

public Super(){ System.out.println("Super");}

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

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

""还是构造方法

有两种创建字符串的方式:

//1. use double quotesString x = "abc";//2. use constructorString y = new String("abc");

它们之间有什么区别呢?

以下代码提供了一个快速回答:

String a = "abcd";String b = "abcd";System.out.println(a == b); // TrueSystem.out.println(a.equals(b)); // TrueString c = new String("abcd");String d = new String("abcd");System.out.println(c == d); // FalseSystem.out.println(c.equals(d)); // True

感谢各位的阅读,以上就是"Java开发人员有哪些最常犯的错误"的内容了,经过本文的学习后,相信大家对Java开发人员有哪些最常犯的错误这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

方法 对象 类型 可变 元素 人员 开发 代码 错误 原始 编译 情况 编译器 循环 子类 之间 例子 时候 更多 学习 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网高科技 百单网互联网科技有限公司怎么样 互联网科技巨头监管 互联网科技财经 互联网科技开发公司 赫美联合互联网科技 互联网金融 科技创新 汉立互联网科技有限公司联系电话 须眉科技是互联网公司吗 互联网教育科技公司vipkid 重庆威客帮互联网科技 湖北码尼互联网科技有限公司电话 华夏互联网科技业 成都互联网科技公司工作好不好 速维有品互联网信息科技(苏州)有限公司 中国科技创新与世界互联网大会 互联网方面的科技前沿 从那以后互联网科技有限公司 济南小医互联网科技有限公司招聘 互联网科技收购价值 江苏根荣互联网科技 港股互联网科技股 互联网 科技公司 世界互联网领先科技成果 互联网科技博主是什么意思 昭通互联网科技选哪家 广州梦谷互联网科技有限公司领导 北京军民互联网科技公司 互联网的黑科技实验室 六子台科技互联网展会
0