一切的起源 - Object

区分一个Java程序员是初级还是中级最好的方法就是问他Object类中的方法都知道哪些。这个问题我曾经在面试中问过很多人,发现真正能回答上来的并不多。有人反问我Object是什么,有人说除了toString其他不清楚……下面来看看Object中都有哪些方法。

一、toString

从API中可以看到默认toString方法的返回的是class name和16进制的hash code的组合。

return getClass().getName() + "@" + Integer.toHexString(hashCode());

二、hashCode和equals

hashCode的协议:

  1. hashCode提供了对HashMap、HashTable的支持;
  2. 对于同一个对象执行hashCode多次,应该返回同样的结果;
  3. 对于两个相等的对象,他们的hashCode也应该一致;
  4. 对于两个不相等的对象,他们的hashCode可以相等,但最好不相等,这样可以增强HashMap的性能。

下面是equals和hashCode的例子:

public class MyObject {
    private long id;
    private String name;
    private String desc;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        MyObject myObject = (MyObject) o;

        if (id != myObject.id) return false;
        if (name != null ? !name.equals(myObject.name) : myObject.name != null) return false;
        return !(desc != null ? !desc.equals(myObject.desc) : myObject.desc != null);

    }

    @Override
    public int hashCode() {
        int result = (int) (id ^ (id >>> 32));
        result = 31 * result + (name != null ? name.hashCode() : 0);
        result = 31 * result + (desc != null ? desc.hashCode() : 0);
        return result;
    }
}

三、wait、notify和notifyAll

wait和notify是Java中基本的对线程进行操作的API,如下例我创建了一个只有一个值长度的Queue,一个Producer向Queue中写入新值,一个Consumer从Queue中取出值。当Producer向Queue中写入新值后通知Consumer可以取值;当Consumer取值后通知Producer可以写值。

public class WaitNotifyExample {
    private class Queue {
        private Integer value;

        public synchronized boolean hasValue() {
            return value != null;
        }

        public synchronized void setValue(Integer value) {
            this.value = value;
        }

        public Integer getValue() {
            return value;
        }
    }

    private class Producer implements Runnable {
        private final Queue q;

        Producer(Queue q) {
            this.q = q;
        }

        @Override
        public void run() {
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            synchronized (q) {
                q.setValue(1);
                q.notify();
            }
        }
    }

    private class Consumer implements Runnable {
        private final Queue q;

        Consumer(Queue q) {
            this.q = q;
        }

        @Override
        public void run() {
            synchronized (q) {
                while (!q.hasValue()) {
                    try {
                        q.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                System.out.println(Thread.currentThread().getName() + " " + q.getValue());
            }
        }
    }

    public static void main(String[] args) {
        WaitNotifyExample example = new WaitNotifyExample();
        Queue q = example.new Queue();
        new Thread(example.new Producer(q), "Producer").start();
        new Thread(example.new Consumer(q), "Consumer").start();
    }
}

其中:

  1. 若删除synchronized后执行会抛出IllegalMonitorStateException,这是因为当使用wait和notify、notifyAll的时候必须拥有对象的monitor锁,否则会抛出异常。
  2. wait方法也可以传入参数指定timeout时间。

四、getClass

这是一个native的方法,返回本对象实例对应的class的对象。

五、clone

跟getClass一样也是一个native的方法,返回本对象的一个复制品。
注意:若要支持本方法,必须实现Cloneable接口。

六、finalize

这是另一个native的方法。当GC回收本对象的时候会被GC调用。
注意:由于该方法的执行时间是无法控制的,因此一般不建议实现该方法。如果需要资源清理请使用自定义方法。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,156评论 19 139
  • 相关概念 面向对象的三个特征 封装,继承,多态.这个应该是人人皆知.有时候也会加上抽象. 多态的好处 允许不同类对...
    东经315度阅读 2,020评论 0 8
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,805评论 18 399
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,395评论 11 349
  • 最年轻的法国总统马克龙以65.5%得票率当选法国新一任总统。即将和他一起牵手入驻法国总统爱丽舍宫的,是他64岁的夫...
    王老二也阅读 227评论 0 2