今天写一个关于为何使用迭代器去删除list里面某一项一模一样的数据。我们知道的是for循环不是可以做到遍历么~那么直接使用list里面自带的remove(i)就可以直接删除里面的某一个项了么?而且还快。我们来分析一下为何要使用迭代器而不是for循环。
比如这样的代码
List<String> names = new ArrayList<>();
RecyclerAdapter mAdapter;
RecyclerView mRecyclerview;
Context context;
TextView mTvContent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
names.add("5");
names.add("---65--");
names.add("5");
names.add("---23---");
names.add("5");
names.add("5");
names.add("--6325--");
names.add("5");
names.add("---2323---");
mAdapter = new RecyclerAdapter(this,names);
mRecyclerview.setAdapter(mAdapter);
int good = 0;
//模块2:
// for (int i = 0; i < 2;i ++ ){
// good += need(i + 1);
// }
// Iterator iter =names.iterator();
// while (iter.hasNext()){
// if (iter.next().equals("5")){
// iter.remove();
// }
// }
String nameneed = "";
//模块1:
for (int i = 0;i < names.size();i ++){
nameneed += names.get(i);
Log.i("NAME",names.get(i) + "Size+============"+names.size());
if(names.get(i) == "5"){
Log.i("NAMENUM",i+"");
names.remove(i);
}
}
Log.i("NAMENUM==========",nameneed);
String name = "";
for (int i = 0; i < names.size();i ++){
name += names.get(i);
}
}
我们来分析一下为什么:对于模块1:我们看到的是一个for循环去删除这个时候我第一项去删除“5”这个数据,这个时候我们进行了第一次的for循环。可是我们的names这个list里面的数据是不是也变化。很确定的說- -是的~~~想一想安卓的内存机制。这个时候我们的names.size()相当于减一了。。。。所以导致我们删除的时候数据不准确了。那这个时候的数据实际上面我们的下标已经产生了变化了。这会导致我们的数据没有办法精确的删除:这个位子我做了一系列的打印来证实我的想法:
里面的是for循环的数据。其实很容易证实我们的想法是不是有问题。所以在删除后,不确定性太多了。你甚至有可能遇到刚刚好全部删除掉。但是这个时候已经没有意义了。数据可能会出现凌乱的问题。这个时候应该使用迭代器。
如代码模块2:
这个是下一个,这样会使得我们想要删除的数据完全删除掉。所以一般来说我们使用迭代器为何使用总是有一定的原因。