在java的String类中 使用equals方法的最好与最坏的时候分别是什么?
在此谢谢大家的帮助!
在此谢谢大家的帮助!
解决方案 »
- 下面帖子植物人大战僵尸的源码谁有不?
- java script 问题求助
- 游戏运行运行十几分钟后出现下面的错误,各位兄弟帮忙解决一下
- (求解)请简单构造一个“SQL注入”漏洞发生得场景,即编写一个有问题的SQL访问代码,并模拟可能存在的安全问题。
- zcjl{to be forgotten}真感谢你啊,我会好好利用你送我的分的
- 在Java中,怎样得到运行程序的当前目录???
- 如何从数据库里取出blob对象?
- 我用jbulider5开发EntityBean时,最后一步它非要我输入一个pool name,我该怎么办!!!
- 请问谁能谈一谈java语言中接口的深层内涵?
- 关于 WindowAdapter
- 用Socket写个和QQ类似的聊天程序
- 高手帮帮忙!关于连接SQL2000数据库的问题
String类的equals()方法做了重写,表示:
将此字符串与指定的对象比较。当且仅当该参数不为 null,并且是与此对象表示相同字符序列的 String 对象时,结果才为 true没有最好和最坏的时候,只有用的最恰当时候
private String name;
private int age;
public Student(String name,int age){
this.name=name;
this.age=age;
}
public boolean equals(Object obj){
if(obj instanceof Student){
Student s=(Student)obj;
if(s.name.equals(this.name) && s.age==this.age){
return true;
}
}
return super.equals(obj);
}
} 你认为上面的代码equals方法的覆盖安全吗?表面看起来好像没什么问题,这样写也确实满足了以上的五大原则。但其实这样的覆盖并不很安全,假如 Student类还有一个子类CollegeStudent,如果我拿一个Student对象和一个CollegeStudent对象equals,只要这两个对象有相同的name和age,它们就会被认为相等,但实际上它们是两个不同类型的对象啊。问题就出在instanceof这个运算符上,因为这个运算符是向下兼容的,也就是说一个CollegeStudent对象也被认为是一个Student的实例。怎样去解决这个问题呢?那就只有不用 instanceof运算符,而使用对象的getClass()方法来判断两个对象是否属于同一种类型,例如,将上面的equals()方法修改为:
public boolean equals(Object obj){
if(obj.getClass()==Student.class){
Student s=(Student)obj;
if(s.name.equals(this.name) && s.age==this.age){
return true;
}
}
return super.equals(obj);
}
这样才能保证obj对象一定是Student的实例,而不会是Student的任何子类的实例。