惊呆了!Java程序员最常犯的错竟然是这10个

和绝大多数的程序员一样,我也非常的宅。周末最奢侈的享受就是逛一逛技术型网站,比如说 programcreek,这个小网站上有一些非常有意思的主题。比如说:Java 程序员最常犯的错竟然是这 10 个,像这类令人好奇心想害死猫的主题,非常值得扒出来给大家分享一下。

PS:别问我“为什么标题要加上‘惊呆了’?”问了答案就只有一个——吓唬人——总得勾起大家的阅读兴趣嘛(我容易吗我)。

01、把 Array 转成 ArrayList

说实在的,很多 Java 程序员喜欢把 Array 转成 ArrayList:

List<String> list = Arrays.asList(arr);

但实际上,Arrays.asList() 返回的 ArrayList 并不是 java.util.ArrayList,而是 Arrays 的内部私有类 java.util.Arrays.ArrayList。虽然名字完全相同,都是 ArrayList,但两个类有着很大的不同。Arrays.ArrayList 虽然有 set()get()contains() 等方法,但却没有一个方法用来添加元素,因此它的大小是固定的。

如果想创建一个真正的 ArrayList,需要这样做:

List<String> list = new ArrayList<String>(Arrays.asList(arr));

ArrayList 的构造方法可以接收一个 Collection 类型的参数,而 Arrays.ArrayList 是其子类,所以可以这样转化。

02、通过 Set 检查数组中是否包含某个值

之前我在写一篇文章《如何检查Java数组中是否包含某个值 》中曾提到一种方法:

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

这种方法确实可行,但却忽视了性能问题;为了能够尽快完成检查,可以这样做:

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

或者使用普通的 for 循环或者 for-each。

03、通过 for 循环删除列表中的元素

新手特列喜欢使用 for 循环删除列表中的元素,就像这样:

List<String> list = new ArrayList<String>(Arrays.asList("沉", "默", "王", "二"));
for (int i = 0; i < list.size(); i++) {list.remove(i);
}
System.out.println(list);

上面这段代码的目的是把列表中的元素全部删除,但结果呢:

[,]

竟然还有两个元素没删除,why?

当 List 的元素被删除时,其 size() 会减小,元素的下标也会改变,所以想通过 for 循环删除元素是行不通的。

那 for-each 呢?

for(String s : list) {if ("沉".equals(s)) {list.remove(s);}
}System.out.println(list);

竟然还抛出异常了:

Exception in thread "main" java.util.ConcurrentModificationExceptionat java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909)at java.util.ArrayList$Itr.next(ArrayList.java:859)at com.cmower.java_demo.programcreek.Top10Mistake.main(Top10Mistake.java:15)

抛出异常的原因,可以查看我之前写的文章《Java,你告诉我 fail-fast 是什么鬼?》。

有经验的程序员应该已经知道答案了,使用 Iterator:

Iterator<String> iter = list.iterator();
while (iter.hasNext()) {String s = iter.next();if (s.equals("沉")) {iter.remove();}
}System.out.println(list);

程序输出的结果如下:

[,,]

04、使用 Hashtable 而不是 HashMap

通常来说,哈希表应该是 Hashtable,但在 Java 中,哈希表通常指的是 HashMap。两者之间的区别之一是 Hashtable 是线程安全的。如果没有特殊要求的话,哈希表应该使用 HashMap 而不是 Hashtable。

05、使用原始类型

在 Java 中,新手很容易混淆无限通配符和原始类型之间的差别。举例来说,List<?> list 为无限通配符,List list 为原始类型。

来看下面这段代码:

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, 18);add(list, "沉默王二");String s = list.get(0);
}

这段代码在运行时会抛出异常:

Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Stringat com.cmower.java_demo.programcreek.Top10Mistake.main(Top10Mistake.java:38)

使用原始类型非常的危险,因为跳过了泛型的检查。至于 List<Object>List 之间的区别,查看我写的另外一篇文章:《为什么不应该使用Java的原始类型》。

06、使用 public 修饰字段

有些新手喜欢使用 public 修饰字段,因为不需要 getter/setter 方法就可以访问字段。但实际上,这是一个非常糟糕的设计;有经验的程序员更习惯于提供尽可能低的访问级别。

07、使用 ArrayList 而不是 LinkedList

新手往往搞不清楚 ArrayList 和 LinkedList 之间的区别,因此更倾向于使用 ArrayList,因为比较面熟。但是呢,它们之间存在巨大的性能差异。简单的说吧,如果“添加/删除”的操作比较多,而“获取”的操作比较少,则应该首选 LinkedList。

08、使用过多的不可变对象

不可变对象有着不少的优点,比如说简单性和安全性。但是呢,如你所料,它也有一些难以抗拒的弊端:对于每一个不同的值,它都需要一个单独的对象来表示,这样的对象太多的话,很可能会导致大量的垃圾,回收的成本就变得特别高。

为了在可变与不可变之间保持平衡,通常会使用可变对象来避免产生太多中间对象。一个经典的例子就是使用 StringBuilder(可变对象) 来连接大量的字符串,否则的话,String(不可变对象)会产生很多要回收的垃圾。

反例:

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

正例:

StringBuilder result = new StringBuilder();
for (String s: strs) {result.append(s);
}

参考文章:为什么 Java 字符串是不可变的?

09、父类没有默认的无参构造方法

在 Java 中,如果父类没有定义构造方法,则编译器会默认插入一个无参的构造方法;但如果在父类中定义了构造方法,则编译器不会再插入无参构造方法。所以下面的代码会在编译时出错。

子类中的无参构造方法试图调用父类的无参构造方法,但父类中并未定义,因此编译出错了。解决方案就是在父类中定义无参构造方法。

10、使用构造方法创建字符串

创建字符串有两种方法:

1)使用双引号

String er = "沉默王二";

2)使用构造方法

String san = new String("沉默王三");

但是它们之间有着很大的不同(可以参照创建 Java 字符串,用""还是构造函数),双引号被称为字符串常量,可以避免重复内容的字符串在内存中创建。

好了,读者朋友们,以上就是本文的全部内容了。可以掏心窝子地说,没有任何客观的数据来证明它们就是前十名,但绝对非常普遍。如果不认可其中的内容,请在留言区轻喷,好人有好报。如果觉得不过瘾,还想看到更多,可以 star 二哥的 GitHub【itwanger.github.io】,本文已收录。

原创不易,如果觉得有点用的话,请不要吝啬你手中点赞的权力——这将是我最强的写作动力;如果想要第一时间看到二哥更新的文章,请扫描下方的二维码,关注【沉默王二】公众号。我们下篇文章见!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/14488.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

spring boot从0到实战 全

前言&#xff1a;看到这篇博客的小可爱们&#xff0c;这篇博客是我自己从0到实战的笔记&#xff0c;后面我会附上我整个过程的源码给大家参考&#xff0c;一起加油把。 同时&#xff0c;这是上一篇博客&#xff0c;SpringBoot详解&#xff0c;完整版。从0到1&#xff01;&#…

FFT蝶形算法的verilog实现专题——从FFT算法的定义开始入手

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 FFT蝶形算法的verilog实现专题——从FFT算法的定义开始入手 先从FFT的定义入手&#xff1a; 一个N 点序列x(n) 的DFT 定义为: 下面用MATLAB程序来面熟一下上述这个式子&…

SAP 电商云 Spartacus UI 修改 Delivery Mode 触发的三个 HTTP 请求

LoaderState&#xff1a; loading 状态在 true 和 false 之间的切换&#xff0c;通过 loader .reducer.ts 里的 reducer 函数进行。每次通过 store.dispatch 往 store 里投递新的 action 时&#xff0c;都会触发该 reducer 的执行。 添加上打印日志&#xff1a; 设置 delive…

再送签名书20本、红包封面10000个

大家好&#xff0c;我是北妈 福利又来了&#xff0c;由于北妈红包封面抢手&#xff0c;又增加了 10000个&#xff0c;没领到的赶紧转发&#xff0c;让亲朋好友来领取。 然后下面送签名书喽。 1、送书 又到了送北妈签名书的时候&#xff0c;凑着要放假&#xff0c;赶紧上车关门&…

vue3.0 非常面熟的错误

1&#xff0c;标签错误 ​​​​ 错误文件所在的目录 \src\views\HomeView.vue:2:3 没有结束标签~ 2.编译问题 Compiled with problems: 编译问题 C:\myel\src\views\HomeView.vue 错误出现文件 3:1 error Mixed spaces and tabs no-mixed-spaces-and-tabs 4:1 error M…

Chat GPT5的主要介绍

Chat GPT-5是一种基于人工智能技术的对话系统&#xff0c;用于进行自然语言处理和对话&#xff0c;以提供更好的服务。 它是由OpenAI公司开发的&#xff0c;是GPT系列的最新版本。 GPT代表着"生成式预训练"&#xff0c;因此Chat GPT-5基于神经网络&#xff0c;通过预…

ChatGPT:探索RLHF与GPT的完美结合

前言 ChatGPT已经发布一周了热度依旧不减&#xff0c;ChatGPT也各种大显神通&#xff0c;为各大网友“出谋划策”&#xff0c;有写周报的&#xff0c;有写绩效的甚至还有写论文的&#xff0c;作为一个NLP从业者&#xff0c;除了好好体验下其中的乐趣&#xff0c;其背后的原理当…

一场场网络时代的“墨攻”

编辑&#xff1a;阿冒 设计&#xff1a;沐由 公输般为楚造云梯之械成&#xff0c;将以攻宋。子墨子闻之&#xff0c;起于鲁&#xff0c;行十日十夜&#xff0c;而至于郢&#xff0c;见公输般。 子墨子解带为城&#xff0c;以牒为械&#xff0c;公输般九设攻城之机变&#xff0c…

人工智能在网络犯罪中的应用:5个最重要的趋势

在当今的数字世界中&#xff0c;网络威胁不断演变。 人工智能的使用虽然在网络犯罪中还不是必须的&#xff0c;但无疑是我们将在未来几年看到的具有重大发展的最有前途的技术之一。 随着 AI 技术的进步&#xff0c;攻击者开始尝试新的、越来越复杂和有效的攻击模式和技术。 …

【CICC原创】大模型技术发展研判及应用思考

来源&#xff1a;中国指挥与控制学会 蒲志强&#xff0c;研究员&#xff0c;中国科学院自动化研究所 近年来&#xff0c;随着人工智能&#xff08;Artificial Intelligence, AI&#xff09;技术的深化发展&#xff0c;大模型&#xff08;Large Model,也称基础模型&#xff0c;即…

从ChatGPT看人工智能的军事应用

来源&#xff1a;中国军网 今年3月中旬&#xff0c;聊天机器人程序ChatGPT推出了最新版本GPT-4,可支持多元的输入输出形式&#xff0c;使其具备了更强的专业学习能力。作为一种基于人工智能&#xff08;以下简称AI&#xff09;技术的聊天程序&#xff0c;ChatGPT一经推出&#…

ChatGPT全面升级,GPT4支持多模态数据。

Open AI在3月14日放了大招&#xff0c;GPT4. 不同于ChatGPT&#xff0c;GPT4是支持多模态数据&#xff0c;目前上去看了下&#xff0c;支持图片和文本两种数据格式。 另外&#xff0c;宣传视频中说&#xff1a;GPT4去年8月就完成了训练&#xff0c;只是为了数据和使用安全方…

揭秘中国开发者真实现状:月薪 8k-17k 占比骤减!

作者 | 郑丽媛 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 瞬息万变的技术圈&#xff0c;似乎随时都在给予技术人数不清的机遇与挑战&#xff1a; 过去一年&#xff0c;频繁出圈的虚拟人曾一度将元宇宙的热度推至巅峰&#xff0c;如今却逐渐“悄无声息”&…

中文互联网正在被AI污染

有没有发现&#xff0c;如今&#xff0c;AI越来越火&#xff0c;但AI生成的垃圾信息也越来越多了。 如果你打开知乎&#xff0c;很大几率会看到AI生成的回答&#xff0c;它们简短、概括性十足&#xff0c;看了等于没看。打开今日头条&#xff0c;你也有很大几率看到用ChatGPT生…

写好“提示”改变“智造未来”-GPT4提示词驶入代码优化驾驶座心得

开篇 在前端科技的新浪潮中,Artificial Intelligence (AI)的逐渐成熟与发展引领着我们向前。其中OpenAI的GPT4提供了我们一种新的可能,帮助我们优化代码,使编程变得更加轻松。在这篇文章中,我们将一同探究如何在1-2分钟内,依靠GPT的提示词优化我们的代码,并展现出我们在…

惊天大绝招-用话术诱导GPT掏出图片来!

开篇 今天我要开大家的眼界!来给大家揭示一个运用Prompts的小诡计。 这个技巧的亮点就在于,即使现在的ChatGPT(适应4版本哦)还没学会把画面呈现出来,我们依然可以借助这个小技巧,让它以图画的形式呼应我们的问题。 对于我们聪明的听众们,我要揭晓的第一件事是这个技巧…

比ChatGPT还好用?收藏10+免费实用的AI工具,轻松提高办公效率

ChatGPT的爆火引发了AI工具的热潮&#xff0c;阿强通过这一段时间对AI工具观察和体验过后&#xff0c;帮大家整理了10好用AI工具&#xff0c;可以应用在不同的工作场景中&#xff0c;比如AI设计、AI办公、AI自媒体&#xff0c;帮你轻松提高工作效率&#xff0c;上班摸鱼也能升值…

ChatGPT 提示语——AI提示词玩家,提示词就是和AI沟通语言的桥梁!

前言&#xff1a; 众所周知&#xff0c;在AI的世界里&#xff0c;提示词就是和AI沟通语言的桥梁&#xff0c;提示关键词常用于AI对话及AI绘画等相关场景&#xff0c;通过准确的使用关键词&#xff0c;你就能更好的让AI辅助自己的工作&#xff0c;其中的成分重要性不言而喻&…

ChatGpt基于第三方API2D服务封装的SpringBoot starter

前置条件&#xff1a; 看下API2D官网&#xff0c;第三方API2D服务对接流程&#xff1a; 其对接文档地址 https://api2d.com/wiki/doc 一:创建一个空的Maven项目 完成后整的项目层级图如下 1.pom.xml 中添加相关依赖包 <?xml version"1.0" encoding"UTF-…

ChatGPT开发【一】:打造与ChatGPT默契互动的绝佳输入格式

点击加入->【OpenAI-API开发】技术交流群 文章目录 1. 导入openai库2.示例聊天API调用3.GPT-3.5-Turbo-0301的使用技巧系统消息Few-show prompt 4.计数Token数 Chatgpt由Openai最先进的型号 gpt-3.5-Turbo和 gpt-4提供支持。我们可以使用OpenAI API使用 GPT-3.5-Turbo或…