今天写jsp程序遇到这个问题找了好久才解决这个问题,所以写这篇文章来当做笔记。
原因一:list再循环添加数据是没有重新创建泛型对象
User.java
public class User{
private static String xh;
private static String xm;
private static String pwd;
public static String getXh() {
return xh;
}
public static void setXh(String xh) {
this.xh = xh;
}
public static String getXm() {
return xm;
}
public static void setXm(String xm) {
this.xm = xm;
}
public static String getPwd() {
return pwd;
}
public static void setPwd(String pwd) {
this.pwd = pwd;
}
}
ListTest.java
public class ListTest { public static void main(String[] arg0){
List<User> userList=new ArrayList<User>();
User user=new User(); //改动的是这条代码
for(int i=0;i<10;i++){
user.setXh(i+" ");
user.setXm(i+1+"");
user.setPwd(i+2+"");
userList.add(user);
}
System.out.println(userList.size());
for(int i=0;i<10;i++){
System.out.println(userList.get(i).getUserName());
}
}}
修改后
public class ListTest { public static void main(String[] arg0){
List<User> userList=new ArrayList<User>();
for(int i=0;i<10;i++){
User user=new User();
user.setXh(i+" ");
user.setXm(i+1+"");
user.setPwd(i+2+"");
userList.add(user);
}
System.out.println(userList.size());
for(int i=0;i<10;i++){
System.out.println(userList.get(i).getUserName());
}
}}
原因:修改前的代码list中的所有数据将会是最后录入的一条数据,因为加入的是它的引用的地址,通俗一点讲就是每次我们添加进list的是user对象的引用地址。我们每次循环由于没有修改user的引用地址,相当我们把同一个user添加了10次。修改后使用User user=new User等于再创建不同的user引用地址。举个例子:user是一个工厂,user中的数据是该工厂的产品,list存储的是该工厂的地址。程序按照list中存储的工厂地址取货。这样就容易理解了。
第二种原因:定义的泛型是静态的
public class User{
private static String xh;
private static String xm;
private static String pwd;
public static String getXh() {
return xh;
}
public static void setXh(String xh) {
this.xh = xh;
}
public static String getXm() {
return xm;
}
public static void setXm(String xm) {
this.xm = xm;
}
public static String getPwd() {
return pwd;
}
public static void setPwd(String pwd) {
this.pwd = pwd;
}
}
public class ListTest { public static void main(String[] arg0){
List<User> userList=new ArrayList<User>();
for(int i=0;i<10;i++){
User user=new User();
user.setXh(i+" ");
user.setXm(i+1+"");
user.setPwd(i+2+"");
userList.add(user);
}
System.out.println(userList.size());
for(int i=0;i<10;i++){
System.out.println(userList.get(i).getUserName());
}
}}
原因:请对照第一User.java可以看出处区别是私有变量,一个是静态变量在静态变量中对象的引用地址是固定的。这时new一个对象是无用的。所以我们把静态变量改为私有的就可以解决问题。
第一次写用词可能不太专业,也可能存在错误,所以大神勿喷。