从Java中堆内存和栈内存分配中详谈String使用equals和==比较的区别

时间:2022-06-29 16:14:46
Java把内存分成两种,一种叫做栈内存,一种叫做堆内存

在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配。当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间。

比如

void func()
{
    Object obj = new Object();//这个obj在函数的栈里。
}

class Test
{
   private Object obj = new Object();//这个obj随对应的Test对象分配在堆里
}

堆内存用于存放由new创建的对象和数组。

 "=="操作符的作用

1、用于基本数据类型的比较

2、判断引用是否指向堆内存的同一块地址。

equals的作用:

用于判断两个变量是否是对同一个对象的引用,即堆中的内容是否相同,返回值为布尔类型


String作为一个对象来使用

例子一:对象不同,内容相同,"=="返回false,equals返回true

String s1 = new String("java");
String s2
= new String("java");

System.out.println(s1
==s2); //false
System.out.println(s1.equals(s2)); //true

详解:s1和s2只是两个引用,存放在函数的栈中,就是堆内存中存放对象的地址,new String("java")这两个对象在函数堆内存中分别创建了对象,所以地址值不一样,==返回为false,而equals 则比较两个对象的值,所以返回true。

例子二:同一对象,"=="和equals结果相同

String s1 = new String("java");
String s2
= s1;

System.out.println(s1
==s2); //true
System.out.println(s1.equals(s2)); //true
详解:引用变量s1在栈中存放了字符串对象 new String("java" )在堆内存的地址;s2 = s1 将s1的引用变量地址赋予了s2,所以 == equals 都返回true。


String作为一个基本类型来使用

如果值不相同,对象就不相同,所以"==" 和equals结果一样

String s1 = "java";
String s2
= "java";

System.out.println(s1
==s2); //true
System.out.println(s1.equals(s2)); //true
详解,java有常量池这个概念,首先 String s1 = "java" 这个语句我们可以拆分, 先定义变量s1,它会在栈中创建s1的引用变量,再查找栈中是否有“java”这个值,如果没有,自己在栈中占一个位置,把“java“这个值存进来,如果栈中有”java“这个值,s1则会直接指向这个值。 所以 图中代码 s2引用变量相当于指向了s1栈中所存放的值,所以==返回true, equals 因为地址都相同了,所以值也相同。