List.add添加不同数据结果却是最后一条记录的重复的两种原因

本文探讨了在JSP程序中使用List循环添加数据时遇到的问题,主要原因是未重新创建泛型对象及定义的泛型为静态。通过调整代码结构,如在循环内创建新的对象实例和修改变量属性,解决了数据重复和静态变量导致的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天写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一个对象是无用的。所以我们把静态变量改为私有的就可以解决问题。

第一次写用词可能不太专业,也可能存在错误,所以大神勿喷。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值