Zależy jak bardzo często będziesz używał danej funkcji. Jeśli rzadko i dla małych kolekcji to możesz użyć czegokolwiek np. właśnie kolekcji przechowujacej posortowane dane (treeset). Jeśli kolekcje będą ogromne, a ty będziesz robił zapytania stosunkowo rzadko to TreeSet może być nieotymalny: wstawianie zajmuje O(log n) czyli dla całej kolekcji masz O(n log n), a z drugiej strony taki HashSet ma złożoność wstawiania O(1), a przeglądnięcie całej kolekcji w celu znalezienia maxa/mina to O(n). A robisz to mniej więcej tak: iterujesz po całej kolekcji porónując kolejne daty z "najbardziej przyszłą" z poprzednio ustalonych (początkowo możesz ustawić ją na np. pierwszy element kolekcji) i w przypadku, gdy ta którą badamy teraz jest większa od currentmaxa to ustalasz currentmax na badaną.
Używanie sortowania, zwłaszcza kwadratowego jest zbrodnią na wydajności.