FAQs – Sonstiges
Was ist der Unterschied zwischen Methoden und Funktionen?
Im eigentlichen Sinn geben Funktionen – ähnlich einer mathematischen Funktion – einen Wert zurück. Methoden können einen Wert zurückgeben, müssen aber nicht.
Meist wird in Java – unabhängig von der Rückgabe eines Wertes – der Begriff Methode verwendet.
Gibt es einheitliche Richtlinien für den Programmierstil? Wie wichtig ist es, auf diese Richtlinien zu achten?
Für die verschiedenen Programmiersprachen gibt es unterschiedliche Richtlinien (coding-conventions).
In Java beispielsweise ist es konventionell, dass Methodennamen im CamelCase und mit Kleinbuchstaben am Wortanfang geschrieben werden. Konstanten werden in Großbuchstaben geschrieben. Klassennamen beginnen mit einem Großbuchstaben, …
Arbeiten mehrere Menschen in einem Projekt zusammen, ist es üblich, Konventionen zum Programmierstil zu vereinbaren. Da diese Konventionen dazu beitragen, dass der Informationsaustausch funktioniert und Fehler und Missverständnisse vermieden werden, ist sorgfältig auf deren Einhaltung zu achten.
Mehr Informationen dazu:
Was ist die Funktionsweise/Aufgabe des Garbage-Collectors?
Beim Erzeugen eines Objekts wird Speicher belegt.
In verschiedenen älteren Programmiersprachen – wie beispielsweise C++ – muss der belegte Speicher explizit freigegeben werden (delete, free), wenn das Objekt nicht mehr benötigt (nicht mehr referenziert) wird. Eine nicht sorgfältig durchgeführte Freigabe des Speichers kann zu einem erhöhten Speicherbedarf (Speicherleck) führen.
In vielen höheren Programmiersprachen sorgt der Garbage-Collector dafür, dass die Speicherfreigabe von einer im Hintergrund laufenden Routine automatisch durchgeführt wird.
ASCII Zeichencode / Unicode?
Zur Codierung von Zeichen kann man unterschiedliche Codes verwenden. Zwei davon sind der ASCII-Code und der Unicode. Die ersten 128 (0 … 127) Zeichen von Unicode und ASCII-Code sind identisch.
Der ASCII-Code verwendet nur 7 bit für die Zeichencodierung. Da für die Übertragung von Zeichen im Allgemeinen mindestens 8 bit (1 Byte) verwendet werden, bot es sich an, den bisher ungenutzten Bereich von 128 … 255 mit verschiedenen Erweiterungen für länderspezifische Zeichen zu belegen.
Beispiel:
Das Zeichen mit dem Code 0xE4 (Dezimal 228) entspricht in der Zeichencodierung ISO 8859-1 (Latin-1) dem Zeichen ä. In der Zeichencodierung Codepage 720 (Arabisch) entspricht der Code dem Zeichen غ.
Da die unterschiedlichen Code-Tabellen zu Problemen führten, strebte man eine Vereinheitlichung an. Aus diesen Bestrebungen entstand der Unicode. Für die Binärdarstellung der Unicode-Zeichen wird meist UTF-8 verwendet. Bei UTF-8 werden die Zeichen mit variabler Länge codiert. Die Zeichen mit dem Code 0 … 127 werden durch ein Byte repräsentiert. Alle anderen Zeichen werden durch mindestens 2 Byte dargestellt.
Wie erstellt man ein Array aus einem Baum?
Es gibt verschiedene Möglichkeiten, um aus einem Baum ein Array zu erzeugen. Zum Traversieren des Baums verwendet man die Tiefensuche oder die Breitensuche.
- Tiefensuche:
Die Tiefensuche bei Binärbäumen ist rekursiv definiert. Dabei wird ausgehend vom aktuellen Knoten der Baum in einen linken und rechten Teilbaum zerlegt. Je nachdem, ob der aktuelle Knoten vor, nach oder zwischen den Teilbäumen abgearbeitet wird, unterscheidet man zwischen pre-order, post-order oder in-order.- Pre-order: Zuerst wird der aktuelle Knoten im Array abgelegt. Dann wird der linke und zuletzt der rechte Teilbaum gemäß der pre-order Abfolge rekursiv abgearbeitet.
- Post-order: Zuerst wird der linke, dann der rechte Teilbaum gemäß der post-order Abfolge rekursiv durchlaufen. Dann wird der aktuelle Knoten im Array abgelegt.
- In-order: Zuerst erfolgt der rekursive Abstieg gemäß der in-order Abfolge im linken Teilbaum. Dann wird der aktuelle Knoten im Array abgelegt und zuletzt erfolgt der rekursive Abstieg gemäß der in-order Abfolge im rechten Teilbaum.
- Breitensuche (level-order):
Bei diesem Verfahren wird der Baum beginnen mit dem Wurzelknoten Ebene für Ebene durchlaufen.
Beispiel:
Beim Traversieren der Bäume gemäß der angegebenen Ordnung ergibt sich die Zeichenkette “HelloWorld”.
Pre-Order: H / \ / \ / \ e r / \ / \ / \ / \ l W l d / \ / l o o Post-Order: d / \ / \ / \ W l / \ / \ / \ / \ l o o r / \ / H e l In-Order: o / \ / \ / \ l l / \ / \ / \ / \ e W r d / \ / H l o
Mehr dazu: Wikipedia Binärbaum
Was ist der Heapspeicher?
Bei der Ausführung eines Programms werden verschiedene Speicherbereiche reserviert. Einer davon ist der Heapspeicher. Im Heapspeicher werden dynamisch zugewiesene Daten abgelegt. Dazu gehören in Java alle zur Laufzeit erzeugten Objekte.
Werden Ressourcen nicht mehr benötigt (nicht mehr referenziert), können sie durch den Garbage-Collector aus dem Heapspeicher gelöscht werden. Dadurch kann dieser Speicherbereich durch das Programm wieder verwendet werden.
Warum werden Sortieralgorithmen als Standardbeispiele für Laufzeitkomplexität verwendet?
Um die Durchführung von Komplexitätsanalysen zu lernen, werden oft Sortieralgorithmen verwendet. Einige Gründe dafür sind, dass Sortieralgorithmen gut dokumentiert und gut verständlich sind. Darüber hinaus sind sie ein gutes Beispiel, wie unterschiedliche Lösungsstrategien mit unterschiedlicher Komplexität für ein Problem entwickelt werden können.
Viele andere Algorithmen – beispielsweise aus der Graphentheorie – stellen bei der Implementierung bzw. der mathematischen Analyse eine größere Herausforderung dar als die Sortieralgorithmen.
Baut jede Programmiersprache auf die Assemblersprache auf?
Assembler ist eine Programmiersprache, die Maschineninstruktionen recht unmittelbar abbildet. Die Programmiersprache C beispielsweise baut auf Assembler auf. Das heißt in einem Zwischenschritt wird vom Compiler Assembler-Code erzeugt.
Java oder C# bauen nicht auf Assembler auf. In diesen Sprachen wird beim Ausführen des Bytecodes von der virtuellen Maschine ohne diesen Zwischenschritt Maschinencode erzeugt.
Welche Sprachen neben Java gibt es noch?
Welche Programmiersprache ist am besten?
Da gehen die Meinungen auseinander. Unterschiedliche Programmiersprachen sind besser oder schlechter geeignet für unterschiedliche Dinge.
Will man beispielsweise ein Programm für einen Mikrocontroller schreiben, wird man dafür eine Programmiersprache verwenden, die einen einfachen Zugriff auf die Hardware ermöglicht (C, Assembler). Für die Erstellung aufwendiger grafischer Oberflächen wird es effizienter sein mit einer höheren Programmiersprache wie Java oder C# zu arbeiten.