I'd probably write this as:

    if (!groupDict.containsKey(key)) {
        groupDict.put(new ArrayList<String>());
    }
    List<String> values = groupDict.get(key);

That way you're not constructing a new instance of ArrayList every time through the loop.  Also, on the left-hand-side of an expression you want to use the more generic interfaces when possible, so `List` instead of `ArrayList`.