1、简单概述
一直以来,对String这个字符串类都是心存疑惑的,也不知道如何来进行解决。最近花点时间看了下别人的博客来研究一下,觉得挺有意思的,所以将此来记录下来。
String将会牵扯到堆和常量池,字符串常量池在JDK8中是存在于堆中的,是属于堆的一部分。
引入:
String str = "计算机";
"computer"也是一个字符串对象,只不过上面创建的这个会存在于字符串常量池中,返回来的是在字符串在常量池中的地址。
String str = "计算机";
String str2 = "计算机";
这段代码表示的是都在字符串常量池中来创建"计算机"对象,但是由于第一行中已经在字符串常量池中创建好了"计算机"对象,所以第二行代码将不会再次进行创建,而是直接指向字符串常量池的中"计算机"的地址。因为常量池是用来节省内存资源开销的,将一些经常使用的常量放在里面来方便来使用。
测试这段代码:
String str = "计算机";
String str2 = "计算机";
System.out.println(str==str2); // true
因为二者指向的是在常量池中得同一个地址,所以返回为true
上面两种创建字符串的方式也是官方推荐的,但是和使用new关键字创建出来的字符串有很大的不同的使用
String str = new String("计算机");
首先看到了因为出现了字符串常量"计算机",那么首先做的事情就是检查字符串常量池中有没有"计算机",如果没有,那么添加进去;如果有,那么就不添加;
然后第二步,因为是new,所以会在堆中创建出来"计算机"对象