文章目录

  • java.lang.Object核心要点
  • java.lang.Object重要方法

java.lang.Object核心要点

  • Object类是所有类的基类,是Java中唯一一个没有基类的类。
  • 一个类可以不是Object类的直接派生类,但一定是Object类的派生类, Java中的每一个类都是从Object扩展来的。
  • 在Object类中定义的方法,在所有类中都可以使用。
  • java.lang.Object属于java.base模块,其API文档(以19为例)可以点此查看

java.lang.Object重要方法

  • public final native Class<?> getClass():返回当前运行时对象的Class对象

    • native意味着该方法用本地语言(比如C或C++)实现。
    • final意味着该方法不允许派生类重写。
  • public native int hashCode():返回对象的哈希码。
    • native意味着该方法用本地语言(比如C或C++)实现。
    • 哈希码是一个代表对象的十六进制整数,好比对象的“身份证号”。在程序运行期间,每次调用同一个对象的hashCode()返回的哈希码必定相同,但是多次执行同一个程序,程序的一次执行和下一次执行期间同一个对象的哈希码不一定相同。实际上默认的哈希码是将对象的内存地址通过某种转换得到的,所以不同对象会有不同的哈希码。
    • hashCode规则:
      • 每当在Java应用程序的执行期间对同一对象多次调用该方法时,若用于equals比较对象的信息没有被修改,则hashCode方法必须始终返回相同的整数。从一个应用程序的一次执行到同一应用程序的另一次执行,该整数不需要保持一致。
      • 如果根据该方法两个对象equals方法判断相等,则它们调用hashCode方法必须产生相同的整数结果。
      • equals方法判断不相等的对象的hashCode值不必相等,hashCode值相等的两个对象equals方法不必返回相等。但是,为不相等的对象生成不同的整数结果有助于提高哈希表的性能。
  • public boolean equals(Object obj):返回某个其他对象是否“等于”这个对象(推荐阅读:相等判定)。
    • 该方法实际比较两个对象的内存地址是否相等,java.lang.Integer、java.lang.String等类都重写了该方法。
    • 为了避免java.lang.NullPointerException,在判断x.equals(y)前应该先判断x是否为null。对于字符串,判断空串的最佳实践是:"".equals(str)
    • equals方法在非空对象引用上实现等价关系(推荐阅读:等价关系):
      • 自反性:对于任何非空引用值x,x.equals(x)都应该返回true。
      • 对称性:对于任何非空引用值x和y,x.equals(y)返回true当且仅当y.equals(x)返回true。
      • 传递性:对于任何非空引用值 x、y和z,如果x.equals(y返回true且y.equals(z)返回true,则x.equals(z)应该返回true。
      • 一致性:对于任何非空引用值x和y,若用于equals比较对象的信息没有被修改,则多次调用x.equals(y)一致返回true或一致返回false。
    • 实现源码:
      public boolean equals(Object obj) {return (this == obj);
      }
      
  • protected native Object clone() throws CloneNotSupportedException:创建并返回当前对象的一份拷贝。
    • native意味着该方法用本地语言(比如C或C++)实现。
    • 推荐阅读:浅拷贝与深拷贝
  • public String toString():返回类的名字实例的哈希码的十六进制的字符串(类名@hashcode十六进制数值)。
    • Java建议Object所有的子类都重写这个方法。
    • 实现源码:
      public String toString() {return getClass().getName() + "@" + Integer.toHexString(hashCode());
      }
      
  • public final native void notify():唤醒在此对象的监视器上等待的单个线程。如果有多个线程正在等待该对象,则选择唤醒其中一个线程。
    • native意味着该方法用本地语言(比如C或C++)实现。
    • final意味着该方法不允许派生类重写。
    • 唤醒选择选择是任意的,由具体实现决定。线程通过调用wait方法在对象的监视器上等待。
    • 唤醒的线程直到当前线程放弃对该对象的锁定才可能获得锁。即便当前线程放弃对该对象的锁定,被唤醒的线程也要与正在积极竞争同步该对象的任何其他线程进行竞争锁。
    • 此方法只能由作为此对象监视器所有者的线程调用,一次只有一个线程可以拥有一个对象的监视器。线程通过以下三种方式之一成为对象监视器的所有者:
      • 通过执行该对象的同步实例方法。
      • 通过执行在对象上同步的synchronized语句的主体。
      • 对于Class类型的对象,通过执行该类的静态同步方法。
  • public final native void notifyAll():唤醒在此对象的监视器上等待的所有线程。
    • native意味着该方法用本地语言(比如C或C++)实现。
    • final意味着该方法不允许派生类重写。
    • 线程通过调用wait方法在对象的监视器上等待。
    • 唤醒的线程直到当前线程放弃对该对象的锁定才可能获得锁。即便当前线程放弃对该对象的锁定,被唤醒的线程也要与正在积极竞争同步该对象的任何其他线程进行竞争锁。
    • 此方法只能由作为此对象监视器所有者的线程调用,一次只有一个线程可以拥有一个对象的监视器。线程通过以下三种方式之一成为对象监视器的所有者:
      • 通过执行该对象的同步实例方法。
      • 通过执行在对象上同步的synchronized语句的主体。
      • 对于Class类型的对象,通过执行该类的静态同步方法。
  • public final void wait() throws InterruptedException:让当前线程等待直到它被唤醒(notified或interrupted)。
    • final意味着该方法不允许派生类重写。
    • 实现源码:
       public final void wait() throws InterruptedException {wait(0L);
      }
      
  • public final void wait(long timeoutMillis) throws InterruptedException:让当前线程等待直到它被唤醒(notified或interrupted或超时)。
    • final意味着该方法不允许派生类重写。
    • sleep方法没有释放锁,而wait方法释放了锁。
    • 实现源码:
      public final void wait(long timeoutMillis) throws InterruptedException {long comp = Blocker.begin();try {wait0(timeoutMillis);} catch (InterruptedException e) {Thread thread = Thread.currentThread();if (thread.isVirtual())thread.getAndClearInterrupt();throw e;} finally {Blocker.end(comp);}
      }
      
    • 调用的wait0方法定义为private final native void wait0(long timeoutMillis) throws InterruptedException
  • public final void wait(long timeout, int nanos) throws InterruptedException:让当前线程等待直到它被唤醒(notified或interrupted或超时)。
    • final意味着该方法不允许派生类重写。
    • sleep方法没有释放锁,而wait方法释放了锁。
    • 当前线程将自身置于此对象的等待队列中,然后放弃对此对象的所有同步声明。请注意,只有此对象上的锁被放弃;当前线程可能同步的任何其他对象在线程等待时保持锁定状态。
    • 一个线程可以在没有被通知、中断或超时的情况下被唤醒,这就是所谓的虚假唤醒。虽然这在实践中很少发生,但应用程序必须通过测试应该导致线程被唤醒的条件来防止它,如果条件不满足则继续等待。
    • 实现源码:
      public final void wait(long timeoutMillis, int nanos) throws InterruptedException {if (timeoutMillis < 0) {throw new IllegalArgumentException("timeoutMillis value is negative");}if (nanos < 0 || nanos > 999999) {throw new IllegalArgumentException("nanosecond timeout value out of range");}if (nanos > 0 && timeoutMillis < Long.MAX_VALUE) {timeoutMillis++;}wait(timeoutMillis);
      }
      
  • protected void finalize() throws Throwable:当垃圾收集确定不再有对该对象的引用时,由垃圾收集器对该对象调用。
    • 子类重写finalize方法以处理系统资源或执行其他清理。
    • Deprecated修饰,从Java9开始判定为过时。
    • 推荐阅读:final、finally、finalize

【Java】java.lang.Object相关推荐

  1. java反射invoke空指针_【Java】Java 反射 object is not an instance of declaring cla

    [Java]Java 反射 object is not an instance of declaring cla [Java]Java 反射 object is not an instance of ...

  2. Java EE之Hibernate异常总结【5】java.lang.StackOverflowError[栈溢出]

    Java EE之Hibernate异常总结[5]java.lang.StackOverflowError[栈溢出] 参考文章: (1)Java EE之Hibernate异常总结[5]java.lang ...

  3. 【Java】java.util.Objects 工具类方法研究

    [Java]java.util.Objects 工具类方法研究 Objects 与 Object 区别 Object 是 Java 中所有类的基类,位于java.lang包. Objects 是 Ob ...

  4. 【Java】Java零基础学习笔记

    文章目录 前言 思维导图 前期准备 卸载JDK 安装JDK Hello,world 可能遇到情况 java程序运行机制 IDEA的安装 java基础部分 基础语法 运算符 包机制 javaDoc文档手 ...

  5. 【笔记】Java反射专题

    反射专题 链接:[韩顺平讲Java]Java反射专题 1. 引出反射 需求: (1)根据配置文件re.properties指定信息,创建Cat对象并调用方法hi classfullpath=com.q ...

  6. java 网络爬虫 正则表达式_【干货】Java网络爬虫基础知识

    原标题:[干货]Java网络爬虫基础知识 引言 Java 网络爬虫具有很好的扩展性可伸缩性,其是目前搜索引擎开发的重要组成部分.例如,著名的网络爬虫工具 Nutch 便是采用 Java 开发,该工具以 ...

  7. 【转载】Java之什么是JIT (Just In Time)?

    [转载]Java之什么是JIT (Just In Time)? JIT概念 JIT:Just In Time Compiler,一般翻译为即时编译器,这是是针对解释型语言而言的,而且并非虚拟机必须,是 ...

  8. .interface文件怎么看啊_【干货】Java关键字合集,看这篇就够了!

    往期精彩回顾 [Java软件]这几款编程软件决定你的编程路能走多远! 最好的Python开发编辑器都在这里,肯定有你没用过的! [福利]Java集合+Spring+开源...最新面试题干货整理! 1. ...

  9. 【Java】Java 对象头 真的是 32位 吗?

    1.概述 HotSpot虚拟机中,对象在内存中存储的布局可以分为三块区域: 对象头(Header) 实例数据(Instance Data) 对齐填充(Padding). 是真的吗?假的! 假的!!! ...

  10. 【信息检索】Java简易搜索引擎原理及实现(三)B+树索引和轮排索引结构

    上一篇文章 :[信息检索]Java简易搜索引擎原理及实现(二)新增停用词表 + 查询处理,我们在建立好的倒排索引的结构中剔除了停用词,同时引入了AND.OR.ANDNOT操作符,支持三种查询方式. 这 ...

最新文章

  1. Python爬虫之足球小将动漫(图片)下载
  2. Charpter5 软件测试总结
  3. linux php ldap扩展,php_ldap域集成模块安装-159
  4. Ubuntu 16.04下减小/释放/清理VirtualBox虚拟硬盘文件的大小
  5. Array的sort() 方法
  6. java密钥库文件存在但为空_java安全套接层SSL示例
  7. oracle不属于集合操作,Oracle的几个集合操作
  8. [转载] Python集合set
  9. 迅为IMX8MM开发板Linux系统修改默认屏幕
  10. Qt编写onvif搜索和云台控制工具源码
  11. 去大公司,还是小公司?我也曾犹豫彷徨……
  12. android app 目标版本,android – 在gradle中使用目标sdk版本23时,ZBA...
  13. 重装系统找不到固态_SSD固态硬盘才装上确找不到盘怎么办 --好文
  14. 为什么黑客几乎不用鼠标?
  15. 用SSI设计组合逻辑红绿灯控制电路
  16. ZGC收集器(学习笔记)
  17. 诺奖以上,真相未满:追捕黑洞二百年
  18. 干货|6个牛逼的基于Vue.js的后台控制面板,接私活必备
  19. dapper mysql通用类_Dapper ORM 用法
  20. 全国AI特色中小学榜单发布:北京46家单位入围,上海3家

热门文章

  1. oracle 加权久期,久期 - MBA智库百科
  2. 开源工具 | 手游自动化框架GAutomator,新增iOS系统和UE4引擎支
  3. SpringMVC 上传文件或图片并以二进制流的方式存到数据库
  4. JAVA从零开始开发区块链技术
  5. 【旧资料整理】8086汇编 鼠标操作
  6. 基于IMS的VoLTE业务
  7. 消费金融及物流概念介绍
  8. 如何使用手机将PDF合并呢?分享一个手机合并文件方法
  9. Convertio —— 支持 300 种文件格式的在线转换神器
  10. 手绘机器学习全流程,教你如何实现模型训练