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

相關文章
相關標籤/搜索