2012-12-15 42 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");