我的代码存在问题。我根据声明行list = new ArrayList<InClass>();
的位置获得了不同的结果。到位//B
但是当我将其添加到//A
时,一切正常,我无法理解其中的区别。这是代码:
import java.util.*;
import java.io.*;
public class ArrayListOne {
private ArrayList<InClass> list;
private InClass in;
public static void main(String args[]) {
ArrayListOne a = new ArrayListOne();
a.readFile();
}
public void readFile() {
//A
/**
* adding "list = new ArrayList<InClass>();"
* getting all 4 lines of test.txt
*/
try {
File file = new File("test.txt");
BufferedReader reader = new BufferedReader(new FileReader(file));
String line = null;
while ((line = reader.readLine()) != null) {
assignToObject(line);
}
} catch (Exception ex) {
ex.printStackTrace();
}
readObject();
}
public void assignToObject(String s) {
//B
/**
* adding "list = new ArrayList<InClass>();"
* getting just last line of test.txt
*/
InClass n = new InClass(s);
list.add(n);
System.out.println(list.size());
}
public void readObject() {
for (int i=0; i<list.size(); i++) {
in = list.get(i);
System.out.println(in.stTest);
}
}
//inner class
public class InClass {
String stTest;
public InClass(String s) {
stTest = s;
}
}
}
test.txt
有3行。在//A
中,我得到了所有三行(我想要的),但在//B
中,我只得到最后一行。
答案 0 :(得分:2)
如果你&#34;内联&#34;更容易看出差异。 assignToObject()
将assignToObject()
的内容复制粘贴到readFile()
中的适当位置{/ 1}}:
public void readFile() {
// B
// list = new ArrayList<InClass>();
try {
File file = new File("test.txt");
BufferedReader reader = new BufferedReader(new FileReader(file));
String line = null;
while ((line = reader.readLine()) != null) {
// Here is where assignToObject() was //
// B
// list = new ArrayList<InClass>();
InClass n = new InClass(line);
list.add(n);
System.out.println(list.size());
}
} catch (Exception ex) {
ex.printStackTrace();
}
readObject();
}
现在考虑一下list = new ArrayList<InClass>()
和A
中是否有B
。
如果您在list = new ArrayList<InClass>()
(即A
内)声明readFile()
,则语句将执行一次 - 当readFile()
被调用时在main()
。因此,您最终会得到一个 ArrayList
,其中包含您需要的所有内容。
但是,如果您在list = new ArrayList<InClass>()
(即B
内)声明assignToObject()
,那么您将获得新 list
您阅读的每一行(即每次拨打assignToObject()
时)。这意味着每次迭代都会以新 ArrayList
结束仅包含最近读取的行。包含前一行的ArrayList
被丢弃,因为用于指向它的引用现在指向一个新对象。