1,什么是Java中的字符串
在程序开发中字符串无处不在,如用户登录时输入的用户名,密码等使用的就是字符串.在Java中,字符串被作为String类型的对象处理,String类位于Java.lang包中,在默认情况下,该包被自动导入所有的程序.
2,创建String对象的方法
String s1="linovy927";
//创建一个字符创对象,名为s1
String s2=new String();
//创建一个空字符串对象,名为s2
String s3=new String("linovy927");
//创建一个字符串对象linovy927,名为s3
3,java中字符串的不变性
String对象创建后就不能被改变,是不可变的,所谓的修改其实是创建了新的对象,所指向的内存空间不同
public class HelloWorld {
public static void main(String[] args) {
String s1 = "linovy";
String s2 = "linovy";
String s3="I love "+s1;
// 比较字符串s1和s2
// linovy为常量字符串,多次出现时会被编译器优化,只创建一个对象
System.out.println("s1和s2内存地址相同吗?" + (s1 == s2));
//比较字符串s1和s3
System.out.println("s1和s3内存地址相同吗?" + (s1==s3));
String s4 = "I love " + s1;
//比较字符串s4和s3
// s1是变量,s4在运行时才知道具体值,所以s3和s4是不同的对象
System.out.println("s3和s4内存地址相同吗?" + (s4 == s3));
}
}
最后运行结果如下:
s1和s3内存地址相同吗?true
s1和s3内存地址相同吗?false
s3和s4内存地址相同吗?false
4,String字符串不可变的原因
1)在Java中字符串池(String pool)的需求,当初始化一个字符串变量时,如果字符串已经存在,就不会创建一个新的字符串变量,而是返回存在字符串的引用.例如:
String s1 = "linovy";
String s2 = "linovy";
这两行代码在堆中只会创建一个字符串对象.如果字符串是可变的,改变另一个字符串变量,就会使另一个字符串变量指向错误的值[1]
2)缓存字符串hashcode码的需求,字符串的
hashcode是经常被使用的,字符串的不可变性确保了
hashcode的值一直是一样的,在需要
hashcode时,就不需要每次都计算,这样会高效很多.[1]
3)出于安全性考虑,字符串经常作为网络连接,数据库连接等参数,不可变就可以保证连接的安全性.[1]
5,总结
只要一个字符创在内存中(堆heap)被创建,就不能被改变.我们需要注意有关字符串的所有方法都不会改变字符串本身,而是会返回一个新的字符串对象.如果你需要可以被改变的字符串,可以使用StringBuffer或StringBuilder
参考文献
[1]Java中字符串的不可变性[CSDN
2015-01-07]
[2]图解String类型的不可变形及其原因[红黑联盟 2014-05-07]