繁体   English   中英

如何根据字节减少Java List对象的大小

[英]How to reduce Java List object size based on bytes

我有一个长字符串的Java列表,并且正在使用net.sourceforge.sizeof.SizeOf尝试查找大小,并将此列表1减小1,直到List对象的总大小小于net.sourceforge.sizeof.SizeOf 50000字节。 我下面的代码性能很差。

    import net.sourceforge.sizeof.SizeOf;

    List<String> mySuperLongStrings;   // this list contains thousands of long strings

    Long size = SizeOf.deepSizeOf(mySuperLongStrings); 

    while (size > Long.valueOf(50000)) {
        if (!mySuperLongStrings.isEmpty()) {
            mySuperLongStrings.remove(0);
            size = SizeOf.deepSizeOf(mySuperLongStrings);
        } 
    }

关于如何做到这一点的任何建议?

由于Size.deepSizeOf(list)每次都必须迭代整个列表,因此您的算法具有二次运行时复杂性。 如果仅对列表中字符串的大小求和,就可以轻松地将其更改为线性,一旦超过50000字节的限制就立即停止:

public static <T> List<T> sizedSubList(List<T> list, long maxSize) {
    long totalSize = 0;
    int i = list.size() - 1;
    while (i >= 0) {
        totalSize += SizeOf.deepSizeOf(list.get(i));
        if (totalSize > maxSize) break;
        i--;
    }

    return list.subList(i + 1, list.size());
}

(结果可能比maxSize稍大,因为此算法未考虑列表对象本身的大小(包括内部存储阵列))。

用法:

List<String> smallList = sizedSubList(largeList, 50000);

请注意,此方法返回的子列表只是原始列表的视图,因此子列表将反映对原始列表的后续修改,反之亦然。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM