`

创建对象在while循环里面和外面的不同效果

阅读更多

1.在while循环的外面
	public List<CollectionBean> list() {
		String sql = "select * from collectiontbl";
		Connection conn = JDBC_Connection.getConnection();
		Statement stmt = null;
		ResultSet rs = null;
		List<CollectionBean> list = new ArrayList<CollectionBean>();
		try {
			stmt = conn.createStatement();
			rs = stmt.executeQuery(sql);
CollectionBean bean = new CollectionBean();

			while (rs.next()) {
				//不能再while外面创建这个对象,这是一个非常有技术含量的问题 
				bean.setId(rs.getInt("id"));
				bean.setName(rs.getString("name"));
				bean.setName(rs.getString("url"));
				list.add(bean);
			}
			for(int i=0;i<list.size();i++){
				System.out.println(list.get(i).getId()+" "+list.get(i).getName());
			}
						return list;
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			JDBC_Connection.free(rs, conn, stmt);
		}
		return null;
	}
运行结果:
1 www.dkfj.com
2 www.dkfj.com
3 www.dkfj.com
4 www.dkfj.com
5 www.dkfj.com
6 www.dkfj.com


原因解释:
我们注意到这个结果显然不是我们想要的,因为创建了一个对象在while循环外面,每循环一次创建的对象都没有变,改变的只是在栈上的值,而添加到list里的对象都指向到还存在的这个对象的栈上。当最后对象消失的时候,list里所有的对象才把栈上的值copy起走,所以打印的结果全部是一样的。所以我们需要把创建对象放在while循环内。
下面是详细的图解:

1.在while循环的里面
	public List<CollectionBean> list() {
		String sql = "select * from collectiontbl";
		Connection conn = JDBC_Connection.getConnection();
		Statement stmt = null;
		ResultSet rs = null;
		List<CollectionBean> list = new ArrayList<CollectionBean>();
		try {
			stmt = conn.createStatement();
			rs = stmt.executeQuery(sql);
			while (rs.next()) {
				//不能再while外面创建这个对象,这是一个非常有技术含量的问题 
				CollectionBean bean = new CollectionBean();
				bean.setId(rs.getInt("id"));
				bean.setName(rs.getString("name"));
				bean.setName(rs.getString("url"));
				list.add(bean);
			}
			for(int i=0;i<list.size();i++){
				System.out.println(list.get(i).getId()+" "+list.get(i).getName());
			}
						return list;
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			JDBC_Connection.free(rs, conn, stmt);
		}
		return null;
	}
运行结果:
1 www.baidu.com
2 www.google.com
3 www.google.com
4 www.javaeye
5 www.javaeye
6 www.dkfj.com

原因解释:
分享到:
评论

相关推荐

    js初级FOR循环 DOm对象 .txt

    主要讲JS初级入门 从不懂到易懂得的过程 其中由for循环 while循环 if else的如何应用知识点 , 字符串的类型 数组创建 对象的概念 DOM对象 以及随机抽人事件 如何获取验证码等简单项目

    Python入门_浅谈for循环、while循环

    Python中有两种循环,分别为:for循环和while循环。 1. for循环 for循环可以用来遍历某一对象(遍历:通俗点说,就是把这个循环中的第一个元素到最后一个元素依次访问一次)。for循环的基本结构如下: 具体看这个...

    c++多线程的创建挂起执行与销毁

    1. 创建一个基于对话框的应用程序。并增加如图所示控件;分别为3个进度条控件关联三个进度条类型的变量;并在对话框的初始化函数中,设定进度条的范围;为编辑框关联一个整型的变量;为12个按钮添加消息处理函数; 2...

    jsp九大内置对象

     Session对象是一个JSP内置对象,它在第一个JSP页面被装载时自动创建,完成会话期管理。从一个客户打开浏览器并连接到服务器开始,到客户关闭浏览器离开这个服务器结束,被称为一个会话。当一个客户访问一个服务器...

    javascript学习手册.zip

    javascript学习手册 JavaScript是一种广泛用于Web开发的编程语言,它可以用于创建动态和...条件语句和循环语句:JavaScript中的条件语句主要有if语句和switch语句,循环语句则包括for循环、while循环和do-while循环。

    java学习笔记-java思维导图流程图表格整理

    Java学习笔记 1 命令行运行 1 Java基础 1 注释 1 单行注释 1 ...创建和初始化对象 34 封装 34 继承 37 super 37 方法重写 39 多态 39 instanceof和类型转换 40 instanceof 40 类型转换 42 static详解

    Java 基础核心总结.md

    Java 基础核心总结 - Java 基础核心总结 - Java 概述 - 什么是 Java? - Java 的特点 - Java 开发环境 - JDK - JRE ... - 对象的创建 - 属性和方法 - 构造方法 - 方法重载 - 方法的重写 -

    JavaScript语言教程及案例.docx

    - while循环在满足条件的情况下重复执行一组语句。 #### 3. 函数: - JavaScript允许用户创建自定义函数,以便在多个地方重复使用。 - 函数可以接受参数,并返回结果。 - JavaScript中的函数也可以作为对象的方法...

    Java机战游戏

    使用for、while和do—while循环进行输出 跳转语句break的使用 4、使用数组和集合存储数据信息 5、使用Java的异常处理机制处理异常 使用try/catch/finally处理异常 使用异常类输出异常信息 开发工具:Eclipse

    使用Java的网络编程实现一个简单的文件传输系统.txt

    在一个while循环中,不断从客户端读取数据并写入到文件中,直到读取完毕。最后关闭客户端的Socket连接。 整个程序通过这些方法来实现文件传输功能,并将文件保存到指定路径下。可以通过修改FILE_PATH常量来指定不同...

    虚拟仪器技术与labview教程

    3.2.2 数组控制对象、常数对象和显示对象 3.2.3 自动索引 3.3 数组功能函数 3.4 什么是多态化(Polymorphism)? 3.5 簇 3.5.1 创建簇控制和显示 3.5.2 使用簇与子VI传递数据 ...

    java报告.wps

    使用while循环语句计算1~100之间能被3和7同时整除的整数之和;使用for循环计算8+88+888+8888+...;计算1-1/3+1/5-1/7+1/9-1/11...的前10000项的和;编写一个类,该类创建的对象可以计算等差数列的和;编写两个类;A...

    C#入门——面向对象等,代码+注释

    第4天 01异常捕获 02练习 02异常捕获 03switch-case 04while循环 06练习 07while练习与do--while 08for 循环 12continue 09乘法口诀练习 10类型转换和方法转换 11tryparse练习 13三元表达式 第5天 00随机数 05数组 ...

    Scala快速从入门到神坑

    4.2 while循环 4.3 for循环 4.3.1 实例 4.3.2 for推导式 五、 数据结构 5.1 数组 5.2 列表(List) 5.3 元组(Tuple) 5.4 集(Set) 5.5 映射(Map) 5.6 迭代器(Iterator) 六、类(Class) 6.1 简单的类 6.2 给类增加字段和...

    零起点学通C++多媒体范例教学代码

    8.4.2 在堆中创建对象 8.4.3 在堆中删除对象 8.4.4 访问堆中的数据成员 8.4..5 在构造函数中开辟内存空间 8.4.6 对象在栈与堆中的不同 8.5 this指针 8.6 指针的常见错误 8.7 指针运算 8.7.1 指针的加减运算 8.7.2 ...

    Java建模:UML工作簿,第2部分――序列图中的条件逻辑

    内容序列图的两种类型序列图绘制中的条件逻辑绘制for循环图绘制while循环图结束语参考资料简介: Granville继续讨论“统一建模语言”和序列图的绘制。他仔细研究了序列图绘制过程中条件逻辑的角色,并讨论了为什么...

    JavaScript:DOM编程艺术(第2版)

    本书将这些概念贯穿在书中的所有代码示例中,以便呈现用来创建图片库页面的脚本、用来创建动画效果的脚本和用来丰富页面元素呈现效果的脚本,最后结合所讲述的内容创建了一个实际的网站。 《javascript dom编程艺术...

    零起点学通C++学习_多媒体范例教学代码

    8.4.2 在堆中创建对象 8.4.3 在堆中删除对象 8.4.4 访问堆中的数据成员 8.4..5 在构造函数中开辟内存空间 8.4.6 对象在栈与堆中的不同 8.5 this指针 8.6 指针的常见错误 8.7 指针运算 8.7.1 指针的加减运算 ...

    VS2010编写的C++代码调用OPENCV处理视频帧数据检测出移动物体

    VS2010编写的C++代码调用OPENCV处理视频帧数据检测出移动物体 ... while(1){//这个死循环模式只是用来不断读取单个图片而已,如果是读取摄像头并不需要这个死循环,因为读取摄像头图片能不断进行 

Global site tag (gtag.js) - Google Analytics