Java: String, StringBuilder和StringBuffer 三者之间的区别

今天咱们将分析Java中String,StringBuilder和StringBuffer三者之间的细微不一样点。面试

String

String是非易失性的(一旦建立不会改变)。当一个String变量被建立时,它将被存储在Constant String Pool中。在Java中,每个非易失的变量都是线程安全的,所以String变量也是线程安全的。String变量是不能被两个线程同时拥有的,而且一旦被赋值便不能被修改。安全

String demo = "hello";
// 上面这个对象被存储在Constant String Pool当中,它的值不能被改变
demo = "Bye"; // 新的字符串变量"Bye"在Constant String Pool中被建立,但仍然被demo引用
// 而String "hello"仍然存在于Constant String Pool中,它的值并无被重写,只不过并无任何变量费用它

StringBuffer

StringBuffer是易失性的,所以它的值是能够被改变的。经过StringBuffer建立的对象是建立在堆(heap)上的。StringBuffer同StringBuilder拥有相同的方法,可是在StringBuffer上每一个方法都是使用synchronized来修饰的,所以StringBuffer是线程安全的性能

StingBuffer的值是能够被改变的,所以它能够被赋予一个新的值。这几个类之间的不一样,常常在面试时被说起。StringBuffer能够经过toString()方法转成String。ui

StringBuffer demo1 = new StringBuffer("Hello");
// 上面这个对象的值存储在堆上,而且值能够被改变。
demo1 = new StringBuffer("Bye");
// 上面这个语句是正确的,由于在StringBuffer中它的值是能够被修改的

StringBuilder

StringBuilder与StringBuffer相似,它的值也是存储在堆上,同时也能够被修改。二者之间最大的不一样就是StringBuilder不是线程安全的,但同时也由于它不须要考虑线程安全,它的性能更好。线程

StringBuilder demo2 = new StringBuilder("Hello");
// 上面的对象是存储在堆上的,它的值是能够被修改的
demo2 = new StringBuilder("Bye");
// 上面这个语句是正确的,由于在StringBuilder中它的值是能够被修改的
String StringBuffer StringBuilder
存储 常量字符池Constant String Pool
可修改(易失性) 否(非易失) 是(易失)
线程安全
性能 很慢

若是您对本文中观点有什么见解,能够在评价中回复。code

相关文章
相关标签/搜索