使用给定数量的空值初始化List <t>而没有循环?</t>

时间:2011-11-22 07:06:03

标签: java list initialization

是否可以初始化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]);

9 个答案:

答案 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.Arrayjava.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());