'=='和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. ‘==’多用来比较数据类型是否相同.

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同为这个字符串对象的实例,但是对象只有一个,存储在堆,而这两个引用存储在栈中。

类的成员变量在不同对象中各不相同,都有自己的存储空间(成员变量在堆中的对象中),基本类型和引用类型的成员变量都在这个对象的空间中,作为一个整体存储在堆。而类的方法却是
该类的所有对象共享的,只有一套,对象使用方法的时候方法才被压入栈,方法不使用则不占用内存。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值