我被问到ArrayList
Integer
ArrayList
String
0
的问题 - 同时存储9
到public 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;
}
的值......需要更多记忆?
答案 0 :(得分:3)
假设列表创建如下:
List<Integer> integers = new ArrayList<>();
integers.add(0);
integers.add(1);
// ...
List<String> strings = new ArrayList<>();
strings.add("0");
strings.add("1");
// ...
回答这个问题有两个层次。
首先是了解Integer
和String
的内存消耗情况。
因此,具有一个字符的String
需要40个字节(Java 8上为32个字节)。
Integer
需要16个字节。
在这个级别上,字符串列表比整数列表占用更多内存。
在第二级,您必须知道字符串文字是实习的,而int
Integer.valueOf
的{{1}}使用缓存来处理-128
和至少127
之间的值。所以基本上add("0")
和add(0)
都会使用缓存对象,可以说没有使用额外的内存。
因此,根据您是否考虑字符串池/整数缓存,答案是“字符串列表占用更多内存”或“两个列表占用相同内存量”。
如果这是一个面试问题,你应该给出两个答案。
PS。我个人不会知道String
或Integer
的大小,但会猜到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
}