Java中使用List的add方法后元素相同问题
在写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方法后元素相同问题的更多相关文章
- Java中的equals和hashCode方法
本文转载自:Java中的equals和hashCode方法详解 Java中的equals方法和hashCode方法是Object中的,所以每个对象都是有这两个方法的,有时候我们需要实现特定需求,可能要 ...
- Java中的equals和hashCode方法详解
Java中的equals和hashCode方法详解 转自 https://www.cnblogs.com/crazylqy/category/655181.html 参考:http://blog.c ...
- Java中Pattern类的quote方法将任何字符串(包括正则表达式)都转换成字符串常量,不具有任何匹配功能
Java中Pattern类的quote方法将任何字符串(包括正则表达式)都转换成字符串常量,不具有任何匹配功能. 下面是个例子: import org.junit.Test; import java. ...
- 将java中数组转换为ArrayList的方法实例(包括ArrayList转数组)
方法一:使用Arrays.asList()方法 1 2 String[] asset = {"equity", "stocks", "gold&q ...
- Java中Date类型如何向前向后滚动时间,( 附工具类)
Java中的Date类型向前向后滚动时间(附工具类) 废话不多说,先看工具类: import java.text.SimpleDateFormat; import java.util.Calendar ...
- 转:Java中的equals和hashCode方法详解
转自:Java中的equals和hashCode方法详解 Java中的equals方法和hashCode方法是Object中的,所以每个对象都是有这两个方法的,有时候我们需要实现特定需求,可能要重写这 ...
- Java中替换HTML标签的方法代码
这篇文章主要介绍了Java中替换HTML标签的方法代码,需要的朋友可以参考下 replaceAll("\\&[a-zA-Z]{0,9};", "").r ...
- Java 中的浮点数取精度方法
Java 中的浮点数取精度方法 一.内容 一般在Java代码中取一个double类型的浮点数的精度,四舍五入或者直接舍去等的方式,使用了4种方法,推荐使用第一种,我已经封装成工具类了. 二.代码实现 ...
- Java中的栈,堆,方法区和常量池
要说Java中的栈,堆,方法区和常量池就要提到HotSpot,HotSpot是Sun JDK 和 Open JDK中所带的虚拟机. (Sun JDK 和 Open JDK除了注释不同,代码实现基本上是 ...
- Java 中extends与implements使用方法
Java 中extends与implements使用方法 标签: javaclassinterfacestring语言c 2011-04-14 14:57 33314人阅读 评论(7) 收藏 举报 分 ...
随机推荐
- 手机 termux 开启ssh 并连接
第一步 :下载 termux https://f-droid.org/packages/com.termux/ 第二步 :安装 termux 打开后安装 pkg install openssh ...
- spring boot2.3.0集成 thymelaf
配置pom 如果是2.x的直接配置一个starter即可 <!-- ThymeLeaf 依赖 --><dependency> <groupId>org.spri ...
- 4组-Alpha冲刺-5/6
一.基本情况 队名:摸鲨鱼小队 组长博客:https://www.cnblogs.com/smallgrape/p/15563236.html 小组人数:8人 二.冲刺概况汇报 组长:许雅萍 过去两天 ...
- 异常(Java)
异常 基本介绍 什么是异常? 在实际工作中,遇到的情况不可能是非常完美.比如:你写的某个模块,用户输入不一定符合你的要求.你的程序要打开某个文件,这个文件可能不存在或者文件格式不对 软件程序在运行过程 ...
- JS笔记(四):面向对象、异常处理
镇楼图 Pixiv:torino 六.JS中的面向对象 类(class) 博主视为你已拥有相关基础,这里不再赘述相关概念 类的语法如下,class在本质上是function,可以说class只是针对构 ...
- [整理]String用法/转换substring
substring(a)从a开始 substring(a,b) [a,b] s=123456789 s.substring(3):456789 s.substring(0,3):1234
- ARM体系与架构【一】
由于笔试题(摩尔线程笔试题)也出现了相关的题目,所以也顺便为此做一点点小准备. 1.ARM用什么类型的指令集 ARM架构用的是RISC精简指令集. 2.RISV与RISC指令集有什么区别 3.ARM架 ...
- 新的世界,我们推荐不劳而获 -> 持续更新中
随着技术带来的生产力爆发越来越猛烈,有人提出是不是有必要保留一些落后的生产工艺及相关岗位,以避免社会动荡. 我的答案:不用.但是要改变社会对于不劳而获的态度:我们对于生活资料的不劳而获持接受的态度,但 ...
- APK 跳转其他APK
+import android.content.ComponentName;^M /* @@ -343,6 +346,15 @@ public class MainActivity extends A ...
- C#软件增加混淆防止反编译
使用Visual Studio新建一个名为"test"的命令行项目输入如图所示的代码并生成项目,这个项目很简单,就是程序启动时,调用"GetGUID"函数返回一 ...