看起来你可以在循环中完全声明Scanner,它可以正常工作 我已经读过你应该给你变量尽可能小的范围。这是否意味着我写的以下代码不正确?
Scanner SeatScan;
int x = 0,y = 0;
for(int i = 0; i < names.size(); i++) {
SeatScan = new Scanner(seats.get(i));
if(SeatScan.hasNext()){
x = SeatScan.nextInt();
y = SeatScan.nextInt();
}
people.add(new Person(x,y,names.get(i)));
}
这样更好吗
for(int i = 0; i < names.size(); i++) {
int x = 0,y = 0;
Scanner SeatScan = new Scanner(seats.get(i));
if(SeatScan.hasNext()){
x = SeatScan.nextInt();
y = SeatScan.nextInt();
}
people.add(new Person(x,y,names.get(i)));
}
在每次迭代后,循环是否会声明并重新分配x和y值并重新声明扫描器(虽然它可能不会这样做)?另外对于第一个代码,我没有收到eclipse关闭扫描仪的警告。 如果我关闭它,它说“扫描仪没有初始化”?对于第二个版本,它说资源泄漏,扫描仪永远不会关闭。这里发生了什么,从现在开始使用循环时我应该如何声明我的变量?
答案 0 :(得分:3)
Scanner seatScan
是引用而不是对象。 JVM非常智能,可以在方法开始时分配所有局部变量,因此嵌套变量不会影响性能。即它不是在运行时创建和销毁某些东西。
如果你查看这个方法的字节代码(并且你有调试信息),你会看到最后有一个表用于整个方法的所有局部变量。
BTW:如果有有效的输入,你可能只会创建一个Person。
简而言之,除非您知道因为测量它而存在性能问题,否则您应该假设最清晰,最简单的代码运行得足够快。
如果我要更改任何内容,我会使用Java编码约定并使用以小写字符开头的变量,例如seatScan
而非SeatScan
看起来像是一个类名。
答案 1 :(得分:0)
这完全取决于您的需求,您希望在程序中使用变量。根据你的代码片段,第二种方法接缝更合适。
在if块之后关闭扫描程序并为x和y添加有效值检查。
for(int i = 0; i < names.size(); i++) {
int x = 0,y = 0;
Scanner seatScan = new Scanner(seats.get(i));
if(seatScan.hasNext()){
x = seatScan.nextInt();
y = seatScan.nextInt();
}
seatScan.close();
if(x!=0 && y!=0) {
people.add(new Person(x,y,names.get(i)));
}
}