JDK源码之Object
1、Object类简介
java中所有的类都会继承Object类,属于java.lang包。
Object类提供的方法如下:其中registerNatives()、getClass()、hashCode()、clone()、notify()、notifyAll()、wait(long timeout)为native方法,后面挑几个重要的方法讲一下。

native 为java的一个关键字
JNI:Java Native Interface ,从Java1.1开始,JNI标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互,例如C或者C++代码。

2、源码
2.1、getClass方法
public final native Class<?> getClass();
getClass()方法返回对象运行时类。
2.2、hashCode方法
public native int hashCode();
hashCode()返回对象的hash值,为int类型。那么对象创建好之后何时计算hashCode值?计算出的hashCode的值存放在那里呢?那么我们来看一下一个java对象组成 。

对象由对象头(对象头包括Mark Word 和 Class Pointer类型指针)、实例数据、对齐填充部分组成,数组对象比较特殊,会多数组长度部分。对齐填充部分时为了保证对象的大小是8字节的整数倍。
对象头中Mark Word用于存储对象自身的一些数据,具体存储信息如下图所示,对象头的大小在不同的虚拟机上的大小有所差异,通常为32bit或者64bit。
对象的hashCode值是在对象使用时调用hashCode函数时计算,并不是对象创建时就计算好的。


2.3、equals方法
public boolean equals(Object obj) {
return (this == obj);
}
由源码可以看出,在Object这个类中,equals()方法和==是相同的,比较的是两个对象的引用是否相同。
我们比较两个字符串是否相等时,需要比较字符串本身的内容是否相等,而不希望比较字符串的引用地址是否相同,所有String类重写了equals()方法,让我一起看看源码。
public boolean equals(Object anObject) {
if (this == anObject) { //如果引用的地址相同,那么这两个字符串必然相同,直接返回true
return true;
}
if (anObject instanceof String) {//判断对象是否为String类型
String anotherString = (String)anObject;//强转为String对象
int n = value.length;//获取对象长度
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) { //依次比较每个字符
if (v1[i] != v2[i])
return false; //有一个不相同则返回false
i++;
}
return true; //内容完全,返回true
}
}
return false; //不是String对象直接返回false
}
如果在程序开发中需要比较对象的属性值是否相同,应该重写Object的equals方法,否则会调用Object的equals方法,使用==比较两个对象引用地址是否相同。
2.4、clone方法
protected native Object clone() throws CloneNotSupportedException;
该方法实现对象的浅拷贝,使用clone()方法时,记得捕获CloneNotSupportedException异常,或者在类上实现Cloneable接口但不抛出该异常(尽管这在实际操作中不常见)。此外,使用clone()方法时要小心,因为它可能会导致性能问题或者在复杂对象图中出现问题(比如循环引用)。在Java中,通常推荐使用构造器或拷贝构造函数来实现浅拷贝或深拷贝,特别是在处理复杂对象时。。
浅拷贝(Shallow Copy)指的是创建一个新的对象,然后将原始对象的数据(字段)复制到新对象中。如果原始对象的字段是值类型(如int、double等基本数据类型,或者它们的包装类如Integer、Double等),这些值会被复制到新对象中。如果原始对象的字段是引用类型(如对象、数组等),那么这些引用类型的字段不会被复制其内容,而是复制引用本身的地址。这意味着新的对象和原始对象将引用同一个内存地址。
深拷贝:不仅复制对象本身,还递归地复制对象内部引用的所有对象。这意味着原始对象和副本对象不会共享任何引用指向的对象。
2.5、finalize方法
protected void finalize() throws Throwable { }
当一个Java对象被垃圾回收器标记为不再使用时,垃圾回收器会调用对象的finalize()方法来清理这个对象。但是垃圾回收器并不保证会立马调用该方法,可能会在后面某个何时的时间再调用。
JDK源码之Object的更多相关文章
- 【java基础之jdk源码】Object
最新在整体回归下java基础薄弱环节,以下为自己整理笔记,若有理解错误,请批评指正,谢谢. java.lang.Object为java所有类的基类,所以一般的类都可用重写或直接使用Object下方法, ...
- JDK源码阅读--Object
在java.lang包下 Object类:是所有类的基类(父类) public final native Class<?> getClass(); 返回这个Object所代表的的运行时类 ...
- jdk源码阅读-Object类
native 关键字 private static native void registerNatives(); static { registerNatives(); } public final ...
- JDK源码笔记--Object
public final native Class<?> getClass(); public native int hashCode(); public boolean equals(O ...
- JDK源码学习笔记——Object
一.源码解析 public class Object { /** * 一个本地方法,具体是用C(C++)在DLL中实现的,然后通过JNI调用 */ private static native void ...
- Java源码之Object
本文出自:http://blog.csdn.net/dt235201314/article/details/78318399 一丶概述 JAVA中所有的类都继承自Object类,就从Object作为源 ...
- 从JDK源码角度看Object
Java的Object是所有其他类的父类,从继承的层次来看它就是最顶层根,所以它也是唯一一个没有父类的类.它包含了对象常用的一些方法,比如getClass.hashCode.equals.clone. ...
- JDK源码阅读(一):Object源码分析
最近经过某大佬的建议准备阅读一下JDK的源码来提升一下自己 所以开始写JDK源码分析的文章 阅读JDK版本为1.8 目录 Object结构图 构造器 equals 方法 getClass 方法 has ...
- Timer的故事----Jdk源码解读
咱们今天也来说说定时器Timer Timer是什么? Timer n. [电子] 定时器:计时器:计时员 从翻译来看,我们可以知道Timer的本意是,定时定点. 而JDK中Timer类也的确是这个本 ...
- JDK源码分析—— ArrayBlockingQueue 和 LinkedBlockingQueue
JDK源码分析—— ArrayBlockingQueue 和 LinkedBlockingQueue 目的:本文通过分析JDK源码来对比ArrayBlockingQueue 和LinkedBlocki ...
随机推荐
- 快速查看kafka消息内容(支持指定group)
下载开源的 kafka 界面客户端 KafkaKing:https://github.com/Bronya0/Kafka-King 在成功下载该客户端后,进行连接操作.连接完毕后,切换到 consum ...
- 解决VMware虚拟机安装centos无法联网问题
网上的教程几乎试了个遍,最后使用该方法成功解决. 用终端进入目录:/etc/sysconfig/network-scripts 执行ls命令查看以"ifcfg-en"开头的文件,例 ...
- XML注入
XML注入 复现使用的题目为buuoj中的[NCTF2019]Fake XML cookbook 1和[NCTF2019]True XML cookbook 1 参考链接为https://xz.ali ...
- C#LINQ去掉数组字符串中的指定元素
例字符串: string s1 = "111,111,111222111,111333111,111"; string del = "111"; 要删除指定元素 ...
- 《HelloGitHub》第 110 期
兴趣是最好的老师,HelloGitHub 让你对开源感兴趣! 简介 HelloGitHub 分享 GitHub 上有趣.入门级的开源项目. github.com/521xueweihan/HelloG ...
- AD 横向移动-哈希传递攻击
本文通过 Google 翻译 Lateral Movement – Pass-the-Hash Attacks 这篇文章所产生,本人仅是对机器翻译中部分表达别扭的字词进行了校正及个别注释补充. 导航 ...
- Python 潮流周刊#107:无 GIL Python 被正式批准(摘要)
本周刊由 Python猫 出品,精心筛选国内外的 400+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...
- ET5.0运行--基础
nodejs转c#,刚刚开始使用ET,在运行Demo中记录了一下. ET5.0 githu: https://github.com/egametang/ET/tree/Branch_V5.0 环境: ...
- 开源 vGPU 方案 HAMi 原理分析 Part1:hami-device-plugin-nvidia 实现
本文为开源的 vGPU 方案 HAMi 实现原理分析第一篇,主要分析 hami-device-plugin-nvidia 实现原理. 之前在 开源 vGPU 方案:HAMi,实现细粒度 GPU 切分 ...
- ETL知识了解并备份
大数据横行的时代,我们对数据越来越重视,从数据的采集.分析.展示每个过程关注进而针对客户完善数据.数据集成是把不同来源.格式和特点的数据在逻辑上或物理上有机地集中,从而为企业提供全面的数据共享,是企业 ...