When one class contains instances of another, that's a has-a relationship. Hand has-a Card. Deck has-a Card. But Hand doesn't care that Deck exists.
Hand and Deck have an ArrayList<Card> field. Neither has any reference to the other — main is the one that tells them to talk. That's loose coupling at work: two classes can collaborate without knowing about each other.
Deck's shuffle algorithm, and Hand doesn't notice.
Hand stores a Deck field and calls deck.deal() itself. Any change to Deck can break Hand. Tests get harder — you can't test Hand without also building a Deck.