Java 为Loop-Spring在内部或外部声明对象

Java 为Loop-Spring在内部或外部声明对象,java,spring,Java,Spring,这里是新手问题-我有一个方法,它通过Spring CrudepositoryfindOne()方法接受用户ID数组,并设置一个公共属性。这是我当前的实现 @RequestMapping(value = "/setUsersActive/{ids}", method = RequestMethod.GET) public String setActive(@PathVariable Long[] ids) { for(Long id : ids) { User user = userRep

这里是新手问题-我有一个方法,它通过Spring Crudepository
findOne()
方法接受用户ID数组,并设置一个公共属性。这是我当前的实现

@RequestMapping(value = "/setUsersActive/{ids}", method = RequestMethod.GET)
public String setActive(@PathVariable Long[] ids) {
for(Long id : ids) {
    User user = userRepo.findOne(id);
    user.setActive("Y");    
    userRepo.save(user);    
}
这个方法可能会在数组中接受数千个ID——如果我像这样在for循环之外声明
User
对象,会对性能产生任何影响吗

User user;
for(Long id : ids) {
    user = userRepo.findOne(id);
    user.setActive("Y");        
}

任何输入都是非常感谢的

是的,我会宣布它不在循环中,它更有效。否则,垃圾收集器必须删除整个对象,如果在循环之前声明它,则可以节省一点RAM使用量。因为只设置了对新对象的引用

除非您需要在该循环之外使用上次保存的
User
对象,否则没有理由将其声明在循环之外,因为它限制了该变量的范围。就性能而言,让Java在编译过程中为您优化它。

不,可能它会转换为完全相同的字节码,不要在类似的事情上浪费时间,JVM将进行各种奇怪的优化,以使代码尽可能快。

在使用局部变量之前不声明它们是一种很好的编程实践

声明局部变量而不立即使用它们可能会不必要地增加它们的范围。这会降低可读性,并会增加不必要的错误


从性能角度看,这没有什么区别,因为将用户声明移到循环之外不会更早地生成对象。

不,不会。始终尽可能缩小变量的范围。不是为了性能,而是为了正确性和易于重构。两个版本在内存中创建的对象数量相同,垃圾收集器在两个版本中收集的对象数量相同。只有当垃圾收集器有对象要从堆中移除时,才会调用垃圾收集器,只有当不再有对该对象的引用时,gc才会扫描该对象的空间,在op的代码中,userRepo仍然保留引用。