在写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. html 手机端适配不同手机高度 ,把内容居中显示

    手机端适配不同手机高度 ,把内容居中显示,可以将div.img.section.span.p等等元素,设置 top:50%; margin-top:xxvw; 这样可以保证主题内容居中显示.

  2. Vue3 流程图组件库 Vue Flow 简单使用

    官网 Vue Flow 官网 Vue Flow GitHub 安装 npm i --save @vue-flow/core yarn add @vue-flow/core pnpm i @vue-fl ...

  3. HidController控件下载安装

    用Delphi 或 C++ 开发 USB 接口时要用到的 HidController控件,如果你找不到去哪下载参考这里. 下载地址:https://sourceforge.net/projects/j ...

  4. opened by another process write access was denied sourceinsight

    Ubuntu 16.04 安装Samba 和 windows 安装Source Insight weixin_43764544 2021-01-07 15:23:03 23 收藏 文章标签: linu ...

  5. centos7 系统运行中做raid磁盘阵列

    插入磁盘 lsblk查看磁盘总体情况 对sdb1等需要做的硬盘进行制作 fdisk /dev/sdb 开始 n 创建 p 给资源回车 重选代码 t 确认磁盘阵列代码 fd 保存w 首先安装工具 mda ...

  6. 学习dom,bom中全选按钮设置

     <script>             var cbAll = document.getElementById('j_cbAll') //全选按钮             var jt ...

  7. HarmonyOS_Text_Image

    Text组件 ohos:属性 id="$+id:text_helloworld" #在程序中控制,需要id="$+id:name",转回MainAbilityS ...

  8. Crypto入门 (十二)转轮机加密

    前言: 杰弗逊转轮加密,可以自己手动排列完成但是繁琐而且容易弄错,还是建议使用编程,我在手动弄得时候就是复制粘贴少了一个字母,弄了很久才发现,如果编程得话,就不会这样拉 转轮机加密: 题目如下: 1: ...

  9. IT工具知识-14:如何通过adb操作安卓剪切板?

    1.安装apk 下载地址 2.运行服务(每次重启系统都需要运行一次) adb shell am startservice ca.zgrs.clipper/.ClipboardService 3.设置剪 ...

  10. 『教程』mariadb的主从复制

    一.MariaDB简介 MariaDB数据库的主从复制方案,是其自带的功能,并且主从复制并不是复制磁盘上的数据库文件,而是通过binlog日志复制到需要同步的从服务器上. MariaDB数据库支持单向 ...