Re: [JGIT PATCH 09/13] Replace inefficient new String(String) constructor to silence FindBugs
- From
Shawn O. Pearce <spearce@spearce.org>
- Date
- Apr 29, 2009, 20:22 UTC
- Message-ID
- <20090429202242.GI23604@spearce.org>
- In-Reply-To
- <200904292210.49627.robin.rosenberg.lists@dewire.com>
Robin Rosenberg <robin.rosenberg.lists@dewire.com> wrote:
Show 6 quoted lines
> tisdag 28 april 2009 23:12:22 skrev "Shawn O. Pearce" <spearce@spearce.org>: > > FindBugs keeps reporting that our usage of new String(String) > > is not the most efficient way to construct a string. > > I think we should find better ways of silencing FindBugs,, than addiing obscure > coding patterns that are worse than what FindBugs warns against.
Heh. Yea, well... I also wasn't too happy with FindBugs for this one.
As far as I can tell there isn't anything in the documentation that suggests that new String(String) behaves the way I want it to here.
It seems a JRE may be free to reuse the same internal char[] as the source string, and just produce a new String wrapper. What I really want is a deep copy of that char[] to shed what I know is garbage around the interesting part.
The use of StringBuilder makes this sort of anti-optimization more difficult, as most JRE implementations would likely assume they should alloc the internal char[] at the size given in the constructor, and will deep-copy the chars during append(String,int,int) because they would expect to see more characters appended after this append call.
Perhaps the only way to really enforce the behavior I want here is to convert the String segment to a char[], and then convert that char[] into a String. Ick, that's two copies.
Maybe we just stick a comment here. Two different people have come up with the same FindBugs issue, trying to get them to share configuration files sounds hard.
> Options are: > Add a comment > Customize findbugs rules > Findbugs specific annotations
-- Shawn.