JAVA基础篇:Object对象

浩浩 等级 435 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
Object-C中的内存管理
ObjectC中的内存管理 原文链接地址:http://www.raywenderlich.com/2657/memorymanagementinobjectivectutorial(http://
一篇文章弄明白Javascript
在一片混沌中,一个叫Function的函数开天辟地,自己创建了自己。于是,一个叫JavaScript的星球诞生了。 图一:创建了自己的Function 新诞生
Python中的基本list操作
List是python中的基本数据结构之一,和Java中的ArrayList有些类似,支持动态的元素的增加。list还支持不同类型的元素在一个列表中,List is an Object。 最基本的创建一个列表的方法 myList \'a','b','c'\ 在python中list也是对象,所以他也有方法和属性,在ptython解释器中 使用h
7个关于"this"面试题,你能回答上来吗?
作者:Shadeed 译者:前端小智 来源:dmitripavlutin 点赞再看,微信搜索【大迁世界(https://mp.weixin.qq.com/s/sY9ufGGKfcdaAQ7KJQs3HA)】,B站关注【前端小智(https://space.bilibili.com/31089477)】这个没有大厂背景,但有着一股向上积
分享5个高效的pandas函数!
熟练掌握pandas函数都能帮我们在数据分析过程中节省时间。pandas还有很多让人舒适的用法,这次就为大家介绍5个pandas函数!本文来源towardsdatascience,作者Soner Yıldırım,由Python大数据分析编译。1\. explodeexplode用于将一行数据展开成多行。比如说dataframe中某一行其中一个元素包含多个同
Java开发面试高频考点学习笔记(每日更新)
Java开发面试高频考点学习笔记(每日更新) 1.深拷贝和浅拷贝 2.接口和抽象类的区别 3.java的内存是怎么分配的 4.java中的泛型是什么?类型擦除是什么? 5.Java中的反射是什么 6.序列化与反序列化 7.Object有哪些方法? 8.JVM内存模型 9.类加载机制 10.对象的创建和对象的布局 11.Java的四种引用
从一个 10 年程序员的角度告诉你:搞懂 Java 面向对象有多容易?
前言: 1)java 面向对象语言,面向过程围绕过程(解决问题步骤),面向对象围绕实体(名词,特性(属性),行为(动作、方法))。它们设计思想区别在于关心核心不同的。主流都是面向对象的。实际开发,先按面向对象思想进行设计,具体实现时面向过程(人习惯) 2)java 怎么支持面向对象呢?a. 万物皆对象,所有的类都是 Object 子类b. java 中支
你不可不知的JS面试题(第一期)
1、JS中有哪些内置类型?7种。分别是boolean、number、string、object、undefined、null、symbol。 2、NaN是独立的一种类型吗?不是。NaN是number类型。 3、如何判断是哪个类型?Object.prototype.toString.call(),返回为[object Type]。现在我们来验证一下。Objec
你不可不知的JS面试题
1、JS中有哪些内置类型?7种。分别是boolean、number、string、object、undefined、null、symbol。 2、NaN是独立的一种类型吗?不是。NaN是number类型。 3、如何判断是哪个类型?Object.prototype.toString.call(),返回为\[object Type\]。 现在我们来验证一下
阿里Java开发手册!非科班生金九银十求职经历
1 基础 为什么 Java 中只有值传递? int 范围?float 范围? hashCode 与 equals,什么关系? String StringBuffer 和 StringBuilder 的区别是什么?String 为什么是不可变的? Java 序列化中如果有些字段不想进行序列化 怎么办? 构造器 Constructor 是
阿里程序员的Java之路!2021年最新Java面试点梳理
面试题模块介绍: 一、Java 基础 JDK 和 JRE 有什么区别? 和 equals 的区别是什么? 两个对象的 hashCode()相同,则 equals()也一定为 true,对吗? final 在 java 中有什么作用? java 中的 Math.round(1.5) 等于多少? String 属于基础的数据类型吗?
AtomicStampedReference是怎样解决CAS的ABA问题
本文已收录 https://github.com/lkxiaolou/lkxiaolou 欢迎star。 什么是ABA问题但凡对Java有一点深入就会知道 CAS,即 compareAndSwap。在Java中使用 Unsafe 类提供的native方法可以直接操作内存,其中就有对compareAndSwap的实现。javapublic final nati
首发10万字Java开发实战文档,涨姿势了!
Java基础1Java语言的三大特性2.Java语言主要特性3\. JDK和JRE有什么区别4.Java基本数据类型及其封装类5.如果main方法被声明为private会怎样?6.说明 下public static void main(String argsQ])这段声明里每个关键字的作用7.与equals的区别8.Object有哪些公用方法9.为什么Jav
腾讯T3团队整理,持续更新中
Java基础1.JAVA 中的几种数据类型是什么,各自占用多少字节。2.String 类能被继承吗,为什么。3\. 两个对象的 hashCode() 相同,则 equals() 也一定为 true,对吗?4\. String 属于基础的数据类型吗?5.Java 中操作字符串都有哪些类?它们之间有什么区别?6.Java 中 IO 流分为几种?7.BIO、NIO