hashcode()、equals、clone()、String 使用场景


一:hashcode()

//表示用于描述其他对象是否等于该对象
.Indicates whether some other object is "equal to" this one.


 1. 使用规则


1.1要求在非空的对象上引用实现等价关系

1.2 @param   obj   the reference object with which to compare.
     * @return  {@code true} if this object is the same as the obj
     *          argument; {@code false} otherwise.
这句话意思是如果 object与之比较的对象相等返回true 反之false

1.3每次重写此方法时都必须重写hashcode 以便维护hashcode()方法的常规协定,
该规定相同的对象必须有相同的哈希吗

2:hashcode和equals区别 


两者都表示比较相同的对象,equals表示相等那么两个对象一定相等,hashcode表示两
个相等不一定相等,所以说hashcode不太靠谱(大部分数据都是对的),然而equals一
个个去比较太过与麻烦,所以我们一般用hashcode生成的值去比较 不相等时两个数就
不想等,相等的时候再用equals去比较 如果相等那么两个对象就真的相等。


3:使用环境


需要大量数据并且快速对比的时候用hashcode


四:用法


   String str = "aa";
        String str2 ="aa";
//返回的是true 说明这两个字符串相等
        System.out.println(str.hashCode()==str2.hashCode());
        Object str1 = str.hashCode();
        //输出3104 拿这个值与之比较
        System.out.println(str1);


二:equals


1.用于描述两个对象是否相等 ( 比较的是值是否相等)


2.在覆盖equals时应该遵守的规则


非空性(non-nullity) :对于任何非null的引用值x,x.equals(null)必须返回
false。
自反性(reflexive) :对于任何非null的引用值x,x.equals(x)必须返回true。
对称性(symmetric) :对于任何非null的引用值x和y,当且仅当y.equals(x)返回
true时,x.equals(y)必须返回true。
传递性(transitive) :对于任何非null的引用值x、y和z,如果x.equals(y)返回
true,且y.equals(z)也返回true,那么x.equals(z)也必须返回true。
一致性(consistent) :对于任何非null的引用值x和y,只要equals方法所用到的对
象的信息没有发生改变,多次调用x.equals(y)返回的结果就会保持一致

3.使用环境 ,在比较值是否相等的时候使用


4.用法

  String str = "aa";
        String str2 ="aa";
        if (str.equals(str2)) {
            System.out.println("这两个字符串相等");

 

三:clone()方法

表示对象的克隆java赋值是复制对象引用,如果我们想要得到一个对象的副本,使用赋值操作是无法达到目的的

如何使用clone()方法对对象进行克隆

Object对象有个clone()方法,实现了对象中各个属性的复制,但它的可见范围是protected的,所以实体类使用克隆的前提是:

① 实现Cloneable接口,这是一个标记接口,自身没有方法。 
② 覆盖clone()方法,可见性提升为public。

2.使用场景

在我们上班打卡的时候 每个人签到的时间需要克隆 ,因克隆的对象是不发生变化的 而签到的机器打卡时间是随着每个人打卡而变化的。

四:toString

把建立的对象实例化出来 

例如 我们建立一个 students类 包括 姓名 年龄  不加toString显示的是一个字符串 

1.

package Test;

/**
 * @author Administrator
 */
public class Students {
    String name ;
    int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Students(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public Students() {
    }



}
2.调用 
 public static void main(String[] args) {
        Students[] students =new Students[2];
        students[0] = new Students("张三",15);
        students[1] = new Students("张三",15);
        for (int i = 0; i <students.length ; i++) {
            System.out.println(students[i]);
        }
  1. 显示结果

加上toString结果 

package Test;

/**
 * @author Administrator
 */
public class Students {
    String name ;
    int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Students(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public Students() {
    }

    @Override
    public String toString() {
        return "Students{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值