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
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也可以运行