我正在调用一个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;
}
解决方案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;
}
答案 0 :(得分:18)
如果您的收藏是一个列表,您可以使用subList(fromIndex, toIndex)
方法。
示例:
List<String> x = new ArrayList<String>();
List<String> y = x.subList(5, 10);
答案 1 :(得分:7)
当然,迭代一个集合比先将数据转换为数组然后遍历数组更好。
第二种方法提供额外的时间和内存费用:
答案 2 :(得分:2)
我认为subList的答案是可行的方法。
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);
}
答案 3 :(得分:0)
如果您有列表,请使用subList方法。这是一个这样做的例子:
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);
}