迭代列表,修改每个元素:有更快的方法吗?

eva*_*ner 6 java list

我有一个 ListStringS和我想trim()的列表中的每个元素.

目前,我正在使用a ArrayList,在元素中进行简单循环,并将修剪后的元素添加到返回列表中,如下所示:

int listLen = listToTrim.size();

List<String> trimmedList = new ArrayList<String>( listLen );

for ( int i = 0; i < listLen; i++ ) {
    trimmedList.add( listToTrim.get( i ).trim() );
}

return trimmedList;
Run Code Online (Sandbox Code Playgroud)

对于大型列表,会有更有效的方法吗?

Joa*_*uer 14

不,你很好.这和它的效率一样高效.没有魔法可以避免迭代.

需要记住的一点是,'但是:如果listToTrim不是随机访问列表(即它没有实现RandomAccess),那么使用Iterator(或增强的for循环,它在Iterator内部使用)而不是传统的for循环通常效率更高.最值得注意的List是没有实现RandomAccessLinkedList.打电话l.get(300)LinkedList 600元将不得不通过〜300元迭代,以获得正确的!

修改代码以使用增强的for循环看起来像这样:

public List<String> trimStrings(Listy<String> listToTrim) {
    List<String> trimmedList = new ArrayList<String>(listToTrim.size());
    for (String str : listToTrim) {
      trimmedList.add(str.trim());
    }
    return trimmedList;
}
Run Code Online (Sandbox Code Playgroud)

如果您不再需要原始列表,则重新使用原始列表可以节省内存并提高性能:

public void trimStringsInPlace(List<String> listToTrim) {
    ListIterator<String> it = listToTrim.listIterator();
    while (it.hasNext()) {
      it.set(it.next().trim());
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @evanjdooner:不,你不需要退货.我只是假设你想保持方法的签名相同,但如果不这样做就不那么混乱了(因为很明显传入的列表被修改了),所以我将删除它. (2认同)