Object常用方法总结

Object常用方法总结

1、clone()

protected native Object clone() throws CloneNotSupportedException;

方法说明:将现有对象克隆一份出来,Object.clone()默认是浅拷贝。
返回一个Object类型的对象。

浅拷贝

当被拷贝对象中存在引用类型的属性的时候,clone()方法拷贝的是引用地址,
当改变克隆出来的对象中的引用类型的值时,被拷贝对象中对应的引用类型得值也会被改变。

深拷贝

当被拷贝对象中存在引用类型的属性又需要深拷贝时,
需要被拷贝对象实现Cloneable接口重写clone()方法。
在clone()方法内部调用引用类型的clone()方法拷贝一份赋值给新的对象。

补充

通过clone()方法进行深拷贝的时候,如果对象引用类型的属性非常多且层次比较深的话,		
每个类都要重写clone方法太过繁琐了,可以通过序列化和反序列化实现深拷贝,(需要实现Serializable接口)
需要注意的是,如果某一个属性被transient修饰了的话,那么该属性就无法被拷贝了。

2、equals()

public boolean equals(Object obj) {
       return (this == obj);
   }

方法说明:检测两个对象是否相等。在Object类中,这个方法判断的是两个对象是否具有相同的引用,但是对于大多数类来说, 这种判断没有任何意义,所以说有很多方法都重写了equals()方法,自定义了对象相等的条件。

自定义equals方法应有特性
1.自反性

对于任何非空引用x,x.equals(x)始终都应该返回true。

2.对称性

对于任何引用x和y,当且仅当x.equals(y)返回为true时,y.equals(x)才能返回true。

3.传递性

对于任意引用x,y,z ,如果x.equals(y)和y.equals(z)都为true,则x.equals(z)也应该为true。

4.一致性

如果x和y引用的对象没有发生变化反复调用x.equals(y)返回的结果应该是一样的。

String中重写的equals()方法

public boolean equals(Object anObject) {
        if (this == anObject) {  //如果引用地址都一样,那肯定是同一个对象,直接返回true。
            return true;
        }
        if (anObject instanceof String) { //判断anObject对象是否属于String类。
            String anotherString = (String)anObject;//属于就强转一下不属于直接返回false。
            int n = value.length;
            if (n == anotherString.value.length) {//判断anObject与调用者长度是否相同,相同就将两者的char数组逐个对比有一个不一样直接返回false,长度不相等直接返回false。
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

3、hashCode() (散列码)

public native int hashCode();

方法说明:由于hashCode()方法在Object中有定义,所以每一个对象都有一个对应的散列码,其值为对象的存储地址。

注意

如果重写了equals()方法,则也必须重新定义hashCode()方法,以便用户可以将对象存储到散列表中。(提高将数据存入HashSet、HashMap.......中时,判断存入对象与已存入对象是否相等的速度。参考源码有助于理解)
字符串s与t拥有相同的散列码,是因为字符串的散列码是由内容计算出的。

String中的hashCode()方法

public int hashCode() {
        int h = hash;
        if (h == 0 && value.length > 0) {
            char val[] = value;

            for (int i = 0; i < value.length; i++) {
                h = 31 * h + val[i];
            }
            hash = h;
        }
        return h;
    }

4、equals()与hashCode()方法总结

1.通过equals判断两个对象相等,则两个对象的hashCode()返回的值必须相等。
2.重写equals()和hashCode()后,如果两个对象的hashCode()值相等,并不能作为这两个对象相等的条件,此时还需要调用equals()方法,判断对象是否相等。
3.如果两个对象的hashCode()值不相等,则这两个对象一定不相等。(Map中就是先判断hashCode是否相等,不相等直接返回flast,相等则再通过equals()判断,因为hashCode性能比equals好)

5、 toString()

public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }

方法说明
它用于返回表示对象值的字符串。
一般都会在自定义类中重写toString方法,方便日志记录。

6、finalize() (垃圾回收机器也叫GC)

方法说明
当对象不再被程序所使用时,垃圾回收机器将会将其回收。
垃圾回收器在回收某个对象的时候,首先会调用该对象的finalize()方法。
GC主要针对堆内存。

protected void finalize() throws Throwable { }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值