关键部分的说明都在代码注释中了,仔细看,包会哈哈哈哈哈哈:
public class PhoneNumber {
private int areaCode;
private String prefix;
private String lineNumber;
@Override
public int hashCode() {
final int prime = 31;//用31的好处:VM会自动把它转化成位运算(cpu支持的运算),“31*num=(31<<5)-num”。这样就很快了
int result = 17;//这个17是写在这个位置的一种习惯数字
result = prime * result + areaCode;//三个属性的“加盟”顺序随便,推荐由上至下依次加入
result = prime * result + ((prefix == null) ? 0 : prefix.hashCode());
result = prime * result + ((lineNumber == null) ? 0 : lineNumber.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)//==就是为了判断两个引用对象的地址是否相等
return true;
if (obj == null)//null则直接返回,快
return false;
if (getClass() != obj.getClass())//getClass就是为了判断是不是同一个类创建的实例(而不能用instanceof,主要是为了排除子类带来的干扰)
return false;
//强转一下,开始比较类的各个属性
PhoneNumber other = (PhoneNumber) obj;
if (areaCode != other.areaCode)//int类型直接==比较
return false;
if (lineNumber == null && other.lineNumber != null)//String类型需要先判空,如果二者都是null,则判断下一个字段(如果没有字段了,那么就返回true了,因为都是null)
return false;
} else if (!lineNumber.equals(other.lineNumber))
return false;
if (prefix == null && other.prefix != null)
return false;
} else if (!prefix.equals(other.prefix))
return false;
return true;
}
}