gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 05:29:04 25 4
gpt4 key购买 nike

看起来你可以完全在循环内声明 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 值并将其重新分配为 0,并一遍又一遍地重新声明 Scanner(尽管它可能不会这样做)?同样对于第一个代码,我没有从 Eclipse 收到关闭扫描仪的警告。如果我关闭它,它会说“扫描仪未初始化”?对于第二个版本,它说资源泄漏,扫描器永远不会关闭。这是怎么回事?从现在开始,在使用循环时我应该如何声明我的变量?

最佳答案

Scanner seatScan 是一个引用,不是一个对象。 JVM 足够聪明,可以在方法的开头分配所有局部变量,因此嵌套变量不会影响性能。也就是说,它不会在运行时创建和销毁某些东西。

如果您查看此方法的字节码(并且您有调试信息),您会看到末尾有一张表,用于整个方法的所有局部变量。

顺便说一句:如果输入有效,您可能只创建一个 Person。

简而言之,除非您因为测量而知道存在性能问题,否则您应该假设最清晰、最简单的代码也能足够快地运行。

如果我要更改任何内容,我会使用 Java 编码约定并使用以小写字符开头的变量,例如seatScan 不是 SeatScan,它看起来像一个类名。

关于java - 使用 new 运算符或在循环中声明变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21749676/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com