这是我的主要课程 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的规则?作为开发人员,您更喜欢哪一段代码?
答案 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)不同取决于您对hashCode和equals的实施情况。基类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);
}
}