今天我就给大家总结一下Java开发人员经常犯的10大错误。

#1 将数组转换为ArrayList

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

List < String > list = 数组。asList ( arr );

Arrays.asList()将返回ArrayList其中是私有静态类的Arrays,而不是java.util.ArrayList该类。该java.util.Arrays.ArrayList班有set(),get(),contains()方法,但没有添加元素的任何方法,所以它的大小是固定的。要创建一个real ArrayList,您应该执行以下操作:

的ArrayList <字符串>的ArrayList = 的ArrayList <字符串> (阵列。asList ( ARR ));

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

#2。检查数组是否包含值

开发人员经常这样做:

组<字符串>组= 的HashSet <字符串> (阵列。asList ( ARR )); 返回集。包含( targetValue );

该代码有效,但是无需先转换列表即可设置。将列表转换为集合需要额外的时间。它可以很简单:

数组。asList ( arr )。包含( targetValue );

要么

for (字符串 s : arr ){

if ( s 等于( targetValue ))

返回 true ; } 返回 假的;

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

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

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

的ArrayList <字符串>列表= 的ArrayList <字符串> (阵列。asList (“A” ,“B” ,“C” ,“d” )) ; INT我= 0 ;我<。列表大小();我++ ){

列表。删除( i ); } 系统。出 。println (列表);

输出为:

[b,d]

该方法存在严重的问题。删除元素后,列表的大小会缩小,索引也会更改。因此,如果您想通过使用索引删除循环中的多个元素,那将无法正常工作。

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

的ArrayList <字符串>列表= 的ArrayList <字符串> (阵列。asList (“A” ,“B” ,“C” ,“d” )) ;

for (字符串 s : list ) {

如果 ( s。等于(“ a” ))

list。除去(小号); }

它将抛出ConcurrentModificationException。

相反,可以执行以下操作:

的ArrayList <字符串>列表= 的ArrayList <字符串> (阵列。asList (“A” ,“B” ,“C” ,“d” )) ;

Iterator < String > iter =列表。迭代器(); ( ITER。hasNext ()){ 字符串小号= ITER。next ();

if ( s。等于(“ a” )) {

iter。删除();

} }

.next()必须在之前调用.remove()。在foreach循环中,编译器将.next()在元素删除操作之后进行调用,从而导致ConcurrentModificationException。您可能需要看一下ArrayList.iterator()的源代码。

#4。哈希表与哈希图

按照算法中的约定,Hashtable是数据结构的名称。但是在Java中,数据结构的名称为HashMap。Hashtable和之间的主要区别HashMap之一Hashtable是同步。因此,通常您不需要Hashtable,而HashMap应该使用。

HashMap与TreeMap,Hashtable与LinkedHashMap 
有关地图的十大问题

#5。使用原始集合类型

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

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

public static void add (List list,Object o ){

列表。加( o ); } 公共 静态 无效主(字符串[ ] ARGS ){

列表<字符串>列表= 的ArrayList <字符串> ();

加( list,10 );

字符串 s =列表。得到(0 ); }

此代码将引发异常:

线程“主”中的异常java.lang.ClassCastException:无法将java.lang.Integer强制转换为java.lang.String

在 ...

使用原始类型集合很危险,因为原始类型集合会跳过泛型类型检查并且不安全。之间存在巨大差异Set,Set<?>和Set<Object>。查看
原始类型与无限制通配符以及类型擦除。

#6。访问权限

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

公共,默认,受保护和私有

#7。ArrayList与LinkedList

当开发人员不知道之间的区别ArrayList和LinkedList,他们经常使用ArrayList,因为它看起来很熟悉。但是,它们之间存在巨大的性能差异。简而言之,LinkedList如果有大量的添加/删除操作并且没有很多随机访问操作,则应首选此方法。如果您是新手,请查看ArrayListvs.LinkedList以获得有关其性能的更多信息。

#8。可变与不可变

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

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

字符串结果= “” ; for (字符串 s : arr ){

结果=结果+ s ; }

还有其他一些情况需要可变对象。例如,将可变对象传递给方法可让您收集多个结果,而无需跳过太多的语法箍。另一个示例是排序和过滤:当然,您可以创建一个采用原始集合并返回已排序集合的方法,但是这对于较大的集合将变得非常浪费。(摘自dasblinkenlight关于堆栈溢出的回答)

为什么字符串是不可变的?

#9。Super和Sub的构造函数

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

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

要解决此问题,只需1)将Super()构造函数添加到Super类,例如

公共 Super (){

系统。出来。println (“超级” );}

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

Super和Sub的构造函数

#10。“”还是构造函数?

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

// 1。使用双引号String x = “ abc” ; // 2。使用构造函数String y = new String (“ abc” );

有什么区别?

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

字符串 a = “ abcd” ; 字符串 b = “ abcd” ; 系统。出来。println ( a == b ); // True System。出来。println ( a。等于( b )); //正确

字符串 c = 字符串(“ abcd” );字符串 d = 字符串(“ abcd” );系统。出来。println ( c == d ); //错误的系统。出来。println ( c。等于( d )); //正确

最后

开发这么多年我也总结了一套学习Java的资料与面试题,如果你在技术上面想提升自己的话,可以关注我,私信发送领取资料或者在评论区留下自己的联系方式,有时间记得帮我点下转发让跟多的人看到哦。

java构造函数_Java开发人员也会犯的十大错误相关推荐

  1. SearchHit转成java对象_Java开发中最常犯的10个错误,你中招了吗?

    http://www.programcreek.com/2014/05/top-10-mistakes-java-developers-make/ 阅读目录 Array转ArrayList 判断一个数 ...

  2. java contains_Java开发人员犯的十大错误,你犯几个?

    本篇为译文: 这个列表总结了Java开发人员经常犯的十大错误. 1.将Array转换为ArrayList 若要将数组转换为ArrayList开发人员经常这样做: List<String> ...

  3. 中国父母常犯的十大错误(转载)

    中国父母常犯的十大错误,如何对待孩子,如何教育孩子,值得深思............. (一)让保姆爷爷奶奶带孩子.不自己亲自照顾 很多中国父母以为孩子只要身边有人看著,没有生命危险就好.其实从出生开 ...

  4. Java开发人员最常犯的10个错误,你犯过几个?

    点击蓝色"程序猿DD"关注我哟 加个"星标",不忘签到哦 来源:http://t.cn/EJscOju 阅读目录 Array转ArrayList 判断一个数组是 ...

  5. javascript错误_JavaScript开发人员最常犯的10个错误

    javascript错误 常见错误1:对" this'错误引用 (Common Mistake #1: Incorrect references to 'this') As JavaScri ...

  6. Spring 常犯的十大错误,打死都不要犯!

    1. 错误一:太过关注底层 我们正在解决这个常见错误,是因为 "非我所创" 综合症在软件开发领域很是常见.症状包括经常重写一些常见的代码,很多开发人员都有这种症状. 虽然理解特定库 ...

  7. java三件套_Java开发人员应该知道的三件事

    java三件套 对于那些长期关注JavaOne 2012会议的读者来说,这是一篇有趣的文章. 我最近对Java冠军Heinz Kabutz的采访引起了我的注意: 包括他的Java内存难题程序,从Jav ...

  8. AngularJS开发人员最常犯的10个错误

    简介 AngularJS是目前最为活跃的Javascript框架之一,AngularJS的目标之一是简化开发过程, 这使得AngularJS非常善于构建小型app原型,但AngularJS对于全功能的 ...

  9. 学习围棋,你最容易犯的十大错误!

    围棋不管是在古代还是在现代都是品味和身份的象征,深受广大人民的喜爱,但围棋不像五子棋那么简单易学,相对五子棋来说,围棋玩法多变奥妙无穷.围棋高手对决都是眼观六路,耳听八方.稍有不甚就会满盘皆输. 下面 ...

最新文章

  1. 在linux下安装配置DNS服务器
  2. Python Django 装饰器模式之二阶装饰器
  3. bat java 启动脚本_bat批处理启动java程序通用脚本
  4. Win11任务栏如何设置在顶部
  5. ansys icem cfd网格划分技术实例详解_详解航空燃油滑油3D打印热交换器设计流程...
  6. EventLoop,TcpClient,TcpServer 中的生命周期
  7. plsql能连mysql吗_每日囧图连世界首富都秃顶,你还觉脱发是能用钱解决的事吗?...
  8. spark sql 给dataframe列重命名的三种方式
  9. 初级第七课——模拟计算器
  10. android加载框效果《IT蓝豹》
  11. 什么是 Rootkit?
  12. java第一个helloworld_Java第一个程序--HelloWorld
  13. EL表达式和JSTL的介绍以及基本使用
  14. 联想拯救者 Y7000 Ubuntu 16.04无线网卡驱动安装踩坑教程
  15. Diss GitHub被收购?说不定是件大喜事呢!
  16. selenium之使用driver及其属性
  17. 第四周项目3---单链表的应用之连接
  18. 什么是APS系统?其重要功能有哪些?这篇文章写得很清楚
  19. 我的互联网创业公司的第一笔收入磨难记
  20. 阿里撤退百度放弃,应用商店十年神话终落幕

热门文章

  1. 2.2 获取图像感兴趣区域_几何变换图像裁剪
  2. P4 数据记录增删查改操作
  3. 100分制的成绩转换(C语言)(查表法)
  4. 不要在有反馈的平台上输出
  5. tensorflow内存溢出问题
  6. JS小技巧 ----- 在onmousedown事件下避免文本选取
  7. 记坑 ----- Arrays.sort()
  8. leetcode877.StoneGame
  9. poj2689Prime Distance
  10. Linux学习总结(八)-磁盘格式化,挂载,swap扩容