精华内容
下载资源
问答
  • Java集合不能存放基本数据类型,只存放对象的引用

    万次阅读 多人点赞 2017-05-06 13:52:15
    Java集合不能存放基本数据类型Java集合如Map、Set、List等所有集合只能存放引用类型数据,它们都是存放引用类型数据的容器,不能存放如int、long、float、double等基础类型的数据。1. 集合存储对象Java集合中实际...

    Java集合如Map、Set、List等所有集合只能存放引用类型数据,它们都是存放引用类型数据的容器,不能存放如int、long、float、double等基础类型的数据。

    1. 集合存储对象

    Java集合中实际存放的只是对象的引用,每个集合元素都是一个引用变量,实际内容都放在堆内存或者方法区里面,但是基本数据类型是在栈内存上分配空间的,栈上的数据随时就会被收回的。

    2. 基本类型数据如何解决呢?

    可以通过包装类把基本类型转为对象类型,存放引用就可以解决这个问题。更方便的,由于有了自动拆箱和装箱功能,基本数据类型和其对应对象(包装类)之间的转换变得很方便,想把基本数据类型存入集合中,直接存就可以了,系统会自动将其装箱成封装类,然后加入到集合当中。

    Java的包装类与基础数据类型的对应表:
    示例代码:
    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中,对象,还有所有的new出来的对象都是存放在堆里。  方法存放在方法体中。  基本类型的变量的数据和对象的引用存放在栈中  ...

    java中,对象,还有所有的new出来的对象都是存放在堆里。

                 方法存放在方法体中。

                 基本类型的变量的数据和对象的引用存放在栈中

     

    展开全文
  • 当批量处理一些数据的时候,经常会将生成的对象放入集合中,这时候很容易犯一个错误,就是将已经放入集合中的对象修改部分属性后,又重新放入这个集合,表面上看是将一个新的对象放入集合中,实际上原来集合中的对象...

    当批量处理一些数据的时候,经常会将生成的对象放入集合中,这时候很容易犯一个错误,就是将已经放入集合中的对象修改部分属性后,又重新放入这个集合,表面上看是将一个新的对象放入集合中,实际上原来集合中的对象的属性已经被修改了。因为集合中存放的是对象的引用,改变原来对象的属性,那么从集合中得到的对象属性也就变了。下面一个示例就是这个问题

    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;
            }
        }
    }
    
    展开全文
  •  存放数据是这三个对象在工程中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----------attributeReplaced

    MyHttpSessionAttributeListener----------attributeRemoved

    ok了,从上面可以发现当我们session对属性执行相应的操作的时候,监听器会知道并向控制台打印相应的信息。同理,监听这两个对象request,ServletContext需要执行的操作也一样,不一样的是实现的接口不一样。

    5.下一阶段的学习

      到目前为止,学习了两类监听器,分别是监听对象创建和销毁的监听器和监听对象存放数据的监听器,接下来要学习的是:监听session中保存的javabean状态的监听器。

      加油~继续前行!

    展开全文
  • java集合中存放的类型  (1)如果是基本数据类型,则是value  (2) 如果是复合数据类型,则是引用地址;String b="a"; lists.add(b); b="bbb";最后输出还是a, 原因是存放的不是b,而是b第一次指向地址...
  • 第3周 对象容器 3.1 顺序容器 3.2 对象数组 3.3 集合容器(Set) 3.4 散列表(Hash) 容器是现代程序设计非常基础而重要...一般意义上的容器,是指具有自动增长容量能力的存放数据的一种数据结构。 在面向对象语言
  • **在既有类中使用关联对象存放自定义数据** 有时需要在对象存放相关信息。这时我们通常会从对象所属类中继承一个子类,然后改用这个子类对象。然而并非所有情况下都能这么做,有时候类实例可能是由某种机制...
  • Java中的map、list、set、map之类的集合容器中只能存放...但是,现在基本数据类型都有了其对应的封装的对象,而且有了自动拆箱和装箱功能,基本数据类型和其对应对象之间的转换变得很方便,想把基本数据类型存入集合
  • 栈中一般用来存放基本数据类型和引用地址。 堆中一般用来存放对象的属性内容。 如: int i = 1; 这里i是一个基本数据类型。i值被存放在栈中。 再如: 定义了一个Person类,该类中有两个属性:int age、...
  • 数据存放的位置

    2016-09-26 12:40:57
    堆:new(对象) 栈:局部变量 数据段:类变量、常量 ...c变量指向堆中字符串对象,但是产生堆中字符串对象之前,会先在常量区中,产生字符串常量对象。然后以常量对象为模板,拷入堆中字符串对象
  • 非自定义对象 ...方式一,利用HashSet不能添加重复数据的特性 由于HashSet不能保证添加顺序,所以只能作为判断条件: private static void removeDuplicate(List<String> list) { HashSet<St...
  • 根据上下文来确定。 根据上下文来确定。 根据上下文来确定。 比如 void func() ...对于方法中局部变量引用时存放在java运行时数据栈中,对于实例变量则是存放在java运行时数据堆中。 ...
  • 在编写程序过程当中,经常会涉及数据存储...下面就以存放对象对象指针、对象智能指针这三种策略,来进行一个实验,并得出它们优势与劣势比较。(代码测试环境为我可怜本本……>_ )实验代码: #include #in
  • C++对象在内存中的存放方式

    千次阅读 2017-03-10 22:19:53
    对象占有一定内存,该内存上存放的是该对象的相关数据,按先后顺序如下: 1、虚表指针:如果该类有虚函数话,将存放虚表指针,该指针指向该类虚函数表,即指向表中第一个元素。续表中存放的是该类虚函数...
  • 1、先插入其它字段,BLOB字段初始化时候,先初始化一个EMPTY_BLOB(),相当于一个BLOB对象的空壳,内部啥也没有,但是是一个对象。 2、SELECT <BLOB字段> FROM <表名称> WHERE <关键字>=<插入...
  • 根据上下文来确定。比如voidfunc(){Objectobj=newObject();//这个obj在函数栈里。...对于方法中局部变量引用时存放在java运行时数据栈中,对于实例变量则是存放在java运行时数据堆中。...
  • emlog缓存保存方式是将php的数据对象(数组)序列化(serialize)后以文件形式存放,读取缓存时候直接反序列化(unserialize)缓存字符串即可读取数据,关于序列化和反序列化原理请看我先前文章《php函数...
  • 存储value用户对象包括姓名,年龄,生日等等 如果用普通key-value结构来存储,主要有以下2种方式存储 方式一(list,set) 这种方式是使用list或者set这些来存储,这样方式其实也可以达到我们想要效果,...
  • 首先,集合的存在就是为了方便...但是,现在基本数据类型都有了其对应的封装的对象,而且有了自动拆箱和装箱功能,基本数据类型和其对应对象之间的转换变得很方便,想把基本数据类型存入集合中,直接存就可以了,系统会
  • 第一种datalist存放的是通一个map对象,在堆内存中map指向的是同一个地址,这种情况下就会发生数据的重复或者说是覆盖;第二种中我们将map放进了循环里面,这样在每次循环的时候都会重新再实例化一个map对象,使map...
  • 数据集中修改后的数据,如果长期保存,就必须存放到数据库中,这就需要使用DataAdapter对象的Update()方法。 事实上数据适配器是通过Command对象来操作数据库和数据。当调用Fill()方法时,系统会通过...
  • 1.Foundation框架中提供了很多集合类如:NSArray,NSMutableArray,NSSet,NSMutableSet,NSDictionary,NSMutableDictionary但是这些类只能存放OC对象类型的数据   2.如果要存放基本数据类型,必须先将...
  • 栈:栈存放的是:基本类型的对象和类的引用变量。每个线程都有一个栈,栈内容私有,每个栈都有三个部分:基本类型变量区,执行环境上下文,操作指令区。栈的声明和持有该栈的线程一样长 堆:对象和数据存放在...
  • 我的想法是把读到的xml文件的内容封装到java的对象中,返回值是一个集合类型,然后我就不知道怎么做了。 图片是展示效果: ![图片说明](https://img-ask.csdn.net/upload/201609/01/1472719954_312637.png) ``` ...
  • 将序列化的对象转成字节数据,将字节数据存放到数据库; 从数据库取出来是以getBlod的方法得到字节数据 public class TypeChangeTool { private static final String TAG = TypeChangeTool.class.getSimpleName()...
  • 2.堆(Heap) 存放对象实例,几乎所有对象实例都在这里分配内存 3.虚拟机栈(VM Stack) 描述是Java方法执行内存模型:每个方法在执行同时会创建一个Stack Frame(方法运行时基础数据结构)用于存储
  • id类型是一个独特的数据类型,可以转换为任何数据类型,即id类型的变量可以存放任何数据类型的对象。这是为什么呢?还是从OC的内部实现机制上来分析吧!  在内部处理上,id类型被定义为指向对象的指针
  • 数据对象数据元组形式存放在数据库中,数据库行对应于数据对象,列对应于属性。 属性是一个数据字段,表示数据对象的特征,在文献中,属性、维度(dimension)、特征(feature)、变量(variance)可...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 16,803
精华内容 6,721
关键字:

存放数据的对象是