今天有幸和公司cto一起共进晚餐,期间谈到了基础知识对于一个程序员的重要,他给我们说到他面试人的经历,一般因为忙在大概看过简历之后就只会随便问一个两个问题,其中他最喜欢的一个方式就是,直接叫面试者写出Object类的所有方法,多写一个工资就多一千块钱。(默默想了下自己只值4000块),现在各位读者自己回想一下能够回答上来么,回答不上也没关系,俗话说做好“事后百分百”。我也想借用这篇博文一起探讨下这个看似简单却也难倒很多人的话题。
作为java中的“万物之父”Object,下面一共有12个方法(这就意味着当你能全部写出12个的时候,你的工资就已经多出12k了)。分别如下所示:
object中的方法其中就来一一研究一下。
1.registerNatives()
registerNatives含义是本地注册的意思。分析:该类有static,为静态方法,同时有native修饰。native表示该方法的实现java本身并没有完成,而是有c/c++来完成,形成.dll文件。但是我们注意到,这里的{}里并没有具体的方法体,而且这里是由private修饰,那么应该如何执行呢?其实后面还一个静态代码块。静态代码块就是一个类在初始化过程中必定会执行的内容,所以在这里执行。
registerNatives()2.hashCode()
Java中的hashCode方法就是根据一定的规则将与对象相关的信息(比如对象的存储地址,对象的字段等)映射成一个数值,这个数值称作为散列值。其主要作用是为了配合基于散列的集合一起正常运行,这样的散列集合包括HashSet、HashMap以及HashTable。当集合要添加新的对象时,先调用这个对象的hashCode方法,得到对应的hashcode值,实际上在HashMap的具体实现中会用一个table保存已经存进去的对象的hashcode值,如果table中没有该hashcode值,它就可以直接存进去,不用再进行任何比较了;如果存在该hashcode值,就调用它的equals方法与新元素进行比较,相同的话就不存了,不相同就散列其它的地址。这样解决了向含有大量数据的集合中添加元素时,大量频繁的操作equals方法的问题。
hashCode()3.equals()
equals比较两个对象是否相当,其原理为比较所存储的内存地址是否相同,相同的话则返回true,不相同则返回false。当一个对象重写了equals方法之后就不再调用object类的equals方法而是调用重写的equals方法。而因为equals比较的是地址,因此重写equals方法之后,一定得重写hashCode方法,以此保证相同的对象必须有相同的hashCode值。
Object()4.clone()
顾名思义,克隆一个对象。其中克隆的对象会拥有和源对象相同的变量,方法等。唯一不相等的是他们在内存中所存储的地址(这也能解释为什么它们是两个对象)。
clone()5.toString()
返回该对象的字符串表示。通常,toString 方法会返回一个“以文本方式表示”此对象的字符串。结果应是一个简明但易于读懂的信息表达式。建议所有子类都重写此方法。
Object 类的 toString 方法返回一个字符串,该字符串由类名(对象是该类的一个实例)、at 标记符“@”和此对象哈希码的无符号十六进制表示组成。如下所示:
toString()6.wait(),notify()/notifyAll()
首先wait()、notify/notifyAll() 方法是Object的本地final方法,无法被重写。同时这几个方法都得配合synchronized使用。
wait()执行后拥有当前锁的线程会释放该线程锁,并处于等待状态(等待重新获取锁)notify/notifyAll() 执行后会唤醒处于等待状态线程获取线程锁、只是notify()只会随机唤醒其中之一获取线程锁,notifyAll() 会唤醒所有处于等待状态的线程抢夺线程锁。
notify() notifyAll() wait()7.finalize()
程序员都知道“初始化”的重要性,但通常都会忘记清除的重要性。当然Java可用垃圾收集器回收不再使用的对象所占据的内存。但对于一个“特殊”的内存区域--没有使用new关键字来分配,垃圾收集器只知道释放那些由new分配的内存(垃圾收集器简介),那该如何回收这“特殊”的内存呢?Java提供了一个被称为收尾的机制。使用这个机制,你可以定义一些特殊的操作,这些操作将在一个对象将要被垃圾回收器回收时执行。而这些操作就是在finalize()方法里实现的。
finalize()希望这篇文章能在各位对Object类的理解上有所帮助,喜欢就点个赞吧
网友评论