java的String内存讲解

42 阅读2分钟

在java中,内存有一个这样的分配.

image.png

栈: 里面存放的都是一些基本数据类型

堆: 里面存放的是一个引用数据类型,new出来的东西都会存到这里面.

方法区: 一个类的基本信息会存放到里面,还有字符串常量会存放在里面.

看下图

image.png 由于都是基本数据类型,所以"=="相对于基本数据类型而言返回是true.但是引用数据类型就不一样.

image.png 这里返回的就是false,具体理由我用图来讲解.

image.png 只要new出来一个对象,那么尽管他们的内容是一样的,但是他们的地址指向不一样,"=="比较的是地址.所以上图的两个worker返回的false.

接下来讲解一下String类内存分配了

image.png 关于上图s1,s2,s3,s4的内存分配给大家画个图,就知道谁和谁相等了.

image.png 由图可知s1=s2!=s3!=s4;

再给大家看一个例子

image.png 这里的str3和str4是不相等的,原因就是当两个字符串在进行相加的时候会在底层进行一个操作,这个操作就是实例化,具体的逻辑可以不需要知道,只需要知道实例化了,也就是new了,那么就是在堆里面开辟一个空间,然后指针指向它.所以上图的str3和str4不相等.

如果一个字符串被final修饰了又不一样了.

image.png 在这里s3和s4又是相等的了,因为在进行"+"操作时两边的都是一个常量,已知的常量,而不是一个变量,所以底层就不会触发new那些操作,也就不会在堆里面开辟空间来存放,所以两者是相等的.

关于equals讲解.其实equals比较的也是指针,所以和"=="有共同点,但是equals是object类的方法,所以可以被重载,在String类中已经被重载,在String类中比较的是里面存放的内容,而不是指针指向.