当前位置: 首页 > news >正文

java的开发人员数量_Java开发人员最容易出现的几类错误

一、把数组转成ArrayList

List list = Arrays.asList(arr);

//以下带伪代码来自Arrays类中

public static List asList(T... a) {

return new ArrayList<>(a);

}

private static class ArrayList extends AbstractList

implements RandomAccess, java.io.Serializable

{

private static final long serialVersionUID = -2764017481108945198L;

private final E[] a;

ArrayList(E[] array) {

a = Objects.requireNonNull(array);

}

}

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

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

ArrayList list = new ArrayList(Arrays.asList("a","b","c","d"));for(int i=0;i

list.remove(i);

}

System.out.println(list);

输出结果:

[b,d]

以上代码的目的是想遍历删除list中所有元素,但是结果却没有成功。原因是忽略了一个关键的问题:当一个元素被删除时,列表的大小缩小并且下标也会随之变化,所以当你想要在一个循环中用下标删除多个元素的时候,它并不会正常的生效。

也有些人知道以上代码的问题就由于数组下标变换引起的。所以,他们想到使用增强for循环的形式:

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

list.remove(s);

}

}

但是,很不幸的是,以上代码会抛出ConcurrentModificationException,有趣的是,如果在remove操作后增加一个break,代码就不会报错:

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

list.remove(s);break;

}

}

迭代器被创建之后会建立一个指向原来对象的单链索引表,当原来的对象数量发生变化时,这个索引表的内容不会同步改变,所以当索引指针往后移动的时候就找不到要迭代的对象,所以按照 fail-fast 原则 迭代器会马上抛出java.util.ConcurrentModificationException 异常。

所以,正确的在遍历过程中删除元素的方法应该是使用Iterator:

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()方法之前调用。如果在循环过程中先调用remove(),再调用next(),就会导致异常ConcurrentModificationException。原因如上。

三、迷之求和

public voidtest_add(){int num = 0;for (int i = 0; i < 100; i++) {

num= num++;

}

System.out.println(num);

}

最终 num 结果为 0,num++ 根本没起啥作用。因为后++,是先用结果,在++操作,不会给赋值。正确写法是:num = ++ num;

四、无用日志

public booleanruleEngine(MatterReq req) {try{//业务流程

} catch(Exception e) {

logger.error(e);//只打异常,不打入参信息

}

}

五、耗时遍历

public voidtest_LinkedList() {//初始化100万数据

List list = new LinkedList(1000000);//遍历求和

int sum = 0;for (int i = 0; i < list.size(); i++) {

sum+=list.get(i);

}

}

乍一看可能觉得没什么问题,但是这个遍历求和会非常慢。主要因为链表的数据结构,每一次list.get(i)都是从链表的头开始查找,与ArrayList不同,LinkedList它时间复杂度是O(n)。那如果说你不知道对方传过来的是LinkedList还是ArrayList呢,其实可以通过list instanceof RandomAccess 进行判断。ArrayList 有随机访问的实现,LinkedList 是没有。同时也可以使用增强的for循环或者Iterator进行遍历。

相关文章:

  • 字符串加减转数字java_剑指Offer解题报告(Java版)——字符串转换为数字 49
  • Java txt 下拉刷新_「小程序JAVA实战」小程序页面的上拉下拉刷新(50)
  • Java语言西安交大高起专_2018年西安交大网络学院高起专/本英语入学考试复习题...
  • php 生成不了zip文件怎么打开吗,PHP生成压缩包,不带根目录 | 学步园
  • php变量持有对象的引用,我对PHP变量引用、对象引用的理解
  • php 自动填写表单,PHP自动生成表单代码分享
  • 记事本底部的java切换,如何使用java操作记事本(转)
  • php类调用类外变量吗,如何调用类外的变量
  • matlab中单相整流器,一种新型单相脉冲整流器的MATLAB仿真研究
  • matlab中支持向量机网格,MATLAB中SVM(支持向量机)的用法
  • mysql出现帮助,MySQL之帮助的使用
  • 不会matlab下载,下载的用MATLAB实现的DTW算法,不会用,跪求大神帮忙
  • mysql序列号重置,当我们更改小于当前序列号的AUTO_INCREMENT值时,MySQL将返回什么?...
  • mysql聚合函数详解,MySQL常用聚合函数详解
  • php 年月日自动更新,php生成年月日下载列表的方法
  • [PHP内核探索]PHP中的哈希表
  • [分享]iOS开发 - 实现UITableView Plain SectionView和table不停留一起滑动
  • 【140天】尚学堂高淇Java300集视频精华笔记(86-87)
  • C++类的相互关联
  • docker容器内的网络抓包
  • Electron入门介绍
  • hadoop集群管理系统搭建规划说明
  • Java IO学习笔记一
  • JavaScript设计模式之工厂模式
  • Java反射-动态类加载和重新加载
  • js写一个简单的选项卡
  • mysql innodb 索引使用指南
  • Python_OOP
  • Python学习之路16-使用API
  • 大型网站性能监测、分析与优化常见问题QA
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 我建了一个叫Hello World的项目
  • 我看到的前端
  • 硬币翻转问题,区间操作
  • 在Docker Swarm上部署Apache Storm:第1部分
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • ​iOS安全加固方法及实现
  • ​渐进式Web应用PWA的未来
  • #1014 : Trie树
  • #pragma pack(1)
  • ( 用例图)定义了系统的功能需求,它是从系统的外部看系统功能,并不描述系统内部对功能的具体实现
  • (Arcgis)Python编程批量将HDF5文件转换为TIFF格式并应用地理转换和投影信息
  • (C语言)逆序输出字符串
  • (zz)子曾经曰过:先有司,赦小过,举贤才
  • (二)hibernate配置管理
  • (求助)用傲游上csdn博客时标签栏和网址栏一直显示袁萌 的头像
  • (十八)用JAVA编写MP3解码器——迷你播放器
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • .net core MVC 通过 Filters 过滤器拦截请求及响应内容
  • .net core 连接数据库,通过数据库生成Modell
  • .NET和.COM和.CN域名区别
  • [ Linux ] git工具的基本使用(仓库的构建,提交)
  • [ 手记 ] 关于tomcat开机启动设置问题
  • [【JSON2WEB】 13 基于REST2SQL 和 Amis 的 SQL 查询分析器