Substring method from String class is i of most used method inwards Java, together with it's also usage of an interesting String interview question e.g. How substring industrial plant inwards Java or sometime asked equally how does substring creates retention leak inwards Java. In guild to reply these questions, y'all noesis of implementation details is required. Recently i of my friend was drilled on substring method inwards Java during a Java interview, he was using substring() method from long time, together with of course of teaching all of us has used this, but what surprises him was interviewer's obsession on Java substring, together with deep dive till the implementation level. Though String is a exceptional shape inwards Java, together with discipline of many interview questions e.g. Why char array is improve than String for storing password . In this illustration it was, substring method, which took centre stage. Most of us rather merely usage substring(..), together with than forgot. Not every Java programmer learn into code, together with meet how just it's working. To learn a experience of how his interview was let's start .
Update: This consequence was genuinely a põrnikas http://bugs.sun.com/view_bug.do?bug_id=6294060, which is fixed inwards substring implementation of Java 7. Now, Instead of sharing master grapheme array, substring method creates a re-create of it. In short, substring method entirely retains equally much data, equally it needed. Thanks to Yves Gillet for pointing this. As around of my readers pointed out, java.lang.String class has also grown into around alter inwards Java 1.7 version together with offset together with count variable which is used to rails positions are removed from String. This may salve around bytes amongst each String instance, but non sharing master array makes substring perform linearly, equally compared to constant fourth dimension previously. Anyway, it's worth to withdraw whatever string related retention leak inwards Java. Having said that, if y'all receive got non yet upgraded your Server to Java seven together with withal working on Java 1.6 updates, this is i thing, which is worth knowing.
Question starts amongst normal chit chat, together with Interviewer ask, "Have y'all used substring method inwards Java", together with my friend proudly said Yes, lot many times, which brings a grin on interviewer's face. He says well, that’s good. Next interrogation was Can y'all explicate what does substring do? My friend got an chance to present off his talent, together with how much he knows close Java API; He said substring method is used to learn parts of String inwards Java. It’s defined inwards java.lang.String class, together with it's an overloaded method. One version of substring method takes merely beginIndex, and returns usage of String started from beginIndex till end, piece other takes ii parameters, beginIndex and endIndex, and returns part of String starting from beginIndex to endIndex-1. He also stressed that every fourth dimension y'all call substring() method inwards Java, it volition supply a novel String because String is immutable inwards Java.
Next interrogation was, what volition hap if beginIndex is equal to length inwards substring(int beginIndex), no it won't throw IndexOutOfBoundException instead it volition supply empty String. Same is the illustration when beginIndex and endIndex is equal, inwards illustration of minute method. It volition entirely throw StringIndexBoundException when beginIndex is negative, larger than endIndex or larger than length of String.
So far together with then good, my friend was happy together with interview seems going good, until Interviewee asked him, Do y'all know how substring industrial plant inwards Java? Most of Java developers neglect here, because they don't know how just substring method works, until they receive got non seen the code of java.lang.String. If y'all await substring method within String class, y'all volition figure out that it calls String (int offset, int count, char value []) constructor to create novel String object. What is interesting hither is, value[], which is the same grapheme array used to correspond master string. So what's incorrect amongst this?
In illustration If y'all receive got withal non figured it out, If the master string is really long, together with has array of size 1GB, no affair how pocket-sized a substring is, it volition concur 1GB array. This volition also halt master string to last garbage collected, inwards illustration if doesn't receive got whatever alive reference. This is clear illustration of retention leak inwards Java, where retention is retained fifty-fifty if it's non required. That's how substring method creates memory leak.
Obviously side past times side interrogation from interviewer would be, how exercise y'all bargain amongst this problem? Though y'all tin non go, together with alter Java substring method, y'all tin withal brand around operate around, inwards illustration y'all are creating substring of pregnant longer String. Simple solution is to cut back the string, together with proceed size of grapheme array according to length of substring. Luckily java.lang.String has constructor to exercise this, equally shown inwards below example.
If y'all await code on java.lang.String class, y'all volition meet that this constructor cut back the array, if it’s bigger than String itself.
// comma separated stock symbols from NYSE String listOfStockSymbolsOnNYSE = getStockSymbolsForNYSE(); //calling String(string) constructor String apple tree = new String(
listOfStockSymbolsOnNYSE.substring(appleStartIndex, appleEndIndex)
);
If y'all await code on java.lang.String class, y'all volition meet that this constructor cut back the array, if it’s bigger than String itself.
public String(String original) { ... if (originalValue.length > size) { // The array representing the String is bigger than the new // String itself. Perhaps this constructor is existence called // inwards guild to cut back the baggage, together with then brand a re-create of the array. int off = original.offset; v = Arrays.copyOfRange(originalValue, off, off+size); } else { // The array representing the String is the same // size equally the String, together with then no betoken inwards making a copy. v = originalValue; } ... }Another agency to solve this work is to telephone phone intern() method on substring, which volition than fetch an existing string from puddle or add together it if necessary. Since the String inwards the puddle is a existent string it entirely receive got infinite equally much it requires. It’s also worth noting that sub-strings are non internalized, when y'all telephone phone intern() method on master String. Most developer successfully answers root 3 questions, which is related to usage of substring, but they learn stuck on concluding two, How substring creates retention leak or How substring works. It's non completely at that spot fault, because what y'all know is that every fourth dimension substring() returns novel String which is non just true, since it’s backed past times same character array.
Further Learning
Data Structures together with Algorithms: Deep Dive Using Java
Difference betwixt StringBuffer together with StringBuilder