根据我们的测试,扫描仪使用高达200个字节来读取一个整数...
练习:10,000个整数,100个连续整数的哪个窗口具有最大总和?
内存使用很小(您只需要记住最后100个整数),但经典版与“Scanner / nextInt()”和手动版本之间存在2.5 Mb的内存差异。
2.5 Mb用于读取10,000个整数==> 200 Bytes用于读取一个整数??
是否有任何简单的解决方案可以向初学者解释?或者以下函数(或类似函数)是正确的方式?
我们的测试函数可以更快地读取整数,同时使用更少的内存:
public static int read_int() throws IOException
{
int number = 0;
int signe = 1;
int byteRead = System.in.read();
while (byteRead != '-' && ((byteRead < '0') || ('9' < byteRead)))
byteRead = System.in.read();
if (byteRead == '-'){
signe = -1;
byteRead = System.in.read();
}
while (('0' <= byteRead) && (byteRead <= '9')){
number *= 10;
number += byteRead - '0';
byteRead = System.in.read();
}
return signe*number;
}
使用Scanner编写代码,如请求的那样:
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int nbValues = sc.nextInt();
int widthWindow = sc.nextInt();
int values[] = new int[widthWindow];
int sumValues = 0;
for (int idValue = 0; idValue < widthWindow; idValue++){
values[idValue] = sc.nextInt();
sumValues += values[idValue];
}
int maximum = sumValues;
for (int idValue = widthWindow; idValue < nbValues; idValue++)
{
sumValues -= values[ idValue % widthWindow ];
values[ idValue % widthWindow ] = sc.nextInt();
sumValues += values[ idValue % widthWindow ];
if (maximum < sumValues)
maximum = sumValues;
}
System.out.println(maximum);
}
}
按要求,内存使用量与整数数量的函数关系如下:
- 10,000个整数:2.5Mb
- 20,000个整数:5Mb
- 50,000个整数:15Mb
- 100,000个整数:30Mb
- 200,000个整数:50Mb
- 300,000个整数:75Mb
BufferedReader
在每个整数数量上使用多少内存? - c-an