String, StringBuffer, and StringBuilder in java are string classes that are often used in programming. The differences between them are also questions that are often asked in interviews. Now let’s summarize and see their differences and similarities.
1. Variable and immutable
The String class uses a character array to save the string, as shown below. Because of the "final" modifier, you can know that the string object is immutable.
private final char value[];
Both StringBuilder and StringBuffer inherit from the AbstractStringBuilder class. In AbstractStringBuilder, character arrays are also used to save strings. As shown below, it can be seen that both objects can be changing.
char[] value;
2. Is it multi-thread safe?
The objects in String are immutable and can be understood as constants, which is obviously thread safe.
AbstractStringBuilder is the common parent class of StringBuilder and StringBuffer. It defines some basic operations of strings, such as expandCapacity, append, insert, indexOf and other public methods.
StringBuffer adds a synchronization lock to the method or adds a synchronization lock to the calling method, so it is thread-safe. Look at the following source code:
public synchronized StringBuffer reverse() { super.reverse(); return this; } public int indexOf(String str) { return indexOf(str, 0); //存在 public synchronized int indexOf(String str, int fromIndex) 方法 }
StringBuilder does not add synchronization locks to the method, so it is not thread-safe.
3. What StringBuilder and StringBuffer have in common
StringBuilder and StringBuffer have a common parent class, AbstractStringBuilder (abstract class).
One of the differences between abstract classes and interfaces is that abstract classes can define some public methods of subclasses. Subclasses only need to add new functions and do not need to rewrite existing methods; while interfaces only need to add new functions. Declaration of methods and definition of constants.
StringBuilder and StringBuffer methods will call public methods in AbstractStringBuilder, such as super.append(...). It's just that StringBuffer will add the synchronized keyword to the method for synchronization.
Finally, if the program is not multi-threaded, then using StringBuilder is more efficient than StringBuffer.
The above in-depth analysis of the differences between String, StringBuffer, and StringBuilder in Java is all the content shared by the editor. I hope it can give you a reference, and I hope you will support the PHP Chinese website.
For more in-depth analysis of the differences between String, StringBuffer, and StringBuilder in Java, please pay attention to the PHP Chinese website!