哪个更有效率? (垃圾收集)

时间:2012-08-09 18:37:52

标签: java memory-management garbage-collection

好的,我的问题如下: 假设您有类似下面的课程。在运行期间:
每次运行循环时都会创建一个新的动作侦听器吗?
第二类比第一类更有效吗?
在第一个类中是否有100个新的ActionListener对象被创建?

public class Foo extends JFrame {
    public Foo() {
        for (int i = 0; i < 100; i++) {
            JTextField someField = new JTextField();
            someField.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    //DO SOMETHING HERE
                }
            });
        }
    }
}

类似于:

public class Foo extends JFrame {
    public Foo() {
        ActionListener someActionListener = new ActionListener(){
            public void actionPerformed(ActionEvent e) {
                //DO SOMETHING HERE
            }
        }; 
        for (int i = 0; i < 100; i++) {
            JTextField someField = new JTextField();
            someField.addActionListener(someActionListener);
        }
    }
}

3 个答案:

答案 0 :(得分:4)

第二个例子可以节省1-2 KB(价值约0.003美分),但鉴于功能不一样,正确性更重要。

相比之下,你在最低工资上的1秒钟的价值是0.2美分,所以如果你花了不到一秒的时间考虑它,那可能是浪费时间。 ;)

答案 1 :(得分:2)

在第一个程序中,您运行new ActionListener() 100次。最终会得到100个ActionListener个对象。

在第二个程序中,您只运行new ActionListener()一次。因此,您最终只会得到1 ActionListener个对象。

显然,在第一个程序中,你占用了更多的内存。但是这些程序并不相同,因为第一个程序中JTextFieldActionListener,而第二个程序中它们共享一个。{/ p>

答案 2 :(得分:1)

  

每次循环时都会创建一个新的动作侦听器   运行

在第一堂课中,是的。

  

第二类比第一类更有效吗?

第二个类为每个新JTextField()对象提供相同的动作侦听器。这样更有效(节省一些内存)。但是,您应该知道所有100个JTextField()对象都具有相同的动作侦听器

此外,如果您打算这样做,则应将someActionListener = new ActionListener()移至Foo

的构造函数中