首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Java 开发人员经常犯的 10 大错误

Java 开发人员经常犯的 10 大错误

作者头像
淡定的蜗牛
修改于 2019-09-17 10:25:16
修改于 2019-09-17 10:25:16
7200
举报
文章被收录于专栏:Java知己Java知己

我们在这里总结了Java开发人员经常犯的十大错误,看看你中了几个?

1、将Array转换为ArrayList


要将Array转换为 ArrayList,开发人员通常会这样做:

代码语言:txt
AI代码解释
复制
List<String> list = Arrays.asList(arr);

Arrays.asList()将返回ArrayList一个私有静态类Arrays,不是它java.util.ArrayList类。该java.util.Arrays.ArrayList类只有set()get()contains()方法,但没有添加元素的任何方法,所以它的大小是固定的。要创建一个真实的ArrayList,你应该做:

代码语言:txt
AI代码解释
复制
ArrayList<String> arrayList = new ArrayList<String>(Arrays.asList(arr));

构造函数ArrayList可以接受Collection类型,它也是一个超类型java.util.Arrays.ArrayList

2、检查数组是否包含指定值


开发人员经常这样做:

代码语言:txt
AI代码解释
复制
Set<String> set = new HashSet<String>(Arrays.asList(arr));
return set.contains(targetValue);

代码可以工作,但不需要先将列表转换为set。将列表转换为集合需要额外的时间。它可以很简单:

代码语言:txt
AI代码解释
复制
Arrays.asList(arr).contains(targetValue);

要么

代码语言:txt
AI代码解释
复制
for(String s: arr){
    if(s.equals(targetValue))
        return true;
}
return false;

第一个比第二个可读性更强。

3、从循环内的列表中删除元素


请考虑以下代码,该代码在迭代期间删除元素:

代码语言:txt
AI代码解释
复制
ArrayList<String> list = new ArrayList<String>(Arrays.asList("a", "b", "c", "d"));
for (int i = 0; i < list.size(); i++) {
    list.remove(i);
}
System.out.println(list);

输出是:

代码语言:txt
AI代码解释
复制
[b, d]

这种方法存在严重问题。删除元素后,列表的大小会缩小,索引也会更改。因此,如果要使用索引删除循环内的多个元素,则无法正常工作。

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

代码语言:txt
AI代码解释
复制
ArrayList<String> list = new ArrayList<String>(Arrays.asList("a", "b", "c", "d"));
 
for (String s : list) {
    if (s.equals("a"))
        list.remove(s);
}

它会抛出ConcurrentModificationException。

相反,以下是可以的:

代码语言:txt
AI代码解释
复制
ArrayList<String> list = new ArrayList<String>(Arrays.asList("a", "b", "c", "d"));
Iterator<String> iter = list.iterator();
while (iter.hasNext()) {
    String s = iter.next();
 
    if (s.equals("a")) {
        iter.remove();
    }
}

.next()必须必须.remove()之前调用。在foreach循环中,编译器.next()在删除元素的操作后进行调用,从而导致ConcurrentModificationException

4、Hashtable vs HashMap


根据算法中的约定,Hashtable是数据结构的名称。但在Java中,数据结构的名称是HashMapHashtableHashMap之间的关键区别之一是Hashtable是同步。所以你经常不需要Hashtable,而HashMap经常使用。

5、使用原始类型的集合


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

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

代码语言:txt
AI代码解释
复制
public static void add(List list, Object o){
    list.add(o);
}
public static void main(String[] args){
    List<String> list = new ArrayList<String>();
    add(list, 10);
    String s = list.get(0);
}

此代码将抛出异常:

代码语言:txt
AI代码解释
复制
Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
    at ...

使用原始类型集合很危险,因为原始类型集合跳过泛型类型检查而不安全。之间存在巨大差异SetSet<?>Set<Object>

6、访问权限


开发人员经常将public用于所有的类成员变量。通过直接引用很容易获得字段值,但这是一个非常糟糕的设计。经验法则是为成员提供尽可能低的访问级别。

7、ArrayList与LinkedList


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

正是金九银十跳槽季,为大家收集了2019年最新的面试资料,有文档、有攻略、有视频。有需要的同学可以在公众号【Java知己】,发送【面试】领取最新面试资料攻略!

8、可变与不可变


不可变对象具有许多优点,例如简单性,安全性等。但是对于每个不同的值,它需要单独的对象,并且太多的对象可能导致高的垃圾收集成本。在可变和不可变之间进行选择时应该保持平衡。

通常,可变对象用于避免产生太多中间对象。一个典型的例子是连接大量字符串。如果使用不可变字符串,则会产生大量符合垃圾收集条件的对象。这会浪费CPU上的时间和精力,使用可变对象正确的解决方案(例如StringBuilder)。

代码语言:txt
AI代码解释
复制
String result="";
for(String s: arr){
    result = result + s;
}

在需要可变对象时还有其他情况。例如,将可变对象传递给方法可以让您收集多个结果,而不会跳过太多语法箍。另一个例子是排序和过滤:当然,您可以创建一个获取原始集合的方法,并返回一个已排序的方法,但这对于较大的集合来说会变得非常浪费。

9、Super和Sub的构造函数


发生此编译错误,因为默认的超级构造函数是未定义的。在Java中,如果类没有定义构造函数,编译器将默认为该类插入默认的无参数构造函数。如果构造函数是在Super类中定义的,在本例中是Super(String s),编译器将不会插入默认的无参数构造函数。这是上面超级类的情况。

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

要解决这个问题,只需1)将Super() 构造函数添加到Super类中即可

代码语言:txt
AI代码解释
复制
public Super(){
    System.out.println("Super");
}

,或2)删除自定义的超级构造函数,或3)添加super(value)到子构造函数。

10、" "或构造函数?

字符串可以通过两种方式创建:

代码语言:txt
AI代码解释
复制
//1. 使用双引号
String x = "abc";
//2. 使用构造函数
String y = new String("abc");

有什么区别?

以下示例可以提供快速答案:

代码语言:txt
AI代码解释
复制
String a = "abcd";
String b = "abcd";
System.out.println(a == b);  // True
System.out.println(a.equals(b)); // True
 
String c = new String("abcd");
String d = new String("abcd");
System.out.println(c == d);  // False
System.out.println(c.equals(d)); // True

最后


这是我基于对GitHub上的大量开源项目、Stack Overflow问题的分析。没有评估和证明它们恰好是前10名,但绝对是非常普遍的。

如果您不赞同部分内容,请留下您的评论。如果你能指出一些更常见的其他错误,我将非常感谢。

“不积跬步,无以至千里”,希望未来的你能:有梦为马 随处可栖!加油,少年!


本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
java开发人员最常犯的10种错误
使用Arrays.asList()方法可以得到一个ArrayList,但是得到这个ArrayList其实是定义在Arrays类中的一个私有的静态内部类。这个类虽然和java.util.ArrayList同名,但是并不是同一个类。java.util.Arrays.ArrayList类中实现了set(), get(), contains()等方法,但是并没有定义向其中增加元素的方法。也就是说通过Arrays.asList()得到的ArrayList的大小是固定的。
鱼找水需要时间
2023/12/31
2140
Java开发人员最常犯的10个错误
Arrays.asList()会返回一个ArrayList,但是要特别注意,这个ArrayList是Arrays类的静态内部类,并不是java.util.ArrayList类。java.util.Arrays.ArrayList类实现了set(), get(),contains()方法,但是并没有实现增加元素的方法(事实上是可以调用add方法,但是没有具体实现,仅仅抛出UnsupportedOperationException异常),因此它的大小也是固定不变的。为了创建一个真正的java.util.ArrayList,你应该这样做:
程序猿DD
2019/05/28
5120
Java开发者容易犯的十个错误
Top1. 数组转换为数组列表 将数组转换为数组列表,开发者经常会这样做: [java] List<String> list = Arrays.asList(arr); Arrays.asList()将返回一个数组内部是私有静态类的ArrayList,这不是java.util.ArrayList类,java.util.Arrays.ArrayList类有set()、 get()、 contains()方法,但是没有任何加元素的方法,因此它的大小是固定的。可以用于方便转换list,不能添加新元素,所以选择正
七月半夏
2018/06/29
5570
Java常犯错误top10
1. 数组转ArrayList 为了实现把一个数组转换成一个ArrayList,很多java程序员会使用如下的代码: List<String> list = Arrays.asList(arr); Arrays.asList确实会返回一个 ArrayList对象,但是该类是 Arrays类 中一个私有静态内部类,而不是常见的 java.util.ArrayList类。这个java.util.Arrays.ArrayList 类具有 set(),get(),contains()等方法,但是不具有任何添加或移
Java帮帮
2018/03/19
8630
Java常犯错误top10
Java开发人员犯的10大错误
Arrays.asList()将返回 ArrayList私有静态类的 Arrays,而不是 java.util.ArrayList类。该 java.util.Arrays.ArrayList有set(),get(),contains()方法,但没有添加元素的任何方法,所以它的大小是固定的。要创建一个real ArrayList,您应该执行以下操作:
Java架构师必看
2021/05/14
6890
Java开发人员犯的10大错误
Java开发人员最常犯的10个错误,你犯过几个?
Arrays.asList()会返回一个ArrayList,但是要特别注意,这个ArrayList是Arrays类的静态内部类,并不是java.util.ArrayList类。java.util.Arrays.ArrayList类实现了set(), get(),contains()方法,但是并没有实现增加元素的方法(事实上是可以调用add方法,但是没有具体实现,仅仅抛出UnsupportedOperationException异常),因此它的大小也是固定不变的。为了创建一个真正的java.util.ArrayList,你应该这样做:
用户1516716
2019/06/17
3720
Java开发人员最常犯的10个错误,你犯过几个?
Java程序员们最常犯的10个错误
本文总结了Java程序员在日常开发中容易犯的一些错误,包括使用过多的修饰符、忽略代码格式、异常处理不当、不合理的类设计、使用未初始化的变量、不使用类型、遗漏的finally子句、误用或过度使用库、不恰当的缓存、在迭代器中使用集合、在循环中避免使用嵌套循环等。
Java后端工程师
2017/12/07
2.3K0
Java程序员们最常犯的10个错误
Java程序员最常犯的 10 个错误!
使用Arrays.asList()方法可以得到一个ArrayList,但是得到这个ArrayList其实是定义在Arrays类中的一个私有的静态内部类。这个类虽然和java.util.ArrayList同名,但是并不是同一个类。java.util.Arrays.ArrayList类中实现了set(), get(), contains()等方法,但是并没有定义向其中增加元素的方法。也就是说通过Arrays.asList()得到的ArrayList的大小是固定的。
Java技术栈
2019/08/14
4080
Java程序员最常犯的 10 个错误!
Java开发者易犯错误Top10
Arrays.asList()将返回一个数组内部是私有静态类的ArrayList,这不是java.util.ArrayList类,java.util.Arrays.ArrayList类有set()、 get()、 contains()方法,但是没有任何加元素的方法,因此它的大小是固定的。你应该这么做来创建一个真正的数组:
lyb-geek
2018/07/26
1.2K0
Java开发者易犯错误Top10
惊呆了!Java程序员最常犯的错竟然是这10个
和绝大多数的程序员一样,我也非常的宅。周末最奢侈的享受就是逛一逛技术型网站,比如说 programcreek,这个小网站上有一些非常有意思的主题。比如说:Java 程序员最常犯的错竟然是这 10 个,像这类令人好奇心想害死猫的主题,非常值得扒出来给大家分享一下。
沉默王二
2020/02/11
5550
惊呆了!Java程序员最常犯的错竟然是这10个
Java开发人员最常犯的9个错误
这是我觉得java中比较常见的问题。如果您不同意任一部分,请留下您的评论。如果您能提出其它一些常见的错误,我将会非常感激。
IT大咖说
2019/05/07
4800
Java开发人员最常犯的9个错误
Java开发人员最常犯的10个错误
原文链接:https://www.cnblogs.com/chenpi/p/5508949.html
业余草
2019/09/18
3780
Java开发人员最常犯的10个错误
Java编程的一些小技巧-----基础语法篇(1)
今天在github上面看到了一个很好的项目,是在Stack Overflow上面点赞数top100的关于Java的回答,看了一些,感觉十分实用,对于新手来说,能加深对Java的认识,同时也能让代码更简洁。所以想写下这系列的博文,每个回答我都会亲自用代码检验一下,下面一起来看看这些小技巧吧,绝不会让你失望。
秃头哥编程
2019/06/04
6060
Java编程的一些小技巧-----基础语法篇(1)
Java程序员最常犯的错误盘点之Top 10
为了实现把一个数组转换成一个ArrayList,很多Java程序员会使用如下的代码:
Python进击者
2020/02/10
8340
「Java面试题精华集」1w字的Java集合框架篇(2020最新版)附PDF版 !
一个多月前,我和一些小伙伴决定做一系列的 Java 知识点常见重要问题的小册,方便用来夯实基础!小册的标准就一个,那就是:取精华,取重点。每一本小册,我们都会充分关注我们所总结的知识点是否达到这个标准。
Guide哥
2020/06/28
1.3K0
「Java面试题精华集」1w字的Java集合框架篇(2020最新版)附PDF版 !
Java避坑指南:java.util.Arrays工具类避坑记
因为Arrays.asList的参数是一个泛型变长参数,但是java中基本类型是不能泛型化的。
崔认知
2023/06/19
2100
Java避坑指南:java.util.Arrays工具类避坑记
Java基础(十九):集合框架
List除了从Collection集合继承的方法外,List 集合里添加了一些根据索引来操作集合元素的方法
Java微观世界
2025/01/21
5400
Java基础(十九):集合框架
13 Java 集合
Java 集合定义了两种基本的数据结构,一种是 Collection,表示一组对象的集合;另一种是Map,表示对象间的一系列映射或关联关系。Java 集合的基本架构如下图。
acc8226
2022/05/17
2.5K0
13  Java 集合
Java容器大全
Java集合框架(java.util包)主要包括两种类型的容器:一种是集合Collection,存储一个元素集合;另一种是图Map,存储键值对映射。 所有的集合框架都包含:接口、实现(类)、算法。任何对象加入集合类后,自动转变为Object类型,所以在取出的时候,需要进行强制类型转换。
matt
2022/10/25
9520
Java容器大全
如何使用 Java 泛型来避免 ClassCastException
泛型是相关语言特性的集合,它允许类或方法对各种类型的对象进行操作,同时提供编译时类型安全性检查
Java宝典
2021/01/28
2.4K0
相关推荐
java开发人员最常犯的10种错误
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档