目录
一.字符串的创建
1.直接赋值
例:String s="aaa"
这种创建方式会在堆中的字符串常量池中存储aaa,并且在栈中用变量s记录其地址。
例:String s="aaa"
String x="aaa"
变量s和x在栈中记录的地址相同。
原因:再次创建相同的字符串,则会直接复用字符串常量池中已存在的字符串,在栈中变量记录的地址也相同。
2.new创建字符串
例:String s=new String("aaa")
这种方式会直接在堆中开辟内存,不会创建在字符串常量池中,并且在栈中用变量s记录其地址。
例:String s=new String("aaa")
String x=new String("aaa")
变量s和x在栈中记录的地址不相同。
原因:再次创建相同字符串,不会复用,而是直接在堆中开辟一个新空间,在栈中记录的地址不同。
二.字符串的不可变性
例:String s="aaa"
s="bbb"
这里首先创建了字符串aaa,并且用s指向aaa
紧接着让s=bbb,因为s指向的字符串aaa不可
变性,不能将aaa变成bbb,所以会另外开辟一
个空间存储bbb,并将s指向bbb。
应用:字符串给函数传参
String s="aaa"
void change(String m){
m="bbb"
}
change(s)
打印s的值仍然是aaa
原因:首先创建字符串aaa,并且用s指向aaa
紧接着给函数传参,参数m和s一样也指向aaa
然后是m=bbb,m现在指向的字符串aaa不可
变,所以会另外开辟空间创建bbb,并且让m指
向bbb,函数调用完s还是指向aaa,而变量m
则会被回收。