2016-03-03 197 views
0

我有一個簡單的類只有一個字符串字段,我有ArrayList。 當我做循環添加一些元素到ArrayList奇怪的事情發生。ArrayList的自定義對象

ArrayList<MyClass> list = new ArrayList<Myclass>(); 
MyClass mc = new MyClass(); 

for(int i=0;i<someNumber;i++){ 
    String s = new String(Integer.toString(i)); 
    mc.setString(s); 
    list.add(mc); 
} 

在此之後,當我打印我的列表,從列表中每個元素的字符串是相同的。

據我所知,如果我做list.add(new Myclass(s);工作正常,但我需要每次創建一個MyClass的新實例嗎?如果someNumber很大,則需要太多內存。謝謝

+0

您只是在進入循環之前創建相同的'mc',並重復將其添加到列表中。因此畢竟它包含多個對一個對象(仍然是'mc')的引用,它具有'string'屬性作爲最新賦值。 –

回答

3

您正在重新添加相同的元素到列表中。嘗試:

List<MyClass> list = new ArrayList<>(someNumber); 


for(int i=0;i<someNumber;i++){ 
    String s = new String(Integer.toString(i)); 
    MyClass mc = new MyClass(); // create new object mc 
    mc.setString(s); 
    list.add(mc); // add the new object to the list 
} 

通過相同的對象我的意思是相同的指向對象的指針,你必須創建新的指針(初始化新類),將其添加到列表中作爲單獨的實例。在這種情況下,您在同一對象上的setString中設置了不同的值,並將列表中的對象相乘。

+0

謝謝。但是,如果某些數字是10 000,則需要700 MB RAM ...是否有其他方法? –

+0

@ђђђашћ從哪裏得到這700 MB?我們不知道MyClass有多大。如果你想創建新的對象,你必須分配他們 –

+0

我的壞。我忘了從MyClass中刪除一些導入。謝謝。 –

2

您需要在循環內移動對象mc的實例。

ArrayList<MyClass> list = new ArrayList<Myclass>(); 


for(int i=0;i<someNumber;i++){ 
    MyClass mc = new MyClass(); 
    String s = new String(Integer.toString(i)); 
    mc.setString(s); 
    list.add(mc); 
} 
相關問題