JDK1.8源码阅读-java.lang.Object.java

1.getClass()

public final native Class<?> getClass();

获得的是变量实际的类型,比如

得到的输出结果是 hashmap。

getClass 获得的实际类型是Class<? extends |X|> 其中X是变量声明时的类型

2.hashCode()

一个对象中无论被调用多少次,都会返回同一个值。以保证不会影响equals()的比较结果。但是在两次不同的运行中,不能保证相同的hashCode。(挺好理解的,就是在一次)

3.equals()

对象应当满足:

1.自反性(a.equals(a)返回true)

2.对称性(a.equals(b)返回true,则 b.equals(a)也返回true)

3.传递性(a.equals(b)==true,b.equals(c)==true,则a.equals(c)==true)

4.持续性,一日相等终生相等

4.clone()

为了保证复制出的对象的独立性,通常是需要修改复制出来对象的几个域。这意味着如果复制的对象比较复杂(具有比较深的对象结构),那么将会把对这个对象的引用改成对它的备份的引用。

1.如果这个对象的类本身没有实现Cloneable接口的话,将会抛出异常CloneNotSupportedException。

2.这个方法产生的对象是浅拷贝(创建一个新对象,初始化它的所有类,并且赋值上与原对象一样的值,所以只是值相同的浅拷贝),而不是深拷贝。、

5.toString()

默认返回 类名@哈希值。建议所有的类都重写这个方法,返回属于自己的toString值。

6.notify()

唤醒单个线程,如果有多个线程正在等待唤醒,那么这个线程是随机选择的。

只有锁的拥有者才可以调用这个方法。那么怎么拥有锁呢?只有三个方法可以获得锁:

1.执行对象中的某个同步方法(对象锁)

2.执行某个同步代码段(对象锁)

3.执行某个静态同步方法(类锁)

那么如果不是锁的拥有者调用这个方法呢?会抛出IllegalMonitorStateException异常。

7.notifyAll()

与notify()功能基本一致,只是唤醒的是所有线程。

8.wait(long timeout)

当前锁的拥有者,放弃已经获取的所有锁,进入休眠并不可用。只有四种情况能打断:

1.某个线程调用了该对象的notify方法,并且刚好被选中。

2.某个线程调用了notifyAll()方法

3.某个线程调用了interrupt()方法中断了这个线程的阻塞状态,抛出InterruptedException异常后,继续正常运行。

4.等待时间到了。不过如果传入的timeout为0,则timeout无效,该线程只能靠notify唤醒

以上的四种情况,都可以打断线程的wait状态。

如果timeout小于0,则抛出IllegalArgumentException。

如果当前线程不是线程锁的拥有者,则抛出IllegalMonitorStateException。

如果被Interrupt()方法唤醒,则抛出InterruptedException

9.wait(long timeout, int nanos)

比起wait(timeout)方法,通过第二个参数nanos,提供了更细粒度的控制。nanos指的是纳秒的数量。

10.wait()

就像是传wait(0),就没有等待时间,只有八其中的1.2.3三个场景能打断。

11.finalize()

当一个对象没有任何引用时,它的finialize()方法将会在垃圾回收时被垃圾回收器调用。一般子类应该重写这个方法来处理系统资源或执行其他清理(少数情况下,可能会执行某些操作让这个对象再被其他线程的对象所引用到)。

JAVA不保证调用这些对象的finalize()方法,但是保证一旦调用的时候,调用该方法的线程不会持有任何用户可见的同步锁。并且这个方法内即使有不被捕获的异常,那些异常也会被忽略,对象的终结过程被终止,这个对象进入被破坏状态。

在调用了一个对象的finalize()方法后,不会采取进一步的动作。直到JVM确保没有任何线程可以访问到该对象之后,包括任何可能的动作或类,这个对象才会被丢弃。

在finalize中的任何异常都会导致finalize这个行动被中断,但是这些异常都会被忽略掉。忽略掉的意思指的是程序会正常运行,不会受影响。但是finalize这个行动已经停了下来,而对象也进入被破坏状态。

原文地址:https://www.cnblogs.com/better-be-better/p/9871377.html

时间: 2024-08-02 20:33:51

JDK1.8源码阅读-java.lang.Object.java的相关文章

《java.util.concurrent 包源码阅读》02 关于java.util.concurrent.atomic包

Aomic数据类型有四种类型:AomicBoolean, AomicInteger, AomicLong, 和AomicReferrence(针对Object的)以及它们的数组类型, 还有一个特殊的AomicStampedReferrence,它不是AomicReferrence的子类,而是利用AomicReferrence实现的一个储存引用和Integer组的扩展类 首先,所有原子操作都是依赖于sun.misc.Unsafe这个类,这个类底层是由C++实现的,利用指针来实现数据操作 关于CAS

根据jdk1.8源码整理而得,java集合体系(继承、实现关系)图解,超清晰,一看就懂,方便记忆

一.前言 1. 该关系图是本人根据JDK1.8 源码整理所得,只整理了常用的.常见的集合,并非全部. 2. 整理逻辑: Collection接口下有两个子接口:List 和 Set 接口. Map是独立的一个接口. 有关各类集合的特点,图中只是给出了总结,并未从底层数据结构去分析,后面有时间我会再写一篇常用集合底层数据结构分析的博文. 3.对关系图的解释说明: ①从左往右各个接口/实现类之间的关系:左边的节点被右边的节点所实现/继承: ②虚线:虚线起点的类实现了虚线箭头指向的接口. ③集合的三大

HashMap与HashTable的哈希算法——JDK1.9源码阅读总结

下面是HashTable源码中的put方法: 注意上面注释标注的地方: HashTable对于元素在哈希表中的坐标算法是: 将对象自身的哈希值key.hashCode()变为正数:hash & 0x7FFFFFFF 将上面得到的哈希值对表长取余,映射到哈希表中去. HashMap中哈希算法比HashTable中的稍微复杂一点.总体可以分为两步: 一.重新计算key本身的哈希值 上面代码中,首先是一个三目运算符,判断key是不是等于null,等于null,则返回0作为哈希值.否则,运算(h=key

《java.util.concurrent 包源码阅读》 结束语

<java.util.concurrent 包源码阅读>系列文章已经全部写完了.开始的几篇文章是根据自己的读书笔记整理出来的(当时只阅读了部分的源代码),后面的大部分都是一边读源代码代码,一边写文章. 由于水平有限,在阅读源代码的时候,分析得也比较浅显,也有很多地方自己也没有研究明白,文章有的地方显得语焉不详,只能请各位多多见谅了. 后面会继续写一些关于Java并发编程的文章,希望各位多多指教. 这里整理了一个简单的目录,包含了本系列所有文章的链接: <java.util.concurr

OpenJDK 源码阅读之 Arrays

概要 类继承关系 java.lang.Object java.util.Arrays 定义 public class Arrays extends Object 要点 此类主要是提供了一些操作数组的方法,比如排序啊,搜索啊.也提供一个工厂,用于将数组当成一个 List. 实现 quick sort public static void sort(int[] a) { DualPivotQuicksort.sort(a); } sort 使用了 util 中的另一个类中的方法,DualPivotQ

OpenJDK 源码阅读之 LinkedList

概要 类继承关系 java.lang.Object java.util.AbstractCollection<E> java.util.AbstractList<E> java.util.AbstractSequentialList<E> java.util.LinkedList<E> 定义 public class LinkedList<E> extends AbstractSequentialList<E> implements

OpenJDK 源码阅读之 ArrayDeque

概要 类继承关系 java.lang.Object java.util.AbstractCollection<E> java.util.ArrayDeque<E> 定义 public class ArrayDeque<E> extends AbstractCollection<E> implements Deque<E>, Cloneable, Serializable 要点 对 Deque 接口的实现 可调整大小 非线程安全 作为栈比 Stac

OpenJDK 源码阅读之 ArrayList

概要 类继承关系 java.lang.Object java.util.AbstractCollection<E> java.util.AbstractList<E> java.util.ArrayList<E> 定义 public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serial

ArrayList源码阅读

ArrayList实现 继承关系 java.lang.Object - java.util.AbstractCollection<E> - java.util.AbstractList<E> - java.util.ArrayList<E> 实现接口 Serializable, Cloneable, Iterable<E>, Collection<E>, List<E>, RandomAccess 关键属性 private trans