瞧瞧bug

1.
问题代码段描述

List<Obj> objList =
ObjUtil.getObjList();
if(null != objList &&
!objList.isEmpty()){
 
  for(Obj p :objList){
       
if(p.getCode().equals(str)){
           
objList.remove(p);
 
      }
 
   }
}

2.bug描述

遇到了如下Exception:

Caused by:
java.util.ConcurrentModificationException
at
java.util.AbstractList$Itr.checkForComodification(Unknown Source)
at
java.util.AbstractList$Itr.next(Unknown Source)

3.问题描述

这个错误从意思上容易看出来,是在for
each迭代同时执行删除操作时发生的。即枚举操作和删除操作同步执行时候会抛出同步异常。

注:for each的实现其实是使用Iterator进行迭代的,即元素枚举。

4.解决方案

个人想到一个个人认为较好的解决方案,其执行的时间复杂度为o(n),空间复杂度为o(1),主要就是用index
i,j,遍历一般将待删除的元素放到List的最后;然后对List取subList(0,i+1).注意这里自己没有实用remove方法,因为看了List
remove操作的代码你就会明白,每删除一个操作,需要调用System.arraycopy将后面的元素拷贝上前,直观看,个人认为这个性能不是很好,尤其该代码不是仅删除一个元素,而是针对元素值进行删除的,当然啦,据说System.arraycopy性能蛮高,还没看,有时间看看研究一下。。

代码如下:

if(null != objList &&
!objList.isEmpty()){
    int i=0, len = objList.size();
 
  for (; i<len; i++) {
        if
(objList.get(i).getCode().equals("gewala")) {
       
    objList.set(i--, objList.get(len-1));
     
      objList.set(--len, null);
        }

    }
    objList = objList.subList(0,
len);
}

注:subList操作并不会为数组开辟新的空间,因此空间复杂度不会是O(n),另外这也使得我们不能随意的对subList做修改,否则对原始List也进行的相同操作,如果想修改最后new开辟新的空间。

陷阱bug:使用上面代码是存在一个风险的,就是在对objList的后面元素设置为null时,会导致元素的个数与List的size不一致的问题,所以该方法在缓存重复使用时可能会造成陷阱奥。。O(∩_∩)O~,解决办法很简单,修改null那条语句就可以,这里不再赘述啦。。。

时间: 2024-08-01 13:24:18

瞧瞧bug的相关文章

ZZNU-OJ-2118 -(台球桌面碰来碰去,求总距离)——模拟到爆炸的不能AC的代码

2118 : 早安晚安,不如我先入土为安 题目描述 spring比较喜欢玩台球,因为看着台球在桌子上碰来碰去很有意思(台球撞壁反弹,入射角等于反射角),每次完美的台球入洞,都能体现他数学天才的能力.机房的大佬们当然不承认spring能力强,而是认为每次都是运气而已. spring很不服气,但又打不过机房大佬,争执过程中聪明的渣渣宥终于想到了完美的办法,那也就是建立数学模型,交给脸红脖子粗的spring来解决. 题目给出一组(x,y),表示矩形的四个点分别为(0,0)(x,0)(0,y)(x,y)

解决myeclipse中struts2 bug问题包的替换问题

因为struts2的bug问题,手工替换还是比较麻烦,但即便是最新的myeclipse2014也没有替换最新的struts2包,研究了一天,终于找到了解决办法.以下就解决方法与大家分享一下. 1.在perferences中找到 Myeclipse->Project Libraries,右边找到 struts2.1 Libraries,点击 Enable advanced configiguration,去掉以下文件前面的对勾,然后点击 Add custom Jars 2.在弹出的对话框中选择 A

关于工作中微信分享接口的bug

调用config 接口1的时候传入参数 debug: true 可以开启debug模式,页面会alert出错误信息.以下为常见错误及解决方法: invalid url domain当前页面所在域名与使用的corpid没有绑定(可在该企业号的应用可信域名中配置域名). invalid signature签名错误.建议按如下顺序检查: 确认签名算法正确,可用 http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign 页面工具进行校验. 确认c

android 2.x上Dialog特定情况导致无法dismiss的bug

近期在做一个简单的对话框框架,作用不过做出一个显示效果在android 2.x到android 4.x上均类似的对话框. 思路比較简单,就是使用装饰模式包裹Dialog,暴露的接口调用时会自己主动完毕一些设置 可是遇到一个特别诡异的问题,在android 2.x上的Dialog对话框无法被dismiss,仅仅要弹出来界面就卡死,强行使用eclipse又一次run的话会导致android设备黑屏无响应,假设是模拟器,则直接崩溃,看到启动画面.并且这个还不是ANR错误. 后来通过删减代码找到了问题的

ThinkPHP3.2.3 foreach嵌套循环bug

有两个数组authA和authB authA如下 1 Array 2 ( 3 [0] => Array 4 ( 5 [auth_id] => 1 6 [auth_name] => 文章管理 7 [auth_pid] => 0 8 [auth_c] => 9 [auth_a] => 10 [auth_level] => 0 11 ) 12 13 [1] => Array 14 ( 15 [auth_id] => 4 16 [auth_name] =>

BUG YII2.0 cURL error 6: Could not resolve host:

BUG描述:登录直接显示 原因:服务器设置端口权限,或者DNS毛病 解决方案:只能去服务器端设置,配置端口 DNS: 修改dns 114.114.114.114 或者 8.8.8.8

SPARK大数据计算BUG处理:

大数据计算BUG处理: 程序修改前资源情况: Driver : 1台 Worker : 2台 程序提交申请内存资源 : 1G内存 内存分配情况 : 1. 20%用于程序运行 2. 20%用于Shuffle 3. 60%用于RDD缓存 单条TweetBean大小 : 3k 1. 内存溢出 原因:因为程序会把所有的TweetBean查询出来并且合并(union),该操作在内存中进行.则某个campaign数据量较大时,如500W数据,则500W*10k=50G,超出内存限制. 解决方法: 先按数据量

移动端上传照片 预览+draw on Canvas demo(解决iOS等设备照片旋转90度的bug)

背景: 本人的一个移动端H5项目,需求如下: 手机相册选取或拍摄照片后在页面上预览 然后绘制在canvas画布上. 这里,我们先看一个demo(http://jsfiddle.net/q3011893/83qfqpk8/embedded/) 操作步骤: 1.点击选择文件,拍摄一张照片,此时"预览:"文字下会显示你刚才拍摄的照片: 2.再点击"draw on Canvas",该按钮下的画布会绘制你刚才拍摄的照片. 正常的结果: 正文: 让input file支持拍照+

hdu1829(A Bug&#39;s Life)

题目链接:传送门 题目大意:有n个昆虫,有m组关系,接下来m行表示两个昆虫性别不同,问是否有矛盾情况(同男同女) 题目思路:并查集的高级应用,开两倍数组大小,后n个数组表示和当前昆虫不同性别的集合 #include <iostream> #include <cstdio> #include <cstdlib> #include <cmath> #include <algorithm> #include <cstring> #inclu