Java中的“==”与“equals”和“栈”与“堆”

"==”与“equals”

注:个人认为,Java中虽然没有指针,但是引用可以简单的认为是C++中的指针 (有机会再详细分析对比,此文不赘述)。

说明:涉及到编辑格式冲突,“= =” 即代表“==”。

来个倒三角,先说结论为敬

(1)“==”:比较的是两个变量或实例域是不是指向同一个内存空间,即是否地址相同,在Java中只是一个运算符号;

(2)“equals”:Object类中未被覆盖(未被重写)的equals方法和“==”无区别(不信的,咱稍后源码见,就在下面哦),主要区别取决于覆盖这个方法的方式 (但多数是判断两个变量或实例所指向的内存空间的值是否相同,即地址是否相同),在Java中是一个方法。 在重写时,equals的显式参数类型一定要是Object类的,否则导致结果并不会覆盖Object类的equals方法,而是定义了一个完全无关的方法。

在这里插入图片描述

(3)“= =”比equals运行速度快,因为“==”只是比较引用。

具体分析“==”与“equals”

==:

==是直接比较的两个对象的堆内存地址,如果相等,则说明这两个引用实际是指向同一个对象地址的。但是我们又常常碰到这样一个问题

int a = 123;
int b = 123;
System.out.println(a == b);

String s1 = "123";
String s2 = "123";
System.out.println(s1 == s2);

String s3 = new String("123");
System.out.println(s1 == s3);

最终结果是 true,true,false,那既然==是比较的地址,那么int数据的地址是怎样的呢,String又是怎样的呢?

对于基本数据类型(byte,short,char,int,float,double,long,boolean)和String常量来说,他们是作为常量在方法区中的常量池里面以HashSet策略存储起来的,对于这样的字符串 “123” 也是相同的道理,在常量池中,一个常量只会对应一个地址,因此不管是再多的 123,“123” 这样的数据都只会存储一个地址,所以所有他们的引用都是指向的同一块地址,因此基本数据类型和String常量是可以直接通过==来直接比较的。

另外,对于基本数据的包装类型(Byte, Short, Character,Integer,Float, Double,Long, Boolean)除了Float和Double之外,其他的六种都是实现了常量池的,因此对于这些数据类型而言,一般我们也可以直接通过==来判断是否相等。那么再出一个问题考考大家

Integer i1 = 127;
Integer i2 = 127;
System.out.println(i1 == i2);

Integer m == 128;
Integer n == 128;
System.out.println(m == n);

结果是 true,false。没想到吧!其实是因为 Integer 在常量池中的存储范围为[-128,127],127在这范围内,因此是直接存储于常量池的,而128不在这范围内,所以会在堆内存中创建一个新的对象来保存这个值,所以m,n分别指向了两个不同的对象地址,故而导致了不相等。

equals方法:

之前在网上也搜了很多相关的问题,但给出的答案却不尽人意,很多网友都说equals比较的是对象的内容,这样的说法是不准确的。首先我们来看看在Object类中定义的equals方法

在这里插入图片描述
可以看到,在Object类型的equals方法是直接通过"= =“来比较的,和”=="是没有任何区别的。

那么为什么又要说equlas和==的区别呢?是因为equals方法是可以由我们自己重写的。

众所周知,我们所有的类都直接或间接地继承自java.lang.Object类,因此我们可以通过重写equals方法来实现我们自己想要的比较方法。来看看eclipse为我们自动生成的equals方法

在这里插入图片描述
可以看出,eclipse还是很智能的,它首先是判断两个对象的地址是否相等,若不相等再进行下面的成员变量判断。

但这个方法体是完全可以由我们自己实现的,即便是我们直接 return true 都是可以的,只要能满足我们的业务需求,怎样写都是无所谓的,因此,equals比较的并不一定是对象的内容,它还可以由其他的信息来指导比较。

“栈”与“堆”

Java的一个突出优势是不用管理内存,怎么能不了解下呢?先说结论为敬

在这里插入图片描述

Java程序员在乎的两种内存区域详述如下

对象的生存空间堆(heap)和方法调用及变量的生存空间 (stack)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

结论

朋友明白了吗?欢迎评论,如果感觉还不错,点个赞呗,再一看表居然01:50了,回去睡了睡了~

参考:《Head First Java 2nd Edition》、《Java核心技术卷Ⅰ》
https://blog.csdn.net/lcsy000/article/details/82782864?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522159594998019724835833539%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=159594998019724835833539&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2blogfirst_rank_v2~rank_blog_default-1-82782864.pc_v2_rank_blog_default&utm_term=equals&spm=1018.2118.3001.4187

如果大家喜欢这篇文章的话,希望大家收藏、转发、关注,转载请注明出自这里。 PS:本随笔属个人学习小结,文中内容有参考互联网上的相关文章。如果您博文的链接被我引用,我承诺不会参杂经济利益。其中如果发现文中有不正确的认知或遗漏的地方请评论告知,谢谢! 还是那句话:不是我喜欢copy,是站在巨人的肩膀上~

猜你喜欢

转载自blog.csdn.net/Mrsgflmx/article/details/107777528