>我有这个:
private ArrayList<ArrayList<Object>> models;
在构造函数中,我有:
models = new ArrayList<ArrayList<Object>>();
后来,我做了这样的事情:
models.add(new ArrayList<Object>());
以及其他操作。
我想将外部 ArrayList 设置为具有固定大小(数组、列表(的东西,由于嵌套对象,我真的不知道如何编写声明、初始化、加法等。有人可以通过为我回答这个问题来节省我的时间吗?
Arrays.asList()
创建固定大小的List
。
例子:
大小为 3 的List
,使用 null 值初始化:
List<ArrayList<Object>> models = Arrays.asList (null,null,null);
大小为 3 的List
,使用非空值初始化:
List<ArrayList<Object>> models = Arrays.asList (new ArrayList<Object> (),new ArrayList<Object> (),new ArrayList<Object> ());
大小为 10 的List
,使用 null 值初始化:
List<ArrayList<Object>> models = Arrays.asList ((ArrayList<Object>[])new ArrayList[10]);
请注意,固定大小的列表不支持add
操作。您必须改用models.set(index,new ArrayList<Object>())
。
编辑:
以下是使用 Stream
s 初始化List
的另一种方法:
List<ArrayList<Object>> models = Arrays.asList (Stream.generate (ArrayList::new).limit (10).toArray (ArrayList[]::new));
一种稍微冗长但通用兼容的方法是扩展AbstractList
。
您需要重写的方法在 Javadoc 中描述:
要实现不可修改的列表,程序员只需要扩展此类并为
get(int)
和size()
方法提供实现。要实现可修改的列表,程序员必须另外重写
set(int, E)
方法(否则会抛出UnsupportedOperationException
(。
因此,实现这三种方法,委托给ArrayList
:
class FixedSizedList<T> extends AbstractList<T> {
private final List<T> delegate;
FixedSizedList(int size) {
delegate = new ArrayList<>(Collections.nCopies(size, null));
}
public T get(int i) { return delegate.get(i); }
public int size() { return delegate.size(); }
public T set(int i, T e) { return delegate.set(i, e); }
}
或者,就此而言,只需使用数组:
class FixedSizedList<T> extends AbstractList<T> {
private final Object[] array;
FixedSizedList(int size) {
array = new Object[size];
}
public T get(int i) { return (T) array[i]; }
public int size() { return array.length; }
public T set(int i, T e) {
T old = (T) array[i];
array[i] = e;
return old;
}
}
java 中没有Array
类,但有一个普通的旧数组声明:
ArrayList<Object> [] array...
问题是您将无法像这样实例化它,因为数组不能是泛型的。
您真的在寻找Arrays.asList
或更好的某种ImmutableList
。