2013-05-13 64 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); 
     } 

這創建多個對象,用Diff值添加9 DIFF對象。

如果(for循環)在單個循環中創建數百個對象而不是9個,每次發出請求時都會發生什麼? 所以它在內存中的轉儲權?

如何避免這種情況?

在此先感謝。

+1

澄清你的問題,它不可理解!當你添加MyRequestType type = new MyRequestType()時,你的意思是「獲取確切的請求」和「請求元素」 – anshulkatta 2013-05-13 05:27:02

+0

。在循環中,創建一個新對象9次。 – anshulkatta 2013-05-13 05:28:58

+0

當我不在循環中創建新對象時,對象被添加9次,但所有對象的數據都相同eventhough如果設置了差異數據。當我將新對象放入循環中時,它將9個對象添加到差異數據列表中。它會影響內存的效率嗎?如果我的for循環創建數百個對象會怎麼樣?我經常從內存PermGen空間錯誤開始。 – 2013-05-13 05:49:33

回答

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);對象添加到列表中,不管其狀態更改或不,或者是同一個對象。因爲它是一個列表而不是一個不允許重複的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); 
    } 

現在,該代碼使得一個新的對象,然後添加到列表,但每個對象是不同的。 兩個片段中的唯一區別是,第二個片段中的對象不相同,但在第一個片段中它相同但添加了10次。

+0

感謝anshulkatta,我想知道它會通過在內存中創建更多對象來影響我的應用程序性能。有沒有辦法避免這一點。 – 2013-05-13 06:05:35

+1

如果你的要求是在List中存儲10次相同的對象,那麼我認爲它浪費了內存,因爲你保存了相同的對象evrytime,但是如果你想擁有10個具有相同值的不同對象,那也是浪費雖然:P,它的一切都是你的要求。你的要求是什麼? ?? – anshulkatta 2013-05-13 06:07:59

1

因爲,當您將對象創建置於循環外部時,只會創建一個對象。因此,只有該對象被添加到列表中,儘管您試圖將其添加9次。創建

  1. 新對象 循環開始
  2. 某些值被設置到對象。
  3. 對象添加到列表中。(即,列表中引用)

在第二次迭代時的值變化時,它在該列表中的10稱爲在步驟1中創建的對象改變倍。

希望澄清。

+0

謝謝rajkumar,提出這個問題的原因是,我在我的應用程序中發現了memery泄漏。如果我爲每個創建的新對象在內循環中設置對象爲null,它是否會影響下一個創建的對象。例如,循環{new myObject; myObject = null;} – 2013-05-15 04:57:30

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設置爲變量'type'如上所示不會對內存產生任何影響。因爲該對象已經被引用到您的列表中。因此,即使您將null設置爲變量「type」,它也不會對內存泄漏產生任何影響。

如果您在實時應用程序中遇到問題,請概述應用程序和您遇到的問題。

+0

我的應用程序都是從web服務獲取用戶信息並以jsps顯示。 web服務是app1(DAO)和struts2&jsp App2。我發送XML請求到Web服務並取回響應。我使用上面解釋的POJO/Bean類迭代響應代碼,將所有對象添加到列表中。所以如果我清除列表,所有引用都將GC'd。現在做什麼。感謝您的幫助。 – 2013-05-16 06:29:30

+0

是的,如果列表被清除,所有的對象將可用於垃圾回收,內存將被釋放。無論如何,一旦響應被處理併發送到客戶機,內存將被釋放。在迭代從Web服務(app1)接收的用戶詳細信息列表時,是否遇到內存問題? – Rajkumar 2013-05-17 04:57:10