Há algumas diferenças.
1) Modo de declaração
int[] variavel = new int[10]; // Array
List<int> variavel = new ArrayList<int>(); // ArrayList
2) Tamanho
O Array é criado com um tamanho predefinido. No exemplo anterior o tamanho é 10. Já o ArrayList tem um tamanho dinâmico. O ArrayList cresce automaticamente conforme a necessidade.
3) Remoção de Elementos
Quando um elemento é removido do Array o espaço ocupado permanece lá, mas vazio. No ArrayList tanto o elemento quanto o espaço são removidos totalmente.
4) Tipo de objeto armazenado
O Array é utilizado para guardar um conjunto de objetos ou tipos primitivos. O ArrayList só guarda objetos.
Há ainda outras diferenças tais como performance, quando usar, para que usar, etc.