首页 > 代码库 > 学习一下Java的String(转)
学习一下Java的String(转)
JAVA 中为什么String 是immutable的?
1.设计:当创建一个String(String str2 = "abc"), 如果它(原先有一个String str = "abc")已经在pool(其实是内存中的栈)中存在,则会返回已存在String的引用,相反,怎会创建一个新的String,并返回该引用。如果String不是immutable的,改变String的一个引用将导致另一个引用的到错误的值。
2.效率:允许String缓存它的hashcode。String的hashcode在JAVA中是使用非常频繁的。例如在HashMapzhong, String设计成immutable保证了hashcode总是一样的,所以hashcode可以被缓存而不用担心改变。也就是说,不需要每次在使用hashcode时都去计算一遍,这样更高效。
3. 安全:String广泛的作为参数被JAVA中的类使用,比如 网络连接,打开的文件等等,如果String不是immutable,一个连接或文件的改变将导致严重的安全威胁,一个方法还以为正连接到一个机器上,并其实没有。可变的String同样将导致反射的安全性问题,因为反射中的参数都是String类型的。
【附】String,StringBuffer,StringBuilder
三者在执行速度方面的比较:StringBuilder > StringBuffer > String
String:字符串常量 StringBuffer:字符串变量 StringBuilder:字符串变量
从上面的名字可以看到,String是常量, 而StringBuffer与StringBuilder就不一样了,他们是字符串变量,是可改变的对象,每当我们用它们对字符串做操作时,实际上是在一个对象上操作的,这样就不会像String一样创建一些而外的对象进行操作了,当然速度就快了。再有,StringBuilder是线程非安全的,而StringBuffer是线程安全的,所以StringBuilder速度最快。
学习一下Java的String(转)