这是我尝试过的代码:
ArrayList<ArrayList<String>> select = new ArrayList<ArrayList<String>>();
ArrayList<String> selectin = new ArrayList<String>();
ResultSet lihat = st.executeQuery("select * from usersss");
while (lihat.next()){
selectin.set(0, lihat.getString("user"));
selectin.set(1, lihat.getString("password"));
selectin.set(2, lihat.getString("email"));
select.add(selectin);
}
for (int i = 0; i<select.size();i++) {
System.out.println(select.get(i));
}
这是结果:
[kursi, meja, kursi@gmail.com]
[kursi, meja, kursi@gmail.com]
[kursi, meja, kursi@gmail.com]
[kursi, meja, kursi@gmail.com]
这是期望的结果(实际表):
[paosp,skajs,paosp@gmail.com]
[fisd,mole,fisd@gmail.com]
[trem,olo,trem@gmail.com]
[kursi,meja,kursi@gmail.com]
似乎selectin
列表会在select
列表中进行自我更新。有没有办法使它不这样做?
答案 0 :(得分:2)
我认为您的while循环应该
while (lihat.next() ) {
selectin = new ArrayList<>();
selectin.add( lihat.getString("user") );
selectin.add( lihat.getString("password") );
selectin.add( lihat.getString("email") );
select.add( selectin );
}
由于已通过引用传递,因此第二次迭代将更新第一个添加的arraylist。这就是为什么所有迭代后输出都相同的原因。
答案 1 :(得分:1)
实际上,您正在替换selectin
变量的相同引用中的值。并且select
变量仅多次包含单个引用selectin
。
为select
中的每个新元素创建一个新的ArrayList,如下所示:
ArrayList<ArrayList<String>> select = new ArrayList<ArrayList<String>>();
ResultSet lihat = st.executeQuery("select * from usersss");
while (lihat.next()){
ArrayList<String> selectin = new ArrayList<String>();
selectin.add(lihat.getString("user"));
selectin.add(lihat.getString("password"));
selectin.add(lihat.getString("email"));
select.add(selectin);
}
for (int i = 0; i<select.size();i++) {
System.out.println(select.get(i));
}
这将在每次while循环运行时创建一个ArrayList的新对象。
您将获得预期的结果。
答案 2 :(得分:1)
set()
类的java.util.ArrayList
方法用于用指定元素替换此列表中指定位置的元素。
布尔值add(Object o)
:此方法用于将特定元素附加到列表的末尾。
您应在循环中将set()
替换为add()
。
while (lihat.next() ) {
selectin = new ArrayList<>();
selectin.add( lihat.getString("user") );
selectin.add( lihat.getString("password") );
selectin.add( lihat.getString("email") );
select.add( selectin );
}