下面是一个示例,它将 CSV 字符串列表读入列表列表,然后循环访问该列表列表并将 CSV 字符串打印回控制台。
import java.util.ArrayList;
import java.util.List;
public class ListExample
{
    public static void main(final String[] args)
    {
        //sample CSV strings...pretend they came from a file
        String[] csvStrings = new String[] {
                "abc,def,ghi,jkl,mno",
                "pqr,stu,vwx,yz",
                "123,345,678,90"
        };
        List<List<String>> csvList = new ArrayList<List<String>>();
        //pretend you're looping through lines in a file here
        for(String line : csvStrings)
        {
            String[] linePieces = line.split(",");
            List<String> csvPieces = new ArrayList<String>(linePieces.length);
            for(String piece : linePieces)
            {
                csvPieces.add(piece);
            }
            csvList.add(csvPieces);
        }
        //write the CSV back out to the console
        for(List<String> csv : csvList)
        {
            //dumb logic to place the commas correctly
            if(!csv.isEmpty())
            {
                System.out.print(csv.get(0));
                for(int i=1; i < csv.size(); i++)
                {
                    System.out.print("," + csv.get(i));
                }
            }
            System.out.print("\n");
        }
    }
}
我认为很简单。请注意以下几点:
- 我建议在创建列表对象时使用左侧的“List”而不是“ArrayList”。最好传递接口“List”,因为如果以后您需要更改为使用Vector之类的东西(例如,您现在需要同步列表),则只需要使用“new”语句更改行。无论您使用哪种列表实现,例如Vector或ArrayList,您仍然总是只是传递。- List<String>
 
- 在 ArrayList 构造函数中,可以将列表留空,它将默认为一定大小,然后根据需要动态增长。但是,如果您知道列表可能有多大,则有时可以节省一些性能。例如,如果您知道文件中总是有500行,那么您可以执行以下操作: 
List<List<String>> csvList = new ArrayList<List<String>>(500);
这样,您就永远不会浪费处理时间等待列表动态增长。这就是我将“linePieces.length”传递给构造函数的原因。通常没什么大不了的,但有时很有帮助。
希望有所帮助!