From c94bbcecc1ed2c2a30a96db20d827b1f77a85a9e Mon Sep 17 00:00:00 2001 From: fractalwrench Date: Sat, 6 Apr 2019 11:28:07 +0100 Subject: [PATCH] refactor: prefer using zero-based array when converting collection There are two styles to convert a collection to an array: either using a pre-sized array (like c.toArray(new String[c.size()])) or using an empty array (like c.toArray(new String[0]). In older Java versions using pre-sized array was recommended, as the reflection call which is necessary to create an array of proper size was quite slow. However since late updates of OpenJDK 6 this call was intrinsified, making the performance of the empty array version the same and sometimes even better, compared to the pre-sized version. Also passing pre-sized array is dangerous for a concurrent or synchronized collection as a data race is possible between the size and toArray call which may result in extra nulls at the end of the array, if the collection was concurrently shrunk during the operation. This inspection allows to follow the uniform style: either using an empty array (which is recommended in modern Java) or using a pre-sized array (which might be faster in older Java versions or non-HotSpot based JVMs). --- sdk/src/main/java/com/bugsnag/android/ErrorReader.java | 4 ++-- sdk/src/main/java/com/bugsnag/android/MetaData.java | 2 +- sdk/src/main/java/com/bugsnag/android/ThreadState.java | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/sdk/src/main/java/com/bugsnag/android/ErrorReader.java b/sdk/src/main/java/com/bugsnag/android/ErrorReader.java index 91f344940a..78118bea05 100644 --- a/sdk/src/main/java/com/bugsnag/android/ErrorReader.java +++ b/sdk/src/main/java/com/bugsnag/android/ErrorReader.java @@ -245,7 +245,7 @@ private static StackTraceElement[] readStackFrames(JsonReader reader) throws IOE frames.add(readStackFrame(reader)); } reader.endArray(); - return frames.toArray(new StackTraceElement[frames.size()]); + return frames.toArray(new StackTraceElement[0]); } private static StackTraceElement readStackFrame(JsonReader reader) throws IOException { @@ -396,7 +396,7 @@ private static ThreadState readThreadState(Configuration config, JsonReader read } } reader.endArray(); - return new ThreadState(threads.toArray(new CachedThread[threads.size()])); + return new ThreadState(threads.toArray(new CachedThread[0])); } private static CachedThread readThread(Configuration config, diff --git a/sdk/src/main/java/com/bugsnag/android/MetaData.java b/sdk/src/main/java/com/bugsnag/android/MetaData.java index 026bcbdc20..94d81cd5fb 100644 --- a/sdk/src/main/java/com/bugsnag/android/MetaData.java +++ b/sdk/src/main/java/com/bugsnag/android/MetaData.java @@ -122,7 +122,7 @@ static MetaData merge(@NonNull MetaData... metaDataList) { @SuppressWarnings({"unchecked", "rawtypes"}) MetaData newMeta = new MetaData(mergeMaps(stores.toArray(new Map[0]))); - newMeta.setFilters(filters.toArray(new String[filters.size()])); + newMeta.setFilters(filters.toArray(new String[0])); return newMeta; } diff --git a/sdk/src/main/java/com/bugsnag/android/ThreadState.java b/sdk/src/main/java/com/bugsnag/android/ThreadState.java index 8e89ab1967..678ee5898b 100644 --- a/sdk/src/main/java/com/bugsnag/android/ThreadState.java +++ b/sdk/src/main/java/com/bugsnag/android/ThreadState.java @@ -56,7 +56,7 @@ public ThreadState(@NonNull Configuration config, private Thread[] sortThreadsById(Map liveThreads) { Set threadSet = liveThreads.keySet(); - Thread[] threads = threadSet.toArray(new Thread[threadSet.size()]); + Thread[] threads = threadSet.toArray(new Thread[0]); Arrays.sort(threads, new Comparator() { public int compare(@NonNull Thread lhs, @NonNull Thread rhs) { return Long.valueOf(lhs.getId()).compareTo(rhs.getId());