Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How is StringBuffer implementing append function without creating two objects?

It was an interview question. I was asked to implement the StringBuffer append function. I saw the code after the interview. But I cannot understand how the operation is done with creation of a single object.

I am thinking like this.

String s = "orange"; s.append("apple"); 

Here two objects are created.

But

StringBuilder s = new StringBuilder("Orange"); s.append("apple"); 

Now here only one object is created.

How is Java doing this operation?

like image 837
javaMan Avatar asked Nov 04 '11 15:11

javaMan


People also ask

What is append in StringBuffer?

StringBuffer. append(boolean a) is an inbuilt method in Java which is used to append the string representation of the boolean argument to a given sequence. Syntax : public StringBuffer append(boolean a) Parameter : This method accepts a single parameter a of boolean type and refers to the Boolean value to be appended.

How is StringBuffer implemented?

As others described, StringBuffer is mutable and it is implemented by using a char array. Operations in the StringBuffer are in-place operations. It shows simple StringBuffer implementations using a char array.

How does append work in Java?

append(String str) method appends the specified string to this character sequence. The characters of the String argument are appended, in order, increasing the length of this sequence by the length of the argument.

How to append method of StringBuffer in Java?

Use append (String str) API method of StringBuffer. This method appends the specified string to this character sequence. The method can also be used to append a boolean, a char, a char array, a double, a float, an int and an Object. This was an example of how to append method of StringBuffer in Java.

Which argument is appended to the contents of a StringBuffer?

The char argument is appended to the contents of this StringBuffer sequence. Parameter : The method accepts a single parameter a which is the Char value whose string representation is to be appended.

What are the implemented interfaces of StringBuffer?

All Implemented Interfaces of StringBuffer class: Serializable, Appendable, CharSequence. public final class StringBuffer extends Object implements Serializable, CharSequence, Appendable. String buffers are safe for use by multiple threads.

How to add characters to a StringBuffer?

(What you are practically doing, is implementing a simple version of an ArrayList internally). When using the stringBufferInstance.append (String s) method, add characters to _chars, increasing its size if needed. As others described, StringBuffer is mutable and it is implemented by using a char array.


2 Answers

First there is a problem with your question:

String s = "orange"; s.append("apple"); 

here two objects are created

Correct, two Objects are created, the String "orange" and the String "apple", inside the StringBuffer/StringBuilder no Objects will be created if we don't overflow the buffer. So those lines of code create 2 or 3 objects.

StringBuilder s = new StringBuilder("Orange"); s.append("apple"); 

Now here only one object is created

I don't know where you get that, here you create one StringBuilder Object, one "Orange" String, one "apple" String, for a total of 3 Objects, or 4 if we overflow the StringBuilder buffer. (I count the array creation as object creation).


I read your question as, how can StringBuilder do the append without creating a new Object (when the buffer is not overflown)?

You should look at StringBuilder, since it's the non thread safe implementation. The code is interesting and easy to read. I've added the inline comments.

As internal structure there is a char array, not a String. It is initially built with length 16 and will be increased every time the capacity is exceeded. If the Strings to append fit within the char array, there is no need to create new Objects.

StringBuilder extends AbstractStringBuilder, where you'll find the following code:

/**  * The value is used for character storage.  */ char value[]; 

Since not all the array will be used at a given time, another important variable is the length:

/**    * The count is the number of characters used.  */ int count; 

There are many overloading of append, but the most interesting one is the following:

public AbstractStringBuilder append(String str) {     if (str == null) str = "null"; //will literally append "null" in case of null     int len = str.length(); //get the string length     if (len == 0) return this; //if it's zero, I'm done     int newCount = count + len; //tentative new length     if (newCount > value.length) //would the new length fit?         expandCapacity(newCount); //oops, no, resize my array     str.getChars(0, len, value, count); //now it will fit, copy the chars      count = newCount; //update the count     return this; //return a reference to myself to allow chaining } 

String.getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) Copies characters from this string into the destination character array.

So, the append method is quite simple, the only magic left to discover is the expandCapacity, here it is:

void expandCapacity(int minimumCapacity) {     //get the current length add one and double it     int newCapacity = (value.length + 1) * 2;      if (newCapacity < 0) { //if we had an integer overflow         newCapacity = Integer.MAX_VALUE; //just use the max positive integer     } else if (minimumCapacity > newCapacity) { //is it enough?         //if doubling wasn't enough, use the actual length computed         newCapacity = minimumCapacity;     }     //copy the old value in the new array     value = Arrays.copyOf(value, newCapacity);  } 

Arrays.copyOf(char[] original, int newLength) Copies the specified array, truncating or padding with null characters (if necessary) so the copy has the specified length.

In our case, padding, since we're expanding the length.

like image 172
stivlo Avatar answered Oct 04 '22 13:10

stivlo


The source is your friend, Luke!

Here is the source for AbstractStringBuilder

like image 25
LordDoskias Avatar answered Oct 04 '22 12:10

LordDoskias