Como clonar ArrayList e também seu conteúdo?

Como posso clonar umArrayList e também clonar seus itens em Java?

Por exemplo, tenho:

ArrayList<Dog> dogs = getDogs();
ArrayList<Dog> clonedList = ....something to do with dogs....

E eu esperaria que os objetos emclonedList não são os mesmos da lista de cãe