"=="和equals方法究竟有什么区别?

比较之前先了解一些背景

(1)Java中内存分配模型

java的内存模型主要分三种,

栈:每个栈中的数据(原始类型和对象引用)都是私有的,编译器自动分配释放,其他栈不能访问。基本类型的变量,函数 的参数值,局部变量,对象引用.每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是 对象),栈分为三个区:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)。

堆:程序员分配释放,若程序员不释放,程序结束后可能由os回收,jvm只有一个堆区(heap)被所有线程共享, 堆中不存放基本类型和对象引用,只存放对象本身 栈的资源比较少,运行速度快。.

静态区(方法区):跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。

方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。

(2)基本数据类型不继承Object类即没有重写equals方法.因为所有类都继承object

首先Objet obj = new Object();(泛指引用类型)

其中变量obj占栈内存,new Object()占堆内存,此时变量obj变量中的值存放的是对象的引用.

A)equals()方法多用来比较对象是否相同(包括引用数据类型),比较的是变量中存放的引用地址.还有equals如果没有重写,则和’==’的意义一样,如果重写了,则会会按照重写的内容进行比较,javaBean规定当重写equals时候必须重写hashCode,如果不重写会出现对象相同但是hashCode不同,这样会出现问题,eg:HashSet存储元素时候是按照hashCode,如果重写equals不重写hashCode会导致同一个对象,存储了两次。

  1. ‘==’多用来比较数据类型是否相同.

1)8种基本数据类型:变量直接存储的是“值”(==特有)

2)引用类型:和对象实例一样.(==和equals都可以使用)

如果要比较两个基本数据类型那必须用’==’,因为基本数据类型没有继承object,没有equals方法.

3)引用类型和基本类型比较

longj=10000l;

Long i=new Long(10000);

System.out.println(i==j);//true

编译成底层指令时,把引用类型转成了基本类型,再比较的值。

java中所有类都继承于Object,如果没有重写Object的 equals方法,那么,引用类型间的“==” 和 equal 都是比较的对象地址。StringBuffer 和StringBuilder特殊,也没有重写equals方法.==和equal都是比较地址,。当变量为基本数据类型时,用== 比较时,通常比较的是值,当变量为引用类型的时候用==比较时,通常比较的是对应的引用的内存地址。

局部变量和成员变量内存分配

对于局部变量,如果是基本类型,会把值直接存储在栈;如果是引用类型,比如String s = new String("william");会把其对象存储在堆,而把这个对象的引用(指针)存储在栈。
再如
String s1 = new String(“william”);
String s2 = s1;
s1和s2同为这个字符串对象的实例,但是对象只有一个,存储在堆,而这两个引用存储在栈中。类的成员变量在不同对象中各不相同,都有自己的存储空间(成员变量在堆中的对象中),基本类型和引用类型的成员变量都在这个对象的空间中,作为一个整体存储在堆。而类的方法却是
该类的所有对象共享的,只有一套,对象使用方法的时候方法才被压入栈,方法不使用则不占用内存。

'=='和equals区别以及jvm内存分配相关推荐

  1. Android性能调优篇之探索JVM内存分配

    开篇废话 今天我们一起来学习JVM的内存分配,主要目的是为我们Android内存优化打下基础. 一直在想以什么样的方式来呈现这个知识点才能让我们易于理解,最终决定使用方法为:图解+源代码分析. 欢迎访 ...

  2. 【拥抱大厂系列】百度面试官问过的 “JVM内存分配与回收策略原理”,我用这篇文章搞定了

    点个赞,看一看,好习惯!本文 GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了3个月总结的一线大厂Java面试总结,本人已拿腾 ...

  3. 深入理解Java虚拟机(第三弹)- JVM 内存分配与回收策略原理,从此告别 JVM 内存分配文盲

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:打卡活动第二期来啦,100% 能获得奖品个人原创+1博客:点击前往,查看更多 虚拟机系列文章 深入理解 Java ...

  4. JVM内存分配与垃圾回收

        其实已经有很多大牛在这方面做了很好的介绍,我在这篇文章里讲下我自己的一些理解,受限于我的认知水平,可能不一定正确,请自我甄别. JVM的GC自动垃圾回收器是JAVA的一大特色,垃圾回收器要解决 ...

  5. 一个可以参考的JVM内存分配

    下面是java命令有关JVM内存分配的参数 JAVA_MEM_OPTS="" BITS=`java -version 2>&1 | grep -i 64-bit` i ...

  6. JAVA面向对象OOP→构造方法、this、访问修饰符、static、方法重载、JVM内存分配、GC垃圾回收、包、样例代码

    构造方法 构造方法(constructor):与类名同名,没有返回值 其初始化作用:一为属性分配内存空间.二为属性赋值 构造方法不能自己调用,只能通过new实例化对象调用 隐式构造方法:对象实例化时编 ...

  7. 深入理解JVM内存分配策略

    点击上方 "程序员小乐"关注公众号, 星标或置顶一起成长 每天早上8点20分, 第一时间与你相约 每日英文 Don't blame people for disappointing ...

  8. jvm内存分配及对象创建和回收过程

    个人博客:https://suveng.github.io/blog/​​​​​​​ Java历史 2004.9 jdk1.5 tiger 自动装箱拆箱,泛型,,注解,枚举,变长参数,增强for循环 ...

  9. JVM内存分配与垃圾回收浅析

    为什么80%的码农都做不了架构师?>>>    想做architect,就必须对JVM的性能有所了解.JVM的内存管理是性能的一大瓶颈.JVM的性能调优,必须建立在对内存管理策略理解 ...

最新文章

  1. 三星android 7.0 root,三星G9300 7.0 root教程及获取7.0的root权限
  2. VTK:Utilities之MassProperties
  3. 的引用_左值、右值、左值引用、右值引用
  4. 【收藏】需求文档(PRD)终极撰写指南
  5. python音频特征提取_使用Python对音频进行特征提取
  6. python flask 分页前后端分离_【flask + vue 前后端分离博客】创建第一个 Flask RESTFul(一)...
  7. 圣思园java.doc_北京圣思园java课堂笔记.doc
  8. 求数组第二大元素 和 字符串拷贝的实现
  9. 冲刺One之站立会议3 /2015-5-16
  10. linux虚拟机发邮件给163邮件
  11. 前端架构设计的方法论
  12. 2012年之前Mac Book pro 安装新系统macOS 10.15 Catalina 制作U盘启动盘
  13. c语言iec 103协议程序,IEC103通信流程详解.doc
  14. 基于大数据的NBA球员数据分析及预测系统
  15. 关于js的match用法
  16. js中indexOf的用法
  17. winform TreeView节点中的CheckBox 禁用
  18. 机器学习小组知识点4:批量梯度下降法(BGD)
  19. 获取某种颜色在图片中所占的比例
  20. 跟着无羡学python第一天

热门文章

  1. 传华为将有2万名CNBG员工转岗CBG 回应:该消息不属实
  2. 饭后什么事情正谋杀你的健康
  3. 泡面比泡MM好的16个理由
  4. 35岁遭遇互联网公司无情裁员,面试屡屡碰壁,原因竟是……
  5. Python使用装饰器和线程限制函数执行时间的方法
  6. java多线程问题,线程交替执行
  7. BootLoader简介——linux内核的引导
  8. 钢琴块2电脑版_云上钢琴学生端电脑版|云上钢琴学生端 V2.3.1 最新PC版 下载_当下软件园...
  9. [大学回忆录]桂X大学大二(上)学期总结
  10. java输入某年某个季度_Java获取某年某季度的第一天出错