这个也是一个坑,平时没怎么注意,在笔试时碰到了,唉,坑啊
List集合在进行获取用的是get(int index),而删除指定元素有两种方法,一个是remove(int index)
,一个是remove(Object o)
,这两个也好理解,一个根据索引一个根据存在List里的元素对象对比
而主要的问题就是这里
当我用List.remove(List1.get(index))
时竟然无法删除List 集合里的索引是List1.get(index) ,一开始我认为是List1 是不是没装上索引,后面验证不是,而且List1.get(index) 输出出来的和我预想值是一样的,这就百思不得其解了,我会还一度认为是不是List的remove方法错了,最后都不是,在测试类里List的remove没有问题,那我就确定肯定是List.remove(List1.get(index))
这句话有问题,
最后在网上一个帖子上看到了,原来是因为List1.get(index) 得到的是一个Integer 类型的对象,记住它是对象,即使它在-128到+127可以自动拆箱成int,但是还是不能忘记一开始它还一个对象,因为编译期它不知道你的数值是几,到底是否满足自动拆箱的要求
List的remove方法看它的返回类型是Integer对象,就直接用remove(Object o)
了,即使这个拆箱是自动的,
这就解释的通了,因为返回的是一个对象,所以List的remove 没用List.remove(int index)
而是用的List.remove(Object o)
,所以就找不到
原因:
1、集合框架只能存放对象,不能存放基本数据类型,所以index取出来的是Integer对象,而不是你想要的int类型。(提醒一点,就算int类型存进去在集合里也是Integer类型)
2、list提供了两个remove方法,分别是remove(int index),remove(Object o),因为Integer对象也是Object类型的,所以匹配list.remove(Object o),不会进行拆箱
解决:
- list.remove(index.get(i).intValue),手动强制拆箱,不等待自动拆箱,因为
index.get(i).intValue
返回类型是int,它就知道你想用List.remove(int index)
- 当然你也可以强转在
List.remove((int)List1.get(index))
或者再来一行把List1.get(index)
赋给一个int类型的变量