`
大器晚成
  • 浏览: 51595 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

ArrayList的陷阱!谁知道?

 
阅读更多
import java.util.ArrayList;


public class ArrayListTest {
	public static void main(String[] args) {
		//一个物件链表
		ArrayList<String> strAl=new ArrayList<String>();
		strAl.add("a");
		strAl.add("b");
		strAl.add("c");
		strAl.add("d");
		//要删除物件链表的所有索引
		ArrayList<Integer> indexes=new ArrayList<Integer>();
		indexes.add(0);
		indexes.add(2);
		//逐个删除
		for (int i = 0; i < indexes.size(); i++) {
			strAl.remove(indexes.get(i));
		}
		//打印最后物件个数
		System.out.println(strAl.size());
	}
}

//谁能不运行代码,知道打印出来是多少呢
7
6
分享到:
评论
22 楼 anshui3211 2011-04-21  
谢谢分享,以前真不知道~
21 楼 贾懂凯 2011-04-20  
20 楼 大器晚成 2011-04-16  
lalahei 写道
感觉标题应该改成,自动装箱和拆箱的陷阱更合适~~

自动装箱和拆箱是根据需要来做的,而不是一遇到有基本类型的对象就自动拆箱
19 楼 magnum2010 2011-04-15  
LZ这个问题很是经典!长知识了!
18 楼 lalahei 2011-04-15  
感觉标题应该改成,自动装箱和拆箱的陷阱更合适~~
17 楼 lantian_123 2011-04-15  
wskiwwwx 写道
谁没事这么干啊,2B,get方法得到的是Object数据,你直接传给remove当然就自动适配到了remove(Object)这个方法了啊,而strAl里面没有0和2 ,当然删不掉任何数据啊,唉!!!

仁兄多大了啊?
16 楼 lalahei 2011-04-15  
i
wskiwwwx 写道
谁没事这么干啊,2B,get方法得到的是Object数据,你直接传给remove当然就自动适配到了remove(Object)这个方法了啊,而strAl里面没有0和2 ,当然删不掉任何数据啊,唉!!!

仁兄,明显激动了,这里的确是个陷阱,我想楼主拿出来,也是想让大家来认识到这个问题。没人做的事,当你做了,有时可以帮助你认识的问题的本质~~
15 楼 wskiwwwx 2011-04-15  
谁没事这么干啊,2B,get方法得到的是Object数据,你直接传给remove当然就自动适配到了remove(Object)这个方法了啊,而strAl里面没有0和2 ,当然删不掉任何数据啊,唉!!!
14 楼 Coder211 2011-04-15  
寻环里面的代码改为下面的语句
strAl.remove(indexes.get(i).intValue());
13 楼 卖火柴的老特工 2011-04-15  
大器晚成 写道
卖火柴的老特工 写道
菜鸟求指教啊

remove有两个类型的参数 Object 和int 你给它Integer  它直接调用remove(Object)

谢谢,还是自动拆箱想的太简单了
12 楼 fanfq 2011-04-14  
4
主要问题在这里
//逐个删除 
        for (int i = 0; i < indexes.size(); i++) { 
            strAl.remove(indexes.get(i)); 
        } 

不能这样直接remove的。
一般都在迭代器里面做的。
11 楼 deific 2011-04-14  
晕,不看源码,真想不到~~
10 楼 大器晚成 2011-04-14  
卖火柴的老特工 写道
菜鸟求指教啊

remove有两个类型的参数 Object 和int 你给它Integer  它直接调用remove(Object)
9 楼 大器晚成 2011-04-14  
卖火柴的老特工 写道
为什么没有自动拆箱啊??

因为remove接受Integer类型的参数,所以不会自动拆箱
8 楼 卖火柴的老特工 2011-04-14  
菜鸟求指教啊
7 楼 卖火柴的老特工 2011-04-14  
为什么没有自动拆箱啊??
6 楼 enefry 2011-04-14  
Object就是Object.
5 楼 snowflate_summer 2011-04-14  
想当然了,确实一开始没看出来,后来看了源码,也没看到  remove(Object o) 这个方法,确实一不小心就要掉到这个陷阱里去了。
4 楼 java_林 2011-04-14  

大器晚成 写道
grandboy 写道
这里要不是仔细看还真搞不对,我仔细想过,不过也是想错了。因为我几乎没有怎么使用过remove这个方法. 仔细看了一下ArrayList的实现。

我也是看到remove有两个参数才知道的。



嗯,想当然了,以为java会自动拆包,谁知道,这个方法有两个参数
3 楼 bolide74 2011-04-14  
for (int i = 0; i < indexes.size(); i++) {
			strAl.remove((int)indexes.get(i));
		}

如果是强制转换get的返回类型,就是真正删除掉了

相关推荐

Global site tag (gtag.js) - Google Analytics