0.深度理解String(初学者可后面再看)
1.JVM理解两种初始化String方式
1.1直接初始化
栈中保存变量s1,s2,而变量保存“abc”在方法区的地址
这里当“abc”具有唯一性,字符串常量区无此字符串,我们就产生一个新内存“abc”,若有则直接找到该地址
如s1="a",s2="b",s3=s1+s2这种,“ab”是不同于"a"与“b”的必须重新创一块内存给“ab”
1.2使用 new构造器初始化
常用三种——new出来的放“堆”空间
//先在堆里开辟内存,等会再给内存值
String s1 = new String()
//堆开辟内存,字符串常量池也开辟内存,后者存original,前者存original的地址
String s2 = new String(String original)
String s2 = new String(char[] a)
//同上,只是这里字符串常量池存的a数组一部分,从startIndex索引开始取count个值存入
String s3 = new String(char[] a,int startIndex,int count)
内存图展示—s3,s4就是new初始化的,所以开辟堆空间,而字符串必须存入字符串常量池,因此堆空间 存常量池地址,栈中变量 存堆空间内存的地址
补充,进一步深刻理解
一个类同样,保存字符串必定在方法区,new对象一定在堆空间
2.String常用方法(持续更新中)
具体解释下最后一个substring方法,是左开右闭区间,如"周俊798".substring(1,3),只会得到“俊9”,因为“周俊798”在字符串常量区按char[]保存,索引从0开始,到3时结束且不取3