Lec10 - Iterators, Object
Methods
Iterators
使用迭代器可以让自己的数据类型可以被迭代(支持for-each loop)
- 需要让对应类实现
Iterable接口
- 具有
Iterator方法来返回迭代器对象(实现一个嵌套类)
- 迭代器需要具有
hasNext()和next()方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| package Lec10;
import java.util.Iterator;
public class ArraySet<T> implements Iterable<T> { private T[] items; private int size;
public ArraySet(){ items = (T[]) new Object[100]; size = 0; } private class ArraySetIterator implements Iterator<T>{
private int pos; ArraySetIterator(){ pos = 0; } @Override public boolean hasNext() { if (pos<size){ return true; } return false; }
@Override public T next() { T itemToReturn = items[pos]; pos++; return itemToReturn; } } public Iterator<T> iterator(){ return new ArraySetIterator();
} }
|
(注:仅有迭代器部分,没有其他具体实现)
Object Method
Java中所有类都是Object的子类
toString()
给予一个object的字符串表示
println方法也调用了toString()方法
该方法类似于python中的repr方法,可以给类一个自定义的字符串输出形式
1 2 3 4 5 6 7 8 9 10
| @Override public String toString(){ StringBuilder stringToReturn = new StringBuilder("{"); for(T x: this){ stringToReturn.append(x); stringToReturn.append(", "); } stringToReturn.append("}"); return stringToReturn.toString(); }
|
this
this是当前对象的一个引用,可以使用this来访问自己的实例变量和方法
但java中this是不必须的
若方法中的局部变量和实例变量重名,此时必须要用this加以区分
equals()
equals()方法通过判断两个对象的地址来判断是否相同
当然,可以通过重写方法来改变其他判断相同的方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| @Override public boolean equals(Object o){ if (o instanceof ArraySet uSet){ if (this.size != uSet.size()){ return false; } for (T x: this){ if (!uSet.contains(x)){ return false; } } return true; } return false; }
|
其中,关键字A instanceof B的用处如下
- 检查o是否指向类B,若不是返回false
- 若是,返回true并将A作为B类并命名为B后面的名字
- o是null也可以运行