# Programmieren 2 (Wintersemester 2024/2025)

## 👋 Willkommen zum Kurs Programmieren 2

In Programmieren 2 lernen Sie die Programmierung in Java auf einem fortgeschrittenen Niveau. Sie werden alle wichtigen Konzepte von Java kennenlernen und diese in praktischen Übungen anwenden. Hierbei werden Sie in kleinen Teams arbeiten und komplexere, objektorientierte Programme in Java entwickeln. Die dazu nötigen objektorientierten Konzepte (Polymorphie, Vererbung, Interfaces, etc.) werden Sie ebenso im Kurs anwenden, wie die dazu grundlegenden Algorithmen und Datenstrukturen.

## 🎓 Freiwillige Übungen

Hier finden Sie die **freiwilligen Übungen** zur Vorlesung Programmieren 2 (PR2). Die Übungen sind unten aufgelistet. Die Spalte **Ausgabe** hat keine Bedeutung.

Hinweise zur nötigen Softwareausstattung finden Sie [hier](help/softwareausstattung.md).

| #   | Kapitel               | Thema                                                                                             |
|-----|-----------------------|---------------------------------------------------------------------------------------------------|
| 1.  | Auffrischung          | [String in Großbuchstaben umwandeln](Auffrischung_001/readme.md)                                  |
| 2.  | Auffrischung          | [Labeled Break](Auffrischung_002/readme.md)                                                       |
| 3.  | Auffrischung          | [Passwortbewertung](Auffrischung_003/readme.md)                                                   |
| 4.  | Auffrischung          | [printf mit Formatstring](Auffrischung_004/readme.md)                                             |
| 5.  | Auffrischung          | [Maximum in einem Array suchen](Auffrischung_005/readme.md)                                       |
| 6.  | Auffrischung          | [Taschenrechner](Auffrischung_006/readme.md)                                                      |
| 7.  | Einführung            | [Java-Coding-Standard anwenden](Einführung_001/readme.md)                                         |
| 8.  | Einführung            | [JavaDoc schreiben](Einführung_002/readme.md)                                                     |
| 9.  | Einführung            | [Klasse mit JUnit testen](Einführung_003/readme.md)                                               |
| 10. | Strukturierung        | [Information-Hiding einer Klasse verbessern](Strukturierung_001/readme.md)                        |
| 11. | Strukturierung        | [Vorhandene Bibliotheken als JAR einbinden](Strukturierung_002/readme.md)                         |
| 12. | Vererbung             | [Final anwenden](Vererbung_001/readme.md)                                                         |
| 13. | Vererbung             | [Figur und Rechteck](Vererbung_002/readme.md)                                                     |
| 14. | Vererbung             | [Figur erweitern](Vererbung_003/readme.md)                                                        |
| 15. | Vererbung             | [Figur noch einmal erweitern](Vererbung_004/readme.md)                                            |
| 16. | Vererbung             | [Konstruktoren schreiben](Vererbung_005/readme.md)                                                |
| 17. | Vererbung             | [Polymorphie einsetzen](Vererbung_006/readme.md)                                                  |
| 18. | Vererbung             | [Singleton](Vererbung_007/readme.md)                                                              |
| 19. | Vererbung             | [Statische Methoden und Attribute](Vererbung_008/readme.md)                                       |
| 20. | Vererbung             | [Methode überladen](Vererbung_009/readme.md)                                                      |
| 21. | Vererbung             | [Methoden überschreiben](Vererbung_010/readme.md)                                                 |
| 22. | Vererbung             | [Varag-Methode schreiben](Vererbung_011/readme.md)                                                |
| 23. | Vererbung             | [Vererbung von Figuren](Vererbung_012/readme.md)                                                  |
| 24. | Abstrakte Klassen     | [Abstrakte Klassen](Abstrakte Klassen_001/readme.md)                                              |
| 25. | Abstrakte Klassen     | [Abstrakte Klasse](Abstrakte Klassen_002/readme.md)                                               |
| 26. | Interfaces            | [Comparable implementieren](Interfaces_001/readme.md)                                             |
| 27. | Interfaces            | [Interface Stack entwerfen](Interfaces_002/readme.md)                                             |
| 28. | Interfaces            | [Interface: Uebersetzer](Interfaces_003/readme.md)                                                |
| 29. | Interfaces            | [Interfaces anwenden und entwerfen](Interfaces_004/readme.md)                                     |
| 30. | Object und Wrapper    | [Deep-Copy mit `clone()`](Object und Wrapper_001/readme.md)                                       |
| 31. | Object und Wrapper    | [Clone](Object und Wrapper_002/readme.md)                                                         |
| 32. | Object und Wrapper    | [`equals()` und `hashCode()` implementieren und nutzen](Object und Wrapper_003/readme.md)         |
| 33. | Object und Wrapper    | [equals und hashCode](Object und Wrapper_004/readme.md)                                           |
| 34. | Object und Wrapper    | [`toString()`-Methode implementieren](Object und Wrapper_005/readme.md)                           |
| 35. | Object und Wrapper    | [Optimierung bei Integer](Object und Wrapper_006/readme.md)                                       |
| 36. | Object und Wrapper    | [Methoden der Wrapper-Klassen](Object und Wrapper_007/readme.md)                                  |
| 37. | Enumerationen         | [Eigene Enumeration schreiben und verwenden](Enumerationen_001/readme.md)                         |
| 38. | Enumerationen         | [Enumeration schreiben](Enumerationen_002/readme.md)                                              |
| 39. | Enumerationen         | [Singleton-Eigenschaft von Enumerationen](Enumerationen_003/readme.md)                            |
| 40. | Enumerationen         | [Stein, Papier, Schere, Echse, Spock](Enumerationen_004/readme.md)                                |
| 41. | Ausnahmen             | [Ausnahmen testen](Ausnahmen_001/readme.md)                                                       |
| 42. | Ausnahmen             | [Eigene Ausnahmen schreiben und an entsprechender Stelle werfen](Ausnahmen_002/readme.md)         |
| 43. | Ausnahmen             | [Eigene Exception schreiben](Ausnahmen_003/readme.md)                                             |
| 44. | Ausnahmen             | [Handle-or-Declare-Regel anwenden](Ausnahmen_004/readme.md)                                       |
| 45. | Ausnahmen             | [Ausnahmen mit `try` und `catch` behandeln.](Ausnahmen_005/readme.md)                             |
| 46. | Input und Output      | [`BufferedReader` zum zeilenweisen Lesen einsetzen](Input und Output_001/readme.md)               |
| 47. | Input und Output      | [DataOutputStream](Input und Output_002/readme.md)                                                |
| 48. | Input und Output      | [DataOutputStream durch Serialisierung ersetzen](Input und Output_003/readme.md)                  |
| 49. | Input und Output      | [Daten mit `DataOutputStream` und `DataInputStream` verarbeiten](Input und Output_004/readme.md)  |
| 50. | Input und Output      | [Daten mit einem `InputStream` lesen](Input und Output_005/readme.md)                             |
| 51. | Input und Output      | [Daten mit einem `OutputStream` schreiben](Input und Output_006/readme.md)                        |
| 52. | Input und Output      | [Filesystem-Abstraktion mit `File`](Input und Output_007/readme.md)                               |
| 53. | Input und Output      | [Fileattribute lesen](Input und Output_008/readme.md)                                             |
| 54. | Input und Output      | [`FilterReader`](Input und Output_009/readme.md)                                                  |
| 55. | Input und Output      | [Konsolen Input/Output](Input und Output_010/readme.md)                                           |
| 56. | Input und Output      | [Zeilen einer Textdatei zählen](Input und Output_011/readme.md)                                   |
| 57. | Input und Output      | [`RandomAccessFile`](Input und Output_012/readme.md)                                              |
| 58. | Input und Output      | [`Reader` verwenden](Input und Output_013/readme.md)                                              |
| 59. | Input und Output      | [Rot13-Verschlüsselung](Input und Output_014/readme.md)                                           |
| 60. | Input und Output      | [Datei zerhacken](Input und Output_015/readme.md)                                                 |
| 61. | Input und Output      | [Serialisierung](Input und Output_016/readme.md)                                                  |
| 62. | Generische Typen      | [Einen generischen Typ schreiben](Generische Typen_001/readme.md)                                 |
| 63. | Generische Typen      | [Generische Klasse Pair schreiben](Generische Typen_002/readme.md)                                |
| 64. | Generische Typen      | [Generische Klasse Pair erweitern: NumberPair](Generische Typen_003/readme.md)                    |
| 65. | Generische Typen      | [Generische Klasse Pair erweitern: SamePair](Generische Typen_004/readme.md)                      |
| 66. | Generische Typen      | [PairList](Generische Typen_005/readme.md)                                                        |
| 67. | Generische Typen      | [Wildcard benutzen](Generische Typen_006/readme.md)                                               |
| 68. | Generische Typen      | [Generische Queue](Generische Typen_007/readme.md)                                                |
| 69. | Generische Typen      | [`super` und `extends` einsetzen](Generische Typen_008/readme.md)                                 |
| 70. | Generische Typen      | [Generische Typen zusammen mit Wildcards einsetzen](Generische Typen_009/readme.md)               |
| 71. | Geschachtelte Klassen | [Eigene compare-Methode schreiben](Geschachtelte Klassen_001/readme.md)                           |
| 72. | Geschachtelte Klassen | [Innere Klasse Beobachter](Geschachtelte Klassen_002/readme.md)                                   |
| 73. | Geschachtelte Klassen | [Callback mit anonymer Klasse realisieren](Geschachtelte Klassen_003/readme.md)                   |
| 74. | Lambdas               | [Comparator als Lambda](Lambdas_001/readme.md)                                                    |
| 75. | Lambdas               | [Callback mit Lambda realisieren](Lambdas_002/readme.md)                                          |
| 76. | Geschachtelte Klassen | [MatrixSuche](Geschachtelte Klassen_001/readme.md)                                                |
| 77. | Lambdas               | [StringTransmogrifier](Lambdas_001/readme.md)                                                     |
| 78. | Lambdas               | [StringTransmogrifier erweitern](Lambdas_002/readme.md)                                           |
| 79. | Collections           | [Iterator schreiben](Collections_001/readme.md)                                                   |
| 80. | Collections           | [Iterator programmieren](Collections_002/readme.md)                                               |
| 81. | Collections           | [`List<T>` und dessen Implementierungen](Collections_003/readme.md)                               |
| 82. | Collections           | [`Map<T>` verwenden](Collections_004/readme.md)                                                   |
| 83. | Collections           | [ReverserGeneric](Collections_005/readme.md)                                                      |
| 84. | Collections           | [Strings umgekehrt sortieren: Reverser](Collections_006/readme.md)                                |
| 85. | Collections           | [`Set<T>` und dessen Implementierungen](Collections_007/readme.md)                                |
| 86. | Collections           | [CommandLineSorter](Collections_008/readme.md)                                                    |
| 87. | Collections           | [CommandLineSorter -- Version 2](Collections_009/readme.md)                                       |
| 88. | Collections           | [`Comparator<T>` verwenden und Objekte sortieren](Collections_010/readme.md)                      |
| 89. | Collections           | [Wörterbuchprogramm](Collections_011/readme.md)                                                   |
| 90. | Streams               | [Kleinbuchstaben in einem String zählen](Streams_001/readme.md)                                   |
| 91. | Streams               | [Buchstaben in einer Liste von Strings zählen](Streams_002/readme.md)                             |
| 92. | Streams               | [Kleinbuchstaben in einem String zählen](Streams_003/readme.md)                                   |
| 93. | Streams               | [Liste filtern](Streams_004/readme.md)                                                            |
| 94. | Streams               | [Streams mit interner Iteration](Streams_005/readme.md)                                           |
| 95. | Streams               | [Map und Filter auf Streams](Streams_006/readme.md)                                               |
| 96. | Streams               | [Map und Reduce auf Streams](Streams_007/readme.md)                                               |
| 97. | Streams               | [Reduce](Streams_008/readme.md)                                                                   |
| 98. | Streams               | [Summe über reduce bestimmen](Streams_009/readme.md)                                              |
| 99. | Streams               | [Wörter zählen](Streams_010/readme.md)                                                            |
| 100. | Threads               | [Fakultät parallel berechnen](Threads_001/readme.md)                                              |
| 101. | Threads               | [Thread per interrupt beenden](Threads_002/readme.md)                                             |
| 102. | Threads               | [wait und notify benutzen](Threads_003/readme.md)                                                 |
| 103. | Threads               | [Parallele Ausgaben erzeugen](Threads_004/readme.md)                                              |
| 104. | Threads               | [Race-Condition finden und beheben](Threads_005/readme.md)                                        |
| 105. | Threads               | [Stack und Heap unterscheiden](Threads_006/readme.md)                                             |
| 106. | Threads               | [synchronized verwenden](Threads_007/readme.md)                                                   |
| 107. | Threads               | [Timer und TimerTask verwenden](Threads_008/readme.md)                                            |
| 108. | Reflection            | [Klasse per Reflection analysieren](Reflection_001/readme.md)                                     |
| 109. | Reflection            | [Objekte per Reflection erzeugen](Reflection_002/readme.md)                                       |
