在写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. 项目实训 DAY17-18

    第一天,与后端的同学交接,先跟他说了怎么安装依赖库,弄完后他那边运行有些问题. 第二天,后端的同学说可以运行但无法部署,我思考后一起商量着只做静态模型(本身不同的两张图片只有input有区别),然后添 ...

  2. 使用commitizen规范提交

    npm install -g commitizen cz-conventional-changelog echo '{ "path": "cz-conventional- ...

  3. springmvc接口访问流程排查

    首先找到webapp下面的web.xml文件: 检查前端控制器: 并注意contextConfigLocation配置的springmvc的配置文件路径: 接着找到springmvc配置文件路径,如果 ...

  4. C++解决海盗分金问题

    #include <iostream> #include <unordered_map> #include <map> // 假定:每个海盗都是一样的聪明,没有谁比 ...

  5. Crypto入门 (十一)easychallenge

    前言: 这题跟python有关,可见看懂python代码还是很有必要得,需要有一些python基础才好 easychallenge: 题目: 下载后来发现是一个.pyc为后缀得文件,查找资料可知,该文 ...

  6. 【git报错】hint: Updates were rejected because the tip of your current branch is behind

    有时候作为非master权限的项目参与者 在push的时候会遇到这样的报错: hint: Updates were rejected because the tip of your current b ...

  7. [Leetcode 104]二叉树最大深度Maximum Depth of Binary Tree

    题目 求二叉树的深度,即根节点出发的最长路径上点的个数,即最长路径+1(本身这个点 https://leetcode.com/problems/maximum-depth-of-binary-tree ...

  8. linux-minicom

    q:只能发送不能接收 a:串口设置,硬件流控制=>NO

  9. NodeJS - XSS-href

    参考:https://owasp-skf.gitbook.io/asvs-write-ups/cross-site-scripting-href-xss-href/kbid-3-xss-url 输入h ...

  10. SQLServer数据库执行时间

    with kk AS( SELECT TOP 2000 total_worker_time/1000 AS [总消耗CPU 时间(ms)],execution_count [运行次数], qs.tot ...