在写JavaWeb时,我在后端通过JDBC读取了数据后逐个使用List.add()方法添加元素并通过request方法传给jsp页面解析,但是添加以后出现了在列表里有n个(假设添加了n个元素)最后一个元素,前面的数据全部丢失,最后排查到问题出现在JDBC读取时,具体代码如下

    @Nullable
public static List<User> getAll(){
List<User> list= new ArrayList<User> ();
Connection conn = getConn();
PreparedStatement ps=null;
ResultSet rs=null;
String sql="select * from library";
try {
ps= (PreparedStatement) conn.prepareStatement(sql);
rs=ps.executeQuery();
User user= new User ();
while(rs.next()){
user.setId(rs.getString("id"));
user.setName(rs.getString("name"));
user.setSex(rs.getString("sex"));
user.setAge(rs.getInt("age"));
user.setTelephone(rs.getString("tel"));
user.setAddress(rs.getString("address"));
list.add(user);
}
for(int i=0; i<list.size(); i++) {
System.out.println ("<tr><td>"+ i +list.get(i).getId()+"</td><td>"+ list.get(i).getName()+"</td><td>"+ list.get(i).getSex()+"</td><td>"+ list.get(i).getAge()+"</td><td>"+ list.get(i).getTelephone()+"</td><td>"+ list.get(i).getAddress()+"</td></tr>");
}
ps.close();
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return list;
}

经过排查最终发现在list.add()部分,考虑到初始化List对象在循环外,List添加的是对象的引用,Test只被new了一次然后不断被赋值,所以最后只能写入最后一个元素,根据我的理解,这一部分应该是编译时候编译器把具体内容放在了实例化全部结束以后以提高运行效率,但是在这里就造成了逻辑性的错误导致最后出现的结果异常(具体原因未知,如果有大佬明白还望不吝赐教),最后将实例化过程放在循环内即可解决问题

    @Nullable
public static List<User> getAll(){
List<User> list= new ArrayList<User> ();
Connection conn = getConn();
PreparedStatement ps=null;
ResultSet rs=null;
String sql="select * from library";
try {
ps= (PreparedStatement) conn.prepareStatement(sql);
rs=ps.executeQuery();
while(rs.next()){
User user= new User ();
user.setId(rs.getString("id"));
user.setName(rs.getString("name"));
user.setSex(rs.getString("sex"));
user.setAge(rs.getInt("age"));
user.setTelephone(rs.getString("tel"));
user.setAddress(rs.getString("address"));
list.add(user);
}
for(int i=0; i<list.size(); i++) {
System.out.println ("<tr><td>"+ i +list.get(i).getId()+"</td><td>"+ list.get(i).getName()+"</td><td>"+ list.get(i).getSex()+"</td><td>"+ list.get(i).getAge()+"</td><td>"+ list.get(i).getTelephone()+"</td><td>"+ list.get(i).getAddress()+"</td></tr>");
}
ps.close();
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return list;
}

Java中使用List的add方法后元素相同问题的更多相关文章

  1. Java中的equals和hashCode方法

    本文转载自:Java中的equals和hashCode方法详解 Java中的equals方法和hashCode方法是Object中的,所以每个对象都是有这两个方法的,有时候我们需要实现特定需求,可能要 ...

  2. Java中的equals和hashCode方法详解

    Java中的equals和hashCode方法详解  转自 https://www.cnblogs.com/crazylqy/category/655181.html 参考:http://blog.c ...

  3. Java中Pattern类的quote方法将任何字符串(包括正则表达式)都转换成字符串常量,不具有任何匹配功能

    Java中Pattern类的quote方法将任何字符串(包括正则表达式)都转换成字符串常量,不具有任何匹配功能. 下面是个例子: import org.junit.Test; import java. ...

  4. 将java中数组转换为ArrayList的方法实例(包括ArrayList转数组)

    方法一:使用Arrays.asList()方法   1 2 String[] asset = {"equity", "stocks", "gold&q ...

  5. Java中Date类型如何向前向后滚动时间,( 附工具类)

    Java中的Date类型向前向后滚动时间(附工具类) 废话不多说,先看工具类: import java.text.SimpleDateFormat; import java.util.Calendar ...

  6. 转:Java中的equals和hashCode方法详解

    转自:Java中的equals和hashCode方法详解 Java中的equals方法和hashCode方法是Object中的,所以每个对象都是有这两个方法的,有时候我们需要实现特定需求,可能要重写这 ...

  7. Java中替换HTML标签的方法代码

    这篇文章主要介绍了Java中替换HTML标签的方法代码,需要的朋友可以参考下 replaceAll("\\&[a-zA-Z]{0,9};", "").r ...

  8. Java 中的浮点数取精度方法

    Java 中的浮点数取精度方法 一.内容 一般在Java代码中取一个double类型的浮点数的精度,四舍五入或者直接舍去等的方式,使用了4种方法,推荐使用第一种,我已经封装成工具类了. 二.代码实现 ...

  9. Java中的栈,堆,方法区和常量池

    要说Java中的栈,堆,方法区和常量池就要提到HotSpot,HotSpot是Sun JDK 和 Open JDK中所带的虚拟机. (Sun JDK 和 Open JDK除了注释不同,代码实现基本上是 ...

  10. Java 中extends与implements使用方法

    Java 中extends与implements使用方法 标签: javaclassinterfacestring语言c 2011-04-14 14:57 33314人阅读 评论(7) 收藏 举报 分 ...

随机推荐

  1. Java实验 继承与接口

     一.实验目的 1.理解 Java 语言的继承和多态特性: 2.掌握变量的隐藏.方法的覆盖.重载: 3.掌握抽象类和接口的使用. 二.实验要求 1.根据实验步骤中提出的要求,使用eclipse等开发工 ...

  2. vue项目浏览器ioc小图标

    1 先有一个需要图片,png .jpg ...格式都可以 2 把图片转换成 .con 格式的图标  ,http://www.bitbug.net/使用比特虫转换 ,目标尺寸:16*16 或者 32*3 ...

  3. md5信息摘要算法实现(python 和 go版本)

    纯手写实现的md5信息摘要算法 github地址如下 https://github.com/kittysmith5/dgst/blob/main/md5 python3版本代码 #!/usr/bin/ ...

  4. Vue声明式渲染、条件与循环、事件绑定、双向绑定及生命周期钩子函数

    VUE基础介绍 Vue 是一套用于构建用户界面的渐进式框架.与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用. -声明式渲染 <div> {{ message }} </ ...

  5. git cherry-pick适用场景详解

    前提条件:有2个分支,分别是master,hotfix,其中master是用于生产环境的发布分支. 场景1:生产环境hotfix. T1时刻,使用master分支发布生产.当时的HEAD的commit ...

  6. js 获取鼠标位置的两种方法

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. python更新pip报错pip._vendor.urllib3.exceptions.ProxySchemeUnknown: Not supported proxy scheme None

    更新pip报错: 看到最后一行很明显是proxy的问题,查看cmd下的代理 将代理删掉重启cmd执行命令就不会报错了

  8. mysql可参考的查询

    获取批量修改列为大写SQL脚本 1 SELECT 2 concat( 'alter table ', TABLE_NAME, ' change column ', COLUMN_NAME, ' ', ...

  9. Vue+SSM+Element-Ui实现前后端分离(2)

    前言:后台使用ssm搭建,对以前学习知识的一个回顾,与此同时来发现自己不足.这里主要采用配置文件方式进行,有部分注解. 目标:搭建ssm框架,并测试成功:(其中也有aop切面的编写) 一.开发工具 I ...

  10. 使用ansible批量推送公钥

    准备两个yml文件 send-pubkey.yml - hosts: all remote_user: root # 连接远程主机的用户,密码就是文件中设置好的 ansible_ssh_pass 的值 ...