2013-05-13 3 views
2

Я пытаюсь добавить объект (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); 
     } 

Это создает только один объект (тип), поэтому он добавляет один и тот же объект 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 объектов diff с значениями diff.

Что делать, если (для цикла) создавать сотни объектов вместо 9 в одном цикле, каждый раз, когда делается запрос? Значит, его дамп в памяти?

Как этого избежать?

Спасибо заранее.

+1

уточнить вопрос, его непонятно !! что означает «получение точного запроса» и «элемент запроса» – anshulkatta

+0

, когда u add MyRequestType type = new MyRequestType(); в цикле новый объект создается в 9 раз. – anshulkatta

+0

Когда я не создаю новый объект в цикле, объект добавляется 9 раз, но данные одинаковы для всех объектов, хотя если данные diff установлены. Когда я помещаю новый объект в цикл, он добавляет 9 объектов для списка с данными diff. Будет ли это влиять на эффективность памяти? Что делать, если мой цикл for создает сотни объектов? Я часто получаю космическую ошибку PermGen. –

ответ

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); добавляет объект в список, независимо от его состояния не изменяется или нет, это тот же самый объект. Потому что это список, а не карта, которая не позволяет дублировать.

Так отсчет идет до 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); 
    } 

Теперь код создает новый объект и добавить в список, но каждый объект отличается. Единственное отличие в двух фрагментах заключается в том, что объекты во втором фрагменте не совпадают, но в первом фрагменте это же, но добавлено 10 раз.

+0

Спасибо anshulkatta, я хочу знать, повлияет ли это на производительность моего приложения, создав больше объектов в памяти. Есть ли способ избежать этого. –

+1

Если ваше требование состоит в том, чтобы хранить один и тот же объект 10 раз в Списке, тогда я думаю, что он потерял память, потому что вы сохраняете одно и то же время evrytime, но если вы хотите иметь 10 разных объектов с одинаковыми значениями, то это также отходы хотя: P, все это по вашему требованию. Каково ваше требование. ?? – anshulkatta

1

Поскольку при создании объекта вне цикла создается только один объект. Следовательно, только этот объект добавляется в список, хотя вы пытаетесь его добавить 9 раз.

  1. Новый объект создается Loop Запускает
  2. Некоторые значения устанавливаются в объект.
  3. Объект добавляется к списку. (То есть ссылка в списке)

Во второй итерации, когда значения изменяются, то изменяется в объекте, созданный на шаге 1, который упоминается в списке 10 раз.

Надеюсь, это уточнит.

+0

Спасибо rajkumar. Причина, по которой возникает этот вопрос, заключается в том, что я получаю утечки памяти в своем приложении. Если я создаю объект как пустой внутренний цикл для каждого нового созданного объекта, это повлияет на следующий созданный объект. Например, loop {new myObject; myObject = null;} –

1
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; 
} 

Установка значения null в переменную типа, как показано выше, не окажет никакого влияния на память. Потому что объект уже указан в вашем списке. Следовательно, даже если вы установите значение null для переменной типа, это не повлияет на утечку памяти.

Просьба дать обзор приложения и проблемы, с которыми вы сталкиваетесь, если сталкиваетесь с проблемой в приложении реального времени.

+0

Мое приложение - это получение информации о пользователе через веб-службу и отображение в jsps. веб-служба - app1 (DAO) и struts2 & jsp App2. я отправляю xml-запрос на веб-службу и возвращаю ответ. Я повторяю ответ, используя класс POJO/Bean, как описано выше, добавьте все объекты в список. Поэтому, если я очищу список, все ссылки будут GC'd. Что делать сейчас. Ваша помощь приветствуется. –

+0

Да, если список очищается, все объекты будут доступны для сбора мусора, и память будет освобождена. Во всяком случае, как только ответ будет обработан и отправлен на клиентскую машину, память будет освобождена. Вы сталкиваетесь с проблемами памяти, итерации через список пользовательских сведений, полученных от веб-службы (приложение 1)? – Rajkumar

Смежные вопросы