2012-12-15 69 views
0

好的,我有一個問題,我的代碼似乎工作,但我沒有測試它特別好。Java列表集方法

我想在ArrayList中設置一個元素。

ArrayList<StringBuilder> g=new ArrayList<StringBuilder>(); 
//set the array contents 
g.get(2).append("Something"); 

我知道,做這樣的事情

StringBuilder q=g.get(2); 
q.append("something else?"); 
g.set(2,q); 

作品,可能是做了正確的方式,但似乎做的這種很長的路要走。

我是不是這樣做,如果我不是,那麼我提到的第二種方法是唯一的方法嗎?

+0

您不需要將相同的StringBuilder重新設置回列表中,因爲它不會執行任何操作。 –

回答

1

如果你有一個StringBuilder的列表,這些列表已被修改,那麼第一種方法是好的。如果您有一些不可變類型的列表(例如String),那麼由於您無法更改出來的對象,所以必須使用第二種方法的變體,因爲結果不是同一個對象。

例如

List<StringBuilder> widgets = new ArrayList<StringBuilder>(); 
// ... 
StringBuilder widget = widgets.get(0); 
widget.append(" version 2"); 

VS

List<String> widgets = new ArrayList<String>(); 
// ... 
String widget = widgets.get(0); 
widgets.set(2, widget + " version 2"); 
+0

謝謝,雖然我並沒有真正詢問StringBuilders,但更多的是修改可變項目列表中項目的整體實踐。 – jaked122

+1

@ jaked122你應該在你的問題中說出這個。 –

+0

爲什麼,在java中stringbuilder類沒有特殊的處理,所以任何建議,如果不是所有的類都可以工作。 – jaked122

0

g.get(2).append("Something");的作品,如果你有StringBuilder實例初始化列表值。否則,您將獲得NullPointerException

注意,在你的代碼中定義StringBuilder類型的ArrayList但你嘗試Integer類型的ArrayList分配給它,它不工作

+0

是的,我正在考慮一個可以工作的可變類型,Integer不起作用,所以我將代碼部分更改爲StringBuilder。 – jaked122

+0

這兩種方法只有在列表初始化時纔會起作用;他們的行爲與第二個人所做的不同之處以及不必要的設置相同。 – SJuan76

1

當調用您檢索列表#get()方法引用您的StringBuilder對象。 StringBuilder是一個可變對象。所以如果你想在索引2修改你的StringBuilder的內容,那麼你在修改它之後不需要再次設置一個引用。因此,以下就足夠了:

g.get(2).append("Something");