'=='和equals区别以及jvm内存分配
"=="和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)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内存分配相关推荐
- Android性能调优篇之探索JVM内存分配
开篇废话 今天我们一起来学习JVM的内存分配,主要目的是为我们Android内存优化打下基础. 一直在想以什么样的方式来呈现这个知识点才能让我们易于理解,最终决定使用方法为:图解+源代码分析. 欢迎访 ...
- 【拥抱大厂系列】百度面试官问过的 “JVM内存分配与回收策略原理”,我用这篇文章搞定了
点个赞,看一看,好习惯!本文 GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了3个月总结的一线大厂Java面试总结,本人已拿腾 ...
- 深入理解Java虚拟机(第三弹)- JVM 内存分配与回收策略原理,从此告别 JVM 内存分配文盲
点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:打卡活动第二期来啦,100% 能获得奖品个人原创+1博客:点击前往,查看更多 虚拟机系列文章 深入理解 Java ...
- JVM内存分配与垃圾回收
其实已经有很多大牛在这方面做了很好的介绍,我在这篇文章里讲下我自己的一些理解,受限于我的认知水平,可能不一定正确,请自我甄别. JVM的GC自动垃圾回收器是JAVA的一大特色,垃圾回收器要解决 ...
- 一个可以参考的JVM内存分配
下面是java命令有关JVM内存分配的参数 JAVA_MEM_OPTS="" BITS=`java -version 2>&1 | grep -i 64-bit` i ...
- JAVA面向对象OOP→构造方法、this、访问修饰符、static、方法重载、JVM内存分配、GC垃圾回收、包、样例代码
构造方法 构造方法(constructor):与类名同名,没有返回值 其初始化作用:一为属性分配内存空间.二为属性赋值 构造方法不能自己调用,只能通过new实例化对象调用 隐式构造方法:对象实例化时编 ...
- 深入理解JVM内存分配策略
点击上方 "程序员小乐"关注公众号, 星标或置顶一起成长 每天早上8点20分, 第一时间与你相约 每日英文 Don't blame people for disappointing ...
- jvm内存分配及对象创建和回收过程
个人博客:https://suveng.github.io/blog/ Java历史 2004.9 jdk1.5 tiger 自动装箱拆箱,泛型,,注解,枚举,变长参数,增强for循环 ...
- JVM内存分配与垃圾回收浅析
为什么80%的码农都做不了架构师?>>> 想做architect,就必须对JVM的性能有所了解.JVM的内存管理是性能的一大瓶颈.JVM的性能调优,必须建立在对内存管理策略理解 ...
最新文章
- 三星android 7.0 root,三星G9300 7.0 root教程及获取7.0的root权限
- VTK:Utilities之MassProperties
- 的引用_左值、右值、左值引用、右值引用
- 【收藏】需求文档(PRD)终极撰写指南
- python音频特征提取_使用Python对音频进行特征提取
- python flask 分页前后端分离_【flask + vue 前后端分离博客】创建第一个 Flask RESTFul(一)...
- 圣思园java.doc_北京圣思园java课堂笔记.doc
- 求数组第二大元素 和 字符串拷贝的实现
- 冲刺One之站立会议3 /2015-5-16
- linux虚拟机发邮件给163邮件
- 前端架构设计的方法论
- 2012年之前Mac Book pro 安装新系统macOS 10.15 Catalina 制作U盘启动盘
- c语言iec 103协议程序,IEC103通信流程详解.doc
- 基于大数据的NBA球员数据分析及预测系统
- 关于js的match用法
- js中indexOf的用法
- winform TreeView节点中的CheckBox 禁用
- 机器学习小组知识点4:批量梯度下降法(BGD)
- 获取某种颜色在图片中所占的比例
- 跟着无羡学python第一天
热门文章
- 传华为将有2万名CNBG员工转岗CBG 回应:该消息不属实
- 饭后什么事情正谋杀你的健康
- 泡面比泡MM好的16个理由
- 35岁遭遇互联网公司无情裁员,面试屡屡碰壁,原因竟是……
- Python使用装饰器和线程限制函数执行时间的方法
- java多线程问题,线程交替执行
- BootLoader简介——linux内核的引导
- 钢琴块2电脑版_云上钢琴学生端电脑版|云上钢琴学生端 V2.3.1 最新PC版 下载_当下软件园...
- [大学回忆录]桂X大学大二(上)学期总结
- java输入某年某个季度_Java获取某年某季度的第一天出错