集合框架——Collection实现类的遍历方法与元素删除

目录

一、Collection实现类的遍历方式

1、循环加随机访问get(index)

2、foreach循环

3、迭代器

4、LinkedList的pollFirst/pollLast和removeFirst/removeLast方法

二、元素的删除


一、Collection实现类的遍历方式

Collection接口继承了Iterable接口,因此其子接口List、Set和Queue的实现类都拥有迭代器(Iterator),因此Collection接口下实现类的遍历方式通常有循环+get()随机访问foreach循环访问迭代器访问三种方式。

1、循环加随机访问get(index)

int size = list.size();
for (int i=0; i<size; i++) {
    System.out.print(list.get(i));        
}

2、foreach循环

for (E e:list){ 
    System.out.println(e);
}

3、迭代器

Iterator iter = list.iterator();
//Iterator iter = set.iterator();
//Iterator iter = queue.iterator();
while(iter.hasNext()){
    System.out.println(iter.next());
}

而List接口还实现了Iterable接口的子接口ListIterator,可以实现双向的迭代器遍历

ListIterator iter = list.ListIterator()
while(iter.hasNext()){
    System.out.println(iter.next());
}
while(iter.hasPrevious()){
    System.out.println(iter.Previous());
}

 

4、LinkedList的pollFirst/pollLast和removeFirst/removeLast方法

除了上述的遍历方式,由于LinkedList是基于双向链表实现的,因此他的pollFirst/pollLast和removeFirst/removeLast也可以实现类似迭代器的效果,只是这些方法是要从LinkedList中删除元素的

pollFirst/pollLast:

Object ii;
while((ii=ll.pollFirst())!=null){
            System.out.println(ii);
        }

同理removeFirst/removeLast:

Object ii;
while((ii=ll.removeFirst())!=null){
            System.out.println(ii);
        }
//打印完所有元素后会抛出NoSuchElementException异常

但是这里有个区别就是,pollFirst/pollLast在list没有元素的时候返回null,而removeFirst/removeLast在list为空的时候抛出NoSuchElementException异常

速度:removeFirst/removeLast>foreach循环>pollFirst/pollLast>迭代器>循环加随机访问get(index)

但是注意,pollFirst/pollLast和removeFirst/removeLast会删除元素,所以最好是使用foreach循环或者迭代器,反正对LinkedList一定不要用循环加随机访问的方式,这是因为每一次get操作都是从链表头(尾)遍历最多size/2个元素后才能访问到,是非常消耗资源的。

二、元素的删除

元素的删除是依赖于元素的遍历的,首先要遍历集合,发现与删除目标相等的元素时对改元素进行删除,但是要注意下标的变化

1、利用迭代器进行删除(推荐,不会需要考虑下标的变化)

Object toBeRemoved=3;
        while(iter.hasNext()){
            Object value=iter.next();
            if(value.equals(toBeRemoved)){
                iter.remove();  //注意此处是iter.remove()
            }
        }

注意,如果把iter.remove()换成list.remove()则会抛出ConcurrentModificationException

2、利用循环加随机访问的方式比较删除目标元素(需要注意下标的变化)

int size=ll.size();
Object toBeRemoved=3;
for(int j=0;j<size;j++){
    Object value=ll.get(j);
    if(value.equals(toBeRemoved)){
        ll.remove(j);
        j--;
        size--; //注意这两处下标j和size的变化
    }
}

注意此处采用的是list.remove()方法,但是同时就需要注意下标j和集合大小size的变化,如果没有j--或size--会出现IndexOutOfBoundsException异常

3、利用反向循环加随机访问

for (int i = list.size() - 1;i > 0; i--) {
    Object value = list.get(i);
	if(value.equals(toRemoveValue)) {
	    list.remove(i);
	}
}

4、利用list的removeAll方法

List toRemoveList = new ArrayList<>();
for (int i = 0; i < list.size(); i++) {
    Object value = list.get(i);
    if(value.equals(toRemoveValue)) {
        toRemoveList.add(value);
    }
}
list.removeAll(toRemoveList);

5、list的removeIf方法和java8新特性

list.removeIf(value -> value==toRemoveValue);

6、利用java8的过滤新特性

list.stream().filter(value -> value!=toRemoveValue).forEach(System.out::println);
list.stream().forEach(value -> { if(value!=toRemoveValue) System.out.println(value);});

注意,以上两个方法其实不是删除,是在打印的时候过滤掉要删除的元素不打印,list里面的元素并没有被删除掉

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值