这个bug是在学习Collection集合当中的ArrayList集合时,在关于remove方法时候,遇到的一个问题,记录一下下~
首先,贴一下报错的源代码:

package day14;import java.util.ArrayList;
import java.util.Collection;public class Test3_Collection {public static void main(String[] args) {//        Collection collection = new Collection<>();//Collection是接口不能直接实例化ArrayList<Integer> c = new ArrayList<>();c.add(100);c.add(200);c.add(300);c.add(400);c.add(500);System.out.println(c);// c.clear();清除c中所有元素// System.out.println(c);System.out.println(c.contains(100));System.out.println(c.isEmpty());System.out.println(c.remove(200));System.out.println(c);}
}

在控制台打印的结果如下:

错误提示:IndexOutOfBoundsException
错误原因:在上面代码中想要移去这个"200"这个元素,但是,remove方法是用的下标法来查找内容的,所以数组越界现象发生

再来看另一个测试的小版本:

package day14;import java.util.ArrayList;
import java.util.Collection;public class Test3_Collection {public static void main(String[] args) {//        Collection collection = new Collection<>();//Collection是接口不能直接实例化ArrayList<Integer> c = new ArrayList<>();c.add(100);c.add(200);c.add(300);c.add(400);c.add(500);System.out.println(c);// c.clear();清除c中所有元素// System.out.println(c);System.out.println(c.contains(100));System.out.println(c.isEmpty());System.out.println(c.remove("200"));System.out.println(c);}
}

这里面运行结果图片贴一下,如下图:

程序运行到时没有报错,但是显然没有实现想要把“200”这个元素移除的目的,在回到代码中看一下编译器给的提示是什么,为什么会出现这种情况呢?

这里提示写到:‘ArrayList’ may not contain objects of type ‘String’

很明显:我们创建的这个集合是用来装Integer类型的,现在放了一个“String”类型的元素进去,编译器翻译不了这个内容,所以remove这个方法执行的结果就是false,我们再点击进去后面的三个小点点看一下提示:

‘ArrayList’ may not contain objects of type ‘String’
Inspection info: Reports method calls to parameterized collections, where actual argument type does not correspond to the collection’s elements type. For example if you have the following code:
//检查信息:提示下集合的方法调用,其中实际参数类型必须要对应于集合的元素类型。例如,如果你有以下代码:
List list = getListOfElements();
list.remove("");

  • the call to remove() will be highlighted. The option ‘Report suspicious but possibly correct method calls’ makes it possible to ignore potentially correct code, like this:
    Number number = new Integer(0);
    list.remove(number));

根据上面的提示:明确告诉一个信息:remove()的调用将突出显示。“报告可疑但可能正确的方法调用”选项可以忽略可能正确的代码。在调用remove这个方法的时候,执行的操作实际是按照下标来进行操作的,而不是按照这个里面的number俩进行操作的。

根据提示我来修改一下做法:

`package day14;import java.util.ArrayList;
import java.util.Collection;public class Test3_Collection {public static void main(String[] args) {//        Collection collection = new Collection<>();//Collection是接口不能直接实例化ArrayList<Integer> c = new ArrayList<>();c.add(100);c.add(200);c.add(300);c.add(400);c.add(500);System.out.println(c);// c.clear();清除c中所有元素// System.out.println(c);System.out.println(c.contains(100));System.out.println(c.isEmpty());System.out.println(c.remove(1));System.out.println(c);}
}
`

运行结果如下图

这里面在remove()方法上面按住ctrl进去看一下它里面的源码的代码是怎么写的:

public boolean remove(Object o) {if (o == null) {//如果要移除的元素为nullfor (int index = 0; index < size; index++)//从0开始循环,每次往后+1,循环到小于目标对象的长度时停止if (elementData[index] == null) {//如果元素中下标==nullfastRemove(index);//快速移除这个元素return true;//返回true}} else {//如果要移除的元素不为nullfor (int index = 0; index < size; index++)//从0开始循环,每次往后+1,循环到小于目标对象的长度时停止if (o.equals(elementData[index])) {//对象等于元素下标值对应的数据fastRemove(index);//快速移除这个元素return true;//返回true}}return false;//如果要移除的元素不为null,且没有找到这个对象等于元素下标值对应的数据}

所以就非常清楚了,源码当中的判断逻辑分了3步走:

  1. 先判断,要移除的这个元素是不是null,如果是null,按照下标寻找对应元素,并快速移除,返回true;
  2. 再根据上一步,要移除的这个元素不是null,按照下标寻找对应元素,并快速移除,返回true;
  3. 再根据上两步,要移除的这个元素不是null,且没有找到这个对象等于元素下标值对应的数据,返回false。

网小鱼Java的bug小集锦0014相关推荐

  1. 网小鱼Java的bug小集锦0031-Linux环境下安装nginx配置文件错误:端口无法正常映射问题解决

    在linux系统下,docker中pull下来nginx之后,因为前一天晚上执行了一下文件,启动nginx容器,运行nginx镜像,执行代码如下: sudo docker run -p 80:80 - ...

  2. 【面试题】Java常见面试题集锦

    Java常见面试题集锦 面试题模块 这份面试题,包含的内容了十九了模块:Java 基础.容器.多线程.反射.对象拷贝.Java Web 模块.异常.网络.设计模式.Spring/Spring MVC. ...

  3. java与微信小程序通讯_java与微信小程序实现websocket长连接

    本文实例为大家分享了java与微信小程序实现websocket长连接的具体代码,供大家参考,具体内容如下 背景: 需要在小程序实现地图固定坐标下实时查看消息 java环境 :tomcat7 jdk1. ...

  4. 景安服务器可以用小程序吗,微信又放大招,无网环境也能使用小程序!

    原标题:微信又放大招,无网环境也能使用小程序! 最近微信小程序的动作不断,就在昨晚又迎来了新能力,也是微信送给开发者的中秋礼物. 这次主要上线4个能力: 小程序"服务商助手" &q ...

  5. Java实现微信小程序校验图片是否含有违法违规内容

    文章目录 1.Java实现微信小程序校验图片是否含有违法违规内容(security.imgSecCheck) 2.接口文档简述 3.Java实现对接接口 4.压缩图片(Thumbnails) 5.整合 ...

  6. Java 独门绝技 用Java玩谷歌小恐龙游戏 (有源码)

    目录 1.Swing成品演示 2.简介 3.Java的Robot类 4.实战开发例子 1.Swing成品演示 2.简介 Java有一个很厉害的类Robot类,这个类可以模仿人的手去操作电脑,鼠标移动, ...

  7. 用java实现Simsimi小黄鸡接口

    package com.iask.webchat.chatmachine; import java.io.BufferedReader; import java.io.InputStream; imp ...

  8. 计算机毕业设计Java课堂管理系统小程序用户端(源码+mysql数据库+系统+lw文档)

    计算机毕业设计Java课堂管理系统小程序用户端(源码+mysql数据库+系统+lw文档) 计算机毕业设计Java课堂管理系统小程序用户端(源码+mysql数据库+系统+lw文档) 本源码技术栈: 项目 ...

  9. 计算机毕业设计JAVA课堂管理系统小程序用户端mybatis+源码+调试部署+系统+数据库+lw

    计算机毕业设计JAVA课堂管理系统小程序用户端mybatis+源码+调试部署+系统+数据库+lw 计算机毕业设计JAVA课堂管理系统小程序用户端mybatis+源码+调试部署+系统+数据库+lw 本源 ...

最新文章

  1. 揭秘百度微服务监控:百度游戏服务监控的演进
  2. android canvas_Android仿IOS11 控制中心进度条
  3. tomcat如何增大并发_系统的性能瓶颈,排查该从哪些方面入手,如何定位?
  4. 括号字符串的有效性和最长有效长度
  5. html游戏禁止微信浏览器下拉,JavaScript实现禁止微信浏览器下拉回弹效果
  6. 远程图片保存到服务器 php,保存远程图片到本地服务器几种方法[php,asp]网
  7. Java8对List<Integer>的求和
  8. 2019年度最受欢迎中国开源软件评选, 请给JeecgBoot 投票,谢谢支持
  9. 一个账号,防止多设备登陆
  10. Android编译期代码生成之apt实践入门
  11. Meta Learning | 加了元学习之后,少样本学习竟然可以变得这么简单!
  12. Scala深入浅出实战经典---001-Scala开发环境搭建和HelloWorld解析
  13. yii2 AR打印sql语句
  14. 【Anylogic智能体状态转移】
  15. c语言实验上机报告,c语言上机实验报告_实验报告.doc
  16. 虚拟服务器 切换任务管理器,在远程桌面连接中使用任务管理器(转)
  17. 玩转easyARM imax283A开发版(二),移植NES模拟器并增加按键驱动,让板子可以玩超级玛丽游戏
  18. 大学生了没-20120709迅雷下载
  19. 2022-JavaScript-过滤数组中的undefined,null,空串,NaN
  20. liunx 中文乱码 和 html转图片中文乱码问题处理方式以及linux中文字体包

热门文章

  1. c#打印方框_c#编写一个程序,打印用星号(*)绘制的方框(正方形),每条边5个*...
  2. PGSQL查询某时间段内的数据、两个时间日期的分钟差、天数
  3. IT江湖的门派之争——转载
  4. 视频播放php,HTML 视频(Video)播放
  5. 一个大专Java程序员的自述
  6. Openfire实现QQ群功能
  7. 解决:先安装豌豆荚,卸载之后,在win7的dos下 adb devices 会重启服务,并且不显示设备的问题
  8. 计算机学院运动会搞笑解说词,趣味运动会搞笑解说词
  9. Word页面设置点击“确定”后出现卡死情况
  10. 曾国藩家书之劝学篇 摘录1