Доступ осуществляется по ключу, а не по индексу. По аналогии со списком, в словаре можно получить доступ к элементам в цикле по ключам.
Значения словаря хранятся в неотсортированном порядке, более того, ключи могут храниться не в том порядке, в котором они добавляются.
По аналогии со списками, словарь может хранить вложенные словари.
Словари реализованы как хеш-таблицы с быстрым доступом.
Словари, так же как и списки, хранят ссылки на объекты, а не сами объекты.
upd
ArrayList это список, реализованный на основе массива
На сколько я знаю, в Java цикл foreach для ArrayList будет просто синтаксически удобнее, может быть чуточку быстрее, потому как проверка на ограничения индекса массива производится только один раз в начале.