将对象传递给arraylist的区别(初始化一次且不止一次)

时间:2014-07-30 06:25:36

标签: java object arraylist

这是我的主要课程 MainClass ,它有一个arraylist MyList 。我为 ExtractClass [未显示] extract 创建了一个对象,并将其添加到我的MyList中。还有另一个类 PressClass [未显示]

public class MainClass {
  public static void main(String[] args) {

    ArrayList<ExtractClass> MyList = new ArrayList<ExtractClass>();

    ExtractClass Extract = new ExtractClass();

    MyList.add(Extract);
    MyList.add(Extract);

    PressClass Press = new PressClass(); 
    Press.pressMethod(MyList);
  }
}

以上是上述程序的另一个版本。我初始化了一个对象 Extract ,然后添加到 MyList ,我再次重复它。

public class trailclass {
  public static void main(String[] args) {

    ArrayList<ExtractClass> MyList = new ArrayList<ExtractClass>();

    ExtractClass Extract;

    Extract = new ExtractClass();
    MyList.add(Extract);

    Extract = new ExtractClass();
    MyList.add(Extract);

    PressClass Press = new PressClass(); 
    Press.pressMethod(MyList);
  }
}

我为这两个程序输出了相同的输出。两者有什么区别?以上两个代码中的任何一个是否违反了java的规则?作为开发人员,您更喜欢哪一段代码?

5 个答案:

答案 0 :(得分:1)

这取决于你试图实现的目标...... 在第一个代码段中,您将相同的 ExtractClass实例两次添加到列表中,在第二个代码段中,您将2个不同的 ExtractClass实例添加到列表中。由于我不知道你的ExtractClass的内部,我可以确定哪些代码是&#34;对&#34;。

答案 1 :(得分:1)

简单的答案是你要创建两个对象,其中一个是你不需要的。垃圾收集器不会破坏它,但是因为它在ArrayList MyList中,所以对它的引用仍然可以访问。 在第一个示例中,相同的对象被添加到ArrayList两次。在第二个示例中,创建了一个对象并将其添加到ArrayList中。之后,创建一个新对象,并将它添加到ArrayList中。对象可能具有相同的值(但是您创建了构造函数)但引用不同。

如果您需要更多解释,请询问。

答案 2 :(得分:0)

提出的2个解决方案并不相同。第一个将同一个对象添加到列表中两次,而第二个将两个不同的实例添加到列表中。

Btw在同一行中初始化一个局部变量更紧凑,如果它是一个简单的对象创建,你应该更喜欢它:

ExtractClass Extract = new ExtractClass();

另请注意,如果您不使用本地变量,只需将其保留并直接添加到列表中即可:

MyList.add(new ExtractClass());

同样按照惯例,您应该使用小写字母开始变量名称,并使用大写字母开始您的类型(例如类名)。

答案 3 :(得分:0)

  

两者有什么区别?

第一个创建一个单个对象并将其两次添加到列表中

在第二个中,您创建两个不同的(1)对象,并将每个一次添加到列表中,这是大多数情况下您将要执行的操作。

  

以上两个代码中的任何一个是否违反了java的规则?

技术上没有。 List允许同一个对象在其中出现多次。从语义上讲,它取决于您是否在列表中不止一次拥有相同的对象。

  

作为开发人员,您更喜欢哪一段代码?

一般来说,你的意思是拥有第二个版本。

(1)不同取决于您对hashCodeequals的实施情况。基类Object的默认值只是参考检查。因此,不同的实例将不相等,因而不同。使用List#contains方法时,您可以看到这种影响。根据您对前一种方法的实现以及您传递给它的实例,您可能会得到不同的结果。

答案 4 :(得分:0)

根据您当前的实现,两个程序都可以正常工作,因为您要添加对象new ExtractClass() 使用列表中的默认实现。第一个程序添加相同的对象两次,而第二个程序将2个不同的实例添加到列表中。

如果您有ExtarctClass构造函数接受某些参数的方案,请说File destDir,您将留下第二个选项,因为您可能必须为不同的对象提供不同的destDir

如上所述,您的第二个程序将如下所示

public class trailclass {
  public static void main(String[] args) {

    ArrayList<ExtractClass> MyList = new ArrayList<ExtractClass>();

    ExtractClass Extract;

    Extract = new ExtractClass(new File("c:\temp"));
    MyList.add(Extract);

    Extract = new ExtractClass(new File("c:\temp"));
    MyList.add(Extract);

    PressClass Press = new PressClass(); 
    Press.pressMethod(MyList);
  }
}

这可以进一步写成如下

public class trailclass {
  public static void main(String[] args) {
    ArrayList<ExtractClass> MyList = new ArrayList<ExtractClass>();
    MyList.add(new ExtractClass(new File("c:\temp")));
    MyList.add(new ExtractClass(new File("c:\temp")));

    PressClass Press = new PressClass(); 
    Press.pressMethod(MyList);
  }
}