1.FOREWORD
Java中字符串是一个不可变的类(指其实例对象不能被修改,所有关于这个对象的信息在这个对象被创建时已初始化且不能被改变)。
2.字符串常量池
字符串常量池是方法区中的一块特殊存储区域。在创建一个字符串时,如果其值已经存在于字符串常量池中,则该常量池中的对应字符串的引用将被返回,而不是创建一个新的字符串对象并返回其引用!如下:
String s1 = "123";
String s2 = "123";//两个字符串指向字符串常量池中的同一块区域
String s3 = new String("123");//注意如果是new出来的,则将重新开拓一块区域存入“123”
如果字符串可变,通过其中一个引用改变了字符串的值后,其他相同引用的字符串对象的值也将被改变。
3.其他方面
1)哈希
字符串广泛应用于HashMap、HashTable、HashSet等需要哈希码作为键的数据结构中,对这些哈希表进行操作的时候,需要频繁调用hashCode()来获取健的哈希码。而正是字符串的不可变性,保证了键值的哈希值不会改变,在第一次调用String类的hashCode()方法时,就对哈希值进行了缓存,之后返回的就是相同的值。如果字符串可变,就会有多个哈希码,通过键获取值的时候就不一定能获取到正确值。
2)安全性
字符串在Java应用程序中的使用范围广,如存储用户名、密码、数据库连接地址等蜜柑信息,所以必须保证String类的绝对安全性。
通常情况下,用户名由客户端传递到服务器端,服务器端接收后要先对用户名进行检查,再进行其他操作,因为客户端传递过来的信息不一定值得信任。如果字符串可变,在对用户名进行安全性检查后,用户名依旧可变,若后续涉及到调用用户名,则更改该用户名可能会造成SQL注入等问题。
…(后续有新的理解再添加)