If you print first and second at each step, this is what you get:
Your first match
Sun Oct 25 00:59:00 CEST 2015 Sun Oct 25 01:01:00 CEST 2015
which is exactly what was expected. Twice, two minutes, during Central European Summer Time.
The second match is becoming interesting. You have added two hours to each date:
Sun Oct 25 02:59:00 CEST 2015 Sun Oct 25 02:01:00 CET 2015
Now two times switching DST. First time in the summer, 2:59; the second time at standard time, at 2:01.
When you add two days to it, it looks like Java forgets everything about daylight saving time:
Tue Oct 27 02:59:00 CET 2015 Tue Oct 27 02:01:00 CET 2015
2:59 and 2:01, just like it was ... it could be two days later on the calendar, but the first time, of course, not 48 hours later than the second step!
If you change the final add-ons to
first = add(first, Calendar.HOUR_OF_DAY, 48); second = add(second, Calendar.HOUR_OF_DAY, 48);
then the problem disappears:
Tue Oct 27 01:59:00 CET 2015 Tue Oct 27 02:01:00 CET 2015
My guess is that the Java developers had to make some guesses about the expected behavior of what it meant "N days later" when it involved switching DST.