 As the book notes, strings in Java are immutable. When you do something like this, initializing a string S to A, B, C, D, and then calling the toUpperCase method on S, that doesn't change S. Instead, it returns a new string. That's why we have to assign it to a new string variable or reassign the original string variable to the newly created string. Sometimes you will want to be able to change the contents of a string. There are two classes for that, string builder and string buffer. These have the same capabilities, except the string builder can only be used when you're running a single task, which is what we've been doing all throughout this course. If you have a program that runs multiple tasks, an advanced topic that this course doesn't cover, you should use string buffer to ensure that multiple tasks don't try to update an object at the same time. For this course, we'll use string builder. There are three ways to create a new string builder object. An empty string builder that can hold 16 characters, a string builder that can hold a specified number of characters, or a string builder that contains the characters from a given string. The capacity is a starting value, not an upper limit. If the content of a string builder gets larger than the capacity, Java will allocate more memory as needed behind the scenes. It's very clever about it, so don't worry too much about this capacity stuff yourself. At this point, it's easier to do a laundry list of some of the methods that string builder provides. Remember, each of these modifies the contents in place. Let's have a string builder variable called s, which will be a new string builder based off of the string abcdefghij. s.append will append a new string to the contents of the string builder. The delete method takes a starting and ending position, and deletes all the characters from the starting position up to but not including the ending position. The insert method takes a starting position and a string, and inserts that string at the starting position. You can also give primitive values. For example, at the beginning of the string, I can insert 17 times 4 converted to a string, which gives me 68. The replace method takes a starting position and an ending position, and replaces everything from the start up to but not including the end with a new string. This new string can be longer or shorter than the original interval that you specified. Finally, there's the set char at method, where you give a position and a single character in single quotes that sets the character at the given position in the string builder. All of these methods except set char at return the original string builder reference as the result. That allows you to build a chain of operations instead of having to do operations one step at a time. Let's reassign s to be a new string builder with abcdefghij, and then build a chain. I'll append klmn, then delete from positions 2 up to but not including 6, and then insert at position 2 the word new. In summary, strings are immutable. String methods always return a brand new string. For those times when you do need to modify the contents of a string in place, use a string builder. It's exactly the tool for that job.