To find characters or substrings with in a string indexOf() and lastIndexOf() methods can be used.
You can also use contains() method
public boolean contains(CharSequence s) - Returns true if and only if this string contains the specified sequence of char values. Otherwise it returns false.
Using intern() method you can still get string object from the pool (if it exists) even if new operator is used to create a string.
When the intern method is invoked, if the pool already contains a string equal to this String object as determined by the equals(Object) method, then the string from the pool is returned. Otherwise, this String object is added to the pool and a reference to this String object is returned.
When String literals are created they are stored in a String pool and that is a common pool; which me if there are two strings literals having the same content then those string will share the space in the pool.
When String object is created by assigning a string literal, pool will be checked to verify if there is any existing object with the same content if there is then that existing reference is used, no new object is created in that case. If no object is found with the same content then this new literal will be added in the pool.
String pool is stored in the heap.
Yes, StringBuffer class is final in Java.
With Java 8 join() method has been added in the String class which makes it very easy to join the multiple strings.
join method has two overloaded versions -
No StringBuilder class is not thread safe. That makes it faster than StringBuffer.
String is immutable where as both StringBuffer and StringBuilder are mutable.
String and StringBuffer are thread safe where as StringBuilder is not thread safe.
Since strings are objects so strings can of course be created using new operator. String class has more than 10 constructors to create Strings which ranges from taking nothing as parameter to taking char array, StringBuffer, StringBuilder, another String as argument.
Another and more preferred way to create Strings is to assign String literal directly to a String reference as you will do for any primitive type. For every string literal Java will automatically constructs a String object.
As example - String str = “abc”;
Since Java maintains a string pool where String references are shared thus changing content of any of the String will also affect the other strings sharing the same references that’s one reason why string is immutable.
Yes StringBuffer class is thread safe. Methods in StringBuffer class are synchronized.
StringBuilder class (Added in Java 5),just like StringBuffer, is a mutable(modifiable) sequence of characters which is in contrast to String class which is an immutable sequence of characters. Thus in case of StringBuilder length and content of the sequence can be changed through certain method calls.
Since String is immutable, whenever you perform any operation on string which alters its content a new string object is created containing the modified string. Which me all the methods of the String class that modify the content in any way return a new String object with the modified content.
Now, What if you can override the method of the String class so that it modifies and return the original string reference itself? In that case all the other strings having the same data in the string pool will also get affected as the reference is shared for the String literals having the same content.
To avoid these kind of scenarios String class is declared as final and it can’t be overridden.
No, StringBuffer is not immutable.
In Java String class represents character strings which me; Strings in Java are objects and all strings are instances of the String class. Internally in String class Strings are stored as character array.
Yes StringBuilder class is final in Java.
String provides a split method in order to split the string into one or more substring based on the given regular expression.
As example If you have a string where one (or more) spaces are used and you want to split it around those spaces.
String str1 = "split example program";
String strArray = str1.split("s+");
An immutable object is an object that would not be able to change its state after creation. Thus immutable object can only be in one state and that state can not be changed after creation of the object.
Yes String object is immutable. Once you create a String object the content of that string cannot be modified.
equals() method can be used for comparing two strings in Java. If you want to ignore case then you can use equalsIgnoreCase(String anotherString) method.
There are also compareTo() and compareToIgnoreCase() methods for comparing two strings lexicographically. Returns an integer indicating whether this string is greater than (result is > 0), equal to (result is = 0), or less than (result is < 0) the argument.
You can also use matches() method where you can pass a regular expression for matching strings.
‘+’ operator is overloaded in Java for String. It is used for concatenating two strings.
Yes string is thread safe in Java as String is immutable.
StringBuffer class is the companion class of String. StringBuffer is a mutable(modifiable) sequence of characters which is in contrast to String class which is an immutable sequence of characters. Thus in case of StringBuffer length and content of the sequence can be changed through certain method calls.
Since StringBuffer is mutable a new String object is not created every time string is modified, which in turn results in less memory consumptions and not having lots of intermediate String object for garbage collection.
You can get the character at a particular index within a string by invoking the charAt() accessor method.
String str = "Example String";
char resChar = str.charAt(3);
Will give char ‘m’. If you want to get more than one consecutive character from a string, you can use the substring method. The substring method has two versions -
Yes from Java 7 string can be used in switch case statement.