Obtén todos los viernes en un rango de fechas en Java

Recientemente me encontré con una tarea en la que tengo que conseguir todos los viernes en un intervalo de fechas. Escribí un pequeño trozo de código y me sorprendió ver algún comportamiento extraño.

A continuación se muestra mi código:

public class Friday {
    public static void main(String[]args){
        String start = "01/01/2009";
        String end = "12/09/2013";
        String[] startTokens = start.split("/");
        String[] endTokens = end.split("/");
        Calendar  startCal = new GregorianCalendar(Integer.parseInt(startTokens[2]),Integer.parseInt(startTokens[1])-1,Integer.parseInt(startTokens[0]));
        Calendar endCal = new GregorianCalendar(Integer.parseInt(endTokens[2]),Integer.parseInt(endTokens[1])-1, Integer.parseInt(endTokens[0]));

        int startYear = Integer.parseInt(startTokens[2]);
        int endYear = Integer.parseInt(endTokens[2]); 


        int startWeek = startCal.get(Calendar.WEEK_OF_YEAR);
        int endWeek = endCal.get(Calendar.WEEK_OF_YEAR);

        Calendar cal = new GregorianCalendar();
        cal.set(Calendar.DAY_OF_WEEK, Calendar.FRIDAY);
    //  cal.setMinimalDaysInFirstWeek(7);
        ArrayList<String> main = new ArrayList<String>();
        while(startYear <= endYear ){
               cal.set(Calendar.YEAR, startYear);
               System.out.println(cal.getMinimalDaysInFirstWeek());
                if(startYear == endYear){
                    main.addAll(getFridays(startWeek, endWeek, cal));
                }
                else{
                    main.addAll(getFridays(startWeek, 52, cal));
                    startWeek = 1;
                }
                startYear =startYear +1;
        }

        for(String s: main){
            System.err.println(s);
        }
    }
    public static ArrayList<String> getFridays(int startWeek, int endWeek, Calendar cal){
        ArrayList<String> fridays = new ArrayList<String>();
        while(startWeek <= endWeek){
            cal.set(Calendar.WEEK_OF_YEAR, startWeek);
            fridays.add(cal.getTime().toString());
            startWeek = startWeek+1;
        }
        return fridays;
    }
}

Ahora, cuando ejecuté el código, noté que faltaban los viernes de 2011. Después de un poco de depuración y navegación en línea me di cuenta de queCalendar.WEEK_OF_YEAR es locale específico y tengo que usarsetMinimalDaysInFirstWeek(7) arreglarlo.

Sin comentar la línea relacionada en el código anterior.

Por lo que entendí ahora, la primera semana del año debería comenzar a partir de la semana completa del año.

Por ejemplo, el 1 de enero de 2010 es viernes. Pero no debería aparecer en los resultados, ya que la configuré para tratar esa semana que comienza el 3 de enero. Pero ahora todavía veo el 1 de enero como viernes.

Estoy muy confundido. ¿Alguien puede explicar por qué está sucediendo?

Estos artículos de Stackoverflow me ayudaron un poco:

¿Por qué el 31 de diciembre de 2010 devuelve 1 como semana del año?

Entendiendo java.util.Calendar WEEK_OF_YEAR

Respuestas a la pregunta(7)

Su respuesta a la pregunta