java中“==”和“equal()”的区别

来源:互联网 发布:怎么优化机构设置 编辑:程序博客网 时间:2024/06/16 10:30

要深入了解这个问题,得从java的内存讲起

内存简介

RAM(random access memory)随机存取存储器。说白了就是内存。
一般Java在内存分配时会涉及到以下区域:

寄存器(Registers): 速度最快的存储场所,因为寄存器位于处理器内部,我们在程序中无法控制

栈(Stack):存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中

堆(Heap):堆内存用来存放由new创建的对象和数组。在堆中分配的内存,由Java虚拟机的自动垃圾回收器(GC)来管理。

静态域(static field): 静态存储区域就是指在固定的位置存放应用程序运行时一直存在的数据,Java在内存中专门划分了一个静态存储区域来管理一些特殊的数据变量如静态的数据变量

常量池(constant pool):虚拟机必须为每个被装载的类型维护一个常量池。常量池就是该类型所用到常量的一个有序集和,包括直接常量(string,integer和floating point常量)和对其他类型,字段和方法的符号引用。

非RAM存储:硬盘等永久存储空间

==和equal

== 比较的是对象的地址
equal 比较的是对象的值

了解了java中的内存,我们就知道了,一个对象,她的引用时存储在栈里面的,而这个对象本身,则存储在堆里面。我们来举个例子说明:

Integer a = new Integer(1);    Integer b = new Integer(1);    boolean c = (a==b);    boolean d =(a.equal(b));

这时,我们发现,a和b是new出来的不同整型对象。这两个对象的值都是1。所以a和b的值相同,不过不是同一个对象。那么 c 为false, d 为true。如果是

    int a = 1;    int b = 1;    boolean c = (a==b);

那么由于a与b是基本数据类型,它们都指向了栈中同一个1。所以这时的 c 为true。例证如下:
例证

1 0