一般我们用==就可以判断两个对象是否是同一个实例
class People {
String name;
int age;
People(this.name, this.age);
}
void main() {
var p1 = People('w', 18);
var p2 = p1;
var p3 = People('w', 18);
print(p1 == p2); // true
print(p1 == p3); // false
}
值得注意的是两个使用相同构造函数相同参数值构造的编译时常量是同一个对象:
class People {
final String name;
final int age;
const People(this.name, this.age);
}
void main() {
var p1 = const People('w', 18);
var p2 = const People('w', 18);
var p3 = const People('w', 19);
print(p1 == p2); // true
print(p1 == p3); // false
}
但是有时候==是可以被重载的, operator用法
class People {
String name;
int age;
int id;
People(this.name, this.age, this.id);
bool operator ==(p) {
return (p is People) && p.id == id;
}
@override
int get hashCode => id.hashCode;
}
void main() {
var p1 = People('w', 18, 1);
var p2 = People('w', 18, 2);
var p3 = People('w', 19, 1);
print(p1 == p2); // false
print(p1 == p3); // true
}
如果我们想知道两个对象到底是不是同一个对象,这个时候要用到identical,identical方法会精确比较两个对象的地址
class People {
String name;
int age;
int id;
People(this.name, this.age, this.id);
bool operator ==(p) {
return (p is People) && p.id == id;
}
@override
int get hashCode => id.hashCode;
}
void main() {
var p1 = People('w', 18, 1);
var p2 = People('w', 18, 2);
var p3 = People('w', 19, 1);
print(p1 == p2); // false
print(p1 == p3); // true
print(identical(p1, p3)); // false
}