JAVA基础篇:Object对象

浩浩 等级 747 1 0

1 Object的内存结构和指针压缩了解一下

JAVA基础篇:Object对象

//hotspot的oop.hpp文件中class oopDesc
class oopDesc {
  friend class VMStructs;
  private:
  volatile markOop  _mark; //对象头部分
  union _metadata {  // klassOop 类元数据指针
    Klass*      _klass;   
    narrowKlass _compressed_klass;
  } _metadata;
  • Object的实例数据内存使用三部分组成的,对象头,实际数据区域、内存对齐区
  • 对象头布局如下:主要和锁,hashcode,垃圾回收有关;由于锁机制的内容篇幅过长,这里就不多解释了;和锁相关的markWord(markOop)内存布局如下

JAVA基础篇:Object对象

2 Object的几种基本方法

  • 本地方法
  1. private static native void registerNatives() 将Object定义的本地方法和java程序链接起来。Object类中的registerNatives
  2. public final native Class<?> getClass() 获取java的Class元数据
  3. public native int hashCode() 获取对象的哈希Code
  4. protected native Object clone() throws CloneNotSupportedException 获得对象的克隆对象,浅复制
  5. public final native void notify() 唤醒等待对象锁waitSet队列中的一个线程
  6. public final native void notifyAll() 类似notify(),唤醒等待对象锁waitSet队列中的全部线程
  7. public final native void wait(long timeout) 释放对象锁,进入对象锁的waitSet队列
  • 普通方法
public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode());}
public boolean equals(Object obj) { return (this == obj);}
public final void wait(long timeout, int nanos) throws InterruptedException;
//都是基于native void wait(long timeout)实现的
public final void wait() throws InterruptedException;
wait(long timeout, int nanos)、wait() 
//jvm回收对象前,会特意调用此方法 
protected void finalize() throws Throwable; 

Object的equals和hashCode

equals是用来比较两个对象是否相等的,可以重写该方法来实现自定义的比较方法;而hashCode则是用来获取对象的哈希值,也可以重写该方法。当对象存储在Map时,是首先利用Object.hashCode判断是否映射在同一位置,若在同一映射位,则再使用equals比较两个对象是否相同。

equals一样,hashCode不一样有什么问题?

如果重写equals导致对象比较相同而hashCode不一样,是违反JDK规范的;而且当用HashMap存储时,可能会存在多个我们自定义认为相同的对象,这样会为我们代码逻辑埋下坑。

Object.wait和Thread.sheep

Object.wait是需要在synchronized修饰的代码内使用,会让出CPU,并放弃对对象锁的持有状态。而Thread.sleep则简单的挂起,让出CPU,没有释放任何锁资源

finalize方法的使用

如果对象重写了finalize方法,jvm会把当前对象注册到FinalizerThread的ReferenceQueue队列中。对象没有其他强引用被当垃圾回收时,jvm会判断ReferenceQueue存在该对象,则暂时不回收。之后FinalizerThread(独立于垃圾回收线程)从ReferenceQueue取出该对象,执行自定义的finalize方法,结束之后并从队列移除该对象,以便被下次垃圾回收finalize会造成对象延后回收,可能导致内存溢出,慎用finally和finalize区别

finally是java关键字,用来处理异常的,和try搭配使用如果在finally之前return,finally的代码块会执行吗? try内的continue,break,return都不能绕过finally代码块的执行,try结束之后finally是一定会被执行的 相似的关键字final

final修饰类,该类不能被继承;修饰方法,方法不能被重写;修饰变量,变量不能指向新的值;修饰数组,数组引用不能指向新数组,但是数组元素可以更改如果对象被final修饰,变量有哪几种声明赋值方式?fianl修饰普通变量:1、定义时声明 2、类内代码块声明 3、构造器声明fianl修饰静态变量:1、定义时声明 2、类内静态代码块声明

收藏
评论区

相关推荐

JAVA基础篇:Object对象
1 Object的内存结构和指针压缩了解一下 java //hotspot的oop.hpp文件中class oopDesc class
JAVA hashCode和equals方法详解
hashCode和equals方法都是Object基类的方法 先看一个例子 public class Studeng { private Integer sid; private String name; public Integer ge
JDK核心JAVA源码解析(9)
> 本文基于 OpenJDK 11, HotSpot 虚拟机 在开发过程中我们可能会经常接触到`hashcode`这个方法来生成哈希码,那么底层是如何实现的?使用时有何注意点呢? hashcode() 方法底层实现 ================= `hashcode()`是`Object`的方法: @HotSpotIntrinsicCan
JDK核心JAVA源码解析(1)
想写这个系列很久了,对自己也是个总结与提高。原来在学JAVA时,那些JAVA入门书籍会告诉你一些规律还有法则,但是用的时候我们一般很难想起来,因为我们用的少并且不知道为什么。知其所以然方能印象深刻并学以致用。 首先我们从所有类的父类Object开始: 1\. Object类 =========== (1)hashCode方法和equals方法 ---
Java不定参数Object… obj 和 Object[] 的区别
Java不定参数Object… obj 和 Object\[\] 的区别 ==================================== 简述: > java中方法重载可以实现参数不同自动匹配对应方法。但现实中也存在这种问题。普通传参对于形如下面的方法,却显得臃肿而失优雅。 > > Map getRealLine( int left,
Java中为什么需要Object类,Object类为什么是所有类的父类
Java中Object是所有类的父类,所有类的对象都是Class类的实例。贴上java doc中的说明![](https://static.oschina.net/uploads/space/2017/0320/224831_Uobg_1400660.png) 为什么我们需要Object类 ============== 这个问题找到了一个外国哥们的回答,
Java基础入门之Object类、匿名内部类、构造方法的继承解析
点击上方“ **Java进阶学习交流** ”,进行关注 后台回复“**Java**”即可获赠Java学习资料 今 日 鸡 汤 古调虽自爱,今人多不弹。 前言 -- 大家好,我是Java进阶者。这篇文章我们主要介绍Java基础中的Object类、匿名内部类、构造方法的继承知识,一起来学习下吧! 一、Object类 ---------
Java提高篇——equals()与hashCode()方法详解
阅读目录 ==== * equals()方法详解 * hashcode() 方法详解 * Hashset、Hashmap、Hashtable与hashcode()和Equals()的密切关系 java.lang.Object类中有两个非常重要的方法: public boolean equals(Object obj) pub
java 面试知识点笔记(六)垃圾回收 下篇
**问:Object的finalize()方法的作用是否与C++的析构函数作用相同?** * 与C++的析构函数不同,析构函数调用是确定的,而finalize是不确定的 * 将未被引用的对象放置于F-Queue队列(垃圾收集器确定一个对象死亡时需要至少两次标记过程。第一次是可达性分析,没有引用则会标记并且判断是否执行finalize方法,如果对象覆
jdk源码之Object的hashcode
package java.lang; public class Object { private static native void registerNatives(); //创建对象时,先调用静态代码块(即registerNatives()方法),。native关键字表示该方法不是由java语言编写,
Object
nil 用来给对象赋值 NULL 则给任何指针赋值    //NULL 和 nil 不能互换,nil 用于类指针赋值 NSNull 则用于集合操作 一般情况下最好使用用 nil (空对象值,有意义) \[ nil  任意方法\],不会导致崩溃 NULL 是一个通用指针(泛型指针,指向空指针) NSNull,NULL 和 nil 在本质上应该
Guava库学习:Guava中Objects实用工具类的学习
    链接地址:[http://www.xx566.com/detail/128.html](https://www.oschina.net/action/GoToLink?url=http%3A%2F%2Fwww.xx566.com%2Fdetail%2F128.html)     Java中的Object类是所有Java类的超类(也就是祖先),所
JVM调优总结(2):一些概念(下)
Java对象的大小 --------- 基本数据的类型的大小是固定的,这里就不多说了。对于非基本类型的Java对象,其大小就值得商榷。 在Java中,**一个空Object对象的大小是8byte**,这个大小只是保存堆中一个没有任何属性的对象的大小。看下面语句: Object ob = new Object(); 有了Object对象的
Object
zilei. h文件 #import <Foundation/Foundation.h> //引入Car父类头文件,让子类知道Car是什么。 #import "Car.h" //子类也可以有自己的属性和自己的方法 [@interface](http://my.oschina.net/u/996807) zilei :Car{
Scala 学习笔记(6)
一、单例对象 在Scala当中没有静态属性或方法,如果需要的话,可以通过object来实现。另外,如果你需要用到单例,也可以用object来实现。总结:object = static+singleton object ObjectTest {   var name = ""   var age = 0   def main(args : Ar