欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

内存分配及变量存储位置(堆、栈、方法区常量池、方法区静态区)

程序员文章站 2024-02-03 17:59:58
区别: “==” 比较的是两个引用在内存中指向的是不是同一对象(即同一内存空间),也就是说在内存空间中的存储位置是否一致。(引用类型) 如果两个对象的引用相同时(指向同一对象时),“==”操作符返回true,否则返回flase。 注:如果有对内存分配及变量存储位置(堆、栈、方法区常量池、方法区静态区 ......

区别:

“==” 比较的是两个引用在内存中指向的是不是同一对象(即同一内存空间),也就是说在内存空间中的存储位置是否一致。(引用类型)

如果两个对象的引用相同时(指向同一对象时),“==”操作符返回true,否则返回flase。

注:如果有对内存分配及变量存储位置(堆、栈、方法区常量池、方法区静态区)感兴趣的可以去看看这篇博客,里面写的很详细。对我还在学基础的人来说帮助很大,理解了很多内容,还有待消化。

 

equals方法是由object类提供的,可以由子类来进行重写

object类默认的实现如下:

1 public boolean equals(object obj) {
2 
3     return (this == obj);
4 
5 }

默认的实现只有当对象和自身进行比较时才会返回true, 这个时候和 “==”是等价的。

java中很多类(string类  date类  file类)等都对equals方法进行了重写,这里拿常见的string类举例。

内存分配及变量存储位置(堆、栈、方法区常量池、方法区静态区)
 1 public class test {
 2     public static void main(string[] args) {
 3         string str1 = "abc";
 4         string str2 = "abc";
 5         system.out.println(str1==str2);//true
 6 
 7 
 8         string str3 = new string("abc");
 9         string str4 = new string ("abc");
10         system.out.println(str3==str4);//false
11         system.out.println(str3.equals(str4));//true
12     }
13 }
内存分配及变量存储位置(堆、栈、方法区常量池、方法区静态区)

上例中第5行,我们看到str1 == str2 的结果是true

分析原因:

先看第3行代码,先在栈中创建一个对 string类的对象引用变量str1,然后通过引用去字符串常量池 里找有没有"abc",如果没有,则将"abc"存放进字符串常量池。这里常量池中并没有“abc”。即在编译期已经创建好(直接用双引号定义的)“abc”,存储在了常量池中。(如果有对常量池不理解的可以看看我上面推荐的博客)

 

第4行代码又创建了对string类的对象引用str2,然后通过引用去字符串常量池 里找有没有"abc",如果没有,则将"abc"存放进字符串常量池 ,并令str2指向”abc”,如果已经有”abc” 则直接令str2指向“abc”。这里我们在第三行代码中已经将“abc”这个字符串存储进了常量池。所以str2和str1指向的是同一个“abc”,返回true。

 

第8行和第9行代码分别创建了2个对象,str3和str4指向的是不同的对象,即上面所说的内存空间中存储位置不同。故str3 == str4 返回的肯定是false。

 

第11行代码 str3.equals(str4) 返回true

因为string类重写了equals方法,比较的是内存空间存放的数据是否相同。这里存放的都是字符串“abc” 故返回true。

 

总结:

java 语言里的 equals方法其实是交给开发者去覆写的,让开发者自己去定义满足什么条件的两个object是equal的。

所以我们不能单纯的说equals到底比较的是什么。你想知道一个类的equals方法是什么意思就是要去看定义。(以上是来自知乎用户的回答)

我们要理解的是equals存在的目的。