JDK1.8源码学习-Object

JDK1.8源码学习-Object

目录

一、方法简介

1.一个本地方法,主要作用是将本地方法注册到虚拟机中。

private static native void registerNatives();
    static {
        registerNatives();
    }

2.获取类的字节码对象

public final native Class<?> getClass();

3.返回当前对象的hash值

 public native int hashCode();

4.比较党当前对象的引用是否和要比较的对象的引用指向同一对象

 public boolean equals(Object obj) {
        return (this == obj);
    }

5.克隆对象,浅拷贝

protected native Object clone() throws CloneNotSupportedException;

6.返回当前对象的一个字符串表示形式

public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }

7.唤醒一个正在等待该对象的线程,如果有多个线程等待,则只能唤醒其中一个

public final native void notify();

8.唤醒所有正在等待这个对象的线程

public final native void notifyAll();

9.阻塞当前线程,等timeout毫秒后会自动唤醒当前线程,当timeout为0时,表示不会自动唤醒线程

public final native void wait(long timeout) throws InterruptedException;

10.阻塞当前线程,等timeout毫秒后会自动唤醒当前线程,nanos为纳秒

    public final void wait(long timeout, int nanos) throws InterruptedException {
        if (timeout < 0) {
            throw new IllegalArgumentException("timeout value is negative");
        }

        if (nanos < 0 || nanos > 999999) {
            throw new IllegalArgumentException(
                                "nanosecond timeout value out of range");
        }

        if (nanos > 0) {
            timeout++;
        }

        wait(timeout);
    }

11.阻塞当前线程

    public final void wait() throws InterruptedException {
        wait(0);
    }

12.当垃圾回收器确定该对象在任何地方没有被引用时,会调用此方法进行垃圾回收

protected void finalize() throws Throwable { }

二、方法详解

1.equals方法

在面试中经常会问道equals()方法和==运算的区别,==运算符用于比较基本类型的值是否相同而equals用于比较两个对象是否相等,在Object中equals与==是等价的,比较的是两个对象的引用,所以自定义对象的时候需要重写equals方法。在Java规范中,对equals方法的使用必须遵循以下几个原则:    

  • 自反性:对于任何非空引用值 x,x.equals(x) 都应返回 true。
  • 对称性:对于任何非空引用值 x 和 y,当且仅当 y.equals(x) 返回 true 时,x.equals(y) 才应返回 true。
  • 传递性:对于任何非空引用值 x、y 和 z,如果 x.equals(y) 返回 true,并且 y.equals(z) 返回 true,那么 x.equals(z) 应返回 true。
  • 一致性:对于任何非空引用值 x 和 y,多次调用 x.equals(y) 始终返回 true 或始终返回 false,前提是对象上 equals 比较中所用的信息没有被修改
  • 对于任何非空引用值 x,x.equals(null) 都应返回 false

  需要注意的是重写equals必须重写hashCode,且

X.equals(Y)==true,则X.hashCode()==Y.hashCode();

X.hashCode()==Y.hashCode(),则X.equals(Y)不一定为true,也可能为false;

具体原因可查看hashMap等集合源码。

 2. getClass方法 

1.一个类的实例对象可以有很多,但是它的字节对象只有一个。

2.一个对象可以被强转为其他对象但是其字节码不变。

public class App {
    public static void main(String[] args) {

        Class clazz1 = new Person().getClass();
        Class clazz2 = new Person().getClass();
        Class clazz3 = Person.class;

        System.out.println(clazz1 == clazz2);//true
        System.out.println(clazz1 == clazz3);//true

        System.out.println(Object.class == (Object)(new Person()).getClass());//false
        System.out.println(Person.class == (Object)(new Person()).getClass());//true

    }
}

class Person{

}

3.clone方法

浅拷贝与深拷贝的区别:

  浅拷贝:如果在一个对象的内部还有一个引用类型的变量,那么在拷贝对象的时候,clone方法新产生的对象只是拷贝了一个该基本类型的引用。

  深拷贝:如果在一个对象内部含有一个引用类型的变量,那么就会将该引用类型的变量指向的对象复制一份,然后引用该新对象。

  

4.toString方法

该方法返回一个能代表该对象的字符串,该字符串由类名以及该对象的十六进制的哈希值拼成。通常情况下,其子类需要覆写该方法。

5.finalize方法

垃圾回收器在认为该对象是垃圾对象的时候会调用该方法,子类可以通过重写该方法来达到资源释放的目的。

在方法调用过程中出现的异常会被忽略且方法调用会被终止。

任何该对象的方法只会被调用一次。

总结

  本地方法7个:

private static native void registerNatives()

public final native Class<?> getClass()

    public native int hashCode()

    protected native Object clone()

public final void notify()

public final native void notifyAll()

public final native void wait(long timeout)

       非本地方法5个:

   public boolean equals(Object obj)

   public String toString()

     public final void wait(long timeout,int nanos)

     public final void wait()

     protected void finalize()

思考点:notify、notifyAll、wait这些和多线程有关的方法为什么定义在Object类中?

1.在java的内置锁机制中,每个对象都可以成为锁,也就是说每个对象都是可以去调用这些方法的,而Object是所有类的父类,所以要把这些方法放到Object中。

2.一个线程可以拥有多个对象锁,上面这些方法跟对象锁之间是有一个绑定关系的,比如用对象锁aObject调用的wait()方法,那么只能通过aObject.notify()或者aObject.notifyAll()来唤醒这个线程,这样JVM很容易就知道该从哪个对象锁的等待池中去唤醒线程,假如用Thread.wait()、Thread.notify()、Thread.notifyAll()来调用,虚拟机则无法判断要操作的对象锁是哪个。

原文地址:https://www.cnblogs.com/liudblog/p/11193963.html

时间: 2024-08-08 01:38:24

JDK1.8源码学习-Object的相关文章

JDK1.8源码学习之 HashMap.java

///JDK1.8源码学习之HashMap.java package java.util; import java.io.IOException; import java.io.InvalidObjectException; import java.io.Serializable; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.function.BiConsu

JDK1.8源码学习-ArrayList

JDK1.8源码学习-ArrayList 目录 一.ArrayList简介 为了弥补普通数组无法自动扩容的不足,Java提供了集合类,其中ArrayList对数组进行了封装,使其可以自动的扩容或缩小长度,相当于动态数组. ArrayList封装了一个动态的可以重新分配的Object[]数组,其中每一个类的对象都有一个capacity属性,表示了它们所封装的Object[]数组的长度,当向ArrayList中添加元素的时候,该属性会自动的添加.如果想要添加大量元素的时候,可以使用ensureCap

JDK1.8源码学习-String

JDK1.8源码学习-String 目录 一.String简介 String类是Java中最常用的类之一,所有字符串的字面量都是String类的实例,字符串是常量,在定义之后不能被改变. 二.定义 public final class String implements java.io.Serializable, Comparable<String>, CharSequence{} 1.String类是由final修饰的,表明String类不能被继承,并且String类中的成员方法都默认是fi

JDK1.8源码学习-String-hashCode方法为什么选择数字31作为乘子

1. 背景 某天,我在写代码的时候,无意中点开了 String hashCode 方法.然后大致看了一下 hashCode 的实现,发现并不是很复杂.但是我从源码中发现了一个奇怪的数字,也就是本文的主角31.这个数字居然不是用常量声明的,所以没法从字面意思上推断这个数字的用途.后来带着疑问和好奇心,到网上去找资料查询一下.在看完资料后,默默的感叹了一句,原来是这样啊.那么到底是哪样呢?在接下来章节里,请大家带着好奇心和我揭开数字31的用途之谜. 2. 选择数字31的原因 在详细说明 String

JDK1.8源码学习之Map.java

package java.util; import java.util.function.BiConsumer; import java.util.function.BiFunction; import java.util.function.Function; import java.io.Serializable; /** * 一个可以将关键字映射为值的对象; * 一个map可以包含重复的关键字keys * 但一个关键字(key)最多只能映射到一个值(value) * *这个接口取代了Dict

【JDK1.8】 Java小白的源码学习系列:HashMap

目录 Java小白的源码学习系列:HashMap 官方文档解读 基本数据结构 基本源码解读 基本成员变量 构造器 巧妙的tableSizeFor put方法 巧妙的hash方法 JDK1.8的putVal方法 JDK1.8的resize方法 初始化部分 数组搬移部分 Java小白的源码学习系列:HashMap 春节拜年取消,在家花了好多天时间啃一啃HashMap的源码,同样是找了很多很多的资料,有JDK1.7的,也有JDK1.8的,当然本文基于JDK1.8.将所学到的东西进行整理,希望回过头再看

Hadoop源码学习笔记(4) ——Socket到RPC调用

Hadoop源码学习笔记(4) ——Socket到RPC调用 Hadoop是一个分布式程序,分布在多台机器上运行,事必会涉及到网络编程.那这里如何让网络编程变得简单.透明的呢? 网络编程中,首先我们要学的就是Socket编程,这是网络编程中最底层的程序接口,分为服务器端和客户端,服务器负责监听某个端口,客户端负责连接服务器上的某个端口,一旦连接通过后,服务器和客户端就可以双向通讯了,我们看下示例代码: ServerSocket server = new ServerSocket(8111); S

Java集合专题总结(1):HashMap 和 HashTable 源码学习和面试总结

2017年的秋招彻底结束了,感觉Java上面的最常见的集合相关的问题就是hash--系列和一些常用并发集合和队列,堆等结合算法一起考察,不完全统计,本人经历:先后百度.唯品会.58同城.新浪微博.趣分期.美团点评等都在1.2--面的时候被问过无数次,都问吐了&_&,其他公司笔试的时候,但凡有Java的题,都有集合相关考点,尤其hash表--现在总结下. Java集合概述 HashMap介绍 HashMap源码学习 关于HashMap的几个经典问题 HashTable介绍和源码学习 Hash

由JDK源码学习HashMap

HashMap基于hash表的Map接口实现,它实现了Map接口中的所有操作.HashMap允许存储null键和null值.这是它与Hashtable的区别之一(另外一个区别是Hashtable是线程安全的).另外,HashMap中的键值对是无序的.下面,我们从HashMap的源代码来分析HashMap的实现,以下使用的是Jdk1.7.0_51. 一.HashMap的存储实现 HashMap底层采用的是数组和链表这两种数据结构.当我们把key-value对put到HashMap时,系统会根据ha