我应该迭代Java集合以获得子集,还是应该先将其转换为数组,然后再迭代以获得子集?

我应该迭代Java集合以获得子集,还是应该先将其转换为数组,然后再迭代以获得子集?,java,performance,collections,iteration,Java,Performance,Collections,Iteration,我正在调用一个API,它将返回一组对象。我想得到对象的子集。我想有两种解决办法。哪一个能给我更好的表现?根据我的理解,toArray()调用主要会在集合中迭代一次。如果这是真的,那么解决方案一会更好 解决方案1- public static List<String> get(UUID recordid, int start, int count) { List<String> names = new ArrayList<String>();

我正在调用一个API,它将返回一组对象。我想得到对象的子集。我想有两种解决办法。哪一个能给我更好的表现?根据我的理解,
toArray()
调用主要会在集合中迭代一次。如果这是真的,那么解决方案一会更好

解决方案1-

public static List<String> get(UUID recordid, int start, int count) {
    List<String> names = new ArrayList<String>();

    ...

    Collection<String> columnnames = result.getColumnNames();
    int index = 0; 
    for (UUID columnname : columnnames) {
        if ((index >= start) && (index - start < count)) {
            names.add(columnname);
        }
        index++;
    }

    return names;
}
公共静态列表获取(UUID recordid、int start、int count){
列表名称=新的ArrayList();
...
Collection columnnames=result.getColumnNames();
int指数=0;
用于(UUID columnname:columnnames){
如果((索引>=开始)和&(索引-开始<计数)){
名称。添加(列名称);
}
索引++;
}
返回姓名;
}
解决方案2-

public static List<String> get(UUID recordid, int start, int count) {
    List<String> names = new ArrayList<String>();

    ...

    Collection<String> columnnames = result.getColumnNames();
    String[] nameArray = columnnames.toArray(new String(columnnames.size()));

    for (int index = 0; index < nameArray.length && count > 0; index++, count--) {
        names.add(nameArray[index]);
    }

    return names;
}
公共静态列表获取(UUID recordid、int start、int count){
列表名称=新的ArrayList();
...
Collection columnnames=result.getColumnNames();
String[]nameArray=columnnames.toArray(新字符串(columnnames.size());
对于(int index=0;index0;index++,count--){
name.add(nameArray[index]);
}
返回姓名;
}

毫无疑问,遍历集合比先将其转换为数组,然后遍历数组要好

第二种方法提供了额外的时间和内存开销:

  • 为数组分配内存
  • 用集合的内容填充数组

  • 如果您的集合是一个列表,则可以使用
    子列表(fromIndex,toIndex)
    方法

    例如:

    List<String> x = new ArrayList<String>();
    List<String> y = x.subList(5, 10);
    
    List x=new ArrayList();
    列表y=x.子列表(5,10);
    
    我认为子列表的答案是正确的

    public static List<String> get(UUID recordid, int start, int count) {
        Collection<String> columnnames = result.getColumnNames();
        List<String> names = new ArrayList<String>(columnnames);
        return names.subList(start, start+count);
    }
    
    公共静态列表获取(UUID recordid、int start、int count){
    Collection columnnames=result.getColumnNames();
    列表名称=新的ArrayList(columnnames);
    返回名称。子列表(开始,开始+计数);
    }
    
    如果有列表,请使用子列表方法。下面是这样做的一个例子:

    private static void doTestListBreak()
    {
        for (int i=0; i<= 300; i++)
        {
            for (int delta=1; delta<= 30; delta++)
            {
                testListBreak(i, delta);
            }
        }
    }
    
    public static void testListBreak(int numItems, int delta)
    {
        if (delta <= 0)
            return;
    
        log("list(" + numItems + "): ");
        List<Integer> list = new ArrayList<Integer>();
        for (int i=0; i < numItems; i++)
        {
            list.add(i);
        }
    
        for (int i=0; i < list.size(); i=i+delta)
        {
            int max = Math.min(list.size(), i + delta);
            List<Integer> subList = list.subList(i, max);
            log("list(" + numItems + "," + delta + "): " + subList);
        }
    }
    
    public static void log(String msg) 
    {
        System.out.println(msg);
    }
    
    私有静态void doTestListBreak()
    {
    
    对于(int i=0;我不知道这是一个
    列表
    ——我想只是一个
    集合
    ,听起来他好像收到了一个
    集合
    不一定是
    列表