版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
1、是否可以继承 String
不可以,String类是final类,不可以被继承。继承String类本身就是一个错误的行为,对String类型的重用最好的方式是关联关系(has-a)和依赖关系(use-a),而不是继承关系(is-a)。
补充:对一个字符串引用做出频繁赋值修改,只会不断生成新的String对象,因为String是其内部使用的是一个final char[] value进行值的存储,赋值完成,其内容不可变。想要频繁改动建议使用StringBuffer类。
2、equals方法必须满足哪几个特性?
自反性:x.equals(x)返回true
对称性:x.equals(y) --> y.equals(x)
传递性:x.equals(y),y.equals(z)–>x.equals(z)
一致性:当x和y的引用对象信息没有被修改时,多次调用x.equals(y)应该得到相同的结果。
非空性:对于任何非null值的引用x,x.equals(null)必须返回false。
3、请写出高效的equals方法
根据《Effective Java》一书中所描述,实现高质量的equals方法可以使用以下几点:
1.使用==操作符检查参数是否为这个对象的引用;
2.使用instanceof操作符检查参数是否为正确的类型
3.对于类中的关键属性,要检查参数传入对像的属性是否与之匹配
4.编写完equals方法要检查其是否满足自反性、对称性、传递性、一致性和非空性
5.重写equals方法时,总是要重写hashcode
6.不要将equals方法参数中的Object对象替换成其他的类型,在重写时不要忘掉@Override注解
事例,String类中重写equals方法:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = count;
if (n == anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n-- != 0) {
if (v1[i++] != v2[j++])
return false;
}
return true;
}
}
return false;
}
补充:为什么重写equals方法时必须重写hashcode…明天再撸…