Finding the Players with the highest score
This is a terrible approach. Sorting the list (an \$O(n \log(n)\$) step) and then iterating through it (an \$O(n)\$ operation) to collect the highest scoring players is simply inefficient.

Instead, just iterate through the list in this way:

List&lt;Player&gt; playersList = new ArrayList&lt;&gt;(players);
Set&lt;Player&gt; highestScoringPlayers = new HashSet&lt;&gt;();
int maxScore = Integer.MIN_VALUE;
for (Player player : playersList) {
    maxScore = Math.max(maxScore, player.score)
}
for (Player player : playersList) {
    if (player.score == maxScore) {
        highestScoringPlayers.add(player);
    }
}
return highestScoringPlayers;


This uses 2 loops and the minimal amount of space (just enough for the original list and the highest scorers) and so is \$O(n)\$, which is better than your \$O(n \log(n))\$ solution.

If you would like to only use 1 loop, at the cost of some additional overhead here is the code:

List&lt;Player&gt; playersList = new ArrayList&lt;&gt;(players);
Set&lt;Player&gt; highestScoringPlayers = new HashSet&lt;&gt;();
int maxScore = Integer.MIN_VALUE;
for (Player player : playersList) {
    if (player.score &gt;= maxScore) {
        if (player.score &gt; maxScore) {
            maxScore = player.score;
            highestScoringPlayer.clear();
        }
        highestScoringPlayer.add(player);
    }
}