ArrayList <integer> vs ArrayList <string> - 两者都存储从0到9的值..这需要更多的内存?

时间:2018-04-29 11:28:23

标签: java string arraylist integer

我被问到ArrayList Integer ArrayList String 0的问题 - 同时存储9public function getClassTreaner() { return $this->hasOne('App\User', 'id', 'class_treaner'); } public static function searchScoop($keyword) { $data = Classe::where('id','like','%'.$keyword.'%') ->orWhere('class_name','like','%'.$keyword.'%') ->limit(30) ->get(); return $data; } 的值......需要更多记忆?

2 个答案:

答案 0 :(得分:3)

假设列表创建如下:

    List<Integer> integers = new ArrayList<>();
    integers.add(0);
    integers.add(1);
    // ...
    List<String> strings = new ArrayList<>();
    strings.add("0");
    strings.add("1");
    // ...

回答这个问题有两个层次。

首先是了解IntegerString的内存消耗情况。

  

因此,具有一个字符的String需要40个字节(Java 8上为32个字节)。 Integer需要16个字节。

在这个级别上,字符串列表比整数列表占用更多内存。

在第二级,您必须知道字符串文字是实习的,而int Integer.valueOf的{​​{1}}使用缓存来处理-128和至少127之间的值。所以基本上add("0")add(0)都会使用缓存对象,可以说没有使用额外的内存。

因此,根据您是否考虑字符串池/整数缓存,答案是“字符串列表占用更多内存”或“两个列表占用相同内存量”。

如果这是一个面试问题,你应该给出两个答案。

PS。我个人不会知道StringInteger的大小,但会猜到String会占用更多内存。

答案 1 :(得分:1)

以下是使用此tool的测试结果,它显示ArrayList<Integer>占用的内存较少:

public static void main(String[] args) {
    ArrayList<Integer> integerArrayList = new ArrayList<>();
    ArrayList<String> stringArrayList = new ArrayList<>();
    for (int i = 0; i < 10; i++) {
        integerArrayList.add(i);
        stringArrayList.add(String.valueOf(i));
    }
    System.out.println(RamUsageEstimator.sizeOf(integerArrayList));  // 240
    System.out.println(RamUsageEstimator.sizeOf(stringArrayList));  // 560
}