java读书笔记-java提高篇(2)

原文:链接

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数据的解析

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值