Java 复习 —— Object

原创
2015/08/07 13:42
阅读数 106

Object有9个方法需要了解;

分别是如下的:

    1)public final native Class<?> getClass();

    2)public native int hashCode();

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

    4)protected native Object clone() throws CloneNotSupportedException;

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

    6)public final native void notify();

    7)public final native void notifyAll();

    8)protected void finalize() throws Throwable { }

    9)public final native void wait(long timeout) throws InterruptedException;

    // wait方法重载有三个,但是真正意义上只有一个有用,有用这个也都是内部实现native

    public final void wait(long timeout, int nanos) throws InterruptedException {

        if (timeout < 0) {
            throw new IllegalArgumentException("timeout value is negative");
        }

        if (nanos < 0 || nanos > 999999) {
            throw new IllegalArgumentException(
                "nanosecond timeout value out of range");
        }

    if (nanos >= 500000 || (nanos != 0 && timeout == 0)) {
        timeout++;
    }

    wait(timeout);
    }


Object 9个方法的具体介绍;

1、public final native Class<?> getClass();

获取对象的类全称,也就是:class package.class

2、public native int hashCode();

返回的是当前对象的内存地址。无论何时,对同一个对象调用hashCode()都应该生成同样的值,不管这个对象是否发生过内部改变。

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

通过内存地址判断对象是否相等。

4、protected native Object clone() throws CloneNotSupportedException;

对象克隆,这个是深度克隆时的必须实现的方法,同时一般都会调用object的clone方法;

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

返回类名+@+地址的16进制数


6、public final native void notify();

线程唤醒

7、 public final native void notifyAll();

线程唤醒

8、protected void finalize() throws Throwable { }

垃圾回收器要回收对象的时候,首先要调用这个类的finalize方法,一般的纯Java编写的Class不需要重新覆盖这个方法,因为Object已经实现了一个默认的,除非我们要实现特殊的功能。

9、public final native void wait(long timeout) throws InterruptedException;

线程阻塞,等待一定时间

10、关于equals与hashCode

一般只要重写二者之一,你们另一个也有必要要重写,但是不是强求的。原因是equals方法使用的是内存地址比较,同样hashCode返回的也是内存地址,那么如果采用equals相等,然而hashCode相等的确是说不通的,应该是equals为true,那么hashCode的值一定相同;反之不成立。另外,使用方面一个很大的因素就是Map的key,因为我们知道Map的key代码:

    public V put(K key, V value) {
        if (key == null)
            return putForNullKey(value);
        int hash = hash(key.hashCode());
        int i = indexFor(hash, table.length);
        for (Entry<K,V> e = table[i]; e != null; e = e.next) {
            Object k;

                V oldValue = e.value;
                e.value = value;
                e.recordAccess(this);
                return oldValue;
            }
        }

        modCount++;
        addEntry(hash, key, value, i);
        return null;
    }

首先比较的是HashCode,其次比较的才是equals,如果你只是对equals重写,没有重写hashCode,应该是不会拿到预期后果的。


展开阅读全文
打赏
0
3 收藏
分享
加载中
更多评论
打赏
0 评论
3 收藏
0
分享
返回顶部
顶部