From: Yann Simon Date: Mon, 13 Jul 2009 08:07:02 GMT Subject: Re: [PATCH] FindBugs: don't use new String(String) in RefDatabase Message-ID: <551f769b0907130107j51d32e4er54e125f9dc61dd80@mail.gmail.com> In-Reply-To: <20090710153441.GF11191@spearce.org> 2009/7/10 Shawn O. Pearce : >  Yann Simon wrote: >  > >  > However, using the trick newString = new String(aString.substring(), >  > i) does not work on all JVM. >  > With an IBM JVM, the newString will still contain the original array of chars. >  > >  > Another solution that work on all JVM could be: >  > newString = new String(aString.substring(i).toCharArray()) >  > Or >  > newString = new String(aString.toCharArray(), i, aString.length() - i) >  > >  > I like the latter one. > >  I prefer this.  It should always do what we want, and at a lower >  temporary memory footprint (one less copy of the name).  IIRC Robin >  rejected it earlier because it wasn't obvious what we were doing. I >  say hogwash, its clear as mud. > > +       private static String copy(final String src, final int off, final int end) { > +               return new StringBuilder(end - off).append(src, off, end).toString(); > +       } > + This method is quite clear. One line javadoc would make it even clearer... :p (and maybe make Robin happy) And you're right: by using a StringBuilder, we need one less arraycopy. After committing your change, we can remove the entry to silent FindBugs. (commit 21c3d82824075cd1f140b3bcf252dfaffe0fc96c) Yann