数据访问的问题
将对数据的遍历方法封装再聚合类中,不利于扩展,并且需要暴露聚合类内部的表示,让数据变得不安全,而且增加的开发者的负担
因此出现了伟大的迭代器!!克服了以上缺点
一、ArrayList中迭代器的介绍
让我们先来看看iterator接口实现的方法
public interface Iterator<E> {
//判断集合是否还有元素 返回true表示还有元素 返回false表示集合中没有元素
//一般对集合的访问通过while(hasNext())判断是否还需要遍历
boolean hasNext();
//获取集合中遍历的当前元素
//一般先判断是否存在元素hasNext,判断有元素在调用next获取元素,需要进行循环交替遍历集合中所有元素
E next();
//删除集合中的元素
void remove();
}
使用场景
//第一步:通过集合调用iterator()获取迭代器实例
Iterator <Integer> iterator1 = list.iterator();
//第二步:首先判断集合中是否存在元素,通过where来循环遍历
while (iterator1.hasNext()) {
//第三步:如果还存在元素,就通过next()获取当前的元素
Integer value = iterator1.next();
}
- 注意:正确的遍历集合是一个hasNext和一个next方法进行循环交替遍历,切勿一个hashNext中包含多个Next的调用
让我们来思考如何自定义来实现集合的遍历
- 集合本身需要具有遍历集合的方法,即集合中需要有iterator()方法,首先集合定义是需要实现或者继承iterable接口的
- 对于iterator()方法的实现,返回类型是Iterator对象
- 需要实现一个Iterator类型的对象,实现给接口中的三个方法
答案如下
/**
* desc:自定义ArrayList实现迭代器功能
*/
import java.util.Arrays;
import java.util.Iterator;
public class DIYArrayList<T> implements Iterable<T> {
private T[] element;
private int size;
public DIYArrayList(){
this(10);
}
public DIYArrayList(int n){
element=(T[])new Object[n];
size=0;
}
private boolean isFull(){
return size==element.length;
}
private void expend(){
element=Arrays.copyOf(element, element.length+element.length>>1);
}
public void add(T elem){
if(isFull()){
expend();
}
element[size++]=elem;
}
private boolean isEmpty(){
return size==0;
}
public void remove(T value){
if(isEmpty()){
return;
}
element[size]=null;
size--;
}
//提供了一个迭代器的方法
@Override
public Iterator <T> iterator() {
return new DIYItr();
}
class DIYItr implements Iterator<T>{
@Override
public boolean hasNext() {
return false;
}
@Override
public T next() {
return null;
}
@Override
public void remove() {
}
}
}
多线程下如何使用集合
1、在多线程下会提供线程安全的集合操作类
2、创建安全的容器来操作:Collections.synchronizedList(list)方法操作
本文详细介绍了迭代器的基本概念及其在ArrayList中的应用。通过分析迭代器接口的方法,展示了如何自定义实现迭代器功能,并探讨了多线程环境下集合的安全使用策略。
-- ArrayList&spm=1001.2101.3001.5002&articleId=122597922&d=1&t=3&u=c0612c06b94f49f9a5bc20df3fe14303)
2394

被折叠的 条评论
为什么被折叠?



