每天三道面试题2019-09-12

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/HardToFindName/article/details/100786843

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…明天再撸…

猜你喜欢

转载自blog.csdn.net/HardToFindName/article/details/100786843
今日推荐