String类型的字面量和其他语言中的定义相同,但是需要注意的是String类型的字面量是用一个专门的“字符串池”来保存的,每次新建一个字符串的字面量,系统都会首先检查“字符串池”中是否已经存在该字面量,如果没有,则在“字符串池”中生成该字面量,如果存在则只需将该字面量的内存地址赋值给引用变量即可。
String a=new String("hello");和String b="hello";有很大的差别,前者是直接在开辟一个内存空间,其中保存的数据为字符串hello,同时申请一个引用变量a,将为字符串开辟的内存地址赋值给a;而对于后者,后台的操作是:首先查看“字符串池”中是否存在hello这个字面量,如果存在,则将该字面量的内存地址赋值给b,如果没有,则在“字符串池”中生成一个hello字面量,将新生成的字面量的内存地址赋值给b。另外,前者是在程序运行时,在内存开的空间,而后者是在程序编译时就为之开了内存空间。
String是一个很特殊的类,他作为函数参数传值的时候是值传递,而不是一般类那样引用传递。
这样在调用change函数前后b的值是不会变的,一直是"xyz"
这两个语句,前一个创建的字符串是放在“字符串池”里的。后一个并不是放在“字符串池”里的。所以用在执行上述语句第二句时,在“字符串池”内找不到字面量"abc" ,会新开辟一块内存。所以
这两个语句第一个返回false,第二个返回true
String a=new String("hello");和String b="hello";有很大的差别,前者是直接在开辟一个内存空间,其中保存的数据为字符串hello,同时申请一个引用变量a,将为字符串开辟的内存地址赋值给a;而对于后者,后台的操作是:首先查看“字符串池”中是否存在hello这个字面量,如果存在,则将该字面量的内存地址赋值给b,如果没有,则在“字符串池”中生成一个hello字面量,将新生成的字面量的内存地址赋值给b。另外,前者是在程序运行时,在内存开的空间,而后者是在程序编译时就为之开了内存空间。
String是一个很特殊的类,他作为函数参数传值的时候是值传递,而不是一般类那样引用传递。
void change(String a){
a="abc";
}
String b="xyz";
change(b);
这样在调用change函数前后b的值是不会变的,一直是"xyz"
String a = "abc";
String b = new String("abc");
这两个语句,前一个创建的字符串是放在“字符串池”里的。后一个并不是放在“字符串池”里的。所以用在执行上述语句第二句时,在“字符串池”内找不到字面量"abc" ,会新开辟一块内存。所以
a==b;
a.equals(b);
这两个语句第一个返回false,第二个返回true