public static List<Integer> generateNumbers(int border) {
  List<Integer> finalList = new ArrayList<>();
  boolean[] bool = new boolean[border];

  for (int i = 0; i < bool.length; i++) {
    bool[i] = true;
  }

  /////////
  for (int i = 2; i < Math.sqrt(border); i++) {
    if (bool[i] == true) {
      for (int j = (i * i); j < border; j = j + i) {
        bool[j] = false;
      }
    }
  }
  ////////

  for (int i = 2; i < bool.length; i++) {
    if (bool[i] == true) {
      finalList.add(i);
    }
  }

  return finalList;
}

Mir geht es vor allem um den Bereich, welcher in den ///////// drinnen liegt, wo ich die Nicht-Primzahlen herausfische. Kann mir jemand diese for-Schleife Schritt für Schritt erklären?