That is that the latter returns an array of posts while the former returns posts one at a time with the_post() function. That means that get_posts() returns all posts at once as an array while WP_Query iterates through posts one at a time echoing out the relevant content of each post as it iterates.