String,StringBuilder,StringBuffer有什么区别?
- String用于字符串操作,属于不可变类(final修饰),也就是说,String对象一旦被创建,其值将不能改变;
- StringBuilder 用于字符串操作 , 底层有一个可以改变的字符数组,可以对这个字符数组做任何操作.当StringBuilder—>String类型时,将StringBuilder的可变char数组赋值给String的不可变char数组.StringBuilder线程不安全
- StringBuffer也是用于字符串操作,但他是可变类,当对象创建后,仍然可以对其值进行修改. 所以,如果一个字符串经常被修改,使用StringBuffer有更高的效率.StringBuffer线程安全.
为什么要把String设计为不变量?
- 节省空间:在Java语言中,为了提供效率与空间使用率,把字符串常量存储在String pool中,这些字符串可以被共享,为了保证一个用户对字符串的修改不会影响其他用户的使用,String被设计为不可变量
- 提高效率:将String设计为不可变量,在多线程编程时,他就是线程安全的,就不需要对String进行同步,可以显著提高多线程的效率。
另外,String经常被当做HashMap的key进行存储,也就需要计算String的hash值,String的不可变,所以他的hash值也会保持不变,就可以把他的hash值缓存起来,不需要每次都计算hash值,显著提高效率. - 安全因素:String会经常被用作参数来使用(例如连接数据库时使用的用户名,密码等等),如果String是可变量,就可以通过特定的手段对这些参数进行修改,从而修改文件的内容或属性.