原文:链接
1.equals 总结
在java规范中,它对equals方法的使用必须遵循如下几个规则
equals 方法在非空对象引用上实现相等关系
1、自反性:对于任何非空引用值 x,x.equals(x) 都应返回 true。
2、对称性:对于任何非空引用值 x 和 y,当且仅当 y.equals(x) 返回 true 时,x.equals(y) 才应返回 true。
3、传递性:对于任何非空引用值 x、y 和 z,如果 x.equals(y) 返回 true,并且 y.equals(z) 返回 true,那么 x.equals(z) 应返回 true。
4、一致性:对于任何非空引用值 x 和 y,多次调用 x.equals(y) 始终返回 true 或始终返回 false,前提是对象上 equals 比较中所用的信息没有被修改。
5、对于任何非空引用值 x,x.equals(null) 都应返回 false。
在 java 中进行比较,我们需要根据比较的类型来选择合适的比较方式:
1) 对象域,使用 equals 方法 。
2) 类型安全的枚举,使用 equals 或== 。
3) 可能为 null 的对象域 : 使用 == 和 equals 。
4) 数组域 : 使用 Arrays.equals 。
5)除 float 和 double 外的原始数据类型 : 使用 == 。
6) float 类型: 使用 Float.foatToIntBits 转换成 int 类型,然后使用==。
7) double 类型: 使用 Double.doubleToLongBit 转换成 long 类型,然后使用==。
在 equals() 中使用 getClass 进行类型判断
父类:Person
public class Person {
protected String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Person(String name){
this.name = name;
}
@Override
public boolean equals(Object obj) {
// TODO Auto-generated method stub
if(obj == null){
return false;
}
if(obj instanceof Person){
Person person = (Person)obj;
if(person.name.equals(name)){
return true;
}else{
return false;
}
}else{
return false;
}
}
}
子类:Employee:
public class Employee extends Person {
private int id;
public Employee(String name, int id) {
super(name);
this.id = id;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Override
public boolean equals(Object obj) {
// TODO Auto-generated method stub
if (obj == null) {
return false;
}
if (obj instanceof Employee) {
Employee employee = (Employee) obj;
return employee.id == id && super.equals(employee.name);
} else {
return false;
}
}
}
测试:
public class Test {
public static void main(String[] args) {
Person p1 = new Person("xinwa");
Person p2 = new Employee("xinwa",23);
Person p3 = new Employee("xinwa",24);
System.out.println("p1与p2是否相等"+p1.equals(p2));
System.out.println("p1与p3是否相等"+p1.equals(p3));
System.out.println("p2与p3是否相等"+p2.equals(p3));
}
}
返回结果:
- p1与p2是否相等true
- p1与p3是否相等true
- p2与p3是否相等false
修改如下:
@Override
public boolean equals(Object obj){
if(obj == null){
return false;
}
if(obj.getClass().equals(Person.class)){
Person person = (Person)obj;
if(person.name.equals(name)){
return true;
}else{
return false;
}
}else{
return false;
}
}
2.String
字符串为对象,在初始化前,他的值为null,在使用=创建时,他会先去字符串常量池查看是否已经有这个字符串了,如果有的话,就返回该引用,使用new String()方法创建,会在堆中分配空间。
2.1StringBuffer
StringBuffer同样是用来存储字符串的,他在对字符串内容修改时,并不会产生一个新的对象,而是修改自身,StringBuffer是不能用”=”来赋初值的,需同过关键字new来创建。如果要对字符串的内容修改的时候需调用
StringBuffer replace(int start, int end, String str);
比起String的"="赋值,确实麻烦了不少。
2.2 StringBuilder
StringBuilder与StringBuffer差不多,只不过StringBuffer是线程安全的,在多线程访问时,由于锁的限制,速度会比较慢。StirngBuilder没有锁的限制,所以速度更快。
StringBuffer 常用来xml解析,Htt参数解析和封装。
StringBuilder常用来SQL语句的拼装和JSON数据的解析