[JGIT PATCH 09/13] Replace inefficient new String(String) constructor to silence FindBugs
From: Shawn O. Pearce <hidden>
Date: 2016-06-15 22:46:40
Subsystem:
the rest · Maintainer:
Linus Torvalds
FindBugs keeps reporting that our usage of new String(String) is not the most efficient way to construct a string. http://thread.gmane.org/gmane.comp.version-control.git/113739/focus=113787
I had a specific reason for forcing a new String object here. The line in question, p, is from the packed-refs file and contains the entire SHA-1 in hex form at the beginning of it. We've converted that into binary as an ObjectId, it uses 1/4 the space of the string portion. The Ref object, its ObjectId, and its name string, are going to be cached in a Map, probably long-term. We're better off shedding the 80 bytes of memory used to hold the hex SHA-1 then risk substring() deciding its "faster" to reuse the char[] then to make a copy of it.
Another way to force this new unique String instance with its own private char[] is to use a StringBuilder and append onto it the ref name. This shouldn't be a warning for FindBugs, but it would accomplish the same goal of producing 1 clean copy, with no extra transient temporary array. Signed-off-by: Shawn O. Pearce <redacted> CC: Yann Simon <redacted> CC: Matthias Sohn <redacted> --- .../src/org/spearce/jgit/lib/RefDatabase.java | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-)
diff --git a/org.spearce.jgit/src/org/spearce/jgit/lib/RefDatabase.java b/org.spearce.jgit/src/org/spearce/jgit/lib/RefDatabase.java
index 87f26bf..bccf2d0 100644
--- a/org.spearce.jgit/src/org/spearce/jgit/lib/RefDatabase.java
+++ b/org.spearce.jgit/src/org/spearce/jgit/lib/RefDatabase.java@@ -447,7 +447,8 @@ private synchronized void refreshPackedRefs() { final int sp = p.indexOf(' '); final ObjectId id = ObjectId.fromString(p.substring(0, sp)); - final String name = new String(p.substring(sp + 1)); + final String name = new StringBuilder(p.length() - (sp + 1)) + .append(p, sp + 1, p.length()).toString(); last = new Ref(Ref.Storage.PACKED, name, name, id); newPackedRefs.put(last.getName(), last); }
--
1.6.3.rc1.205.g37f8