【问题标题】:Creating new instance of object in loop to add in list在循环中创建对象的新实例以添加到列表中
【发布时间】:2013-05-13 05:25:07
【问题描述】:

我正在尝试将对象 (JavaBean) 添加到列表中。

     MyWebServiceRequest mywebService = new MyWebServiceRequest();
     MyRequestType type= new MyRequestType ();

       for(int i=0; i< 9; i++){
           type.setA(someDynamicValue);
           type.setB(someDynamicValue);
           mywebService.add(type);
       }

这只会创建一个 (type) 的对象,因此它会使用相同的数据添加相同的对象 9 次。

 MyWebServiceRequest mywebService = new MyWebServiceRequest();
   for(int i=0; i< 9; i++){
           MyRequestType type= new MyRequestType ();
           type.setA(someDynamicValue);
           type.setB(someDynamicValue);
           mywebService.add(type);
       }

这会创建多个对象,添加 9 个具有差异值的差异对象。

如果(for 循环)在每次发出请求时在单个循环中创建数百个对象而不是 9 个对象会怎样? 那么它在内存中的转储对吗?

如何避免这种情况?

提前致谢。

【问题讨论】:

  • 澄清你的问题,这是不可理解的!你所说的“获得确切的请求”和“请求元素”是什么意思
  • 当你添加 MyRequestType type= new MyRequestType ();在循环中,一个新对象被创建了 9 次。
  • 当我不在循环中创建新对象时,该对象被添加了 9 次,但所有对象的数据都是相同的,即使设置了差异数据。当我将新对象放入循环中时,它会添加 9 个对象列出差异数据。会不会影响内存的效率?如果我的 for 循环创建了数百个对象怎么办?我经常遇到内存不足 PermGen 空间错误。
  • 请接受我对所有回答者的赞美...我已尝试阅读该问题 5 次,但仍然无法理解他要问什么
  • @user1665651 ,您想要一个对象或 9 个不同的对象..?? ,所有其他 9 个对象的数据是否必须相同

标签: java web-services object


【解决方案1】:

当你这样做时

 MyWebServiceRequest mywebService = new MyWebServiceRequest();
   MyRequestType type= new MyRequestType ();

   for(int i=0; i< 9; i++){
       type.setA(1);
       type.setB(2);
       mywebService.add(type);
   }

mywebService.add(type); 行将对象添加到 list 中,无论它的状态是否改变或者它是同一个对象。因为它是一个列表,而不是一个不允许重复的 Map。

所以计数变为 10 ,现在当你这样做时

 MyWebServiceRequest mywebService = new MyWebServiceRequest();


   for(int i=0; i< 9; i++){
       MyRequestType type= new MyRequestType ();
       type.setA(1);
       type.setB(2);
       mywebService.add(type);
   }

代码现在创建一个新对象并添加到列表中,但每个对象都不同。 两个sn-p的唯一区别是,第二个sn-p中的Objects不一样,但第一个sn-p中的对象相同但相加了10次。

【讨论】:

  • 感谢 anshulkatta,我想知道它是否会通过在内存中创建更多对象来影响我的应用程序性能。有没有办法避免这种情况。
  • 如果您的要求是在 List 中存储同一个对象 10 次,那么我认为这很浪费内存,因为您每次都保存同一个对象,但是如果您想拥有 10 个具有相同对象的不同对象values ,虽然这也是一种浪费 :P ,这完全取决于您的要求。你有什么要求。 ??
【解决方案2】:

因为,当您将对象创建放在循环之外时,只会创建一个对象。因此,尽管您尝试添加 9 次,但只有该对象被添加到列表中。

  1. 创建了一个新对象 循环开始
  2. 在对象中设置了一些值。
  3. 对象被添加到列表中。(即在列表中引用)

在第二次迭代中,当值发生变化时,它在步骤 1 中创建的对象中发生变化,该对象在列表中引用了 10 次。

希望这可以澄清。

【讨论】:

  • 感谢 rajkumar,提出这个问题的原因是,我的应用程序中出现内存泄漏。如果我为每个创建的新对象在循环内将对象设为 null,它会影响创建的下一个对象。例如,循环{ new myObject; myObject=null;}
【解决方案3】:
MyWebServiceRequest mywebService = new MyWebServiceRequest();
for(int i=0; i< 9; i++){
   MyRequestType type= new MyRequestType ();
   type.setA(1);
   type.setB(2);
   mywebService.add(type);
   type = null;
}

如上所示将变量'type'设置为null不会对内存产生任何影响。因为,该对象已被引用到您的列表中。因此,即使您将变量 'type' 设置为 null,它也不会对内存泄漏产生任何影响。

如果您在实时应用程序中遇到问题,请概述应用程序和您面临的问题。

【讨论】:

  • 我的应用程序都是从 Web 服务获取用户详细信息并显示在 jsps 中。 web服务是app1(DAO)和struts2&jsp App2。我将 xml 请求发送到 Web 服务并取回响应。如上所述,我使用 POJO/Bean 类迭代响应,将所有对象添加到列表中。因此,如果我清除列表,所有引用都将被 GC 处理。现在要做什么。感谢您的帮助。
  • 是的,如果列表被清除,所有对象都将可用于垃圾回收并释放内存。无论如何,一旦响应被处理并发送到客户端机器,内存将被释放。您在遍历从 Web 服务 (app1) 接收的用户详细信息列表时是否遇到内存问题?
猜你喜欢
  • 1970-01-01
  • 2014-06-28
  • 1970-01-01
  • 2018-01-17
  • 1970-01-01
  • 2016-01-11
  • 2023-03-15
  • 1970-01-01
  • 2016-02-22
相关资源
最近更新 更多