You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android中如何高效排序含2000条记录的ArrayList<JSONObject>?

Optimizing Sorting for ArrayList in Android

Hey there, let's tackle this sorting performance issue you're facing with your 2000-item ArrayList<JSONObject>! The main culprit behind slow Collections.sort is usually repeated, expensive access to JSONObject properties during comparisons—since each getX() call involves hash table lookups and type conversions. Here are practical, memory-based solutions tailored to your dynamic data scenario (no Room required):

1. Pre-extract Sort Keys to Reduce JSONObject Access

The biggest win comes from avoiding repeated property lookups during sorting. Extract the sort key for each object once, store it alongside the original JSONObject, then sort using the pre-extracted key.

Example Code:

// Step 1: Create a list of pairs (JSONObject, pre-extracted sort key)
List<Pair<JSONObject, Comparable>> sortedPairs = new ArrayList<>();
for (JSONObject obj : yourOriginalList) {
    // Adjust the key type based on your attribute (String, Integer, Long, etc.)
    Comparable sortKey = obj.optString("your_sort_attribute", ""); 
    // Use optString/optInt to avoid exceptions if the attribute is missing
    sortedPairs.add(new Pair<>(obj, sortKey));
}

// Step 2: Sort the pairs using the pre-extracted key (fast comparisons!)
Collections.sort(sortedPairs, (pair1, pair2) -> 
    pair1.second.compareTo(pair2.second)
);

// Step 3: Map back to your original ArrayList<JSONObject>
yourOriginalList.clear();
for (Pair<JSONObject, Comparable> pair : sortedPairs) {
    yourOriginalList.add(pair.first);
}

This cuts down the number of JSONObject property accesses from ~44,000 (for 2000 items, O(n log n) comparisons) to just 2000, which drastically reduces overhead.

2. Use Parallel Streams (Java 8+)

If your app targets API 24+ (Android 7.0+) and your JSONObjects are immutable (or not modified during sorting), parallel sorting can leverage multi-threading to speed things up. Combine this with pre-extracted keys for best results.

Example Code:

// Parallel stream with optimized comparison logic
yourOriginalList = yourOriginalList.parallelStream()
    .sorted((o1, o2) -> {
        String key1 = o1.optString("your_sort_attribute", "");
        String key2 = o2.optString("your_sort_attribute", "");
        return key1.compareTo(key2);
    })
    .collect(Collectors.toList());

Note: Parallel sorting has a small overhead, but for 2000 items, it should still yield a noticeable improvement, especially if your comparison logic is non-trivial.

3. Optimize the Comparator Logic

Even without pre-extracting keys, you can tweak your Comparator to minimize expensive operations:

  • Use optX() methods (like optString(), optInt()) instead of getX() to avoid exception handling overhead when attributes are missing.
  • Handle null/default values upfront to avoid repeated checks during comparisons.
  • Avoid any heavy operations (like parsing dates) inside the comparator—pre-parse those values if possible.

Optimized Comparator Example:

Collections.sort(yourOriginalList, (o1, o2) -> {
    // Pre-handle defaults to avoid null checks in compareTo
    String key1 = o1.optString("your_sort_attribute", "");
    String key2 = o2.optString("your_sort_attribute", "");
    // For numeric keys, use type-safe comparison
    // Integer key1 = o1.optInt("numeric_key", 0);
    // Integer key2 = o2.optInt("numeric_key", 0);
    // return Integer.compare(key1, key2);
    return key1.compareTo(key2);
});

4. Cache Sorted Results (If Sorting is Frequent)

If you need to sort the same dataset multiple times, cache the sorted list instead of re-sorting every time. Only re-sort when the underlying data changes (e.g., new items added, existing items modified).


Hope these tweaks get your sorting performance back on track! Let me know if you need adjustments for specific data types (like dates, floats, or nested JSON attributes).

内容的提问来源于stack exchange,提问作者Sootood Ebrahimi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:20:54