今天咱们将分析Java中String,StringBuilder和StringBuffer三者之间的细微不一样点。面试
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建立的对象是建立在堆(heap)上的。StringBuffer同StringBuilder拥有相同的方法,可是在StringBuffer上每一个方法都是使用synchronized来修饰的,所以StringBuffer是线程安全的。性能
StingBuffer的值是能够被改变的,所以它能够被赋予一个新的值。这几个类之间的不一样,常常在面试时被说起。StringBuffer能够经过toString()方法转成String。ui
StringBuffer demo1 = new StringBuffer("Hello"); // 上面这个对象的值存储在堆上,而且值能够被改变。 demo1 = new StringBuffer("Bye"); // 上面这个语句是正确的,由于在StringBuffer中它的值是能够被修改的
StringBuilder与StringBuffer相似,它的值也是存储在堆上,同时也能够被修改。二者之间最大的不一样就是StringBuilder不是线程安全的,但同时也由于它不须要考虑线程安全,它的性能更好。线程
StringBuilder demo2 = new StringBuilder("Hello"); // 上面的对象是存储在堆上的,它的值是能够被修改的 demo2 = new StringBuilder("Bye"); // 上面这个语句是正确的,由于在StringBuilder中它的值是能够被修改的
String | StringBuffer | StringBuilder |
---|---|---|
存储 | 常量字符池Constant String Pool | 堆 |
可修改(易失性) | 否(非易失) | 是(易失) |
线程安全 | 是 | 是 |
性能 | 快 | 很慢 |
若是您对本文中观点有什么见解,能够在评价中回复。code