-
Java集合不能存放基本数据类型,只存放对象的引用
2017-05-06 13:52:15Java集合不能存放基本数据类型Java集合如Map、Set、List等所有集合只能存放引用类型数据,它们都是存放引用类型数据的容器,不能存放如int、long、float、double等基础类型的数据。1. 集合存储对象Java集合中实际...Java集合如Map、Set、List等所有集合只能存放引用类型数据,它们都是存放引用类型数据的容器,不能存放如int、long、float、double等基础类型的数据。
1. 集合存储对象
Java集合中实际存放的只是对象的引用,每个集合元素都是一个引用变量,实际内容都放在堆内存或者方法区里面,但是基本数据类型是在栈内存上分配空间的,栈上的数据随时就会被收回的。
2. 基本类型数据如何解决呢?
可以通过包装类把基本类型转为对象类型,存放引用就可以解决这个问题。更方便的,由于有了自动拆箱和装箱功能,基本数据类型和其对应对象(包装类)之间的转换变得很方便,想把基本数据类型存入集合中,直接存就可以了,系统会自动将其装箱成封装类,然后加入到集合当中。
示例代码:
int i = 10;
Integer in = new Integer(i);//手动将i包装为Integer类型对象
HashSet set = new HashSet();//定义一个Set集合
set.add(in);//将包装类对象加入该集合
System.out.println(set);//打印结果
同样的效果(自动包装):
int i = 10;
HashSet set = new HashSet();
set.add(i);//系统会自动将i装箱为Integer类型的对象然后再存入set集合中
System.out.println(set); -
java中对象,变量,方法,变量的数据和对象的引用的存放位置
2018-10-11 10:13:32java中,对象,还有所有的new出来的对象都是存放在堆里。 方法存放在方法体中。 基本类型的变量的数据和对象的引用存放在栈中 ...java中,对象,还有所有的new出来的对象都是存放在堆里。
方法存放在方法体中。
基本类型的变量的数据和对象的引用存放在栈中
-
添加一个对象到集合中时,集合里面存放的是对象的引用
2017-03-13 14:48:51当批量处理一些数据的时候,经常会将生成的对象放入集合中,这时候很容易犯一个错误,就是将已经放入集合中的对象修改部分属性后,又重新放入这个集合,表面上看是将一个新的对象放入集合中,实际上原来集合中的对象...当批量处理一些数据的时候,经常会将生成的对象放入集合中,这时候很容易犯一个错误,就是将已经放入集合中的对象修改部分属性后,又重新放入这个集合,表面上看是将一个新的对象放入集合中,实际上原来集合中的对象的属性已经被修改了。因为集合中存放的是对象的引用,改变原来对象的属性,那么从集合中得到的对象属性也就变了。下面一个示例就是这个问题
monitorCompanyRiskGradeTrend = new MonitorCompanyRiskGradeTrend(); monitorCompanyRiskGradeTrend.setId(UUIDUtils.getUUID()); monitorCompanyRiskGradeTrend.setAccountId(accountId); monitorCompanyRiskGradeTrend.setCompanyName(monitorCompanyRisk.getCompanyName()); monitorCompanyRiskGradeTrend.setRiskGrade(monitorCompanyRisk.getRiskGrade()); monitorCompanyRiskGradeTrend.setCycle("1"); monitorCompanyRiskGradeTrend.setReportDate(calTrend.getTime()); monitorCompanyRiskGradeTrend.setCreateTime(calTrend.getTime()); monitorCompanyRiskGradeTrendList.add(monitorCompanyRiskGradeTrend); if(1 == calTrend.get(Calendar.DAY_OF_MONTH)){ monitorCompanyRiskGradeTrend.setId(UUIDUtils.getUUID()); monitorCompanyRiskGradeTrend.setCycle("3"); monitorCompanyRiskGradeTrendList.add(monitorCompanyRiskGradeTrend); } if(2 == calTrend.get(Calendar.DAY_OF_WEEK)){ monitorCompanyRiskGradeTrend.setId(UUIDUtils.getUUID()); monitorCompanyRiskGradeTrend.setCycle("2"); monitorCompanyRiskGradeTrendList.add(monitorCompanyRiskGradeTrend); }
从表面上看没有逻辑问题,因为数据库中id是主键,那么重新生成主键再存入是没问题的,但是在保存数据的时候就报有重复主键,关键就是因为集合中存储的是对象的引用,重复将同一个对象的引用添加到集合中,保存数据的时候就出现了重复项了。
通过以下代码我们可以清晰的理解这个问题
import java.util.ArrayList; import java.util.List; public class Test5 { public static void main(String args[]){ List<User> userList1 = new ArrayList<User>(); List<User> userList2 = new ArrayList<User>(); User user1 = new User(); userList1.add(user1); userList2.add(user1); System.out.println("SET VALUE FOR USERLIST2:"); for(User user: userList2){ user.setName("name"); user.setPassword("password"); } System.out.println("PRINT VALUE FOR USERLIST1:"); for(User user: userList1){ System.out.println(user.getName()); System.out.println(user.getPassword()); } } public static class User{ private String name; private String password; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } } }
-
【监听器篇】2.监听request、session、ServletContext 对象存放的数据变化情况
2018-05-15 10:46:32存放数据指的是这三个对象在工程中setAttribute(),removeAttribute()的时候,我们的监听器就会知道,然后在对应的方法中执行相应的操作。 以下是定义这三个对象需要实现的接口: 监听器的接口----监听对象...1.工程说明
在前一阶段介绍了监听器监听我们这三个对象创建和销毁的监听事件,现在我们要监听这三个对象存放属性的时候的一个监听事件。
存放数据指的是这三个对象在工程中setAttribute(),removeAttribute()的时候,我们的监听器就会知道,然后在对应的方法中执行相应的操作。
以下是定义这三个对象需要实现的接口:
监听器的接口----监听对象
ServletContextAttributeListener----ServletContext对象中的属性的变化情况
HttpSessionAttributeListener----session对象中的属性的变化情况
ServletRequestAttributeListener----request对象中的属性的变化情况实现以上监听器需要重写的方法都一样:添加 、删除 、 修改的方法名称全部一致
当我们在代码中添加,删除,修改属性的时候,监听器都会收到信息,然后执行相应的代码。
这三个对象需要实现的方法都一样,行为也差不多,所以在此演示session对象添加,删除,替换属性时,我们监听器所做的操作。
基本步骤:
1.定义一个实现HttpSessionAttributeListener的监听器
2.采用注解的方式注册监听器
3.在实现的三个方法内向控制台打印相应的信息4.在jsp中写一段代码:在session对象中添加,修改,替换属性
2.定义监听器MyHttpSessionAttributeListener
package listener; import javax.servlet.annotation.WebListener; import javax.servlet.http.HttpSessionAttributeListener; import javax.servlet.http.HttpSessionBindingEvent; /* * 2018.5.15 * @author Dragon * 监听session属性变化的监听器 */ @WebListener public class MyHttpSessionAttributeListener implements HttpSessionAttributeListener { @Override public void attributeAdded(HttpSessionBindingEvent arg0) { System.err.println("MyHttpSessionAttributeListener----------attributeAdded"); } @Override public void attributeRemoved(HttpSessionBindingEvent arg0) { System.err.println("MyHttpSessionAttributeListener----------attributeRemoved"); } @Override public void attributeReplaced(HttpSessionBindingEvent arg0) { System.err.println("MyHttpSessionAttributeListener----------attributeReplaced"); } }
在上面的代码中,我们在相应的方法中打印了相应的信息。同时采用注解的方式对我们的监听器进行了注册。
3.给session对象存放数据
<%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <% //添加数据 session.setAttribute("test", "Dragon"); //替换数据 session.setAttribute("test", "long"); //删除数据 session.removeAttribute("test"); %>
4.部署工程并运行
运行结果:
MyHttpSessionAttributeListener----------attributeAdded
MyHttpSessionAttributeListener----------attributeReplacedMyHttpSessionAttributeListener----------attributeRemoved
ok了,从上面可以发现当我们session对属性执行相应的操作的时候,监听器会知道并向控制台打印相应的信息。同理,监听这两个对象request,ServletContext需要执行的操作也一样,不一样的是实现的接口不一样。
5.下一阶段的学习
到目前为止,学习了两类监听器,分别是监听对象创建和销毁的监听器和监听对象存放数据的监听器,接下来要学习的是:监听session中保存的javabean状态的监听器。
加油~继续前行!
-
Java中list存放的是值还是对象的引用问题
2016-04-21 01:45:39java的集合中存放的类型 (1)如果是基本数据类型,则是value (2) 如果是复合数据类型,则是引用的地址;String b="a"; lists.add(b); b="bbb";最后输出还是a, 原因是存放的不是b,而是b第一次指向的地址... -
JAVA进阶 面向对象程序设计——第3周 对象容器(数据存放)
2016-09-11 21:35:14第3周 对象容器 3.1 顺序容器 3.2 对象数组 3.3 集合容器(Set) 3.4 散列表(Hash) 容器是现代程序设计非常基础而重要...一般意义上的容器,是指具有自动增长容量能力的存放数据的一种数据结构。 在面向对象语言 -
在既有类中使用关联对象存放自定义数据
2016-07-19 11:33:18**在既有类中使用关联对象存放自定义数据** 有时需要在对象中存放相关信息。这时我们通常会从对象所属的类中继承一个子类,然后改用这个子类对象。然而并非所有情况下都能这么做,有时候类的实例可能是由某种机制... -
【详解】JAVA集合只能存放引用类型的的数据,不能存放基本数据类型
2020-07-19 17:20:09Java中的map、list、set、map之类的集合容器中只能存放...但是,现在基本数据类型都有了其对应的封装的对象,而且有了自动拆箱和装箱功能,基本数据类型和其对应对象之间的转换变得很方便,想把基本数据类型存入集合 -
从存放数据的类型的角度浅谈堆和栈的区别
2019-07-19 20:51:58栈中一般用来存放基本数据类型和引用的地址。 堆中一般用来存放对象的属性内容。 如: int i = 1; 这里的i是一个基本数据类型。i的值被存放在栈中。 再如: 定义了一个Person类,该类中有两个属性:int age、... -
数据存放的位置
2016-09-26 12:40:57堆:new(对象) 栈:局部变量 数据段:类变量、常量 ...c变量指向堆中的字符串对象,但是产生堆中的字符串对象之前,会先在常量区中,产生字符串常量对象。然后以常量对象为模板,拷入堆中的字符串对象。 -
List去重根据对象某个属性或者对象(比如:存放的是String)
2018-12-28 00:22:06非自定义对象 ...方式一,利用HashSet不能添加重复数据的特性 由于HashSet不能保证添加顺序,所以只能作为判断条件: private static void removeDuplicate(List<String> list) { HashSet<St... -
Java中的引用类型的对象存放在哪里
2020-06-19 12:04:22根据上下文来确定。 根据上下文来确定。 根据上下文来确定。 比如 void func() ...对于方法中的局部变量的引用时存放在java运行时数据区的栈中,对于实例变量则是存放在java运行时数据区的堆中。 ... -
存放对象、对象指针、对象智能指针,哪个更好?
2010-03-11 18:39:00在编写程序的过程当中,经常会涉及数据存储的...下面就以存放对象、对象指针、对象智能指针这三种策略,来进行一个实验,并得出它们的优势与劣势的比较。(代码测试环境为我可怜的本本……>_ )实验代码: #include #in -
C++对象在内存中的存放方式
2017-03-10 22:19:53对象占有一定的内存,该内存上存放的是该对象的相关数据,按先后顺序如下: 1、虚表指针:如果该类有虚函数的话,将存放虚表指针,该指针指向该类的虚函数表,即指向表中的第一个元素。续表中存放的是该类虚函数的... -
blob 和clob类型中存放的是数据本身还是数据地址指针
2020-03-27 18:37:481、先插入其它字段,BLOB字段初始化的时候,先初始化一个EMPTY_BLOB(),相当于一个BLOB对象的空壳,内部啥也没有,但是是一个对象。 2、SELECT <BLOB字段> FROM <表名称> WHERE <关键字>=<插入... -
java中的引用类型的对象存放在哪里
2018-03-03 19:20:00根据上下文来确定。比如voidfunc(){Objectobj=newObject();//这个obj在函数的栈里。...对于方法中的局部变量的引用时存放在java运行时数据区的栈中,对于实例变量则是存放在java运行时数据区的堆中。... -
问题表现情况如下: emlog缓存的保存方式是将php的数据对象(数组)序列化(serialize)后以文件的形式存放,
2014-10-05 14:09:00emlog缓存的保存方式是将php的数据对象(数组)序列化(serialize)后以文件的形式存放,读取缓存的时候直接反序列化(unserialize)缓存字符串即可读取数据,关于序列化和反序列化的原理请看我先前的文章《php函数... -
Redis存放对象的两种方式
2020-05-19 21:21:12存储的value用户对象包括姓名,年龄,生日等等 如果用普通的key-value结构来存储,主要有以下2种方式存储 方式一(list,set) 这种方式是使用list或者set这些来存储的,这样的方式其实也可以达到我们想要的效果,... -
JAVA集合只能存放引用类型的的数据,不能存放基本数据类型。
2016-09-06 17:42:50首先,集合的存在就是为了方便...但是,现在基本数据类型都有了其对应的封装的对象,而且有了自动拆箱和装箱功能,基本数据类型和其对应对象之间的转换变得很方便,想把基本数据类型存入集合中,直接存就可以了,系统会 -
HashMap中循环存放List集合 取出时 所有数据都是相同的
2018-12-27 00:26:33第一种datalist存放的是通一个map对象,在堆内存中map指向的是同一个地址,这种情况下就会发生数据的重复或者说是覆盖;第二种中我们将map放进了循环里面,这样在每次循环的时候都会重新再实例化一个map对象,使map... -
DataAdapter对象保存数据集中的数据
2010-11-21 23:38:00数据集中修改后的数据,如果长期保存,就必须存放到数据库中,这就需要使用DataAdapter对象的Update()方法。 事实上数据适配器是通过Command对象来操作数据库和数据集的。当调用Fill()方法时,系统会通过... -
iOS Foundation框架 利用NSNumber和NSValue将非OC对象类型数据存放到集合
2014-06-24 11:26:301.Foundation框架中提供了很多的集合类如:NSArray,NSMutableArray,NSSet,NSMutableSet,NSDictionary,NSMutableDictionary但是这些类只能存放OC对象类型的数据 2.如果要存放基本数据类型,必须先将... -
Java中各种数据存放的位置
2019-04-18 11:12:51栈:栈存放的是:基本类型的对象和类的引用变量。每个线程都有一个栈,栈内容私有,每个栈都有三个部分:基本类型变量区,执行环境上下文,操作指令区。栈的声明和持有该栈的线程一样长 堆:对象和数据都存放在... -
java读取xml,将读到的数据存放到对象中,再按照一定条件写入xml,从而生成动态菜单
2016-09-01 09:03:34我的想法是把读到的xml文件的内容封装到java的对象中,返回值是一个集合类型,然后我就不知道怎么做了。 图片是展示效果:  ``` ... -
将一个序列化的对象存放到数据库的方法
2016-01-26 09:49:04将序列化的对象转成字节数据,将字节数据存放到数据库; 从数据库取出来是以getBlod的方法得到字节数据 public class TypeChangeTool { private static final String TAG = TypeChangeTool.class.getSimpleName()... -
关于数据区中存放的东西
2017-08-14 09:57:152.堆(Heap) 存放对象实例,几乎所有对象实例都在这里分配内存 3.虚拟机栈(VM Stack) 描述的是Java方法执行的内存模型:每个方法在执行的同时会创建一个Stack Frame(方法运行时的基础数据结构)用于存储 -
Objective-C id为什么可以存放任意类型的对象?
2015-05-23 21:22:42id类型是一个独特的数据类型,可以转换为任何数据类型,即id类型的变量可以存放任何数据类型的对象。这是为什么呢?还是从OC的内部实现机制上来分析吧! 在内部处理上,id类型被定义为指向对象的指针 -
数据挖掘:数据(数据对象与属性类型)
2019-10-06 10:27:05数据对象以数据元组的形式存放在数据库中,数据库的行对应于数据对象,列对应于属性。 属性是一个数据字段,表示数据对象的特征,在文献中,属性、维度(dimension)、特征(feature)、变量(variance)可...
-
用研转岗规划——案例2则
-
LVS + Keepalived 实现 MySQL 负载均衡与高可用
-
docker菜鸟学习笔记之ubuntu容器中安装python3和卸载python2
-
MySQL 函数、用户自定义函数
-
linux连接wifi
-
电信用户流失预测
-
linux系统下文件夹没有权限
-
Appscan_STD_10.0.4_Patch.zip
-
电池管理系统通信协议.docx
-
2014年重庆理工大学《信息管理学》两套期末考试试卷.pdf
-
HW解决方案业务拓展指引.pptx
-
IEXPath.zip
-
SpringBoot 2.3.x整合Swagger3.x接口文档+Knife4jUI
-
GDPR专题文档.zip
-
基于小波技术进行图像融合.zip
-
libFuzzer视频教程
-
2014年重庆理工大学《算法分析与设计》三套期末考试试卷.pdf
-
LeetCode.304 二维区域和检索 - 矩阵不可变
-
MySQL 设计基础(数据库概论、初探)
-
【毕业答辩】学位论文答辩ppt指南!