1、String类在堆中的永久带存储着,也就是说GC垃圾回收机制不会主动去回收
2、如果采用String s = "某个字符串",这样的方式创建字符串,系统会主动从内存中找有没有这个字符串对象,如果有,则吧该字符串地址赋值给s,如果没有就新开辟一块空间,然后把地址给s
然后我们来看一段代码
public class Test {
public static void main(String[] args) {
String s1 = "aaa";
String s2 = "aaa";
System.out.println(s1 == s2);
}
}
/**
* 输出的结果为true,说明s1和s2地址一样
*/
我们再看一段代码
public class Test {
public static void main(String[] args) {
String s1 = "aaa";
String s2 = new String("aaa")
System.out.println(s1 == s2);
}
}
/**
* 输出的结果为false,说明s1和s2地址不一样
*/
结论:
如果用String s1 = "aaa",这种方式创建的字符串,会自动找内存中已存在的字符串。
如果用new 对象的形式,那么就会直接在内存中新创建地址。
首先,我们来看一段代码
public class Test {
public static void main(String[] args) {
String s1 = "s1";
String s2 = "s2";
String s3 = "s3";
String s4 = s1 + s2 + s3;
}
}
如果采用+的方式,内存分析:
1、栈中创建变量s1,并在堆的永久带中开辟空间,然后把字符串地址给s1
2、同理s2,s3创建变量,并获得字符串地址
3、创建s4变量,然后s4先初始值为null,等待s1+s2+s3结果
4、首先s1+s2在永久带中创建一个新的字符串,把他们的结果拼接一起
5、再继续把s1+s2的值和s3的值拼接一起,并在堆中继续开辟一块空间。
返回值类型 | 方法 | 描述 |
---|---|---|
char | charAt(int index) | 返回指定索引处的 char 值。 |
int | length() | 返回字符串的长度 |
String[] | split(String s) | 将字符串按s这样值进行分割,然后返回一个字符串数组 |
String | replace(String target,String replace) | 将目标的字符串替换成套替换的字符串 |
原文:https://www.cnblogs.com/huangwenchao0821/p/14543059.html