以前对于这两个的理解都是这样的
对于==
如果是基本类型,则直接判断值是否相等。
如果是引用数据类型,则比较存放地址是否相等。
对于equals()方法
比较存放地址是否相等。
现在的理解:
首先是数据保存位置
栈(heap)内存中存放基本类型,引用,局部变量;
堆(stack)内存中存放new出来的对象;
方法区(共享区,数据区)中存放静态变量,字符串常量,方法代码。方法区的代码被调用时,将在栈中开辟空间。运行完后,栈中的空间被释放。
对于==
如果是基本数据类型,那么它们是存在方法区中。方法区中只允许有一个相同的数据,如果多次用到同一个数据类型,则会指向方法区中相同的地址。
正是因为如此,才会说 对于基本数据类型,直接盘对是否相等。例如:
String a="asd";
String b=new String("asd") 这样,物理地址一样,==返回true,但是按照最开始的理解,用equals()方法应该也返回true了。但是结果是返回false.
这是为什么呢?因为.equals()在比较的时候,首先要比较的是两个是不是一个类型,然后再比较物理地址是不是一样,必须两者都满足,才返回true.