今天咱們將分析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