是否可以初始化List<T>
以包含给定数量的null
s,其中T是列表所属类的类型参数?我确定可以用循环来做,但想知道是否可以没有。
List<T> myList = new ArrayList<T>(numEls);
创建一个给定容量的列表,但大小为0,因此myList.get(x)
对所有x
都失败,因此,例如myList.set(numEls-1,null)
。
myList = Arrays.asList(new T[numEls]);
无法编译,
myList = (List<T>) Arrays.asList(new Object[numEls]);
在Eclipse中编译(带有未经检查的强制转换警告),但不包含javac。
更新:谢谢您的回答!但是,我找到了另一个非常简短的解决方案,接近我上一次的尝试,它在eclipse和我们的自动构建系统中编译:投射数组,而不是列表!
myList = Arrays.asList((T[]) new Object[numEls]);
答案 0 :(得分:5)
您需要使用反射来使用Array.newInstance()
实例化支持数组T[]
:
public static <T> List<T> getListWithNulls(Class<T> componentType, int length) {
T[] array = (T[])Array.newInstance(componentType, length);
return new ArrayList<T>(Arrays.asList(array));
}
如您所见,这需要引用代表Class<T>
类型的T
对象:
List<String> strListWithNulls = getListWithNulls(String.class, 100);
另外请确保不要混淆这里使用的课程java.lang.reflect.Array
和java.util.Arrays
。
最后,请注意反射比使用循环慢得多。
答案 1 :(得分:4)
你可能想要的是这样......
final int maxSize = 50;
List<T> v = new Vector<T>() {{setSize(maxSize);}};
向量允许您设置一个大小,用null
填充它们。
答案 2 :(得分:3)
如果您不需要改变列表......
List<T> result = Collections.nCopies(num, (T) null);
......或者
List<T> result = new ArrayList<T>(Collections.nCopies(num, (T) null));
答案 3 :(得分:2)
不是真正的解决方案,但你想避免循环。
void fillNullList(List<T> list, count) {
if (count > 0) {
list.add(null);
fillNullList(list, count - 1);
}
}
说真的,你为什么要避免循环?也许你想要一个O(1)复杂度而不是O(n)复杂度解决方案的解决方案,无论是否使用了循环。
答案 4 :(得分:2)
我只是使用一个循环,它更简单,也可能更快。
List<T> list =
while(list.size()<size) list.add(null);
您使用的任何其他方法都可能为您使用循环。如果这样很好,只需编写自己的方法来隐藏所使用的循环。
答案 5 :(得分:1)
如果您想要ArrayList
,可以使用反射作弊
ArrayList<T> myList = new ArrayList<T>(numEls);
Field f = ArrayList.class.getField("size");//cache this
f.setAccessible(true);
f.setInt(myList, numEls);
答案 6 :(得分:0)
试试这个:
List<String> list = new ArrayList<String>(Arrays.asList(new String[100]));
for(String string : list){
System.out.println(string);
}
好吧,你可以写一个层次结构:
class Base<T>{
protected List<T> list;
public List<T> getList(){
return list;
}
}
class Child extends Base<String>{
public Child(){
list = new ArrayList<String>(Arrays.asList(new String[100]));
}
}
它可以用于下一个方式:
Base<String> base = new Child();
base.getList();
答案 7 :(得分:0)
我做的是
MyClass[] array = {new MyClass(), new MyClass(), new MyClass(), new MyClass(), new ProfileSectionDTO(), new MyClass()};
List<MyClass> MyClassList = Arrays.asList(array);
很脏,但有效:)
答案 8 :(得分:0)
带有流的新选项:
列表resultColumn = IntStream.range(0,10000).mapToObj(i-> null).collect(Collectors.toList());