一、foreach原理
foerach官方文档 从.java文件和.class文件看foreach
public class ForeachTest {
public void test ( ) {
List < Integer > list = new ArrayList < > ( ) ;
for ( Integer i : list) {
System . out. println ( i) ;
}
}
}
public class ForeachTest {
public ForeachTest ( ) {
}
public void test ( ) {
List < Integer > list = new ArrayList ( ) ;
Iterator var2 = list. iterator ( ) ;
while ( var2. hasNext ( ) ) {
Integer i = ( Integer ) var2. next ( ) ;
System . out. println ( i) ;
}
}
}
从.java文件和.class文件可以知道foreach只是语法糖,是编译器帮助我们完善代码。 解析代码
for ( Integer i : list) {
System . out. println ( i) ;
}
list其实调用了list.iterator()然后获取一个Iterator对象。
例子:System.out.println(list); 其实是System.out.println(list.toString())。 之后利用Itrator对象的hasNext()和next()方式实现了foreach的功能。
思考:为什么foreach只能输出,而不能删除的原因?(提示:看.class文件代码)
二、自定义类如何才能用foreach
从foreach原理可以知道,List只是利用Iterable接口的iterator()方法。 自定义类实现Iterable接口。
public class LchSet < T > implements Iterable < T > {
Object [ ] lchData;
int size;
int capacity;
public LchSet ( int capacity) {
this . capacity = capacity;
lchData = new Object [ capacity] ;
}
public void add ( T t) {
lchData[ size++ ] = ( Object ) t;
}
@Override
public Iterator < T > iterator ( ) {
return new LchIterator ( ) ;
}
}
自定义类定义内置类实现Iterator接口
private class LchIterator implements Iterator < T > {
int cur;
@Override
public boolean hasNext ( ) {
return cur!= size;
}
@SneakyThrows
@Override
public T next ( ) {
int i = cur;
if ( i>= size) {
throw new Exception ( ) ;
}
return ( T ) lchData[ cur++ ] ;
}
}
完整代码
public class LchSet < T > implements Iterable < T > {
Object [ ] lchData;
int size;
int capacity;
public LchSet ( int capacity) {
this . capacity = capacity;
lchData = new Object [ capacity] ;
}
public void add ( T t) {
lchData[ size++ ] = ( Object ) t;
}
@Override
public Iterator < T > iterator ( ) {
return new LchIterator ( ) ;
}
private class LchIterator implements Iterator < T > {
int cur;
@Override
public boolean hasNext ( ) {
return cur!= size;
}
@SneakyThrows
@Override
public T next ( ) {
int i = cur;
if ( i>= size) {
throw new Exception ( ) ;
}
return ( T ) lchData[ cur++ ] ;
}
}
}
测试
public static void main ( String [ ] args) {
Test < Integer > test = new Test < > ( ) ;
LchSet < Integer > lchSet = new LchSet < > ( 10 ) ;
lchSet. add ( 1 ) ;
lchSet. add ( 2 ) ;
for ( Integer i : lchSet) {
System . out. println ( i) ;
}
}
1
2