使用new运算符或在循环中声明变量?

时间:2014-02-13 09:15:26

标签: java

看起来你可以在循环中完全声明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关闭扫描仪的警告。 如果我关闭它,它说“扫描仪没有初始化”?对于第二个版本,它说资源泄漏,扫描仪永远不会关闭。这里发生了什么,从现在开始使用循环时我应该如何声明我的变量?

2 个答案:

答案 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))); 
   }
}